From c7905ae282164b6b2c4fed551c5f96467ade1ffe Mon Sep 17 00:00:00 2001 From: Roland Krummenacher Date: Tue, 8 Sep 2026 20:41:00 +0200 Subject: [PATCH 1/9] fix(open-data): restore retired SKUs and reconcile ISF ratio scale The Catalogs API only returns SKUs that can still be purchased, so the instance size flexibility dataset dropped every retired series that active reservations still cover (Av2, D, DS, Dv2, Dv3, Ev3, F, G, H, LS, NC, NV and others). The Optimization Engine joins ISF with kind=inner, so those reservations were silently missing from its reports. - Backfill the retired groups from the ratio file the API replaced: 1,353 -> 2,573 SKUs and 211 -> 318 flexibility groups. Purely additive against v15 -- no row removed and no published ratio changed. - Merge additively instead of overwriting, so a SKU the API stops returning is carried forward rather than dropped, and fail the run if the dataset would shrink. - Enumerate every physical region from the ARM locations API (63) instead of sweeping a hardcoded list of 26, which omitted SKUs that launch in only a handful of regions. regionType is nested under metadata, and the logical groupings it marks are not valid catalog scopes. - Reconcile the ratio scale. The retired file normalized each group so its smallest SKU was 1 while the API reports vCPU counts, and because Azure retires individual sizes the API covers only part of 44 of the 204 shared groups, so a per-SKU merge left single groups holding both units. Backfilled rows were converted onto the API scale once, and Assert-IsfScale now fails the run if a group drifts off it again. - Drop non-positive ratios. The API returns one, and the benefits simulation workbook divides by Ratio. Fixes #2300 Co-Authored-By: Claude Opus 5 (1M context) --- .../opendata-instance-size-flexibility.yml | 6 +- docs-mslearn/toolkit/changelog.md | 5 + docs-mslearn/toolkit/open-data.md | 9 +- src/open-data/InstanceSizeFlexibility.csv | 1220 +++++++++++++++++ src/open-data/README.md | 12 +- .../Update-InstanceSizeFlexibility.Tests.ps1 | 224 ++- .../Update-InstanceSizeFlexibility.ps1 | 257 +++- 7 files changed, 1701 insertions(+), 32 deletions(-) diff --git a/.github/workflows/opendata-instance-size-flexibility.yml b/.github/workflows/opendata-instance-size-flexibility.yml index 370731907..800b84df8 100644 --- a/.github/workflows/opendata-instance-size-flexibility.yml +++ b/.github/workflows/opendata-instance-size-flexibility.yml @@ -94,9 +94,13 @@ jobs: echo "replacing the deprecated \`AutofitComboMeterData.csv\` and \`isfratioblob.csv\` files" echo "that were hosted on \`ccmstorageprod.blob.core.windows.net\` (retired 30 Aug 2026)." echo "" + echo "The dataset is additive: the Catalogs API only returns purchasable SKUs, so the" + echo "result is merged over the published file rather than replacing it. SKUs the API" + echo "no longer returns are retained." + echo "" echo "## Test plan" echo "" - echo "- [ ] Review the diff for unexpected changes (large drops in group/SKU count, etc.)" + echo "- [ ] Review the diff for unexpected changes (the dataset is additive, so expect additions and ratio updates only)" echo "- [ ] Spot-check a few SKUs against the Azure Pricing Calculator" echo "" echo "🤖 Generated by the **Update Instance Size Flexibility** workflow" diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index c9a66fcd1..052de9564 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -78,6 +78,11 @@ The following section lists features and enhancements that are currently in deve - **Added** - Added a new [Instance size flexibility](open-data.md#instance-size-flexibility) dataset that maps each ARM SKU to its instance size flexibility group and ratio, sourced from the Azure Reservations Catalogs API. It replaces the deprecated ISF ratio files hosted on `ccmstorageprod.blob.core.windows.net` ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). +- **Fixed** + - Fixed the instance size flexibility dataset omitting SKUs that are no longer available to purchase. The Catalogs API only returns purchasable SKUs, so retired series that reservations still cover (Av2, D, DS, Dv2, Dv3, Ev3, F, G, H, LS, NC, NV, and others) were missing. The dataset is now additive and backfilled from the retired ratio file, growing from 211 to 318 flexibility groups and from 1,353 to 2,574 SKUs ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - Fixed the generator sweeping a hardcoded list of 26 regions, which silently omitted SKUs that launch only in regions outside the list. It now enumerates every physical region from the ARM locations API, 63 at the time of the change ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - Fixed the dataset publishing a SKU whose ratio is `0`, which the Optimization Engine's benefits simulation divides by. Non-positive ratios are now dropped ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - Fixed ratios from the retired files sitting on a different scale than the Catalogs API. The retired files normalized each group so its smallest SKU was `1`; the API reports absolute vCPU counts. Because Azure retires individual sizes rather than whole families, the API covers only part of many groups, so combining the two left single groups holding both units. The backfilled rows were converted onto the API scale, and the generator now fails rather than publishing a group in two units ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). **[Commitment discount eligibility](open-data.md#commitment-discount-eligibility)** diff --git a/docs-mslearn/toolkit/open-data.md b/docs-mslearn/toolkit/open-data.md index bed426f87..191b3e6bd 100644 --- a/docs-mslearn/toolkit/open-data.md +++ b/docs-mslearn/toolkit/open-data.md @@ -4,7 +4,7 @@ description: Use open data to normalize and enhance your FinOps reporting, ensur ms.topic: concept-article author: flanakin ms.author: micflan -ms.date: 09/01/2026 +ms.date: 09/08/2026 ms.service: finops ms.subservice: finops-toolkit ms.reviewer: micflan @@ -193,10 +193,11 @@ Sample data: A few important notes about the data: -- It covers Virtual Machines, Redis Cache, and Dedicated Host. +- It covers Virtual Machines, Redis Cache, and Dedicated Host across every physical Azure region. - `ArmSkuName` is unique across the file and can be used as a join key on its own. -- Ratios are the raw Microsoft values within each group (the smallest SKU isn't always `1`). -- Data is updated weekly via a GitHub Actions workflow and always reflects the current API catalog, so retired SKUs are removed automatically. +- Ratios are the Microsoft values within each group (the smallest SKU isn't always `1`). Compare ratios only within a flexibility group. +- The retired ratio files normalized each group so its smallest SKU was `1`, while the Catalogs API reports absolute vCPU counts. Both express the same proportions. Rows carried over from the retired files were converted onto the API scale, except for the fully retired groups that the API doesn't cover, which keep the normalized scale. +- Data is updated weekly via a GitHub Actions workflow. The dataset is additive: the Catalogs API only returns SKUs you can still purchase, so SKUs it no longer returns are kept because reservations might still cover them. > [!div class="nextstepaction"] diff --git a/src/open-data/InstanceSizeFlexibility.csv b/src/open-data/InstanceSizeFlexibility.csv index 498cb64d7..9165ac8ee 100644 --- a/src/open-data/InstanceSizeFlexibility.csv +++ b/src/open-data/InstanceSizeFlexibility.csv @@ -1,4 +1,11 @@ "InstanceSizeFlexibilityGroup","ArmSkuName","Ratio" +"Av2 Series","Standard_A1_v2","1" +"Av2 Series","Standard_A2_v2","2.1" +"Av2 Series","Standard_A4_v2","4.4" +"Av2 Series","Standard_A8_v2","9.2" +"Av2 Series High Memory","Standard_A2m_v2","1" +"Av2 Series High Memory","Standard_A4m_v2","2" +"Av2 Series High Memory","Standard_A8m_v2","4" "Azure Managed Redis - Balanced","azure_managed_redis_balanced_b0","1" "Azure Managed Redis - Balanced","azure_managed_redis_balanced_b1","2" "Azure Managed Redis - Balanced","azure_managed_redis_balanced_b10","19.69" @@ -44,6 +51,55 @@ "Azure Managed Redis - Memory Optimized","azure_managed_redis_memory_optimized_m50","4" "Azure Managed Redis - Memory Optimized","azure_managed_redis_memory_optimized_m500","32" "Azure Managed Redis - Memory Optimized","azure_managed_redis_memory_optimized_m700","48" +"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_16_vCPU","4" +"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_32_vCPU","8" +"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_4_vCPU","1" +"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_48_vCPU","12" +"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_64_vCPU","16" +"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_72_vCPU","18" +"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_8_vCPU","2" +"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_1_vCPU","1" +"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_104_vCPU","104" +"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_2_vCPU","2" +"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_20_vCPU","20" +"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_24_vCPU","24" +"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_96_vCPU","96" +"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_16_vCPU","16" +"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_32_vCPU","32" +"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_4_vCPU","4" +"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_48_vCPU","48" +"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_64_vCPU","64" +"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_8_vCPU","8" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_12_vCPU","3" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_16_vCPU","4" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_24_vCPU","6" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_4_vCPU","1" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_48_vCPU","12" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_6_vCPU","1.5" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_64_vCPU","16" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_8_vCPU","2" +"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_96_vCPU","24" +"Azure Red Hat OpenShift GPU Accelerated ND","Azure_Red_Hat_OpenShift_GPU_Accelerated_ND_96_vCPU","1" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_104_vCPU","52" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_128_vCPU","64" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_16_vCPU","8" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_192_vCPU","96" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_2_vCPU","1" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_20_vCPU","10" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_32_vCPU","16" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_4_vCPU","2" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_48_vCPU","24" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_64_vCPU","32" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_8_vCPU","4" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_80_vCPU","40" +"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_96_vCPU","48" +"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_16_vCPU","4" +"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_32_vCPU","8" +"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_4_vCPU","1" +"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_48_vCPU","12" +"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_64_vCPU","16" +"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_8_vCPU","2" +"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_80_vCPU","20" "Azure Redis Cache Enterprise","azure_redis_cache_enterprise_e1","1" "Azure Redis Cache Enterprise","azure_redis_cache_enterprise_e10","12.03" "Azure Redis Cache Enterprise","azure_redis_cache_enterprise_e100","94.23" @@ -77,6 +133,16 @@ "Bpsv2 Series","Standard_B4ps_v2","31.9" "Bpsv2 Series","Standard_B8pls_v2","56.66" "Bpsv2 Series","Standard_B8ps_v2","64.04" +"BS Series","Standard_B1ls","1" +"BS Series","Standard_B1s","2" +"BS Series","Standard_B2s","8" +"BS Series High Memory","Standard_B12ms","12.05" +"BS Series High Memory","Standard_B16ms","16.05" +"BS Series High Memory","Standard_B1ms","0.5" +"BS Series High Memory","Standard_B20ms","20.1" +"BS Series High Memory","Standard_B2ms","2" +"BS Series High Memory","Standard_B4ms","4" +"BS Series High Memory","Standard_B8ms","8.05" "Bsv2 Series","Standard_B16ls_v2","113.27" "Bsv2 Series","Standard_B16s_v2","128.08" "Bsv2 Series","Standard_B2ls_v2","8" @@ -88,6 +154,23 @@ "Bsv2 Series","Standard_B4s_v2","31.92" "Bsv2 Series","Standard_B8ls_v2","56.73" "Bsv2 Series","Standard_B8s_v2","64.04" +"Copilot_Credit_Pre-Purchase_Plan","Microsoft_Copilot_Studio_Pay_As_You_Go","1" +"D Series","Standard_D1","1" +"D Series","Standard_D2","2" +"D Series","Standard_D3","4" +"D Series","Standard_D4","8" +"D Series High Memory","Standard_D11","1" +"D Series High Memory","Standard_D12","2" +"D Series High Memory","Standard_D13","4" +"D Series High Memory","Standard_D14","8" +"Dadsv5 Internal Series","Internal_D16ads_v5","8" +"Dadsv5 Internal Series","Internal_D2ads_v5","1" +"Dadsv5 Internal Series","Internal_D32ads_v5","16" +"Dadsv5 Internal Series","Internal_D48ads_v5","24" +"Dadsv5 Internal Series","Internal_D4ads_v5","2" +"Dadsv5 Internal Series","Internal_D64ads_v5","32" +"Dadsv5 Internal Series","Internal_D8ads_v5","4" +"Dadsv5 Internal Series","Internal_D96ads_v5","48" "Dadsv5 Series","Standard_D16ads_v5","16" "Dadsv5 Series","Standard_D2ads_v5","2" "Dadsv5 Series","Standard_D32ads_v5","32" @@ -97,16 +180,42 @@ "Dadsv5 Series","Standard_D8ads_v5","8" "Dadsv5 Series","Standard_D96ads_v5","96" "Dadsv5 Series DedicatedHost","dadsv5_type1","112" +"Dalsv5 Internal Series","Internal_D16als_v5","8" +"Dalsv5 Internal Series","Internal_D2als_v5","1" +"Dalsv5 Internal Series","Internal_D32als_v5","16" +"Dalsv5 Internal Series","Internal_D48als_v5","24" +"Dalsv5 Internal Series","Internal_D4als_v5","2" +"Dalsv5 Internal Series","Internal_D64als_v5","32" +"Dalsv5 Internal Series","Internal_D8als_v5","4" +"Dalsv5 Internal Series","Internal_D96als_v5","48" "Dasv4 Series","Standard_D16as_v4","16" "Dasv4 Series","Standard_D2as_v4","2" "Dasv4 Series","Standard_D32as_v4","32" "Dasv4 Series","Standard_D48as_v4","48" +"Dasv4 Series","Standard_D4ahs_v4","4" "Dasv4 Series","Standard_D4as_v4","4" "Dasv4 Series","Standard_D64as_v4","64" +"Dasv4 Series","Standard_D8ahs_v4","8" "Dasv4 Series","Standard_D8as_v4","8" "Dasv4 Series","Standard_D96as_v4","96" "Dasv4 Series Dedicated Host","dasv4_type1","96" "Dasv4 Series Dedicated Host","dasv4_type2","99.84" +"Dasv5 Internal Series","Internal_D16as_v5","8" +"Dasv5 Internal Series","Internal_D2as_v5","1" +"Dasv5 Internal Series","Internal_D32as_v5","16" +"Dasv5 Internal Series","Internal_D48as_v5","24" +"Dasv5 Internal Series","Internal_D4as_v5","2" +"Dasv5 Internal Series","Internal_D64as_v5","32" +"Dasv5 Internal Series","Internal_D8as_v5","4" +"Dasv5 Internal Series","Internal_D96as_v5","48" +"Dasv5 Promo Series","Standard_D16as_v5_Promo","8" +"Dasv5 Promo Series","Standard_D2as_v5_Promo","1" +"Dasv5 Promo Series","Standard_D32as_v5_Promo","16" +"Dasv5 Promo Series","Standard_D48as_v5_Promo","24" +"Dasv5 Promo Series","Standard_D4as_v5_Promo","2" +"Dasv5 Promo Series","Standard_D64as_v5_Promo","32" +"Dasv5 Promo Series","Standard_D8as_v5_Promo","4" +"Dasv5 Promo Series","Standard_D96as_v5_Promo","48" "Dasv5 Series","Standard_D16as_v5","16" "Dasv5 Series","Standard_D2as_v5","2" "Dasv5 Series","Standard_D32as_v5","32" @@ -151,6 +260,11 @@ "DCdsv3 Series Linux","Standard_DC48ds_v3","48" "DCdsv3 Series Linux","Standard_DC4ds_v3","4" "DCdsv3 Series Linux","Standard_DC8ds_v3","8" +"DCSv2 Series","Standard_DC1s_v2","1" +"DCSv2 Series","Standard_DC2s_v2","2" +"DCSv2 Series","Standard_DC4s_v2","4" +"DCSv2 Series","Standard_DC8_v2","8" +"DCsv2 Series Dedicated Host","DCsv2 Type 1","1" "DCsv3 Series DedicatedHost","dcsv3 type1","51" "DCsv3 Series Linux","Standard_DC16s_v3","16" "DCsv3 Series Linux","Standard_DC1s_v3","1" @@ -237,6 +351,14 @@ "Dpsv5 Series","Standard_D4ps_v5","4" "Dpsv5 Series","Standard_D64ps_v5","64" "Dpsv5 Series","Standard_D8ps_v5","8" +"DS Series","Standard_DS1","1" +"DS Series","Standard_DS2","2" +"DS Series","Standard_DS3","4" +"DS Series","Standard_DS4","8" +"DS Series High Memory","Standard_DS11","1" +"DS Series High Memory","Standard_DS12","2" +"DS Series High Memory","Standard_DS13","4" +"DS Series High Memory","Standard_DS14","8" "DSv2 Series","Standard_DS1_v2","1" "DSv2 Series","Standard_DS2_v2","2" "DSv2 Series","Standard_DS3_v2","4" @@ -254,6 +376,21 @@ "DSv2 Series High Memory","Standard_DS14-4_v2","16" "DSv2 Series High Memory","Standard_DS14-8_v2","16" "DSv2 Series High Memory","Standard_DS15_v2","20" +"DSv2 Series High Memory Isolated","Standard_DS15i_v2","1" +"DSv3 Series","Standard_D16s_v3","8" +"DSv3 Series","Standard_D2s_v3","1" +"DSv3 Series","Standard_D32-16s_v3","16" +"DSv3 Series","Standard_D32-8s_v3","16" +"DSv3 Series","Standard_D32s_v3","16" +"DSv3 Series","Standard_D48s_v3","24" +"DSv3 Series","Standard_D4s_v3","2" +"DSv3 Series","Standard_D64-16s_v3","32" +"DSv3 Series","Standard_D64-32s_v3","32" +"DSv3 Series","Standard_D64s_v3","32" +"DSv3 Series","Standard_D8hs_v3","4" +"DSv3 Series","Standard_D8s_v3","4" +"DSv3 Series Dedicated Host","dsv3_type1","68" +"DSv3 Series Dedicated Host","dsv3_type2","76.59" "DSv3 Series Dedicated Host","dsv3_type3","85" "DSv3 Series Dedicated Host","dsv3_type4","106.08" "Dsv4 Series","Standard_D16s_v4","16" @@ -274,6 +411,24 @@ "Dsv5 Series","Standard_D8s_v5","8" "Dsv5 Series","Standard_D96s_v5","96" "Dsv5 Series DedicatedHost","dsv5_type1","107" +"Dv2 Series","Standard_D1_v2","1" +"Dv2 Series","Standard_D2_v2","2" +"Dv2 Series","Standard_D3_v2","4" +"Dv2 Series","Standard_D4_v2","8" +"Dv2 Series","Standard_D5_v2","16" +"Dv2 Series High Memory","Standard_D11_v2","1" +"Dv2 Series High Memory","Standard_D12_v2","2" +"Dv2 Series High Memory","Standard_D13_v2","4" +"Dv2 Series High Memory","Standard_D14_v2","8" +"Dv2 Series High Memory","Standard_D15_v2","10" +"Dv2 Series High Memory Isolated","Standard_D15i_v2","1" +"Dv3 Series","Standard_D16_v3","8" +"Dv3 Series","Standard_D2_v3","1" +"Dv3 Series","Standard_D32_v3","16" +"Dv3 Series","Standard_D4_v3","2" +"Dv3 Series","Standard_D48_v3","24" +"Dv3 Series","Standard_D64_v3","32" +"Dv3 Series","Standard_D8_v3","4" "Dv4 Series","Standard_D16_v4","16" "Dv4 Series","Standard_D2_v4","2" "Dv4 Series","Standard_D32_v4","32" @@ -289,6 +444,15 @@ "Dv5 Series","Standard_D64_v5","64" "Dv5 Series","Standard_D8_v5","8" "Dv5 Series","Standard_D96_v5","96" +"Eadsv5 Internal Series","Internal_E16ads_v5","8" +"Eadsv5 Internal Series","Internal_E20ads_v5","10" +"Eadsv5 Internal Series","Internal_E2ads_v5","1" +"Eadsv5 Internal Series","Internal_E32ads_v5","16" +"Eadsv5 Internal Series","Internal_E48ads_v5","24" +"Eadsv5 Internal Series","Internal_E4ads_v5","2" +"Eadsv5 Internal Series","Internal_E64ads_v5","32" +"Eadsv5 Internal Series","Internal_E8ads_v5","4" +"Eadsv5 Internal Series","Internal_E96ads_v5","48" "Eadsv5 Series","Standard_E112iads_v5","123.2" "Eadsv5 Series","Standard_E16-4ads_v5","16" "Eadsv5 Series","Standard_E16-8ads_v5","16" @@ -310,6 +474,7 @@ "Eadsv5 Series","Standard_E96-24ads_v5","96" "Eadsv5 Series","Standard_E96-48ads_v5","96" "Eadsv5 Series","Standard_E96ads_v5","96" +"Eadsv5 Series","Standard_E96iads_v5","105.4" "Eadsv5 Series DedicatedHost","eadsv5_type1","112" "Easv4 Series","Standard_E16-4as_v4","16" "Easv4 Series","Standard_E16-8as_v4","16" @@ -334,6 +499,24 @@ "Easv4 Series","Standard_E96ias_v4","96" "Easv4 Series Dedicated Host","easv4_type1","96" "Easv4 Series Dedicated Host","easv4_type2","112" +"Easv5 Internal Series","Internal_E16as_v5","8" +"Easv5 Internal Series","Internal_E20as_v5","10" +"Easv5 Internal Series","Internal_E2as_v5","1" +"Easv5 Internal Series","Internal_E32as_v5","16" +"Easv5 Internal Series","Internal_E48as_v5","24" +"Easv5 Internal Series","Internal_E4as_v5","2" +"Easv5 Internal Series","Internal_E64as_v5","32" +"Easv5 Internal Series","Internal_E8as_v5","4" +"Easv5 Internal Series","Internal_E96as_v5","48" +"Easv5 Promo Series","Standard_E16as_v5_Promo","8" +"Easv5 Promo Series","Standard_E20as_v5_Promo","10" +"Easv5 Promo Series","Standard_E2as_v5_Promo","1" +"Easv5 Promo Series","Standard_E32as_v5_Promo","16" +"Easv5 Promo Series","Standard_E48as_v5_Promo","24" +"Easv5 Promo Series","Standard_E4as_v5_Promo","2" +"Easv5 Promo Series","Standard_E64as_v5_Promo","31.9" +"Easv5 Promo Series","Standard_E8as_v5_Promo","4" +"Easv5 Promo Series","Standard_E96as_v5_Promo","47.8" "Easv5 Series","Standard_E112ias_v5","123.2" "Easv5 Series","Standard_E16-4as_v5","16" "Easv5 Series","Standard_E16-8as_v5","16" @@ -355,6 +538,7 @@ "Easv5 Series","Standard_E96-24as_v5","96" "Easv5 Series","Standard_E96-48as_v5","96" "Easv5 Series","Standard_E96as_v5","96" +"Easv5 Series","Standard_E96ias_v5","105.4" "Easv5 Series DedicatedHost","easv5_type1","112" "Eav4 Series","Standard_E16a_v4","16" "Eav4 Series","Standard_E20a_v4","20" @@ -365,6 +549,7 @@ "Eav4 Series","Standard_E64a_v4","64" "Eav4 Series","Standard_E8a_v4","8" "Eav4 Series","Standard_E96a_v4","96" +"Ebdsv5 Series","Ebdsv5","1" "Ebdsv5 Series","Standard_E112ibds_v5","123.2" "Ebdsv5 Series","Standard_E16bds_v5","16" "Ebdsv5 Series","Standard_E2bds_v5","2" @@ -375,6 +560,7 @@ "Ebdsv5 Series","Standard_E8bds_v5","8" "Ebdsv5 Series","Standard_E96bds_v5","96" "Ebdsv5 Series Dedicated Host","ebdsv5-type1","112" +"Ebsv5 Series","Ebsv5","1" "Ebsv5 Series","Standard_E112ibs_v5","123.2" "Ebsv5 Series","Standard_E16bs_v5","16" "Ebsv5 Series","Standard_E2bs_v5","2" @@ -410,22 +596,27 @@ "Edsv4 Series","Standard_E16-4ds_v4","16" "Edsv4 Series","Standard_E16-8ds_v4","16" "Edsv4 Series","Standard_E16ds_v4","16" +"Edsv4 Series","Standard_E16ds_v4_ADHType1","16" "Edsv4 Series","Standard_E20ds_v4","20" "Edsv4 Series","Standard_E2ds_v4","2" "Edsv4 Series","Standard_E32-16ds_v4","32" "Edsv4 Series","Standard_E32-8ds_v4","32" "Edsv4 Series","Standard_E32ds_v4","32" +"Edsv4 Series","Standard_E32ds_v4_ADHType1","32" "Edsv4 Series","Standard_E4-2ds_v4","4" "Edsv4 Series","Standard_E48ds_v4","48" "Edsv4 Series","Standard_E4ds_v4","4" +"Edsv4 Series","Standard_E4ds_v4_ADHType1","4" "Edsv4 Series","Standard_E64-16ds_v4","64" "Edsv4 Series","Standard_E64-32ds_v4","64" "Edsv4 Series","Standard_E64ds_v4","64" "Edsv4 Series","Standard_E8-2ds_v4","8" "Edsv4 Series","Standard_E8-4ds_v4","8" "Edsv4 Series","Standard_E8ds_v4","8" +"Edsv4 Series","Standard_E8ds_v4_ADHType1","8" "Edsv4 Series Dedicated Host","edsv4_type 1","68" "Edsv4 Series Dedicated Host","edsv4_type2","80.92" +"Edsv4 Series Isolated","Standard_E64ids_v4_SPECIAL","66.666667" "Edsv4 Series Isolated","Standard_E80ids_v4","80" "Edsv5 Series","Standard_E16-4ds_v5","16" "Edsv5 Series","Standard_E16-8ds_v5","16" @@ -457,6 +648,7 @@ "Edv4 Series","Standard_E4d_v4","4" "Edv4 Series","Standard_E64d_v4","64" "Edv4 Series","Standard_E8d_v4","8" +"Edv4 Series Isolated","Standard_E64id_v4_SPECIAL","1" "Edv5 Series","Standard_E104id_v5","114.4" "Edv5 Series","Standard_E16d_v5","16" "Edv5 Series","Standard_E20d_v5","20" @@ -467,6 +659,7 @@ "Edv5 Series","Standard_E64d_v5","64" "Edv5 Series","Standard_E8d_v5","8" "Edv5 Series","Standard_E96d_v5","96" +"Eiadmsv5-series Linux","Standard_E112_iadms_v5","1" "Epdsv5 Series","Standard_E16pds_v5","16" "Epdsv5 Series","Standard_E20pds_v5","20" "Epdsv5 Series","Standard_E2pds_v5","2" @@ -496,25 +689,32 @@ "ESv3 Series","Standard_E8-2s_v3","8" "ESv3 Series","Standard_E8-4s_v3","8" "ESv3 Series","Standard_E8s_v3","8" +"ESv3 Series Dedicated Host","esv3_type1","68" +"ESv3 Series Dedicated Host","esv3_type2","62" "ESv3 Series Dedicated Host","esv3_type3","68.82" "ESv3 Series Dedicated Host","esv3_type4","93" +"ESv3 Series Isolated","Standard_E64is_v3","1" "Esv4 Series","Standard_E16-4s_v4","16" "Esv4 Series","Standard_E16-8s_v4","16" "Esv4 Series","Standard_E16s_v4","16" +"Esv4 Series","Standard_E16s_v4_ADHType1","16" "Esv4 Series","Standard_E20s_v4","20" "Esv4 Series","Standard_E2s_v4","2" "Esv4 Series","Standard_E32-16s_v4","32" "Esv4 Series","Standard_E32-8s_v4","32" "Esv4 Series","Standard_E32s_v4","32" +"Esv4 Series","Standard_E32s_v4_ADHType1","32" "Esv4 Series","Standard_E4-2s_v4","4" "Esv4 Series","Standard_E48s_v4","48" "Esv4 Series","Standard_E4s_v4","4" +"Esv4 Series","Standard_E4s_v4_ADHType1","4" "Esv4 Series","Standard_E64-16s_v4","64" "Esv4 Series","Standard_E64-32s_v4","64" "Esv4 Series","Standard_E64s_v4","64" "Esv4 Series","Standard_E8-2s_v4","8" "Esv4 Series","Standard_E8-4s_v4","8" "Esv4 Series","Standard_E8s_v4","8" +"Esv4 Series","Standard_E8s_v4_ADHType1","8" "ESv4 Series Dedicated Host","esv4_type1","64" "ESv4 Series Dedicated Host","esv4_type2","83.84" "ESv4 Series Dedicated Host","standard_e64is_v4_special","64" @@ -541,6 +741,15 @@ "Esv5 Series","Standard_E96s_v5","96" "Esv5 Series DedicatedHost","esv5_type1","107" "Esv5 Series Isolated","Standard_E104is_v5","104" +"Ev3 Series","Standard_E16_v3","16" +"Ev3 Series","Standard_E2_v3","2" +"Ev3 Series","Standard_E20_v3","20" +"Ev3 Series","Standard_E32_v3","32" +"Ev3 Series","Standard_E4_v3","4" +"Ev3 Series","Standard_E48_v3","48" +"Ev3 Series","Standard_E64_v3","57.6" +"Ev3 Series","Standard_E8_v3","8" +"Ev3 Series Isolated","Standard_E64i_v3","1" "Ev4 Series","Standard_E16_v4","16" "Ev4 Series","Standard_E2_v4","2" "Ev4 Series","Standard_E20_v4","20" @@ -549,6 +758,7 @@ "Ev4 Series","Standard_E48_v4","48" "Ev4 Series","Standard_E64_v4","64" "Ev4 Series","Standard_E8_v4","8" +"Ev4 Series Isolated","Standard_E64i_v4_SPECIAL","1" "Ev5 Series","Standard_E104i_v5","114.4" "Ev5 Series","Standard_E16_v5","16" "Ev5 Series","Standard_E2_v5","2" @@ -559,12 +769,685 @@ "Ev5 Series","Standard_E64_v5","64" "Ev5 Series","Standard_E8_v5","8" "Ev5 Series","Standard_E96_v5","96" +"F Series","Standard_F1","1" +"F Series","Standard_F16","16" +"F Series","Standard_F2","2" +"F Series","Standard_F4","4" +"F Series","Standard_F8","8" +"Foundry_Agent_P3","3.3 70b FT","0.3" +"Foundry_Agent_P3","51 codex cd inp Dz","0.1" +"Foundry_Agent_P3","51 codex cd inp Gl","0.1" +"Foundry_Agent_P3","51 codex cd inp Rg","0.1" +"Foundry_Agent_P3","51 codex inp Dz","1.3" +"Foundry_Agent_P3","51 codex inp Gl","1.2" +"Foundry_Agent_P3","51 codex inp Rg","1.3" +"Foundry_Agent_P3","51 codex max cd inp Dz","0.1" +"Foundry_Agent_P3","51 codex max cd inp Gl","0.1" +"Foundry_Agent_P3","51 codex max cd inp Rg","0.1" +"Foundry_Agent_P3","51 codex max inp Dz","1.3" +"Foundry_Agent_P3","51 codex max inp Gl","1.2" +"Foundry_Agent_P3","51 codex max inp Rg","1.6" +"Foundry_Agent_P3","51 codex max opt Dz","11" +"Foundry_Agent_P3","51 codex max opt Gl","10" +"Foundry_Agent_P3","51 codex max opt Rg","12" +"Foundry_Agent_P3","51 codex mini inp Dz","0.2" +"Foundry_Agent_P3","51 codex mini inp Gl","0.2" +"Foundry_Agent_P3","51 codex mini inp Rg","0.3" +"Foundry_Agent_P3","51 codex mini opt Dz","2.2" +"Foundry_Agent_P3","51 codex mini opt Gl","2" +"Foundry_Agent_P3","51 codex mini opt Rg","2.4" +"Foundry_Agent_P3","51 codex opt Dz","11" +"Foundry_Agent_P3","51 codex opt Gl","10" +"Foundry_Agent_P3","51 codex opt Rg","12" +"Foundry_Agent_P3","52 chat 0210 cd inp Dz","0.1" +"Foundry_Agent_P3","52 chat 0210 cd inp Gl","0.1" +"Foundry_Agent_P3","52 chat 0210 cd inp Rg","0.2" +"Foundry_Agent_P3","52 chat 0210 inp Dz","2.4" +"Foundry_Agent_P3","52 chat 0210 inp Gl","1.7" +"Foundry_Agent_P3","52 chat 0210 inp Rg","1.9" +"Foundry_Agent_P3","52 chat 0210 opt Dz","15.4" +"Foundry_Agent_P3","52 chat 0210 opt Gl","14" +"Foundry_Agent_P3","52 chat 0210 opt Rg","16.9" +"Foundry_Agent_P3","52 codex cd inp Dz","0.1" +"Foundry_Agent_P3","52 codex cd inp Gl","0.2" +"Foundry_Agent_P3","52 codex cd inp Rg","0.1" +"Foundry_Agent_P3","52 codex inp Dz","1.9" +"Foundry_Agent_P3","52 codex inp Gl","2.1" +"Foundry_Agent_P3","52 codex inp Rg","1.9" +"Foundry_Agent_P3","52 codex opt Dz","15.4" +"Foundry_Agent_P3","52 codex opt Gl","14" +"Foundry_Agent_P3","52 codex opt Rg","18.4" +"Foundry_Agent_P3","A Event Analytics","1" +"Foundry_Agent_P3","Add-On Face Grouping","2" +"Foundry_Agent_P3","Add-On Formula","3" +"Foundry_Agent_P3","Add-On Layout","5" +"Foundry_Agent_P3","Agent_Commit_Units_100K","1" +"Foundry_Agent_P3","Agent_Commit_Units_20K","1" +"Foundry_Agent_P3","Agent_Commit_Units_500K","1" +"Foundry_Agent_P3","Apache Airflow job","1" +"Foundry_Agent_P3","API for GraphQL Query","1" +"Foundry_Agent_P3","Assistants-File Search-glbl","0.1" +"Foundry_Agent_P3","Assistants-File Search-regnl","0.1" +"Foundry_Agent_P3","Audio Content Extraction","0.3" +"Foundry_Agent_P3","Audio Field Extraction","0.8" +"Foundry_Agent_P3","autoscale for Data Warehouse","0.2" +"Foundry_Agent_P3","autoscale for Spark","0.2" +"Foundry_Agent_P3","Az-Code-Davinci","0.1" +"Foundry_Agent_P3","Az-Embeddings-Davinci","0.2" +"Foundry_Agent_P3","Az-Provisioned Throughput","2" +"Foundry_Agent_P3","babbage-002-FT-Hstng-glbl","1.7" +"Foundry_Agent_P3","babbage-002-FT-Hstng-regnl","1.7" +"Foundry_Agent_P3","babbage-002-FT-Trng-glbl","34" +"Foundry_Agent_P3","babbage-002-FT-Trng-regnl","34" +"Foundry_Agent_P3","Basic CC","0.1" +"Foundry_Agent_P3","Basic Doc Content Extraction","1" +"Foundry_Agent_P3","Batch2","1" +"Foundry_Agent_P3","Business","19" +"Foundry_Agent_P3","Business for non-GHE customers","19" +"Foundry_Agent_P3","C2","82.8" +"Foundry_Agent_P3","C2 Custom Model Hosting","12.5" +"Foundry_Agent_P3","C2 Custom Training","8.2" +"Foundry_Agent_P3","C3","24" +"Foundry_Agent_P3","C3 Custom Model Hosting","12.5" +"Foundry_Agent_P3","C3 Custom Training","6" +"Foundry_Agent_P3","C4","1451.6" +"Foundry_Agent_P3","C4 Custom Model Hosting","12.5" +"Foundry_Agent_P3","C4 Custom Training","4.5" +"Foundry_Agent_P3","CNV Neural HD Synthesis","48" +"Foundry_Agent_P3","Code-cushman-FineTuned-Training","26" +"Foundry_Agent_P3","Code-davinci","0.1" +"Foundry_Agent_P3","Commitment Tier App 150K hours","337500" +"Foundry_Agent_P3","Commitment Tier App 20K hours","75000" +"Foundry_Agent_P3","Commitment Tier App 400K hours","1.9" +"Foundry_Agent_P3","Commitment Tier App 50K hours","165000" +"Foundry_Agent_P3","Commitment Tier Azure 10000M","4.5" +"Foundry_Agent_P3","Commitment Tier Azure 1000M","6000" +"Foundry_Agent_P3","Commitment Tier Azure 250M","10.2" +"Foundry_Agent_P3","Commitment Tier Azure 4000M","6.8" +"Foundry_Agent_P3","Commitment Tier CLU Azure 10M","1.1" +"Foundry_Agent_P3","Commitment Tier CLU Azure 1M","1.6" +"Foundry_Agent_P3","Commitment Tier CLU Azure 25M","24000" +"Foundry_Agent_P3","Commitment Tier CLU Azure 3M","4080" +"Foundry_Agent_P3","Commitment Tier CLU Connected Cont 10M","9280" +"Foundry_Agent_P3","Commitment Tier CLU Connected Cont 1M","1280" +"Foundry_Agent_P3","Commitment Tier CLU Connected Cont 25M","19200" +"Foundry_Agent_P3","Commitment Tier CLU Connected Cont 3M","4080" +"Foundry_Agent_P3","Commitment Tier Connected 10000M","4.2" +"Foundry_Agent_P3","Commitment Tier Connected 1000M","7.1" +"Foundry_Agent_P3","Commitment Tier Connected 250M","9.7" +"Foundry_Agent_P3","Commitment Tier Connected 4000M","5.2" +"Foundry_Agent_P3","Commitment Tier CSTT Disconnected 100K","547200" +"Foundry_Agent_P3","Commitment Tier CSTT Disconnected 10K","111150" +"Foundry_Agent_P3","Commitment Tier CSTT Disconnected 2K","27360" +"Foundry_Agent_P3","Commitment Tier CSTT Disconnected 50K","427500" +"Foundry_Agent_P3","Commitment Tier Custom NTTS Disconnected 10000M","2016000" +"Foundry_Agent_P3","Commitment Tier Custom NTTS Disconnected 2000M","489600" +"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Azure 100K","0.5" +"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Azure 10K","7800" +"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Azure 2K","2400" +"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Azure 50K","30000" +"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Connected 100K","0.4" +"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Connected 10K","0.7" +"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Connected 2K","1824" +"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Connected 50K","28500" +"Foundry_Agent_P3","Commitment Tier DC CLU 10M","111360" +"Foundry_Agent_P3","Commitment Tier DC CLU 1M","15360" +"Foundry_Agent_P3","Commitment Tier DC CLU 25M","288000" +"Foundry_Agent_P3","Commitment Tier DC CLU 3M","39168" +"Foundry_Agent_P3","Commitment Tier Emb 10000M","53437.5" +"Foundry_Agent_P3","Commitment Tier Emb 1000M","5.7" +"Foundry_Agent_P3","Commitment Tier Emb 250M","7.8" +"Foundry_Agent_P3","Commitment Tier Emb 4000M","6.5" +"Foundry_Agent_P3","Commitment Tier Image Azure 2.5M","1500" +"Foundry_Agent_P3","Commitment Tier Image Azure 250K","0.6" +"Foundry_Agent_P3","Commitment Tier Image Azure 6.25M","3281" +"Foundry_Agent_P3","Commitment Tier Image Azure 625K","398" +"Foundry_Agent_P3","Commitment Tier Image Con 6.25M","0.4" +"Foundry_Agent_P3","Commitment Tier Image Conn 2.5M","1425" +"Foundry_Agent_P3","Commitment Tier Image Conn 250K","0.6" +"Foundry_Agent_P3","Commitment Tier Image Conn 625K","379" +"Foundry_Agent_P3","Commitment Tier Pre-Built Azure 1000K","7.5" +"Foundry_Agent_P3","Commitment Tier Pre-Built Azure 100K","900" +"Foundry_Agent_P3","Commitment Tier Pre-Built Azure 20K","11.8" +"Foundry_Agent_P3","Commitment Tier Pre-Built Azure 500K","8" +"Foundry_Agent_P3","Commitment Tier Pre-Built Connected 1000K","6000" +"Foundry_Agent_P3","Commitment Tier Pre-Built Connected 100K","720" +"Foundry_Agent_P3","Commitment Tier Pre-Built Connected 20K","9.5" +"Foundry_Agent_P3","Commitment Tier Pre-Built Connected 500K","6.4" +"Foundry_Agent_P3","Commitment Tier Pre-Built Disconnected 1000K","90000" +"Foundry_Agent_P3","Commitment Tier Pre-Built Disconnected 100K","10800" +"Foundry_Agent_P3","Commitment Tier Pre-Built Disconnected 20K","2280" +"Foundry_Agent_P3","Commitment Tier Pre-Built Disconnected 500K","48000" +"Foundry_Agent_P3","Commitment Tier Read Azure 16000K","0.4" +"Foundry_Agent_P3","Commitment Tier Read Azure 2000K","1500" +"Foundry_Agent_P3","Commitment Tier Read Azure 500K","0.9" +"Foundry_Agent_P3","Commitment Tier Read Azure 8000K","4200" +"Foundry_Agent_P3","Commitment Tier Read Connected 16000K","6480" +"Foundry_Agent_P3","Commitment Tier Read Connected 2000K","1080" +"Foundry_Agent_P3","Commitment Tier Read Connected 500K","0.6" +"Foundry_Agent_P3","Commitment Tier Read Connected 8000K","0.4" +"Foundry_Agent_P3","Commitment Tier Read Disconnected 16000K","77760" +"Foundry_Agent_P3","Commitment Tier Read Disconnected 2000K","12960" +"Foundry_Agent_P3","Commitment Tier Read Disconnected 500K","4050" +"Foundry_Agent_P3","Commitment Tier Read Disconnected 8000K","56700" +"Foundry_Agent_P3","Commitment Tier STT AddOn 100K","171000" +"Foundry_Agent_P3","Commitment Tier STT AddOn 10K","27787.5" +"Foundry_Agent_P3","Commitment Tier STT AddOn 2K","5472" +"Foundry_Agent_P3","Commitment Tier STT AddOn 50K","106875" +"Foundry_Agent_P3","Commitment Tier STT AddOn Azure 100K","15000" +"Foundry_Agent_P3","Commitment Tier STT AddOn Azure 10K","2437.5" +"Foundry_Agent_P3","Commitment Tier STT AddOn Azure 2K","480" +"Foundry_Agent_P3","Commitment Tier STT AddOn Azure 50K","0.1" +"Foundry_Agent_P3","Commitment Tier STT AddOn Connected 100K","0.1" +"Foundry_Agent_P3","Commitment Tier STT AddOn Connected 10K","0.1" +"Foundry_Agent_P3","Commitment Tier STT AddOn Connected 2K","0.2" +"Foundry_Agent_P3","Commitment Tier STT AddOn Connected 50K","8906.2" +"Foundry_Agent_P3","Commitment Tier Summarization 10M","67200" +"Foundry_Agent_P3","Commitment Tier Summarization 1M","15360" +"Foundry_Agent_P3","Commitment Tier Summarization 3M","31680" +"Foundry_Agent_P3","Commitment Tier Summarization Azure 10M","0.8" +"Foundry_Agent_P3","Commitment Tier Summarization Azure 3M","1.3" +"Foundry_Agent_P3","Commitment Tier Summarization Connected 10M","5600" +"Foundry_Agent_P3","Commitment Tier Summarization Connected 3M","1.1" +"Foundry_Agent_P3","Commitment Tier TA4H 10M","70000" +"Foundry_Agent_P3","Commitment Tier TA4H 1M","14" +"Foundry_Agent_P3","Commitment Tier TA4H 3M","11" +"Foundry_Agent_P3","Commitment Tier TA4H Connected 10M","5.5" +"Foundry_Agent_P3","Commitment Tier TA4H Connected 1M","14000" +"Foundry_Agent_P3","Commitment Tier TA4H Connected 3M","27500" +"Foundry_Agent_P3","Commitment Tier Txt Azure 10M","0.2" +"Foundry_Agent_P3","Commitment Tier Txt Azure 1M","338" +"Foundry_Agent_P3","Commitment Tier Txt Azure 2.5M","0.3" +"Foundry_Agent_P3","Commitment Tier Txt Azure 25M","6563" +"Foundry_Agent_P3","Commitment Tier Txt Conn 10M","2850" +"Foundry_Agent_P3","Commitment Tier Txt Conn 1M","0.3" +"Foundry_Agent_P3","Commitment Tier Txt Conn 2.5M","0.3" +"Foundry_Agent_P3","Commitment Tier Txt Conn 25M","6234" +"Foundry_Agent_P3","Compute Pool","0.2" +"Foundry_Agent_P3","Copilot and AI","0.3" +"Foundry_Agent_P3","Cosmos DB backup storage","0.3" +"Foundry_Agent_P3","Csms DB in MS Fabric","1" +"Foundry_Agent_P3","Custom - Fast Transcription","0.4" +"Foundry_Agent_P3","Custom Image Classification","20" +"Foundry_Agent_P3","Custom Object Detection","2" +"Foundry_Agent_P3","Custom Speech to Text Batch Teams","0.2" +"Foundry_Agent_P3","D3","9" +"Foundry_Agent_P3","Data Movement","0.2" +"Foundry_Agent_P3","Data Orchestration","1" +"Foundry_Agent_P3","Data Warehouse","1" +"Foundry_Agent_P3","davinci-002-FT-Hstng-glbl","1.7" +"Foundry_Agent_P3","davinci-002-FT-Hstng-regnl","1.7" +"Foundry_Agent_P3","davinci-002-FT-Trng-glbl","50" +"Foundry_Agent_P3","davinci-002-FT-Trng-regnl","50" +"Foundry_Agent_P3","dbt job","1" +"Foundry_Agent_P3","Digital Twin Builder","0.2" +"Foundry_Agent_P3","Digital Twin Builder Operation","1" +"Foundry_Agent_P3","Digital Twin Builder Query","0.2" +"Foundry_Agent_P3","Doc AI DZone 2505","3.2" +"Foundry_Agent_P3","Doc AI glbl 2505","3" +"Foundry_Agent_P3","Doc AI regnl 2505","3.6" +"Foundry_Agent_P3","Document Field Extraction","22" +"Foundry_Agent_P3","Embed Internal","16" +"Foundry_Agent_P3","embedding-davinci-regnl","0.2" +"Foundry_Agent_P3","Enterprise","39" +"Foundry_Agent_P3","Eventhouse","0.1" +"Foundry_Agent_P3","Eventstream Connector","1" +"Foundry_Agent_P3","Eventstream Data Traffic","0.2" +"Foundry_Agent_P3","Eventstream Flat","1" +"Foundry_Agent_P3","Eventstream Processor","0.2" +"Foundry_Agent_P3","Fabric Meter 15","1" +"Foundry_Agent_P3","Fabric Meter 23","0.5" +"Foundry_Agent_P3","Fabric Meter 27","1" +"Foundry_Agent_P3","Fabric Meter 28","1" +"Foundry_Agent_P3","Fabric Meter 29","1" +"Foundry_Agent_P3","Fabric Meter 31","0.2" +"Foundry_Agent_P3","Fabric Meter 34","1" +"Foundry_Agent_P3","Fabric Meter 36","0.2" +"Foundry_Agent_P3","Fabric Meter 37","1" +"Foundry_Agent_P3","Fabric Meter 38","1" +"Foundry_Agent_P3","Fabric Meter 39","1" +"Foundry_Agent_P3","Fabric Meter 40","1" +"Foundry_Agent_P3","Fabric Meter 41","1" +"Foundry_Agent_P3","Fabric Meter 42","1" +"Foundry_Agent_P3","Fabric Meter 43","1" +"Foundry_Agent_P3","Fabric Meter 44","1" +"Foundry_Agent_P3","Fabric Meter 45","1" +"Foundry_Agent_P3","Fabric Meter 46","0.2" +"Foundry_Agent_P3","Fabric Meter 47","1" +"Foundry_Agent_P3","Fabric Meter 48","1" +"Foundry_Agent_P3","Fabric Meter 49","0.2" +"Foundry_Agent_P3","Fabric Meter 50","0.1" +"Foundry_Agent_P3","Fabric Meter 51","1" +"Foundry_Agent_P3","Fabric Meter 52","0.2" +"Foundry_Agent_P3","Fabric Meter 53","0.1" +"Foundry_Agent_P3","Fabric Meter 54","1" +"Foundry_Agent_P3","Fabric Meter 55","1" +"Foundry_Agent_P3","Fabric Meter 56","1" +"Foundry_Agent_P3","Fabric Meter 57","0.1" +"Foundry_Agent_P3","Fabric Meter 58","0.2" +"Foundry_Agent_P3","Fabric Meter 59","1" +"Foundry_Agent_P3","Fabric Meter 60","1" +"Foundry_Agent_P3","Fabric_Capacity_CU_Hour","0.1" +"Foundry_Agent_P3","Fabric_Capacity_Data_Movement_Incremental_copy","1" +"Foundry_Agent_P3","Face Transaction","1" +"Foundry_Agent_P3","Fast Transcription","0.3" +"Foundry_Agent_P3","File Based Speech Translation Input","1" +"Foundry_Agent_P3","file-search-tool-calls-datazone","2.7" +"Foundry_Agent_P3","file-search-tool-calls-glbl","2.5" +"Foundry_Agent_P3","file-search-tool-calls-rgnl","3.4" +"Foundry_Agent_P3","Flux 1.1 Pro Dzone","44" +"Foundry_Agent_P3","Flux 1.1 Pro glbl","40" +"Foundry_Agent_P3","Flux 1.1 Pro regnl","48.3" +"Foundry_Agent_P3","gpt 4.5 0227 Outp glbl","0.1" +"Foundry_Agent_P3","GPT 5 Batch Inpt DZone","0.6" +"Foundry_Agent_P3","GPT 5 Batch Inpt Glbl","0.6" +"Foundry_Agent_P3","GPT 5 Batch outpt DZone","5.5" +"Foundry_Agent_P3","GPT 5 Batch outpt Glbl","5" +"Foundry_Agent_P3","GPT 5 cchd Inpt DZone","0.1" +"Foundry_Agent_P3","GPT 5 cchd Inpt Glbl","0.1" +"Foundry_Agent_P3","GPT 5 cchd Inpt Rgnl","0.1" +"Foundry_Agent_P3","GPT 5 Chat cchd Inpt DZone","0.1" +"Foundry_Agent_P3","GPT 5 Chat cchd Inpt Glbl","0.1" +"Foundry_Agent_P3","GPT 5 Chat cchd Inpt Rgnl","0.1" +"Foundry_Agent_P3","GPT 5 Chat Inpt DZone","1.3" +"Foundry_Agent_P3","GPT 5 Chat Inpt Glbl","1.2" +"Foundry_Agent_P3","GPT 5 Chat Inpt Rgnl","1.5" +"Foundry_Agent_P3","GPT 5 Chat outpt DZone","13.7" +"Foundry_Agent_P3","GPT 5 Chat outpt Glbl","12.5" +"Foundry_Agent_P3","GPT 5 Chat outpt Rgnl","12" +"Foundry_Agent_P3","GPT 5 Inpt DZone","1.3" +"Foundry_Agent_P3","GPT 5 Inpt Glbl","1.2" +"Foundry_Agent_P3","GPT 5 Inpt Rgnl","1.3" +"Foundry_Agent_P3","GPT 5 Mini Batch Inpt DZone","0.1" +"Foundry_Agent_P3","GPT 5 Mini Batch Inpt Glbl","0.1" +"Foundry_Agent_P3","GPT 5 Mini Batch outpt DZone","1.3" +"Foundry_Agent_P3","GPT 5 Mini Batch outpt Glbl","1" +"Foundry_Agent_P3","GPT 5 Mini Inpt DZone","0.2" +"Foundry_Agent_P3","GPT 5 Mini Inpt Glbl","0.2" +"Foundry_Agent_P3","GPT 5 Mini Inpt Rgnl","0.3" +"Foundry_Agent_P3","GPT 5 Mini outpt DZone","2.7" +"Foundry_Agent_P3","GPT 5 Mini outpt Glbl","2" +"Foundry_Agent_P3","GPT 5 Mini outpt Rgnl","2.4" +"Foundry_Agent_P3","gpt 5 mini Prty Inp Dzone","0.4" +"Foundry_Agent_P3","gpt 5 mini Prty Inp glbl","0.4" +"Foundry_Agent_P3","gpt 5 mini Prty Outp Dzone","3.9" +"Foundry_Agent_P3","gpt 5 mini Prty Outp glbl","3.6" +"Foundry_Agent_P3","GPT 5 Nano Batch outpt DZone","0.2" +"Foundry_Agent_P3","GPT 5 Nano Batch outpt Glbl","0.2" +"Foundry_Agent_P3","GPT 5 Nano outpt DZone","0.4" +"Foundry_Agent_P3","GPT 5 Nano outpt Glbl","0.4" +"Foundry_Agent_P3","GPT 5 Nano outpt Rgnl","0.4" +"Foundry_Agent_P3","GPT 5 outpt DZone","11" +"Foundry_Agent_P3","GPT 5 outpt Glbl","10" +"Foundry_Agent_P3","GPT 5 outpt Rgnl","12" +"Foundry_Agent_P3","gpt 5 pro out dzone","0.1" +"Foundry_Agent_P3","gpt 5 pro out glbl","0.1" +"Foundry_Agent_P3","gpt 5 Prty cchd Inp Dzone","0.2" +"Foundry_Agent_P3","gpt 5 Prty cchd Inp glbl","0.3" +"Foundry_Agent_P3","gpt 5 Prty Inp Dzone","2.7" +"Foundry_Agent_P3","gpt 5 Prty Inp glbl","2.5" +"Foundry_Agent_P3","gpt 5 Prty Outp Dzone","22" +"Foundry_Agent_P3","gpt 5 Prty Outp glbl","20" +"Foundry_Agent_P3","GPT 5.2 Batch inp Dz","0.9" +"Foundry_Agent_P3","GPT 5.2 Batch inp Gl","0.8" +"Foundry_Agent_P3","GPT 5.2 Batch opt Dz","7.7" +"Foundry_Agent_P3","GPT 5.2 Batch opt Gl","7" +"Foundry_Agent_P3","GPT 5.2 cd inp Dz","0.1" +"Foundry_Agent_P3","GPT 5.2 cd inp Gl","0.1" +"Foundry_Agent_P3","GPT 5.2 cd inp Rg","0.1" +"Foundry_Agent_P3","GPT 5.2 chat cd inp Dz","0.1" +"Foundry_Agent_P3","GPT 5.2 chat cd inp Gl","0.1" +"Foundry_Agent_P3","GPT 5.2 chat cd inp Rg","0.2" +"Foundry_Agent_P3","GPT 5.2 chat inp Dz","1.9" +"Foundry_Agent_P3","GPT 5.2 chat inp Gl","1.7" +"Foundry_Agent_P3","GPT 5.2 chat inp Rg","2.1" +"Foundry_Agent_P3","GPT 5.2 chat opt Dz","19.2" +"Foundry_Agent_P3","GPT 5.2 chat opt Gl","14" +"Foundry_Agent_P3","GPT 5.2 chat opt Rg","19.2" +"Foundry_Agent_P3","GPT 5.2 inp Dz","1.9" +"Foundry_Agent_P3","GPT 5.2 inp Gl","1.7" +"Foundry_Agent_P3","GPT 5.2 inp Rg","1.9" +"Foundry_Agent_P3","GPT 5.2 opt Dz","15.4" +"Foundry_Agent_P3","GPT 5.2 opt Gl","14" +"Foundry_Agent_P3","GPT 5.2 opt Rg","16.9" +"Foundry_Agent_P3","GPT 5.2 pro Batch inp Dz","11.5" +"Foundry_Agent_P3","GPT 5.2 pro Batch inp Gl","13.1" +"Foundry_Agent_P3","GPT 5.2 pro Batch opt Dz","92.4" +"Foundry_Agent_P3","GPT 5.2 pro Batch opt Gl","84" +"Foundry_Agent_P3","GPT 5.2 pro inp Dz","23.1" +"Foundry_Agent_P3","GPT 5.2 pro inp Gl","21" +"Foundry_Agent_P3","GPT 5.2 pro inp Rg","27.7" +"Foundry_Agent_P3","GPT 5.2 pro opt Dz","184.8" +"Foundry_Agent_P3","GPT 5.2 pro opt Gl","168" +"Foundry_Agent_P3","GPT 5.2 pro opt Rg","203.2" +"Foundry_Agent_P3","GPT 51 Batch inp Dz","0.6" +"Foundry_Agent_P3","GPT 51 Batch inp Gl","0.6" +"Foundry_Agent_P3","GPT 51 Batch opt Dz","5.5" +"Foundry_Agent_P3","GPT 51 Batch opt Gl","5" +"Foundry_Agent_P3","GPT 51 cd inp Dz","0.1" +"Foundry_Agent_P3","GPT 51 cd inp Gl","0.1" +"Foundry_Agent_P3","GPT 51 cd inp Rg","0.1" +"Foundry_Agent_P3","GPT 51 chat cd inp Dz","0.1" +"Foundry_Agent_P3","GPT 51 chat cd inp Gl","0.1" +"Foundry_Agent_P3","GPT 51 chat cd inp Rg","0.1" +"Foundry_Agent_P3","GPT 51 chat inp Dz","1.3" +"Foundry_Agent_P3","GPT 51 chat inp Gl","1.2" +"Foundry_Agent_P3","GPT 51 chat inp Rg","1.3" +"Foundry_Agent_P3","GPT 51 chat opt Dz","11" +"Foundry_Agent_P3","GPT 51 chat opt Gl","12.5" +"Foundry_Agent_P3","GPT 51 chat opt Rg","12" +"Foundry_Agent_P3","GPT 51 inp Dz","1.3" +"Foundry_Agent_P3","GPT 51 inp Gl","1.2" +"Foundry_Agent_P3","GPT 51 inp Rg","1.5" +"Foundry_Agent_P3","GPT 51 opt Dz","11" +"Foundry_Agent_P3","GPT 51 opt Gl","10" +"Foundry_Agent_P3","GPT 51 opt Rg","12" +"Foundry_Agent_P3","gpt aud mn in DZ 1215","11" +"Foundry_Agent_P3","gpt aud mn in gl 1215","10" +"Foundry_Agent_P3","gpt aud mn in rg 1215","11" +"Foundry_Agent_P3","gpt aud mn out DZ 1215","22" +"Foundry_Agent_P3","gpt aud mn out gl 1215","20" +"Foundry_Agent_P3","gpt aud mn out rg 1215","22" +"Foundry_Agent_P3","gpt aud mn txt in DZ 1215","0.6" +"Foundry_Agent_P3","gpt aud mn txt in gl 1215","0.5" +"Foundry_Agent_P3","gpt aud mn txt in rg 1215","0.6" +"Foundry_Agent_P3","gpt aud mn txt out DZ 1215","2.6" +"Foundry_Agent_P3","gpt aud mn txt out gl 1215","2.3" +"Foundry_Agent_P3","gpt aud mn txt out rg 1215","2.9" +"Foundry_Agent_P3","gpt img 1.5 in cd img DZ","2.2" +"Foundry_Agent_P3","gpt img 1.5 in cd img gl","2.5" +"Foundry_Agent_P3","gpt img 1.5 in cd txt DZ","1.3" +"Foundry_Agent_P3","gpt img 1.5 in cd txt gl","1.2" +"Foundry_Agent_P3","gpt img 1.5 in img DZ","8.8" +"Foundry_Agent_P3","gpt img 1.5 in img gl","8" +"Foundry_Agent_P3","gpt img 1.5 in txt DZ","5.5" +"Foundry_Agent_P3","gpt img 1.5 in txt gl","6.2" +"Foundry_Agent_P3","gpt img 1.5 out img DZ","35.2" +"Foundry_Agent_P3","gpt img 1.5 out img gl","40" +"Foundry_Agent_P3","gpt img 1.5 out txt DZ","11" +"Foundry_Agent_P3","gpt img 1.5 out txt gl","10" +"Foundry_Agent_P3","gpt rt aud mn cd in DZ 1215","0.3" +"Foundry_Agent_P3","gpt rt aud mn cd in gl 1215","0.2" +"Foundry_Agent_P3","gpt rt aud mn cd in rg 1215","0.3" +"Foundry_Agent_P3","gpt rt aud mn in DZ 1215","11" +"Foundry_Agent_P3","gpt rt aud mn in gl 1215","10" +"Foundry_Agent_P3","gpt rt aud mn in rg 1215","11" +"Foundry_Agent_P3","gpt rt aud mn out DZ 1215","22" +"Foundry_Agent_P3","gpt rt aud mn out gl 1215","20" +"Foundry_Agent_P3","gpt rt aud mn out rg 1215","26.3" +"Foundry_Agent_P3","gpt rt img mn in DZ 1215","0.8" +"Foundry_Agent_P3","gpt rt img mn in gl 1215","0.8" +"Foundry_Agent_P3","gpt rt img mn in rg 1215","0.9" +"Foundry_Agent_P3","gpt rt txt mn in DZ 1215","0.6" +"Foundry_Agent_P3","gpt rt txt mn in gl 1215","0.5" +"Foundry_Agent_P3","gpt rt txt mn in rg 1215","0.7" +"Foundry_Agent_P3","gpt rt txt mn out DZ 1215","2.6" +"Foundry_Agent_P3","gpt rt txt mn Out gl 1215","2.3" +"Foundry_Agent_P3","gpt rt txt mn out rg 1215","2.6" +"Foundry_Agent_P3","gpt-35-turbo16K-FT-Hstng-glbl","1.7" +"Foundry_Agent_P3","gpt-35-turbo16K-FT-Hstng-regnl","2.1" +"Foundry_Agent_P3","gpt-35-turbo16K-FT-Trng-regnl","85" +"Foundry_Agent_P3","gpt-35-turbo4K-FT-Hstng-glbl","2.1" +"Foundry_Agent_P3","gpt-35-turbo4K-FT-Hstng-regnl","2.1" +"Foundry_Agent_P3","gpt-35-turbo4K-FT-Trng-regnl","49.5" +"Foundry_Agent_P3","gpt-4-32K-Outp-glbl","0.1" +"Foundry_Agent_P3","gpt-4-32K-Output-regional","0.1" +"Foundry_Agent_P3","gpt-4-8K-FT-Hstng-glbl","6.2" +"Foundry_Agent_P3","gpt-4-8K-FT-Hstng-regnl","6.2" +"Foundry_Agent_P3","gpt-4-8K-FT-Trng-regnl","127.5" +"Foundry_Agent_P3","gpt-4-8K-FT-Trng-regnl tkn","0.1" +"Foundry_Agent_P3","gpt-4.1-ft hosting global","1.7" +"Foundry_Agent_P3","gpt-4.1-ft hosting regional","1.7" +"Foundry_Agent_P3","gpt-4.1-mini-ft hosting global","1.7" +"Foundry_Agent_P3","gpt-4.1-mini-ft hosting regional","1.7" +"Foundry_Agent_P3","gpt-4.1-nano-ft hosting global","1.7" +"Foundry_Agent_P3","gpt-4.1-nano-ft hosting regional","1.7" +"Foundry_Agent_P3","gpt-4o-0806-FT-Hstng-glbl","1.7" +"Foundry_Agent_P3","gpt-4o-0806-FT-Hstng-regnl","1.8" +"Foundry_Agent_P3","gpt-4o-mini-0718-FT-Hstng-glbl","1.7" +"Foundry_Agent_P3","gpt-4o-mini-0718-FT-Hstng-regnl","1.8" +"Foundry_Agent_P3","gpt4o mn trscb aud in dz 1215","3.2" +"Foundry_Agent_P3","gpt4o mn trscb aud in gl 1215","3" +"Foundry_Agent_P3","gpt4o mn trscb aud in rg 1215","3.9" +"Foundry_Agent_P3","gpt4o mn trscb txt in dz 1215","1.3" +"Foundry_Agent_P3","gpt4o mn trscb txt in gl 1215","1.2" +"Foundry_Agent_P3","gpt4o mn trscb txt in rg 1215","1.3" +"Foundry_Agent_P3","gpt4o mn trscb txt out dz 1215","5.5" +"Foundry_Agent_P3","gpt4o mn trscb txt out gl 1215","5" +"Foundry_Agent_P3","gpt4o mn trscb txt out rg 1215","6" +"Foundry_Agent_P3","gpt4o mn tts aud out dz 1215","13.1" +"Foundry_Agent_P3","gpt4o mn tts aud out gl 1215","12" +"Foundry_Agent_P3","gpt4o mn tts aud out rg 1215","14.5" +"Foundry_Agent_P3","gpt4o mn tts txt in dz 1215","0.6" +"Foundry_Agent_P3","gpt4o mn tts txt in gl 1215","0.5" +"Foundry_Agent_P3","gpt4o mn tts txt in rg 1215","0.6" +"Foundry_Agent_P3","gpt4o realtimePrvw audio inp glbl","0.1" +"Foundry_Agent_P3","gpt4o realtimePrvw audio inp regn","0.1" +"Foundry_Agent_P3","gpt4o realtimePrvw audio outp glbl","0.2" +"Foundry_Agent_P3","gpt4o realtimePrvw audio outp regn","0.2" +"Foundry_Agent_P3","gpt4o realtimePrvwAudInp DataZone","0.1" +"Foundry_Agent_P3","gpt4o realtimePrvwAudOutp DataZone","0.2" +"Foundry_Agent_P3","Graph data management","1" +"Foundry_Agent_P3","Graph data science","1" +"Foundry_Agent_P3","High Scale DF Comp","0.2" +"Foundry_Agent_P3","Image Field Extraction","6" +"Foundry_Agent_P3","Image Retrieval - Query","0.1" +"Foundry_Agent_P3","Image-DALL-E-2-glbl","2.5" +"Foundry_Agent_P3","Image-DALL-E-2-regnl","2" +"Foundry_Agent_P3","Image-Dall-E-3 HD HighRes-glbl","12" +"Foundry_Agent_P3","Image-Dall-E-3 HD HighRes-regnl EP","13.1" +"Foundry_Agent_P3","Image-Dall-E-3 HD LowRes-glbl","8" +"Foundry_Agent_P3","Image-Dall-E-3 HD LowRes-regnl EP","10" +"Foundry_Agent_P3","Image-Dall-E-3 Std HighRes-glbl","10" +"Foundry_Agent_P3","Image-Dall-E-3 Std HighRes-regnl EP","8.8" +"Foundry_Agent_P3","Image-Dall-E-3 Std LowRes-glbl","5" +"Foundry_Agent_P3","Image-Dall-E-3 Std LowRes-regnl EP","4.4" +"Foundry_Agent_P3","Internal Personal Voice","6.2" +"Foundry_Agent_P3","Internal Service Charge","1000" +"Foundry_Agent_P3","Kontext Pro Dzone","44" +"Foundry_Agent_P3","Kontext Pro glbl","40" +"Foundry_Agent_P3","Kontext Pro regnl","48.3" +"Foundry_Agent_P3","Layout","5" +"Foundry_Agent_P3","Liveness","15" +"Foundry_Agent_P3","Liveness and Verification","18.6" +"Foundry_Agent_P3","M1","3" +"Foundry_Agent_P3","M2","3.2" +"Foundry_Agent_P3","Map processing","1" +"Foundry_Agent_P3","Map services","1" +"Foundry_Agent_P3","ML Model Endpoint","1" +"Foundry_Agent_P3","Model Router","0.1" +"Foundry_Agent_P3","Model Router Datazone","0.1" +"Foundry_Agent_P3","MultiRecognizerSpeechToTextTeams","1.1" +"Foundry_Agent_P3","Neural HD Text to Speech","22" +"Foundry_Agent_P3","o1-pro Batch Outp Data Zone","0.3" +"Foundry_Agent_P3","o1-pro Batch Outp glbl","0.2" +"Foundry_Agent_P3","o1-pro Inp Data Zone","0.1" +"Foundry_Agent_P3","o1-pro Inp glbl","0.1" +"Foundry_Agent_P3","o1-pro Inp regnl","0.1" +"Foundry_Agent_P3","o1-pro Outp Data Zone","0.6" +"Foundry_Agent_P3","o1-pro Outp glbl","0.5" +"Foundry_Agent_P3","o1-pro Outp regnl","0.7" +"Foundry_Agent_P3","o3-deep research 0626-inp-cchd-dzone","2.7" +"Foundry_Agent_P3","o3-deep research 0626-inp-cchd-glbl","2.5" +"Foundry_Agent_P3","o3-deep research 0626-inp-dzone","11" +"Foundry_Agent_P3","o3-deep research 0626-inp-glbl","10" +"Foundry_Agent_P3","o3-deep research 0626-out-dzone","44" +"Foundry_Agent_P3","o3-deep research 0626-out-glbl","40" +"Foundry_Agent_P3","o3-mini RFT Training global","100" +"Foundry_Agent_P3","o3-mini RFT Training regional","110" +"Foundry_Agent_P3","o3-mini-ft hosting global","1" +"Foundry_Agent_P3","o3-mini-ft hosting regional","1.1" +"Foundry_Agent_P3","o4 mini dev RFT Training glbl","50" +"Foundry_Agent_P3","o4-mini RFT Training global","100" +"Foundry_Agent_P3","o4-mini RFT Training regional","121" +"Foundry_Agent_P3","o4-mini-ft hosting global","1.7" +"Foundry_Agent_P3","o4-mini-ft hosting regional","1.7" +"Foundry_Agent_P3","OAI-based Neural Text to Speech","15" +"Foundry_Agent_P3","OCR 1125 Dzone","2.2" +"Foundry_Agent_P3","OCR 1125 glbl","2" +"Foundry_Agent_P3","OCR DZone","1.1" +"Foundry_Agent_P3","OCR glbl","1" +"Foundry_Agent_P3","OCR regnl","1.2" +"Foundry_Agent_P3","OneLake BCDR Iterative Read Operation via proxy","0.2" +"Foundry_Agent_P3","OneLake BCDR Iterative Read Operations","1" +"Foundry_Agent_P3","OneLake BCDR Iterative Write Operations","0.1" +"Foundry_Agent_P3","OneLake BCDR Iterative Write Operations via proxy","1" +"Foundry_Agent_P3","OneLake BCDR Other Operations","1" +"Foundry_Agent_P3","OneLake BCDR Other Operations via proxy","1" +"Foundry_Agent_P3","OneLake BCDR Read Operations","0.1" +"Foundry_Agent_P3","OneLake BCDR Read Operations via proxy","1" +"Foundry_Agent_P3","OneLake BCDR Write Operations","1" +"Foundry_Agent_P3","OneLake BCDR Write Operations via proxy","0.2" +"Foundry_Agent_P3","OneLake Cache","0.2" +"Foundry_Agent_P3","OneLake diagnostics","1" +"Foundry_Agent_P3","OneLake Iterative Read Operations","1" +"Foundry_Agent_P3","OneLake Iterative Read Operations via proxy","0.2" +"Foundry_Agent_P3","OneLake Iterative Write Operations","1" +"Foundry_Agent_P3","OneLake Iterative Write Operations via proxy","1" +"Foundry_Agent_P3","OneLake Other Operations","1" +"Foundry_Agent_P3","OneLake Other Operations via proxy","1" +"Foundry_Agent_P3","OneLake Read Operations","1" +"Foundry_Agent_P3","OneLake Read Operations via proxy","1" +"Foundry_Agent_P3","OneLake Security","1" +"Foundry_Agent_P3","OneLake Write Operations","1" +"Foundry_Agent_P3","Phi-3-Medium-128K-Instruct-Finetuned","0.8" +"Foundry_Agent_P3","Phi-3-Medium-4K-Instruct-Finetuned","0.8" +"Foundry_Agent_P3","Phi-3-Mini-128K-Instruct-Finetuned","0.8" +"Foundry_Agent_P3","Phi-3-Small-128K-Instruct-Finetuned","0.8" +"Foundry_Agent_P3","Phi-3.5-Mini-Instruct-Finetuned","0.8" +"Foundry_Agent_P3","Phi-4-Mini-FT","0.8" +"Foundry_Agent_P3","Photo Avatar Creation","2000" +"Foundry_Agent_P3","Power BI","1" +"Foundry_Agent_P3","Provisioned Data Zone","1.1" +"Foundry_Agent_P3","Provisioned Global","1" +"Foundry_Agent_P3","Provisioned Throughput - Available","2" +"Foundry_Agent_P3","Provisioned Throughput Units","312" +"Foundry_Agent_P3","Provisioned Throughput Units Overage","2" +"Foundry_Agent_P3","Real Time Speech Translation Cstm Audio Output","2" +"Foundry_Agent_P3","Real Time Speech Translation Std Audio Output","1.5" +"Foundry_Agent_P3","Real Time Speech Translation Text Output","10" +"Foundry_Agent_P3","Rerank v4 Fast DZ","2.2" +"Foundry_Agent_P3","Rerank v4 Fast Glbl","2" +"Foundry_Agent_P3","Rerank v4 Pro DZ","2.7" +"Foundry_Agent_P3","Rerank v4 Pro Glbl","2.5" +"Foundry_Agent_P3","RTI Event Listener and Alert","1" +"Foundry_Agent_P3","RTI Event Operations","1" +"Foundry_Agent_P3","S1 Custom Model Hosting","10" +"Foundry_Agent_P3","S1 Custom Training","12.5" +"Foundry_Agent_P3","S1 Custom Translation","40" +"Foundry_Agent_P3","S1 Document","15" +"Foundry_Agent_P3","S1 Image","10" +"Foundry_Agent_P3","S1 Standard","15" +"Foundry_Agent_P3","S2","8.2" +"Foundry_Agent_P3","S2 Custom Model Hosting","12.5" +"Foundry_Agent_P3","S3","6" +"Foundry_Agent_P3","S3 Custom Model Hosting","10" +"Foundry_Agent_P3","S4","5.6" +"Foundry_Agent_P3","S4 Custom Model Hosting","10" +"Foundry_Agent_P3","Shelf Image Composition","2.5" +"Foundry_Agent_P3","Shelf Planogram Compliance","5" +"Foundry_Agent_P3","Shelf Product Recognition","5" +"Foundry_Agent_P3","Sora 1080p 1-5s glbl","1.3" +"Foundry_Agent_P3","Sora 1080p 1-5s regnl","1.6" +"Foundry_Agent_P3","Sora 1080p 11-15s glbl","2.8" +"Foundry_Agent_P3","Sora 1080p 11-15s regnl","2.8" +"Foundry_Agent_P3","Sora 1080p 16-20s glbl","3.6" +"Foundry_Agent_P3","Sora 1080p 16-20s regnl","3.9" +"Foundry_Agent_P3","Sora 1080p 6-10s glbl","1.8" +"Foundry_Agent_P3","Sora 1080p 6-10s regnl","2" +"Foundry_Agent_P3","Sora 1080p Sq 1-5s glbl","0.5" +"Foundry_Agent_P3","Sora 1080p Sq 1-5s regnl","0.5" +"Foundry_Agent_P3","Sora 1080p Sq 11-15s glbl","1.1" +"Foundry_Agent_P3","Sora 1080p Sq 11-15s regnl","1.1" +"Foundry_Agent_P3","Sora 1080p Sq 16-20s glbl","1.3" +"Foundry_Agent_P3","Sora 1080p Sq 16-20s regnl","1.6" +"Foundry_Agent_P3","Sora 1080p Sq 6-10s glbl","0.7" +"Foundry_Agent_P3","Sora 1080p Sq 6-10s regnl","0.8" +"Foundry_Agent_P3","Sora 2 dzone","0.1" +"Foundry_Agent_P3","Sora 2 glbl","0.1" +"Foundry_Agent_P3","Sora 2 pro dzone","0.3" +"Foundry_Agent_P3","Sora 2 pro glbl","0.2" +"Foundry_Agent_P3","Sora 2 pro high res dzone","0.5" +"Foundry_Agent_P3","Sora 2 pro high res glbl","0.5" +"Foundry_Agent_P3","Sora 2 pro high res rgnl","0.6" +"Foundry_Agent_P3","Sora 2 pro rgnl","0.3" +"Foundry_Agent_P3","Sora 2 rgnl","0.1" +"Foundry_Agent_P3","Sora 480p 1-20s glbl","0.2" +"Foundry_Agent_P3","Sora 480p 1-20s regnl","0.2" +"Foundry_Agent_P3","Sora 480p Sq 1-20s glbl","0.1" +"Foundry_Agent_P3","Sora 480p Sq 1-20s regnl","0.1" +"Foundry_Agent_P3","Sora 720p 1-5s glbl","0.4" +"Foundry_Agent_P3","Sora 720p 1-5s regnl","0.4" +"Foundry_Agent_P3","Sora 720p 11-15s glbl","0.6" +"Foundry_Agent_P3","Sora 720p 11-15s regnl","0.6" +"Foundry_Agent_P3","Sora 720p 16-20s glbl","0.7" +"Foundry_Agent_P3","Sora 720p 16-20s regnl","0.9" +"Foundry_Agent_P3","Sora 720p 6-10s glbl","0.5" +"Foundry_Agent_P3","Sora 720p 6-10s regnl","0.5" +"Foundry_Agent_P3","Sora 720p Sq 1-20s glbl","0.2" +"Foundry_Agent_P3","Sora 720p Sq 1-20s regnl","0.2" +"Foundry_Agent_P3","Spark Mem Op","1" +"Foundry_Agent_P3","Spatial Presenter","5" +"Foundry_Agent_P3","Speech-Text to Speech HD-global","30" +"Foundry_Agent_P3","Speech-Text to Speech HD-Regional","36.2" +"Foundry_Agent_P3","Speech-Text to Speech-global","15" +"Foundry_Agent_P3","Speech-Text to Speech-Regional","15" +"Foundry_Agent_P3","Speech-to-Text-Batch-Whisper-glbl","0.3" +"Foundry_Agent_P3","Speech-to-Text-Batch-Whisper-regnl","0.4" +"Foundry_Agent_P3","SQL database in Microsoft Fabric","0.2" +"Foundry_Agent_P3","SQL database in Microsoft Fabric - LR","0.2" +"Foundry_Agent_P3","SQL Storage","0.2" +"Foundry_Agent_P3","SRE","0.1" +"Foundry_Agent_P3","SSIS in Fabric","1" +"Foundry_Agent_P3","Standard","0.3" +"Foundry_Agent_P3","Standard Doc Content Extraction","5" +"Foundry_Agent_P3","Standard Pay As You Go","15" +"Foundry_Agent_P3","Standard S1 CC","0.3" +"Foundry_Agent_P3","Standard S2 CC","1.9" +"Foundry_Agent_P3","Standard S3 CC","2.9" +"Foundry_Agent_P3","Standard Streaming","0.5" +"Foundry_Agent_P3","Storage","0.2" +"Foundry_Agent_P3","Storage Optimized L1 CC","4.2" +"Foundry_Agent_P3","Storage Optimized L2 CC","8.4" +"Foundry_Agent_P3","Text to Speech - Personal Voice","600" +"Foundry_Agent_P3","TTS Custom Avatar Batch","2" +"Foundry_Agent_P3","TTS Custom Avatar Hosting","0.5" +"Foundry_Agent_P3","TTS Custom Avatar Realtime","0.5" +"Foundry_Agent_P3","TTS Custom Avatar Training","15" +"Foundry_Agent_P3","TTS HD Custom Avatar Batch","2.7" +"Foundry_Agent_P3","TTS HD Custom Avatar Realtime","0.8" +"Foundry_Agent_P3","TTS HD Standard Avatar Batch","1.3" +"Foundry_Agent_P3","TTS HD Standard Avatar Realtime","0.6" +"Foundry_Agent_P3","TTS Standard Avatar Batch","1" +"Foundry_Agent_P3","TTS Standard Avatar Realtime","0.6" +"Foundry_Agent_P3","user data functions","0.1" +"Foundry_Agent_P3","User Messages","0.2" +"Foundry_Agent_P3","Vectorize Image","0.1" +"Foundry_Agent_P3","Video Content Extraction","1" +"Foundry_Agent_P3","Video Field Extraction","9" +"Foundry_Agent_P3","Video Retrieval - Query","0.2" +"Foundry_Agent_P3","Video Retrieval - Summary","6" +"Foundry_Agent_P3","Video Retrieval and Description - Ingestion","3" +"Foundry_Agent_P3","Video Translation AddOn PersonalVoice","0.2" +"Foundry_Agent_P3","Video Translation Automated","1" +"Foundry_Agent_P3","Video Translation Cstm Audio Output","20" +"Foundry_Agent_P3","Video Translation Edit Text to Video","0.2" +"Foundry_Agent_P3","Video Translation Input","5" +"Foundry_Agent_P3","Video Translation Std Audio Output","15" +"Foundry_Agent_P3","VNet Data Gateway","1" +"Foundry_Agent_P3","Voice Conversion - Standard","0.1" +"FS Series","Standard_F16s","16" +"FS Series","Standard_F1s","1" +"FS Series","Standard_F2s","2" +"FS Series","Standard_F4s","4" +"FS Series","Standard_F8s","8" "FSv2 Series","Standard_F16s_v2","16" "FSv2 Series","Standard_F2s_v2","2" "FSv2 Series","Standard_F32s_v2","32" "FSv2 Series","Standard_F48s_v2","48" "FSv2 Series","Standard_F4s_v2","4" "FSv2 Series","Standard_F64s_v2","64" +"FSv2 Series","Standard_F72fs_v2","72" "FSv2 Series","Standard_F72s_v2","72" "FSv2 Series","Standard_F8s_v2","8" "FSv2 Series Dedicated Host","fsv2 type3","93.6" @@ -576,33 +1459,82 @@ "FX Series Linux","Standard_FX36mds","36" "FX Series Linux","Standard_FX48mds","48" "FX Series Linux","Standard_FX4mds","4" +"G Series","Standard_G1","1" +"G Series","Standard_G2","2" +"G Series","Standard_G3","4" +"G Series","Standard_G4","8" +"G Series","Standard_G5","14.2" +"Gen7 IaaS LI_internal series Linux","Internal_Gen7_IaaS_LI","1" +"GS Series","Standard_GS1","1" +"GS Series","Standard_GS2","2" +"GS Series","Standard_GS3","4" +"GS Series","Standard_GS4","8" +"GS Series","Standard_GS4-4","8" +"GS Series","Standard_GS4-8","8" +"GS Series","Standard_GS5","14.2" +"GS Series","Standard_GS5-16","14.2" +"GS Series","Standard_GS5-8","14.2" +"H Series","Standard_H16","2" +"H Series","Standard_H8","1" +"H Series High Memory","Standard_H16m","2" +"H Series High Memory","Standard_H8m","1" +"H Series High Memory Low Latency","Standard_H16mr","1" +"H Series Low Latency","Standard_H16r","1" "HBrsv3 Series Low Latency","Standard_HB120-16rs_v3","120" "HBrsv3 Series Low Latency","Standard_HB120-32rs_v3","120" "HBrsv3 Series Low Latency","Standard_HB120-64rs_v3","120" "HBrsv3 Series Low Latency","Standard_HB120-96rs_v3","120" "HBrsv3 Series Low Latency","Standard_HB120rs_v3","120" +"HBS Series","Standard_HB60-15rs","1" +"HBS Series","Standard_HB60-30rs","1" +"HBS Series","Standard_HB60-45rs","1" +"HBS Series","Standard_HB60rs","1" "HBSv2 Series Low Latency","Standard_HB120-16rs_v2","120" "HBSv2 Series Low Latency","Standard_HB120-32rs_v2","120" "HBSv2 Series Low Latency","Standard_HB120-64rs_v2","120" "HBSv2 Series Low Latency","Standard_HB120-96rs_v2","120" +"HBSv2 Series Low Latency","Standard_HB120rs_v2","120" "HCS Series","Standard_HC44-16rs","44" "HCS Series","Standard_HC44-32rs","44" "HCS Series","Standard_HC44rs","44" +"Internal series Linux","Internal_NPHH_128ids","1" +"Internal series Linux","Internal_NPMM_128ids","1" +"Internal_Gen8_MM_LI Linux","Internal_Gen8_LMMM_128ids_LI","4" +"Internal_Gen8_MM_LI Linux","Internal_Gen8_LMMM_32ds_LI","1" +"Internal_Gen8_MM_LI Linux","Internal_Gen8_LMMM_64ds_LI","2" "Lasv3 Series DedicatedHost","lasv3_type1","80" +"Lasv3 Series Linux","Standard_L112ias_v3","123.2" "Lasv3 Series Linux","Standard_L16as_v3","16" "Lasv3 Series Linux","Standard_L32as_v3","32" "Lasv3 Series Linux","Standard_L48as_v3","48" "Lasv3 Series Linux","Standard_L64as_v3","64" "Lasv3 Series Linux","Standard_L80as_v3","80" "Lasv3 Series Linux","Standard_L8as_v3","8" +"Lasv3 Series Linux","Standard_L96ias_v3","104.8" +"LS Series","Standard_L16s","4" +"LS Series","Standard_L32s","8" +"LS Series","Standard_L4s","1" +"LS Series","Standard_L8s","2" +"LSv2 Series","Standard_L16s_v2","2" +"LSv2 Series","Standard_L32s_v2","4" +"LSv2 Series","Standard_L48s_v2","6" +"LSv2 Series","Standard_L64s_v2","8" +"LSv2 Series","Standard_L80s_v2","10" +"LSv2 Series","Standard_L8s_v2","1" +"LSv2 Series","Standard_L96s_v2","12" "LSv2 Series Dedicated Host","lsv2_type1","80" +"LSv2 Series Isolated","Standard_L88is_v2","1" +"Lsv2_Internal-Series Linux","Internal_L128is_v2","1" "Lsv3 Series DedicatedHost","lsv3_type1","80" +"Lsv3 Series Linux","Standard_L104is_v3","104" +"Lsv3 Series Linux","Standard_L112is_v3","112" "Lsv3 Series Linux","Standard_L16s_v3","16" "Lsv3 Series Linux","Standard_L32s_v3","32" "Lsv3 Series Linux","Standard_L48s_v3","48" "Lsv3 Series Linux","Standard_L64s_v3","64" "Lsv3 Series Linux","Standard_L80s_v3","80" "Lsv3 Series Linux","Standard_L8s_v3","8" +"Lsv3 Series Linux","Standard_L96is_v3","96" "MdSv2 Series 32 Disk","Standard_M32dms_v2","1" "MdSv2 Series 64 Disk","Standard_M64ds_v2","1" "Mdsv2 Series Dedicated Host","mdsv2medmem_type1","1" @@ -617,6 +1549,8 @@ "MS Series","Standard_M64","1" "MS Series","Standard_M64s","1" "MS Series Dedicated Host","ms_type1","1" +"MS Series Fractional","Standard_M16s","1" +"MS Series Fractional","Standard_M32s","1.3" "MS Series Fractional High Memory","Standard_M16-4ms","2" "MS Series Fractional High Memory","Standard_M16-8ms","2" "MS Series Fractional High Memory","Standard_M16ms","2" @@ -638,26 +1572,51 @@ "MS Series High Memory","Standard_M64m","1" "MS Series High Memory","Standard_M64ms","1" "MS Series HM Dedicated Host","msm_type1","1" +"MSv2 Series","Standard_M208-104s_v2","1" +"MSv2 Series","Standard_M208-52s_v2","1" "MSv2 Series","Standard_M208s_v2","1" +"MSv2 Series","Standard_M416-104s_v2","2.2" "MSv2 Series","Standard_M416-208s_v2","2.2" +"MSv2 Series","Standard_M416is_v2","2.2" "MSv2 Series","Standard_M416s_v2","2.2" "MSv2 Series 192ms","Standard_M192ims_v2","1" "MSv2 Series 32","Standard_M32ms_v2","1" "MSv2 Series 64","Standard_M64s_v2","1" "MSv2 Series Dedicated Host","msv2_type1","1" "MSv2 Series Disk 192s","Standard_M192is_v2","1" +"MSv2 Series Fractional","Standard_M192s_v2","8" +"MSv2 Series Fractional","Standard_M24s_v2","1" +"MSv2 Series Fractional","Standard_M48s_v2","2" +"MSv2 Series Fractional","Standard_M96s_v2","4" +"MSv2 Series Fractional High Memory","Standard_M192ms_v2","8" +"MSv2 Series Fractional High Memory","Standard_M24ms_v2","1" +"MSv2 Series Fractional High Memory","Standard_M48ms_v2","2" +"MSv2 Series Fractional High Memory","Standard_M96ms_v2","4" "MSv2 Series Fractional High Memory 128s","Standard_M128s_v2","1" +"MSv2 Series High Memory","Standard_M208-104ms_v2","4.4" +"MSv2 Series High Memory","Standard_M208-52ms_v2","4.4" "MSv2 Series High Memory","Standard_M208ms_v2","4.4" +"MSv2 Series High Memory","Standard_M416-104ms_v2","9.8" "MSv2 Series High Memory","Standard_M416-208ms_v2","9.8" "MSv2 Series High Memory","Standard_M416ms_v2","9.8" "MSv2 Series High Memory","Standard_M416s_10_v2","8.16" "MSv2 Series High Memory","Standard_M416s_8_v2","6.5" "MSv2 Series High Memory","Standard_M416s_9_v2","7.36" +"MSv2 Series High Memory","Standard_M64-32ms_v2","1" "MSv2 Series High Memory 128ms","Standard_M128ms_v2","1" "MSv2 Series HM Dedicated Host","msmv2_type1","1" "MSv2 Series MedMem Dedicated Host","msv2medmem type1","1" "MSv2 Series MedMem HM Dedicated Host","mmsv2medmem-type1","1" +"MSv2 Series MedMem HM Dedicated Host","Msmv2MedMem Type1","1" "MSv2 Series Memory","Standard_M64ms_v2","1" +"Msv2 XS Large Series","Standard_M832ixs","1" +"Msv2 XS Large Series","Standard_M832ixs_v2","1.8" +"MSv2 XS Series","Standard_M420ixs_v2","1" +"MSv2 XS Series","Standard_M420xs_v2","1" +"NC Series","Standard_NC12","2" +"NC Series","Standard_NC24","4" +"NC Series","Standard_NC6","1" +"NC Series Low Latency","Standard_NC24r","1" "NCads A100 v4 Series Linux","Standard_NC24ads_A100_v4","24" "NCads A100 v4 Series Linux","Standard_NC48ads_A100_v4","48" "NCads A100 v4 Series Linux","Standard_NC96ads_A100_v4","96" @@ -668,14 +1627,33 @@ "NCasA10_v4 Linux","Standard_NC16ads_A10_v4","16" "NCasA10_v4 Linux","Standard_NC32ads_A10_v4","32" "NCasA10_v4 Linux","Standard_NC8ads_A10_v4","8" +"NCSv2 Series","Standard_NC12s_v2","2" +"NCSv2 Series","Standard_NC24s_v2","4" +"NCSv2 Series","Standard_NC6s_v2","1" +"NCSv2 Series Low Latency","Standard_NC24rs_v2","1" +"NCSv3 Series","Standard_NC12s_v3","2" +"NCSv3 Series","Standard_NC24s_v3","4" +"NCSv3 Series","Standard_NC6s_v3","1" +"NCSv3 Series Low Latency","Standard_NC24rs_v3","1" "NDamsr A100 v4 Series","ndamsra100v4_type1","96" +"NDamsr A100 v4 Series Linux","Standard_ND112amsr_A100_v4","106.56" +"NDamsr A100 v4 Series Linux","Standard_ND112asr_A100_v4","106.56" +"NDamsr A100 v4 Series Linux","Standard_ND96ams_A100_v4","106.56" "NDamsr A100 v4 Series Linux","Standard_ND96amsr_A100_v4","106.56" "NDasr A100 v4 Series","ndasra100v4_type1","105.6" +"NDasr A100 v4 Series","Standard_ND96asr_A100_v4","96" "NDasr A100 v4 Series","Standard_ND96asr_v4","96" "NDrSv2 Series Low Latency","Standard_ND40rs_v2","40" +"NDS Series","Standard_ND12s","2" +"NDS Series","Standard_ND24s","4" +"NDS Series","Standard_ND6s","1" +"NDS Series Low Latency","Standard_ND24rs","1" "NP Series","Standard_NP10s","10" "NP Series","Standard_NP20s","20" "NP Series","Standard_NP40s","40" +"NV Series","Standard_NV12","2" +"NV Series","Standard_NV24","4" +"NV Series","Standard_NV6","1" "NVadsA10_v5 DedicatedHost","nvadsa10v5_type1","72" "NVadsA10_v5 Linux","Standard_NV12ads_A10_v5","12" "NVadsA10_v5 Linux","Standard_NV18ads_A10_v5","21.12" @@ -683,6 +1661,82 @@ "NVadsA10_v5 Linux","Standard_NV36ads_A10_v5","42.3" "NVadsA10_v5 Linux","Standard_NV6ads_A10_v5","6" "NVadsA10_v5 Linux","Standard_NV72ads_A10_v5","86.16" +"NVasv4 Series","Standard_NV16as_v4","4" +"NVasv4 Series","Standard_NV32as_v4","8" +"NVasv4 Series","Standard_NV4as_v4","1" +"NVasv4 Series","Standard_NV8as_v4","2" +"NVasv4 Series Dedicated Host","NVasv4_Type1","1" +"NVSv3 Series","Standard_NV12s_v3","1" +"NVSv3 Series","Standard_NV24s_v3","2" +"NVSv3 Series","Standard_NV48s_v3","4" +"NVSv3 Series Dedicated Host","NVsv3_Type1","1" +"NVSv3 Series High Memory","Standard_NV24ms_v3","1" +"NVSv3 Series High Memory","Standard_NV32ms_v3","1.2" +"Red Hat Enterprise Linux","Red Hat Enterprise Linux ARM64 1-4 vCPU","1" +"Red Hat Enterprise Linux","Red Hat Enterprise Linux ARM64 5plus vCPU","2.1" +"Red Hat Enterprise Linux","Red Hat Enterprise Linux for ARM64 1-4 vCPU","1" +"Red Hat Enterprise Linux","Red Hat Enterprise Linux for ARM64 5plus vCPU","1" +"Red Hat Enterprise Linux","Red Hat Enterprise Linux for ARM64 BYOS","1" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_1_4_vCPU_VM","1" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_1_vCPU_VM","1" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_12_vCPU_VM","9" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_120_vCPU_VM","80" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_128_vCPU_VM","85.3" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_144_vCPU_VM","96" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_16_vCPU_VM","12" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_192_vCPU_VM","128" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_2_vCPU_VM","2" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_20_vCPU_VM","15" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_208_vCPU_VM","138.6" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_24_vCPU_VM","18" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_32_vCPU_VM","24" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_4_vCPU_VM","4" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_40_vCPU_VM","30" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_416_vCPU_VM","277.3" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_420_vCPU_VM","280" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_44_vCPU_VM","33" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_48_vCPU_VM","36" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_5_vCPU_VM","2.1" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_52_vCPU_VM","39" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_6_vCPU_VM","6" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_60_vCPU_VM","45" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_64_vCPU_VM","48" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_72_vCPU_VM","54" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_8_vCPU_VM","8" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_80_vCPU_VM","60" +"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_96_vCPU_VM","72" +"Red Hat Enterprise Linux for SAP with HA","RHEL_SAP_HA_1-4_vCPU","1" +"Red Hat Enterprise Linux for SAP with HA","RHEL_SAP_HA_5plus_vCPU","2.3" +"Red Hat Enterprise Linux with HA","RHEL_HA_1-4_vCPU","1" +"Red Hat Enterprise Linux with HA","RHEL_HA_5plus_vCPU","2" +"RHEL for SAP Business Applications","52 vCPU VM","1" +"SQL on IaaS","Standard_SQLG7_AMD_IaaS","1" +"SQLG7","SQLG7 IaaS","1" +"SQLG7","SQLG7 NP104s","1" +"SQLG7","Standard_SQLG7_AMD_NVME","2" +"SQLG7","Standard_SQLG7_NVME","1.6" +"SUSE Enterprise Linux Server for SQL with HA","SUSE_Enterprise_Linux_Server_for_SQL_with_HA_1-2_vCPU","1" +"SUSE Enterprise Linux Server for SQL with HA","SUSE_Enterprise_Linux_Server_for_SQL_with_HA_3-4_vCPU","1.9" +"SUSE Enterprise Linux Server for SQL with HA","SUSE_Enterprise_Linux_Server_for_SQL_with_HA_5_vCPU","2.1" +"SUSE Linux Enterprise Server for HPC Priority","SLES_HPC_Priority_1-2_vCPU_VM","1" +"SUSE Linux Enterprise Server for HPC Priority","SLES_HPC_Priority_3-4_vCPU_VM","2" +"SUSE Linux Enterprise Server for HPC Priority","SLES_HPC_Priority_5plus_vCPU_VM","2.6" +"SUSE Linux Enterprise Server for HPC Standard","SLES_HPC_Standard_1-2_vCPU_VM","1" +"SUSE Linux Enterprise Server for HPC Standard","SLES_HPC_Standard_3-4_vCPU_VM","1.9" +"SUSE Linux Enterprise Server for HPC Standard","SLES_HPC_Standard_5plus_vCPU_VM","2.9" +"SUSE Linux Enterprise Server for SAP Standard","SLES_SAP_Priority_1-2_vCPU_VM","1" +"SUSE Linux Enterprise Server for SAP Standard","SLES_SAP_Priority_3-4_vCPU_VM","2" +"SUSE Linux Enterprise Server for SAP Standard","SLES_SAP_Priority_5plus_vCPU_VM","2.4" +"SUSE Linux Enterprise Server for SAP Standard","SUSE_for_SAP_Linux_Enterprise_Server_1_2_vCPU_VM","1" +"SUSE Linux Enterprise Server for SAP Standard","SUSE_for_SAP_Linux_Enterprise_Server_3_4_vCPU_VM","2" +"SUSE Linux Enterprise Server for SAP Standard","SUSE_for_SAP_Linux_Enterprise_Server_5_vCPU_VM","2.4" +"SUSE Linux Enterprise Server Priority","SLES_Priority_1_vCPU_VM","1" +"SUSE Linux Enterprise Server Priority","SLES_Priority_2-4_vCPU_VM","2" +"SUSE Linux Enterprise Server Priority","SLES_Priority_6_vCPU_VM","3" +"SUSE Linux Enterprise Server Priority","SLES_Priority_8plus_vCPU_VM","3.2" +"SUSE Linux Enterprise Server Standard","SLES_Standard_1-2_vCPU_VM","1" +"SUSE Linux Enterprise Server Standard","SLES_Standard_3-4_vCPU_VM","1.9" +"SUSE Linux Enterprise Server Standard","SLES_Standard_5plus_vCPU_VM","2.3" "Virtual Machines Dadsv6-series Linux","Standard_D16ads_v6","16" "Virtual Machines Dadsv6-series Linux","Standard_D2ads_v6","2" "Virtual Machines Dadsv6-series Linux","Standard_D32ads_v6","32" @@ -858,19 +1912,25 @@ "Virtual Machines Dpdsv6-series Linux","Standard_D16pds_v6","16" "Virtual Machines Dpdsv6-series Linux","Standard_D2pds_v6","2" "Virtual Machines Dpdsv6-series Linux","Standard_D32pds_v6","32" +"Virtual Machines Dpdsv6-series Linux","Standard_D32pdus_v6","32" "Virtual Machines Dpdsv6-series Linux","Standard_D48pds_v6","48" "Virtual Machines Dpdsv6-series Linux","Standard_D4pds_v6","4" "Virtual Machines Dpdsv6-series Linux","Standard_D64pds_v6","64" +"Virtual Machines Dpdsv6-series Linux","Standard_D64pdus_v6","64" "Virtual Machines Dpdsv6-series Linux","Standard_D8pds_v6","8" "Virtual Machines Dpdsv6-series Linux","Standard_D96pds_v6","96" +"Virtual Machines Dpdsv6-series Linux","Standard_D96pdus_v6","96" "Virtual Machines Dpldsv6-series Linux","Standard_D16plds_v6","16" "Virtual Machines Dpldsv6-series Linux","Standard_D2plds_v6","2" "Virtual Machines Dpldsv6-series Linux","Standard_D32plds_v6","32" +"Virtual Machines Dpldsv6-series Linux","Standard_D32pldus_v6","32" "Virtual Machines Dpldsv6-series Linux","Standard_D48plds_v6","48" "Virtual Machines Dpldsv6-series Linux","Standard_D4plds_v6","4" "Virtual Machines Dpldsv6-series Linux","Standard_D64plds_v6","64" +"Virtual Machines Dpldsv6-series Linux","Standard_D64pldus_v6","64" "Virtual Machines Dpldsv6-series Linux","Standard_D8plds_v6","8" "Virtual Machines Dpldsv6-series Linux","Standard_D96plds_v6","96" +"Virtual Machines Dpldsv6-series Linux","Standard_D96pldus_v6","96" "Virtual Machines Dplsv6-series Linux","Standard_D16pls_v6","16" "Virtual Machines Dplsv6-series Linux","Standard_D2pls_v6","2" "Virtual Machines Dplsv6-series Linux","Standard_D32pls_v6","32" @@ -898,14 +1958,25 @@ "Virtual Machines Dsv6-series Linux","Standard_D64s_v6","63.88" "Virtual Machines Dsv6-series Linux","Standard_D8s_v6","8" "Virtual Machines Dsv6-series Linux","Standard_D96s_v6","95.8" +"Virtual Machines Eadsv6-series Linux","Standard_E16-4ads_v6","16" +"Virtual Machines Eadsv6-series Linux","Standard_E16-8ads_v6","16" "Virtual Machines Eadsv6-series Linux","Standard_E16ads_v6","16" "Virtual Machines Eadsv6-series Linux","Standard_E20ads_v6","20" "Virtual Machines Eadsv6-series Linux","Standard_E2ads_v6","2" +"Virtual Machines Eadsv6-series Linux","Standard_E32-16ads_v6","32" +"Virtual Machines Eadsv6-series Linux","Standard_E32-8ads_v6","32" "Virtual Machines Eadsv6-series Linux","Standard_E32ads_v6","32" +"Virtual Machines Eadsv6-series Linux","Standard_E4-2ads_v6","4" "Virtual Machines Eadsv6-series Linux","Standard_E48ads_v6","48" "Virtual Machines Eadsv6-series Linux","Standard_E4ads_v6","4" +"Virtual Machines Eadsv6-series Linux","Standard_E64-16ads_v6","64" +"Virtual Machines Eadsv6-series Linux","Standard_E64-32ads_v6","64" "Virtual Machines Eadsv6-series Linux","Standard_E64ads_v6","64" +"Virtual Machines Eadsv6-series Linux","Standard_E8-2ads_v6","8" +"Virtual Machines Eadsv6-series Linux","Standard_E8-4ads_v6","8" "Virtual Machines Eadsv6-series Linux","Standard_E8ads_v6","8" +"Virtual Machines Eadsv6-series Linux","Standard_E96-24ads_v6","96.14" +"Virtual Machines Eadsv6-series Linux","Standard_E96-48ads_v6","96.14" "Virtual Machines Eadsv6-series Linux","Standard_E96ads_v6","96.14" "Virtual Machines Eadsv7-series Linux","Standard_E128-32ads_v7","128" "Virtual Machines Eadsv7-series Linux","Standard_E128-64ads_v7","128" @@ -931,14 +2002,25 @@ "Virtual Machines Eadsv7-series Linux","Standard_E96-48ads_v7","96" "Virtual Machines Eadsv7-series Linux","Standard_E96ads_v7","96" "Virtual Machines Easv6-series DedicatedHost","easv6_type1","144" +"Virtual Machines Easv6-series Linux","Standard_E16-4as_v6","16" +"Virtual Machines Easv6-series Linux","Standard_E16-8as_v6","16" "Virtual Machines Easv6-series Linux","Standard_E16as_v6","16" "Virtual Machines Easv6-series Linux","Standard_E20as_v6","20" "Virtual Machines Easv6-series Linux","Standard_E2as_v6","2" +"Virtual Machines Easv6-series Linux","Standard_E32-16as_v6","32" +"Virtual Machines Easv6-series Linux","Standard_E32-8as_v6","32" "Virtual Machines Easv6-series Linux","Standard_E32as_v6","32" +"Virtual Machines Easv6-series Linux","Standard_E4-2as_v6","4" "Virtual Machines Easv6-series Linux","Standard_E48as_v6","48" "Virtual Machines Easv6-series Linux","Standard_E4as_v6","4" +"Virtual Machines Easv6-series Linux","Standard_E64-16as_v6","64" +"Virtual Machines Easv6-series Linux","Standard_E64-32as_v6","64" "Virtual Machines Easv6-series Linux","Standard_E64as_v6","64.1" +"Virtual Machines Easv6-series Linux","Standard_E8-2as_v6","8" +"Virtual Machines Easv6-series Linux","Standard_E8-4as_v6","8" "Virtual Machines Easv6-series Linux","Standard_E8as_v6","8" +"Virtual Machines Easv6-series Linux","Standard_E96-24as_v6","96" +"Virtual Machines Easv6-series Linux","Standard_E96-48as_v6","96" "Virtual Machines Easv6-series Linux","Standard_E96as_v6","96.16" "Virtual Machines Easv7-series Linux","Standard_E128-32as_v7","128" "Virtual Machines Easv7-series Linux","Standard_E128-64as_v7","128" @@ -963,6 +2045,26 @@ "Virtual Machines Easv7-series Linux","Standard_E96-24as_v7","96" "Virtual Machines Easv7-series Linux","Standard_E96-48as_v7","96" "Virtual Machines Easv7-series Linux","Standard_E96as_v7","96" +"Virtual Machines Ebdsv6-Series Linux","Standard_E128bds_v6","64" +"Virtual Machines Ebdsv6-Series Linux","Standard_E16bds_v6","8" +"Virtual Machines Ebdsv6-Series Linux","Standard_E192ibds_v6","96" +"Virtual Machines Ebdsv6-Series Linux","Standard_E2bds_v6","1" +"Virtual Machines Ebdsv6-Series Linux","Standard_E32bds_v6","16" +"Virtual Machines Ebdsv6-Series Linux","Standard_E48bds_v6","24" +"Virtual Machines Ebdsv6-Series Linux","Standard_E4bds_v6","2" +"Virtual Machines Ebdsv6-Series Linux","Standard_E64bds_v6","32" +"Virtual Machines Ebdsv6-Series Linux","Standard_E8bds_v6","4" +"Virtual Machines Ebdsv6-Series Linux","Standard_E96bds_v6","48" +"Virtual Machines Ebsv6-Series Linux","Standard_E128bs_v6","64" +"Virtual Machines Ebsv6-Series Linux","Standard_E16bs_v6","8" +"Virtual Machines Ebsv6-Series Linux","Standard_E192ibs_v6","96" +"Virtual Machines Ebsv6-Series Linux","Standard_E2bs_v6","1" +"Virtual Machines Ebsv6-Series Linux","Standard_E32bs_v6","16" +"Virtual Machines Ebsv6-Series Linux","Standard_E48bs_v6","24" +"Virtual Machines Ebsv6-Series Linux","Standard_E4bs_v6","2" +"Virtual Machines Ebsv6-Series Linux","Standard_E64bs_v6","32" +"Virtual Machines Ebsv6-Series Linux","Standard_E8bs_v6","4" +"Virtual Machines Ebsv6-Series Linux","Standard_E96bs_v6","48" "Virtual Machines ECadsv6-series Linux","Standard_EC16ads_v6","16" "Virtual Machines ECadsv6-series Linux","Standard_EC2ads_v6","2" "Virtual Machines ECadsv6-series Linux","Standard_EC32ads_v6","32" @@ -979,6 +2081,7 @@ "Virtual Machines ECasv6-series Linux","Standard_EC64as_v6","64" "Virtual Machines ECasv6-series Linux","Standard_EC8as_v6","8" "Virtual Machines ECasv6-series Linux","Standard_EC96as_v6","96" +"Virtual Machines ECedsv6-series Linux","Standard_EC128eds_v6","128" "Virtual Machines ECedsv6-series Linux","Standard_EC16eds_v6","16" "Virtual Machines ECedsv6-series Linux","Standard_EC2eds_v6","2" "Virtual Machines ECedsv6-series Linux","Standard_EC32eds_v6","32" @@ -986,6 +2089,7 @@ "Virtual Machines ECedsv6-series Linux","Standard_EC4eds_v6","4" "Virtual Machines ECedsv6-series Linux","Standard_EC64eds_v6","64" "Virtual Machines ECedsv6-series Linux","Standard_EC8eds_v6","8" +"Virtual Machines ECesv6-series Linux","Standard_EC128es_v6","128" "Virtual Machines ECesv6-series Linux","Standard_EC16es_v6","16" "Virtual Machines ECesv6-series Linux","Standard_EC2es_v6","2" "Virtual Machines ECesv6-series Linux","Standard_EC32es_v6","32" @@ -1026,6 +2130,10 @@ "Virtual Machines Endv6-series Linux","Standard_E64nds_v6","64" "Virtual Machines Endv6-series Linux","Standard_E8nds_v6","8" "Virtual Machines Endv6-series Linux","Standard_E96nds_v6","96" +"Virtual Machines Ensv6special-series Linux","Standard_E16ns_v6_Special","16" +"Virtual Machines Ensv6special-series Linux","Standard_E36ns_v6_Special","1" +"Virtual Machines Ensv6special-series Linux","Standard_E72ns_v6_Special","72" +"Virtual Machines Ensv6special-series Linux","Standard_E8ns_v6_Special","8" "Virtual Machines Env6-series Linux","Standard_E128ns_v6","128" "Virtual Machines Env6-series Linux","Standard_E16ns_v6","16" "Virtual Machines Env6-series Linux","Standard_E2ns_v6","2" @@ -1038,11 +2146,14 @@ "Virtual Machines Epdsv6-series Linux","Standard_E16pds_v6","16" "Virtual Machines Epdsv6-series Linux","Standard_E2pds_v6","2" "Virtual Machines Epdsv6-series Linux","Standard_E32pds_v6","32" +"Virtual Machines Epdsv6-series Linux","Standard_E32pdus_v6","32" "Virtual Machines Epdsv6-series Linux","Standard_E48pds_v6","48" "Virtual Machines Epdsv6-series Linux","Standard_E4pds_v6","4" "Virtual Machines Epdsv6-series Linux","Standard_E64pds_v6","64" +"Virtual Machines Epdsv6-series Linux","Standard_E64pdus_v6","64" "Virtual Machines Epdsv6-series Linux","Standard_E8pds_v6","8" "Virtual Machines Epdsv6-series Linux","Standard_E96pds_v6","96" +"Virtual Machines Epdsv6-series Linux","Standard_E96pdus_v6","96" "Virtual Machines Epsv6-series Linux","Standard_E16ps_v6","16" "Virtual Machines Epsv6-series Linux","Standard_E2ps_v6","2" "Virtual Machines Epsv6-series Linux","Standard_E32ps_v6","32" @@ -1095,11 +2206,13 @@ "Virtual Machines Faldsv7-series Linux","Standard_F80alds_v7","80" "Virtual Machines Faldsv7-series Linux","Standard_F8alds_v7","8" "Virtual Machines Falsv6-series Linux","Standard_F16als_v6","16" +"Virtual Machines Falsv6-series Linux","Standard_F1als_v6","1" "Virtual Machines Falsv6-series Linux","Standard_F2als_v6","2" "Virtual Machines Falsv6-series Linux","Standard_F32als_v6","32" "Virtual Machines Falsv6-series Linux","Standard_F48als_v6","48" "Virtual Machines Falsv6-series Linux","Standard_F4als_v6","4" "Virtual Machines Falsv6-series Linux","Standard_F64als_v6","64" +"Virtual Machines Falsv6-series Linux","Standard_F72als_v6","72" "Virtual Machines Falsv6-series Linux","Standard_F8als_v6","8" "Virtual Machines Falsv7-series Linux","Standard_F16als_v7","16" "Virtual Machines Falsv7-series Linux","Standard_F1als_v7","1" @@ -1131,11 +2244,13 @@ "Virtual Machines Famdsv7-series Linux","Standard_F80amds_v7","80" "Virtual Machines Famdsv7-series Linux","Standard_F8amds_v7","8" "Virtual Machines Famsv6-series Linux","Standard_F16ams_v6","16" +"Virtual Machines Famsv6-series Linux","Standard_F1ams_v6","1" "Virtual Machines Famsv6-series Linux","Standard_F2ams_v6","2" "Virtual Machines Famsv6-series Linux","Standard_F32ams_v6","32" "Virtual Machines Famsv6-series Linux","Standard_F48ams_v6","48" "Virtual Machines Famsv6-series Linux","Standard_F4ams_v6","4" "Virtual Machines Famsv6-series Linux","Standard_F64ams_v6","64" +"Virtual Machines Famsv6-series Linux","Standard_F72iams_v6","72" "Virtual Machines Famsv6-series Linux","Standard_F8ams_v6","8" "Virtual Machines Famsv7-series Linux","Standard_F16-4ams_v7","16" "Virtual Machines Famsv7-series Linux","Standard_F16-8ams_v7","16" @@ -1158,11 +2273,13 @@ "Virtual Machines Famsv7-series Linux","Standard_F80ams_v7","80" "Virtual Machines Famsv7-series Linux","Standard_F8ams_v7","8" "Virtual Machines Fasv6-series Linux","Standard_F16as_v6","16" +"Virtual Machines Fasv6-series Linux","Standard_F1as_v6","1" "Virtual Machines Fasv6-series Linux","Standard_F2as_v6","2" "Virtual Machines Fasv6-series Linux","Standard_F32as_v6","32" "Virtual Machines Fasv6-series Linux","Standard_F48as_v6","48" "Virtual Machines Fasv6-series Linux","Standard_F4as_v6","4" "Virtual Machines Fasv6-series Linux","Standard_F64as_v6","64" +"Virtual Machines Fasv6-series Linux","Standard_F72as_v6","72" "Virtual Machines Fasv6-series Linux","Standard_F8as_v6","8" "Virtual Machines Fasv7-series Linux","Standard_F16as_v7","16" "Virtual Machines Fasv7-series Linux","Standard_F1as_v7","1" @@ -1237,6 +2354,14 @@ "Virtual Machines HBrsv5 Linux","Standard_HB368-336rs_v5","368" "Virtual Machines HBrsv5 Linux","Standard_HB368-48rs_v5","368" "Virtual Machines HBrsv5 Linux","Standard_HB368-96rs_v5","368" +"Virtual Machines HBrsv5 Linux","Standard_HB368FC-144rs_v5","368" +"Virtual Machines HBrsv5 Linux","Standard_HB368FC-192rs_v5","368" +"Virtual Machines HBrsv5 Linux","Standard_HB368FC-240rs_v5","368" +"Virtual Machines HBrsv5 Linux","Standard_HB368FC-288rs_v5","368" +"Virtual Machines HBrsv5 Linux","Standard_HB368FC-336rs_v5","368" +"Virtual Machines HBrsv5 Linux","Standard_HB368FC-48rs_v5","368" +"Virtual Machines HBrsv5 Linux","Standard_HB368FC-96rs_v5","368" +"Virtual Machines HBrsv5 Linux","Standard_HB368FCrs_v5","368" "Virtual Machines HBrsv5 Linux","Standard_HB368rs_v5","368" "Virtual Machines HXrs Linux","Standard_HX176-144rs","176" "Virtual Machines HXrs Linux","Standard_HX176-24rs","176" @@ -1245,29 +2370,44 @@ "Virtual Machines HXrs Linux","Standard_HX176rs","176" "Virtual Machines Laosv4-series Linux","Standard_L12aos_v4","12" "Virtual Machines Laosv4-series Linux","Standard_L16aos_v4","16" +"Virtual Machines Laosv4-series Linux","Standard_L16aous_v4","16" "Virtual Machines Laosv4-series Linux","Standard_L24aos_v4","24" "Virtual Machines Laosv4-series Linux","Standard_L2aos_v4","2" "Virtual Machines Laosv4-series Linux","Standard_L32aos_v4","32" +"Virtual Machines Laosv4-series Linux","Standard_L32aous_v4","32" "Virtual Machines Laosv4-series Linux","Standard_L4aos_v4","4" "Virtual Machines Laosv4-series Linux","Standard_L8aos_v4","8" "Virtual Machines Lasv4 Series Linux","Standard_L16as_v4","16" +"Virtual Machines Lasv4 Series Linux","Standard_L16aus_v4","16" "Virtual Machines Lasv4 Series Linux","Standard_L2as_v4","2" "Virtual Machines Lasv4 Series Linux","Standard_L32as_v4","32" +"Virtual Machines Lasv4 Series Linux","Standard_L32aus_v4","32" "Virtual Machines Lasv4 Series Linux","Standard_L48as_v4","48" +"Virtual Machines Lasv4 Series Linux","Standard_L48aus_v4","48" "Virtual Machines Lasv4 Series Linux","Standard_L4as_v4","4" "Virtual Machines Lasv4 Series Linux","Standard_L64as_v4","64" +"Virtual Machines Lasv4 Series Linux","Standard_L64aus_v4","64" "Virtual Machines Lasv4 Series Linux","Standard_L80as_v4","80" +"Virtual Machines Lasv4 Series Linux","Standard_L80aus_v4","80" "Virtual Machines Lasv4 Series Linux","Standard_L8as_v4","8" "Virtual Machines Lasv4 Series Linux","Standard_L96as_v4","96" +"Virtual Machines Lasv4 Series Linux","Standard_L96aus_v4","96" +"Virtual Machines Lsv4 Series Linux","L192isv4","192" "Virtual Machines Lsv4 Series Linux","Standard_L16s_v4","16" +"Virtual Machines Lsv4 Series Linux","Standard_L16us_v4","16" "Virtual Machines Lsv4 Series Linux","Standard_L2s_v4","2" "Virtual Machines Lsv4 Series Linux","Standard_L32s_v4","32" +"Virtual Machines Lsv4 Series Linux","Standard_L32us_v4","32" "Virtual Machines Lsv4 Series Linux","Standard_L48s_v4","48" +"Virtual Machines Lsv4 Series Linux","Standard_L48us_v4","48" "Virtual Machines Lsv4 Series Linux","Standard_L4s_v4","4" "Virtual Machines Lsv4 Series Linux","Standard_L64s_v4","64" +"Virtual Machines Lsv4 Series Linux","Standard_L64us_v4","64" "Virtual Machines Lsv4 Series Linux","Standard_L80s_v4","80" +"Virtual Machines Lsv4 Series Linux","Standard_L80us_v4","80" "Virtual Machines Lsv4 Series Linux","Standard_L8s_v4","8" "Virtual Machines Lsv4 Series Linux","Standard_L96s_v4","96" +"Virtual Machines Lsv4 Series Linux","Standard_L96us_v4","96" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128-64bds_3_v3","31.5" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128-64bds_v3","8" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128bds_3_v3","31.5" @@ -1275,6 +2415,7 @@ "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M16bds_v3","1" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176-88bds_4_v3","43" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176-88bds_v3","11" +"Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176bds_3_v3","24.6" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176bds_4_v3","43" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176bds_v3","11" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M32bds_v3","2" @@ -1289,6 +2430,7 @@ "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M128bs_v3","8" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M16bs_v3","1" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M176-88bs_v3","11" +"Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M176bs_3_v3","24.6" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M176bs_v3","11" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M32bs_v3","2" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M416bs_v3","34.4" @@ -1300,33 +2442,87 @@ "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds_6_v3","1" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds_8_v3","1.33" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds_9_v3","416" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds-104_6_v3","1.005" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds-104_8_v3","1.3065" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds-208_6_v3","1.005" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds-208_8_v3","1.3065" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M624ds_12_v3","2" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M624ds-156_12_v3","2.01" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M624ds-312_12_v3","2.01" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ds_12_v3","2.01" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ds-208_12_v3","2.01" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ds-416_12_v3","2.01" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ids_16_v3","2.96" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ids-208_16_v3","2.9145" +"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ids-416_16_v3","2.9145" "Virtual Machines Mdsv3 Medium Memory Series DedicatedHost","mdsv3medmem_type1","1" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M12ds_v3","1" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M12ds-6_v3","1.008621" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds_2_v3","9.985345" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds_3_v3","11.7" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds_4_v3","16.2" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds-44_3_v3","11.7" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds-44_4_v3","16.238793" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds-88_3_v3","11.7" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds-88_4_v3","16.238793" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M24ds_v3","2" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M24ds-12_v3","2.017241" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M24ds-6_v3","2.017241" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M48ds_1_v3","4.1" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M48ds-12_1_v3","4.034483" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M48ds-24_1_v3","4.034483" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds_1_v3","6.1" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds_2_v3","8.1" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds-24_1_v3","6.051724" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds-24_2_v3","8.068966" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds-48_1_v3","6.051724" +"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds-48_2_v3","8.068966" +"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M1792ixds_32_v3","2.8" +"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M832ixds_24_v3","1.8" +"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M832xds_16_v3","1" +"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M896ixds_24_v3","1.9" +"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M896ixds_32_v3","2.6" +"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M896xds_16_v3","1.3" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_10_v3","416" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_12_v3","416" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_6_v3","1" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_8_v3","1.33" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_9_v3","416" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M416s-104_6_v3","1.005" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M416s-104_8_v3","1.3065" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M416s-208_6_v3","1.005" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M416s-208_8_v3","1.3065" "Virtual Machines Msv3 High Memory Series Linux","Standard_M624s_12_v3","2" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M624s-156_12_v3","2.01" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M624s-312_12_v3","2.01" "Virtual Machines Msv3 High Memory Series Linux","Standard_M832is_16_v3","2.96" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M832is-208_16_v3","2.9145" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M832is-416_16_v3","2.9145" "Virtual Machines Msv3 High Memory Series Linux","Standard_M832s_12_v3","2.01" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M832s-208_12_v3","2.01" +"Virtual Machines Msv3 High Memory Series Linux","Standard_M832s-416_12_v3","2.01" "Virtual Machines Msv3 Medium Memory Series DedicatedHost","msv3medmem_type1","1" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M12s_v3","1" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M12s-6_v32","1.006211" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s_2_v3","9.961491" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s_3_v3","11.6" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s_4_v3","16.2" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s-44_3_v3","11.571429" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s-44_4_v3","16.2" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s-88_3_v3","11.571429" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s-88_4_v3","16.2" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M24s_v3","2" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M24s-12_v3","2.012422" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M24s-6_v3","2.012422" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M48s_1_v3","4" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M48s-12_1_v3","4.024845" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M48s-24_1_v3","4.024845" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s_1_v3","6.1" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s_2_v3","8.1" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s-24_1_v3","6.037267" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s-24_2_v3","8.049689" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s-48_1_v3","6.037267" +"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s-48_2_v3","8.049689" "Virtual Machines NCadsH100_v5-series Linux","Standard_NC40ads_H100_v5","40" "Virtual Machines NCadsH100_v5-series Linux","Standard_NC80adis_H100_v5","80" "Virtual Machines NCCadsH100_v5_series Linux","Standard_NCC40ads_H100_v5","40" @@ -1341,14 +2537,38 @@ "Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC72lds_xl_RTXPRO6000BSE_v6","72" "Virtual Machines ND MI300X v5 Series Linux","Standard_ND96is_MI300X_v5","96" "Virtual Machines ND MI300X v5 Series Linux","Standard_ND96isr_MI300X_v5","96" +"Virtual Machines NDamsf A100 v4-Series Linux","Standard_ND96ams_A100_flex_v4","1" +"Virtual Machines NDamsrf A100 v4-Series Linux","Standard_ND96amsf_A100_v4","1" +"Virtual Machines NDamsrf A100 v4-Series Linux","Standard_ND96amsrf_A100_v4","1.1" +"Virtual Machines NDs GB200 v6-Series Linux","Standard_ND128is_GB200_v6","1" +"Virtual Machines NDs H100 v5 Series Linux","Standard_ND96is_noIB_H100_v5","1" +"Virtual Machines NDs H200 v5 Series Linux","Standard_ND96is_H200_v5","1" +"Virtual Machines NDs MI300X v5 Series Linux","Standard ND96is noIB MI300X v5","1" +"Virtual Machines NDsf GB200 v6-Series Linux","Standard_ND128isf_GB200_v6","1" +"Virtual Machines NDsf H100 v5 Series Linux","Standard_ND96is_flex_H100_v5","1" +"Virtual Machines NDsf H200 v5 Series Linux","Standard_ND96isf_H200_v5","1" +"Virtual Machines NDsf MI300X v5-Series Linux","Standard ND96isf MI300X v5","1" +"Virtual Machines NDsr GB200 ETH Metal v6-Series Linux","ND144_ETH_GB200_Metal_v6","1" +"Virtual Machines NDsr GB200 ETH v6-Series Linux","Standard_ND128isr_ETH_GB200_v6","1" "Virtual Machines NDsr GB200 NDR v6 Series Linux","Standard_ND128isr_NDR_GB200_v6","128" "Virtual Machines NDsr GB300 v6-Series Linux","Standard_ND128isr_GB300_v6","128" +"Virtual Machines NDsr H100 v5-Series Linux","Standard_ND96is_H100_v5","96.872727" "Virtual Machines NDsr H100 v5-Series Linux","Standard_ND96isr_H100_v5","106.56" "Virtual Machines NDsr H200 v5 Series Linux","Standard_ND96isr_H200_v5","96" +"Virtual Machines NDsr INFE H100 v5 Series Linux","Standard ND96isr INFE H100 v5","1" +"Virtual Machines NDsrf GB200 ETH v6-Series Linux","Standard_ND128isrf_ETH_GB200_v6","1" +"Virtual Machines NDsrf GB200 NDR v6 Series Linux","Standard_ND128isrf_NDR_GB200_v6","1" +"Virtual Machines Ndsrf H100 V5-Series Linux","Standard_ND96isf_H100_v5","1" +"Virtual Machines Ndsrf H100 V5-Series Linux","Standard_ND96isrf_H100_v5","1.1" +"Virtual Machines NDsrf H200 v5 Series Linux","Standard_ND96isrf_H200_v5","1" +"Virtual Machines NDsrf MI300X v5-Series Linux","Standard ND96isrf MI300X v5","1" "Virtual Machines NGads_V620_v1 Linux","Standard_NG16ads_V620_v1","16" +"Virtual Machines NGads_V620_v1 Linux","Standard_NG32adms_V620","41.6" "Virtual Machines NGads_V620_v1 Linux","Standard_NG32ads_V620_v1","32" "Virtual Machines NGads_V620_v1 Linux","Standard_NG8ads_V620_v1","8" +"Virtual Machines NMads MA35D Linux","Standard_NM16ads_MA35D","1" "Virtual Machines NVads_V710_v5 Linux","Standard_NV12ads_V710_v5","12" "Virtual Machines NVads_V710_v5 Linux","Standard_NV24ads_V710_v5","24" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV28adms_V710_v5","28.4" "Virtual Machines NVads_V710_v5 Linux","Standard_NV4ads_V710_v5","4" "Virtual Machines NVads_V710_v5 Linux","Standard_NV8ads_V710_v5","8" diff --git a/src/open-data/README.md b/src/open-data/README.md index c6b3b62e1..4b32f133e 100644 --- a/src/open-data/README.md +++ b/src/open-data/README.md @@ -41,10 +41,20 @@ To update manually:
-The [InstanceSizeFlexibility.csv](./InstanceSizeFlexibility.csv) file maps each ARM SKU to its instance size flexibility (ISF) group and ratio. ISF lets a reservation apply across multiple SKUs in the same flexibility group; the ratio is the relative weight of each SKU within its group. It covers Virtual Machines, Redis Cache, and Dedicated Host, unioned across a broad set of regions (ISF groups are region-stable, but SKU availability is not). The raw Microsoft ratios are kept as-is (they don't always start at `1` for the smallest SKU) for drop-in parity with the deprecated files; pass `-Normalize` to rescale each group so its smallest SKU is `1`. This data is updated weekly by the [Update Instance Size Flexibility](../../.github/workflows/opendata-instance-size-flexibility.yml) workflow, which queries the [Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api). Each run publishes exactly what the API returns, so records Microsoft retires from the catalog disappear from the file on the next update. +The [InstanceSizeFlexibility.csv](./InstanceSizeFlexibility.csv) file maps each ARM SKU to its instance size flexibility (ISF) group and ratio. ISF lets a reservation apply across multiple SKUs in the same flexibility group; the ratio is the relative weight of each SKU within its group. It covers Virtual Machines, Redis Cache, and Dedicated Host, unioned across every physical region the ARM locations API reports (ISF groups are region-stable, but SKU availability is not, and new GPU and specialty SKUs often launch in only a handful of regions). The Microsoft ratios are kept as-is (they don't always start at `1` for the smallest SKU); pass `-Normalize` to rescale each group so its smallest SKU is `1`. This data is updated weekly by the [Update Instance Size Flexibility](../../.github/workflows/opendata-instance-size-flexibility.yml) workflow, which queries the [Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api). + +The dataset is additive. The Catalogs API only returns SKUs that are still purchasable, so a destructive write drops retired series (Av2, D, DS, Dv2, F, G, H, NC, NV, and others) that customers still hold reservations against ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). Each run merges the API result over the previously published file, keyed on `ArmSkuName`, so the live API wins wherever it has an opinion and everything else carries forward. The published file is therefore the floor for those groups, and the run fails rather than publishing a dataset smaller than the last one. + +Ratios are only comparable within a flexibility group, and the ratios the Catalogs API returns are used verbatim. + +The retired files were on a different scale: they normalized each group so its smallest SKU was `1`, while the API reports absolute vCPU counts. Both encode the same proportions, differing by a per-group constant (usually 2×, e.g. `Standard_DS11_v2` is `1` in the retired file and `2` in the API). Because Azure retires individual sizes rather than whole families, the API often covers only part of a group — 44 of the 204 groups both sources knew — so a naive merge would leave one group holding both units. The rows backfilled from the retired files were therefore converted onto the API scale once, using the factor derived from the SKUs each group shared with the API, and the generator fails the run if a carried-forward group is ever found on the wrong scale again. + +The fully retired groups (roughly a third of the dataset — `Av2 Series`, `D Series`, `F Series`, and the like) have no API counterpart to convert against, so they keep the normalized scale. That is harmless as long as ratios are compared only within their own group. This dataset replaces two deprecated static CSVs that were hosted on `ccmstorageprod.blob.core.windows.net` (`AutofitComboMeterData.csv` and `isfratioblob.csv` / `aka.ms/isf`), which Microsoft is retiring (no updates after 9 May 2026, removed 30 Aug 2026). +SKUs whose ratio is not a positive number are dropped. The API returns one such row today (`azure_redis_cache_isolated_i100` at `0`); a zero carries no flexibility information and consumers divide by `Ratio`, so publishing it would hand them a division by zero. + The file uses the canonical three-column Catalogs API schema: `InstanceSizeFlexibilityGroup`, `ArmSkuName`, `Ratio`. This is a 1:1 match for the deprecated `isfratioblob.csv`. `ArmSkuName` is unique across the whole file and is safe to use as a standalone join key; both the generator and a unit test enforce this. The deprecated `AutofitComboMeterData.csv` also carried Cost Management connector columns (`ResourceLocation`, meter IDs, composite key, normalized SKU) that are not part of the Catalogs API and aren't reproducible from it; consumers that relied on them (e.g. the Power BI model's join key) should join on `ArmSkuName` instead. Block Blob storage also exposes ISF metadata in the Catalogs API, but it is intentionally excluded: its entries carry meter-style catalog names rather than real ARM SKU names, every ratio is `1`, and its groups are region-specific — which would duplicate `ArmSkuName` values and break the join-key guarantee above. Pass `-ReservedResourceType` explicitly to generate it if needed. diff --git a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 index 2d1c444b7..1fe8267ed 100644 --- a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 +++ b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 @@ -42,7 +42,7 @@ Describe 'Update-InstanceSizeFlexibility' { Mock Get-AzContext { @{ Subscription = @{ Id = '00000000-0000-0000-0000-000000000000' } } } Mock Start-Sleep {} $outFile = Join-Path $TestDrive 'InstanceSizeFlexibility.csv' - if (Test-Path $outFile) { Remove-Item $outFile -Force } # the generator cache-merges an existing file + if (Test-Path $outFile) { Remove-Item $outFile -Force } # the generator merges into an existing file $baseParams = @{ OutputPath = $outFile Location = @('eastus') @@ -152,6 +152,21 @@ Describe 'Update-InstanceSizeFlexibility' { @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_E2s_v5' } + It 'Skips SKUs the API reports with a zero ratio' { + # A zero ratio carries no flexibility information, and the Optimization Engine's + # benefits simulation divides by it. The API returns one (Azure Redis Cache Isolated). + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @( + (New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '1'), + (New-CatalogItem -Sku 'azure_redis_cache_isolated_i100' -Group 'Azure Redis Cache Isolated' -Ratio '0') + ) + } + + Invoke-Generator $baseParams + + @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_D2' + } + It 'Skips items without ISF group or ratio properties' { Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( @@ -179,11 +194,11 @@ Describe 'Update-InstanceSizeFlexibility' { } } - Context 'Convergence' { - It 'Replaces the output with exactly what the API returned, removing retired records' { + Context 'Additive merge' { + It 'Carries forward published records the API no longer returns' { @( [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'DSeries'; ArmSkuName = 'Standard_D2'; Ratio = '1' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'DSeries'; ArmSkuName = 'Standard_Retired'; Ratio = '2' } + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '2' } ) | Export-Csv $outFile -NoTypeInformation Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( @@ -194,8 +209,52 @@ Describe 'Update-InstanceSizeFlexibility' { Invoke-Generator $baseParams + # Standard_A1_v2 is no longer purchasable, so the API omits it, but reservations still + # cover it -- issue #2300. + @(Import-Csv $outFile).ArmSkuName | Should -Be @('Standard_A1_v2', 'Standard_D2', 'Standard_D8') + } + + It 'Lets the API supersede a published record for the same SKU' { + @([PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'DSeries'; ArmSkuName = 'Standard_D2'; Ratio = '1' }) ` + | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries v2' -Ratio '4')) + } + + Invoke-Generator $baseParams + $rows = @(Import-Csv $outFile) - $rows.ArmSkuName | Should -Be @('Standard_D2', 'Standard_D8') # retired record is gone + $rows.Count | Should -Be 1 + $rows[0].InstanceSizeFlexibilityGroup | Should -Be 'DSeries v2' + $rows[0].Ratio | Should -Be '4' + } + + It 'Drops published SKUs that map to more than one flexibility group' { + # Ambiguous SKUs would break the ArmSkuName join key that Power BI's model + # relationship and the Optimization Engine's externaldata() joins depend on. + @( + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'PTU_Area_US East'; ArmSkuName = 'Provisioned_Managed'; Ratio = '1' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'PTU_Area_EU West'; ArmSkuName = 'Provisioned_Managed'; Ratio = '1' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '1' } + ) | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { New-CatalogResponse -Items @() } + + Invoke-Generator $baseParams + + @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_A1_v2' + } + + It 'Ignores published rows with a blank, non-numeric or non-positive ratio' { + @( + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'MDC_PrePurchase_Plan'; ArmSkuName = 'Free'; Ratio = '' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Azure Redis Cache Isolated'; ArmSkuName = 'azure_redis_cache_isolated_i100'; Ratio = '0' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '1' } + ) | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { New-CatalogResponse -Items @() } + + Invoke-Generator $baseParams + + @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_A1_v2' } It 'Fails instead of publishing when the same SKU appears in multiple flexibility groups' { @@ -226,6 +285,155 @@ Describe 'Update-InstanceSizeFlexibility' { } } + Context 'Ratio scale' { + It 'Fails when a carried-forward group is on a different scale than the API' { + # The retired files normalized each group to smallest-SKU-=-1; the API reports vCPU + # counts. Azure retires individual sizes, so the API returns only part of Ev3 Series + # and merging per SKU would leave both units in one group. + @( + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E2_v3'; Ratio = '1' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E4_v3'; Ratio = '2' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E8_v3'; Ratio = '4' } + ) | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @( + (New-CatalogItem -Sku 'Standard_E2_v3' -Group 'Ev3 Series' -Ratio '2'), + (New-CatalogItem -Sku 'Standard_E4_v3' -Group 'Ev3 Series' -Ratio '4') + ) + } + + { Invoke-Generator $baseParams } | Should -Throw -ExpectedMessage '*different ratio scale*' + } + + It 'Accepts a migrated group whose ratios already match the API' { + @( + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E2_v3'; Ratio = '2' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E4_v3'; Ratio = '4' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E8_v3'; Ratio = '8' } + ) | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_E2_v3' -Group 'Ev3 Series' -Ratio '2')) + } + + Invoke-Generator $baseParams + + $rows = @(Import-Csv $outFile) + $rows.Count | Should -Be 3 + ($rows | Where-Object ArmSkuName -eq 'Standard_E8_v3').Ratio | Should -Be '8' + } + + It 'Takes a small ratio correction from the API without failing the run' { + # A genuine correction from Microsoft is small; only scale-sized gaps are fatal. + @([PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'DSeries'; ArmSkuName = 'Standard_D2'; Ratio = '2' }) ` + | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '2.1')) + } + + Invoke-Generator $baseParams + + @(Import-Csv $outFile).Ratio | Should -Be '2.1' + } + + It 'Ignores a group the API does not cover' { + @( + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '1' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A2_v2'; Ratio = '2.1' } + ) | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '2')) + } + + Invoke-Generator $baseParams + + $rows = @(Import-Csv $outFile) + ($rows | Where-Object ArmSkuName -eq 'Standard_A1_v2').Ratio | Should -Be '1' + ($rows | Where-Object ArmSkuName -eq 'Standard_A2_v2').Ratio | Should -Be '2.1' + } + + It 'Drops placeholder SKU names carried in the published file' { + @( + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'NV Series'; ArmSkuName = 'arm_sku_name_placeholder'; Ratio = '1' }, + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '1' } + ) | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { New-CatalogResponse -Items @() } + + Invoke-Generator $baseParams + + @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_A1_v2' + } + } + + Context 'Region enumeration' { + BeforeEach { + function New-LocationsResponse + { + param([object[]]$Locations, [int]$StatusCode = 200) + [PSCustomObject]@{ + StatusCode = $StatusCode + Content = @{ value = $Locations } | ConvertTo-Json -Depth 20 + } + } + } + + It 'Sweeps every physical region returned by the ARM locations API when -Location is omitted' { + Mock Invoke-AzRestMethod { + if ($Uri -like '*/locations?*') + { + # regionType is nested under metadata in the real ARM response. + New-LocationsResponse -Locations @( + @{ name = 'eastus'; metadata = @{ regionType = 'Physical' } }, + @{ name = 'switzerlandnorth'; metadata = @{ regionType = 'Physical' } }, + @{ name = 'global'; metadata = @{ regionType = 'Logical' } }, + @{ name = 'nometadata' } + ) + } + else + { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '1')) + } + } + + Invoke-Generator @{ OutputPath = $outFile; ReservedResourceType = @('VirtualMachines') } + + Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*/locations?*' } + Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*location=eastus*' } + Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*location=switzerlandnorth*' } + # Logical groupings are not valid catalog scopes, and neither is an entry whose + # metadata is missing entirely. + Should -Invoke Invoke-AzRestMethod -Exactly -Times 0 -ParameterFilter { $Uri -like '*location=global*' } + Should -Invoke Invoke-AzRestMethod -Exactly -Times 0 -ParameterFilter { $Uri -like '*location=nometadata*' } + } + + It 'Does not enumerate regions when -Location is supplied' { + Mock Invoke-AzRestMethod { New-CatalogResponse -Items @() } + + Invoke-Generator $baseParams + + Should -Invoke Invoke-AzRestMethod -Exactly -Times 0 -ParameterFilter { $Uri -like '*/locations?*' } + } + + It 'Fails rather than sweeping a partial region set when enumeration returns nothing' { + Mock Invoke-AzRestMethod { + if ($Uri -like '*/locations?*') { New-LocationsResponse -Locations @(@{ name = 'global'; metadata = @{ regionType = 'Logical' } }) } + else { New-CatalogResponse -Items @() } + } + + { Invoke-Generator @{ OutputPath = $outFile } } | + Should -Throw -ExpectedMessage '*no physical regions*' + } + + It 'Fails when the locations API returns an error' { + Mock Invoke-AzRestMethod { + if ($Uri -like '*/locations?*') { New-LocationsResponse -Locations @() -StatusCode 403 } + else { New-CatalogResponse -Items @() } + } + + { Invoke-Generator @{ OutputPath = $outFile } } | + Should -Throw -ExpectedMessage '*HTTP 403 enumerating regions*' + } + } + Context 'Published dataset' { It 'Has globally unique ArmSkuName values' { $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" @@ -233,6 +441,12 @@ Describe 'Update-InstanceSizeFlexibility' { $duplicates.Name | Should -BeNullOrEmpty } + It 'Has no zero or negative ratios' { + # Consumers multiply and divide by Ratio, so a non-positive value is unusable. + $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" + @($csv | Where-Object { [double]$_.Ratio -le 0 }).ArmSkuName | Should -BeNullOrEmpty + } + It 'Has the documented three-column schema' { $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" @($csv[0].PSObject.Properties.Name) | Should -Be @('InstanceSizeFlexibilityGroup', 'ArmSkuName', 'Ratio') diff --git a/src/scripts/Update-InstanceSizeFlexibility.ps1 b/src/scripts/Update-InstanceSizeFlexibility.ps1 index f66d3544f..963e23855 100644 --- a/src/scripts/Update-InstanceSizeFlexibility.ps1 +++ b/src/scripts/Update-InstanceSizeFlexibility.ps1 @@ -25,14 +25,27 @@ .PARAMETER OutputPath Path to the output CSV file. Defaults to src/open-data/InstanceSizeFlexibility.csv. + The file is merged into, not replaced. The Catalogs API only returns SKUs that are still + purchasable, so retired series (Av2, D/DS v1, Dv2, F, G, H, NC, NV, ...) are absent from it + even though customers still hold active reservations covering them. The published file is + therefore the floor that keeps those groups in the dataset, and the run fails rather than + publishing a smaller one. + .PARAMETER SubscriptionId Subscription to use for the Catalogs API call. Defaults to the subscription in the current Azure context. .PARAMETER Location One or more Azure regions to query and union ISF ratios from. ISF group/ratio relationships - are region-stable, but not every SKU is available in every region, so the default unions a - broad region set to maximize SKU coverage. + are region-stable, but not every SKU is available in every region, so the results are unioned + across regions to maximize SKU coverage. + + Defaults to every physical region the subscription's cloud exposes, enumerated from the ARM + locations API. A hardcoded list has to be hand-maintained as Azure adds regions, and new GPU + and specialty SKUs routinely launch in a handful of regions first, so any SKU that lands + outside the list is missing from the dataset until someone notices. That is no longer + recoverable now that the retired blob can't backfill it. Pass an explicit list to narrow the + sweep (tests do). .PARAMETER ReservedResourceType One or more reserved resource types to extract ISF ratios for. Default is VirtualMachines, @@ -45,11 +58,23 @@ .PARAMETER ApiVersion Catalogs API version. Default = 2022-03-01. + .PARAMETER LocationApiVersion + ARM locations API version, used only when -Location is not supplied. Default = 2022-12-01. + .PARAMETER Normalize Normalize ratios so the smallest SKU in each flexibility group has a ratio of 1. The raw API ratios don't always start at 1 (e.g. BS Series starts at 0.25). When omitted, the raw Microsoft - ratios are kept for drop-in parity with the deprecated isfratioblob.csv / - AutofitComboMeterData.csv files that downstream tools (Power BI, Optimization Engine) expect. + ratios are kept. + + Note that raw API ratios are NOT on the same scale as the retired isfratioblob.csv: the blob + normalized each group to smallest-SKU-=-1, the API returns vCPU-scaled values, and the two + differ by a per-group constant (usually 2x -- e.g. Standard_DS11_v2 is 1 in the blob and 2 in + the API). The published dataset was migrated onto the API scale once, so ratios are the API's + verbatim wherever it has an opinion. Ratios are only ever compared within a flexibility group. + + The groups the API doesn't cover at all -- the fully retired series, roughly a third of the + dataset -- necessarily keep the blob's normalized scale, because there is no API value to + reconcile them against. That is harmless as long as ratios stay within their group. .EXAMPLE ./Update-InstanceSizeFlexibility.ps1 @@ -64,14 +89,8 @@ param( [string]$SubscriptionId, - # ISF group/ratio relationships are region-stable, but SKU availability is not, so a broad - # region set is unioned to maximize coverage. - [string[]]$Location = @( - 'eastus', 'eastus2', 'westus', 'westus2', 'westus3', 'centralus', 'southcentralus', 'northcentralus', - 'westeurope', 'northeurope', 'uksouth', 'francecentral', 'germanywestcentral', 'swedencentral', 'norwayeast', - 'southeastasia', 'eastasia', 'japaneast', 'japanwest', 'australiaeast', 'koreacentral', 'centralindia', - 'canadacentral', 'brazilsouth', 'southafricanorth', 'uaenorth' - ), + # Defaults to every physical region the subscription's cloud exposes -- see the parameter help. + [string[]]$Location, # The reserved resource types that expose usable ISF ratios (ReservationsAutofitGroup/Ratio). # BlockBlob is excluded by default -- see the parameter help above. @@ -79,6 +98,8 @@ param( [string]$ApiVersion = '2022-03-01', + [string]$LocationApiVersion = '2022-12-01', + [switch]$Normalize ) @@ -101,6 +122,35 @@ if (-not $SubscriptionId) { throw "No subscription found in the current Azure context. Pass -SubscriptionId or run Set-AzContext." } +if (-not $Location) +{ + # Physical regions only: the response also carries logical groupings ('global', 'unitedstates', + # 'europe', 'asiapacific'), which are not valid catalog scopes -- 46 of the 109 entries at the + # time of writing. Note regionType is nested under metadata, not at the top level. + # Az.Accounts is the only module the workflow installs, so this uses the REST API rather than + # Get-AzLocation, which lives in Az.Resources. + $locationsUri = "https://management.azure.com/subscriptions/$SubscriptionId/locations?api-version=$LocationApiVersion" + $locationsResponse = Invoke-AzRestMethod -Uri $locationsUri -Method GET + if ($locationsResponse.StatusCode -ge 400) + { + throw "HTTP $($locationsResponse.StatusCode) enumerating regions: $($locationsResponse.Content)" + } + + $Location = @( + ($locationsResponse.Content | ConvertFrom-Json -Depth 20).value | + Where-Object { $_.metadata.regionType -eq 'Physical' } | + Select-Object -ExpandProperty name + ) + + # Sweeping fewer regions than intended silently drops SKUs, so treat an empty result as fatal + # rather than falling back to a partial sweep. + if (-not $Location) + { + throw "Region enumeration returned no physical regions for subscription $SubscriptionId. Pass -Location explicitly to override." + } + Write-Host "Enumerated $($Location.Count) physical region(s) from the ARM locations API" +} + Write-Host "Using subscription $SubscriptionId, $($Location.Count) region(s), types: $($ReservedResourceType -join ', ')" function Invoke-CatalogsApi @@ -214,12 +264,16 @@ function Get-IsfRecords # 'arm_sku_name_placeholder'); skip them so they don't leak into the public CSV. if ($armSkuName -like '*placeholder*') { continue } - if ($flexGroup -and $ratio -and $armSkuName) + # A ratio of 0 carries no flexibility information and consumers divide by it -- the + # Optimization Engine's benefits simulation does exactly that -- so drop it rather than + # publish a division by zero. The API returns one today (Azure Redis Cache Isolated). + $parsedRatio = 0.0 + if ($flexGroup -and $armSkuName -and [double]::TryParse($ratio, [ref]$parsedRatio) -and $parsedRatio -gt 0) { $null = $records.Add([PSCustomObject]@{ InstanceSizeFlexibilityGroup = [string]$flexGroup ArmSkuName = [string]$armSkuName - Ratio = [double]$ratio + Ratio = $parsedRatio }) } } @@ -255,13 +309,63 @@ function Get-NormalizedRecords return $normalized } +function Import-IsfCsv +{ + <# + .SYNOPSIS + Reads an ISF CSV into records, dropping rows that cannot serve as usable open data. + + .DESCRIPTION + Drops rows with a blank, non-numeric or non-positive ratio, and drops every row for an + ArmSkuName that the file maps to more than one flexibility group, which would break the + ArmSkuName join key that Power BI's model relationship and the Optimization Engine's + externaldata() joins both depend on. + #> + param( + [string]$Path + ) + + $records = [System.Collections.ArrayList]::new() + if (-not $Path -or -not (Test-Path $Path)) { return $records } + + $rows = Import-Csv -Path $Path + $groupsPerSku = @{} + foreach ($row in $rows) + { + $ratio = 0.0 + if (-not [double]::TryParse($row.Ratio, [ref]$ratio)) { continue } + if ($ratio -le 0) { continue } + if (-not $groupsPerSku.ContainsKey($row.ArmSkuName)) { $groupsPerSku[$row.ArmSkuName] = @{} } + $groupsPerSku[$row.ArmSkuName][$row.InstanceSizeFlexibilityGroup] = $true + } + + foreach ($row in $rows) + { + $ratio = 0.0 + if (-not [double]::TryParse($row.Ratio, [ref]$ratio)) { continue } + if ($ratio -le 0) { continue } + if ($groupsPerSku[$row.ArmSkuName].Count -gt 1) { continue } + # Same placeholder filter the API path applies, so a retired file's placeholder rows + # can't linger in the published dataset. + if ($row.ArmSkuName -like '*placeholder*') { continue } + $null = $records.Add([PSCustomObject]@{ + InstanceSizeFlexibilityGroup = [string]$row.InstanceSizeFlexibilityGroup + ArmSkuName = [string]$row.ArmSkuName + Ratio = $ratio + }) + } + + return $records +} + # ----------------------------------------------------------------------- # Step 1: Fetch ISF ratios for each reserved resource type across all regions # ----------------------------------------------------------------------- -# The output is exactly what the API returns for a fully successful run so the dataset always -# converges on the Catalogs API (records Microsoft retires disappear on the next run). Any scope -# that still fails after retries aborts the whole run without touching the output file; the -# weekly workflow then fails and the last published dataset stays as-is. +# The dataset is additive: the API result is merged over the previously published file. The API +# only returns SKUs that are still purchasable, so a destructive write drops retired series that +# customers still hold reservations against (issue #2300). Any scope that still fails after +# retries aborts the whole run without touching the output file; the weekly workflow then fails +# and the last published dataset stays as-is. $seen = @{} foreach ($type in $ReservedResourceType) { @@ -279,18 +383,129 @@ foreach ($type in $ReservedResourceType) Write-Host " $type`: $($typeKeys.Count) distinct SKUs with ISF ratios across $($Location.Count) region(s)" } -$allRecords = @($seen.Values) +$apiRecords = @($seen.Values) # ArmSkuName is documented as a safe standalone join key, so fail hard if the API ever returns # the same SKU in multiple flexibility groups instead of silently publishing ambiguous data. -$duplicateSkus = $allRecords | Group-Object ArmSkuName | Where-Object Count -gt 1 +$duplicateSkus = $apiRecords | Group-Object ArmSkuName | Where-Object Count -gt 1 if ($duplicateSkus) { throw "Duplicate ArmSkuName values across flexibility groups: $($duplicateSkus.Name -join ', '). ArmSkuName must stay unique; investigate before publishing." } +function Assert-IsfScale +{ + <# + .SYNOPSIS + Fails the run if a carried-forward group sits on a different ratio scale than the API. + + .DESCRIPTION + The Catalogs API reports ratios as absolute vCPU counts, while the ratio files it replaced + normalized each group so its smallest SKU was 1. Both encode the same proportions in + different units, differing by a per-group constant. Those units were reconciled once, in a + one-time migration, so every published record now sits on the API scale. + + Azure retires individual sizes rather than whole families, so the API commonly returns only + part of a group. If a carried-forward record were ever on the other scale, the group would + silently mix units -- Ev3 Series ending up with Standard_E2_v3 at 2 from the API next to + Standard_E4_v3 at 2 from the older file, which is not just wrong but non-monotonic. + + Scale mismatches are large (the observed factors run from 2x to 80x) while a genuine ratio + correction from Microsoft is small and should simply be taken, so this compares the median + factor across the SKUs a group shares with the API and only fails on a scale-sized gap. + #> + param( + [object[]]$Published, + [object[]]$Api, + + # Well above any plausible ratio correction, well below the smallest observed unit change. + [double]$MaxFactor = 1.5 + ) + + $apiByGroup = @{} + foreach ($record in $Api) + { + if (-not $apiByGroup.ContainsKey($record.InstanceSizeFlexibilityGroup)) + { + $apiByGroup[$record.InstanceSizeFlexibilityGroup] = @{} + } + $apiByGroup[$record.InstanceSizeFlexibilityGroup][$record.ArmSkuName] = $record.Ratio + } + + $conflicts = [System.Collections.ArrayList]::new() + foreach ($group in ($Published | Group-Object InstanceSizeFlexibilityGroup)) + { + if (-not $apiByGroup.ContainsKey($group.Name)) { continue } + + $apiRatios = $apiByGroup[$group.Name] + $observed = @( + $group.Group | + Where-Object { $_.Ratio -and $apiRatios.ContainsKey($_.ArmSkuName) } | + ForEach-Object { $apiRatios[$_.ArmSkuName] / $_.Ratio } + ) + if ($observed.Count -eq 0) { continue } + + $sorted = @($observed | Sort-Object) + $factor = $sorted[[Math]::Floor($sorted.Count / 2)] + if ($factor -gt $MaxFactor -or $factor -lt (1 / $MaxFactor)) + { + $null = $conflicts.Add("$($group.Name) (published ratios are $([Math]::Round($factor, 3))x off the API)") + } + } + + if ($conflicts.Count -gt 0) + { + throw "These flexibility groups are on a different ratio scale than the Catalogs API, so merging them would publish one group in two units: $($conflicts -join '; '). The published dataset was migrated onto the API scale once; re-migrate these groups instead of publishing." + } +} + +# ----------------------------------------------------------------------- +# Step 2: Merge over the previously published file +# ----------------------------------------------------------------------- +# Keyed on ArmSkuName, lowest precedence first, so the live API wins wherever it has an opinion +# and rows it no longer returns are carried forward instead of dropped. Carried-forward records +# were migrated onto the API's scale once, and the check below keeps them there. +$publishedRecords = @(Import-IsfCsv -Path $OutputPath) +Assert-IsfScale -Published $publishedRecords -Api $apiRecords + +$merged = [ordered]@{} +$sources = @( + @{ Name = 'published'; Records = $publishedRecords } + @{ Name = 'API'; Records = $apiRecords } +) +foreach ($source in $sources) +{ + $added = 0 + $updated = 0 + foreach ($record in $source.Records) + { + if ($merged.Contains($record.ArmSkuName)) { $updated++ } else { $added++ } + $merged[$record.ArmSkuName] = $record + } + Write-Host " $($source.Name): $($source.Records.Count) records ($added new, $updated superseding an earlier source)" +} + +$allRecords = @($merged.Values) +Write-Host "Merged to $($allRecords.Count) SKUs across $(($allRecords | Group-Object InstanceSizeFlexibilityGroup).Count) flexibility groups" + +# The merge is keyed on ArmSkuName and every source is filtered to one group per SKU, so this can +# only fire if that changes. Keep the invariant checked rather than assumed. +$duplicateSkus = $allRecords | Group-Object ArmSkuName | Where-Object Count -gt 1 +if ($duplicateSkus) +{ + throw "Duplicate ArmSkuName values after merge: $($duplicateSkus.Name -join ', '). ArmSkuName must stay unique; investigate before publishing." +} + +# The published dataset must never shrink: downstream consumers join on SKUs that may no longer be +# purchasable but are still covered by active reservations. +$previousCount = (Import-IsfCsv -Path $OutputPath).Count +if ($allRecords.Count -lt $previousCount) +{ + throw "Merged output has $($allRecords.Count) SKUs but the published file has $previousCount. The dataset must not shrink; investigate before publishing." +} + # ----------------------------------------------------------------------- -# Step 2: Normalize, sort, and write output +# Step 3: Normalize, sort, and write output # ----------------------------------------------------------------------- if ($Normalize) { From d886805b5cd8598fe5349f79d3ba67bbe8060a14 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 8 Sep 2026 18:43:03 +0000 Subject: [PATCH 2/9] chore: Update ms.date in docs-mslearn files --- docs-mslearn/toolkit/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index 052de9564..9f993da90 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -3,7 +3,7 @@ title: FinOps toolkit changelog description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more. author: MSBrett ms.author: brettwil -ms.date: 09/07/2026 +ms.date: 09/08/2026 ms.topic: reference ms.service: finops ms.subservice: finops-toolkit From 3c28f860b8eb889f4745c181ba09a846ae036c5b Mon Sep 17 00:00:00 2001 From: Roland Krummenacher Date: Tue, 8 Sep 2026 20:56:34 +0200 Subject: [PATCH 3/9] docs(open-data): correct the description of the Catalogs API ratio scale The ratios were described as absolute vCPU counts. That holds for many D/E-series groups by coincidence -- their smallest SKU has 2 vCPUs, so normalizing against it yields a factor of 2 -- but not in general: - 799 of 1,164 parseable VM SKUs match their vCPU count; 365 do not. - Standard_B2as_v2 has 2 vCPUs and a ratio of 16; Standard_B16als_v2 has 16 and a ratio of 113.4. - azure_managed_redis_balanced_b1000 has a ratio of 1248. - 156 of the returned ratios are not integers. What is actually verifiable is that the API leaves ratios unnormalized: only 52 of its 211 groups start at 1, against 432 of 433 in the retired files. That is what the merge and the scale check rely on, so the wording now states it and no longer names a unit. Co-Authored-By: Claude Opus 5 (1M context) --- docs-mslearn/toolkit/changelog.md | 2 +- docs-mslearn/toolkit/open-data.md | 2 +- src/open-data/README.md | 2 +- src/scripts/Update-InstanceSizeFlexibility.ps1 | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index 052de9564..b5e7ee198 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -82,7 +82,7 @@ The following section lists features and enhancements that are currently in deve - Fixed the instance size flexibility dataset omitting SKUs that are no longer available to purchase. The Catalogs API only returns purchasable SKUs, so retired series that reservations still cover (Av2, D, DS, Dv2, Dv3, Ev3, F, G, H, LS, NC, NV, and others) were missing. The dataset is now additive and backfilled from the retired ratio file, growing from 211 to 318 flexibility groups and from 1,353 to 2,574 SKUs ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - Fixed the generator sweeping a hardcoded list of 26 regions, which silently omitted SKUs that launch only in regions outside the list. It now enumerates every physical region from the ARM locations API, 63 at the time of the change ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - Fixed the dataset publishing a SKU whose ratio is `0`, which the Optimization Engine's benefits simulation divides by. Non-positive ratios are now dropped ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - - Fixed ratios from the retired files sitting on a different scale than the Catalogs API. The retired files normalized each group so its smallest SKU was `1`; the API reports absolute vCPU counts. Because Azure retires individual sizes rather than whole families, the API covers only part of many groups, so combining the two left single groups holding both units. The backfilled rows were converted onto the API scale, and the generator now fails rather than publishing a group in two units ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - Fixed ratios from the retired files sitting on a different scale than the Catalogs API. The retired files normalized each group so its smallest SKU was `1`; the API returns them unnormalized, so a group's smallest SKU usually isn't `1`. Because Azure retires individual sizes rather than whole families, the API covers only part of many groups, so combining the two left single groups holding both units. The backfilled rows were converted onto the API scale, and the generator now fails rather than publishing a group in two units ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). **[Commitment discount eligibility](open-data.md#commitment-discount-eligibility)** diff --git a/docs-mslearn/toolkit/open-data.md b/docs-mslearn/toolkit/open-data.md index 191b3e6bd..b40d90e97 100644 --- a/docs-mslearn/toolkit/open-data.md +++ b/docs-mslearn/toolkit/open-data.md @@ -196,7 +196,7 @@ A few important notes about the data: - It covers Virtual Machines, Redis Cache, and Dedicated Host across every physical Azure region. - `ArmSkuName` is unique across the file and can be used as a join key on its own. - Ratios are the Microsoft values within each group (the smallest SKU isn't always `1`). Compare ratios only within a flexibility group. -- The retired ratio files normalized each group so its smallest SKU was `1`, while the Catalogs API reports absolute vCPU counts. Both express the same proportions. Rows carried over from the retired files were converted onto the API scale, except for the fully retired groups that the API doesn't cover, which keep the normalized scale. +- The retired ratio files normalized each group so its smallest SKU was `1`, while the Catalogs API returns them unnormalized, so a group's smallest SKU usually isn't `1`. Both express the same proportions. Rows carried over from the retired files were converted onto the API scale, except for the fully retired groups that the API doesn't cover, which keep the normalized scale. - Data is updated weekly via a GitHub Actions workflow. The dataset is additive: the Catalogs API only returns SKUs you can still purchase, so SKUs it no longer returns are kept because reservations might still cover them. diff --git a/src/open-data/README.md b/src/open-data/README.md index 4b32f133e..d2848535f 100644 --- a/src/open-data/README.md +++ b/src/open-data/README.md @@ -47,7 +47,7 @@ The dataset is additive. The Catalogs API only returns SKUs that are still purch Ratios are only comparable within a flexibility group, and the ratios the Catalogs API returns are used verbatim. -The retired files were on a different scale: they normalized each group so its smallest SKU was `1`, while the API reports absolute vCPU counts. Both encode the same proportions, differing by a per-group constant (usually 2×, e.g. `Standard_DS11_v2` is `1` in the retired file and `2` in the API). Because Azure retires individual sizes rather than whole families, the API often covers only part of a group — 44 of the 204 groups both sources knew — so a naive merge would leave one group holding both units. The rows backfilled from the retired files were therefore converted onto the API scale once, using the factor derived from the SKUs each group shared with the API, and the generator fails the run if a carried-forward group is ever found on the wrong scale again. +The retired files were on a different scale: they normalized each group so its smallest SKU was `1`, while the API leaves them unnormalized -- only 52 of its 211 groups start at `1`, against 432 of 433 in the retired files. Both encode the same proportions, differing by a per-group constant (usually 2×, e.g. `Standard_DS11_v2` is `1` in the retired file and `2` in the API). Because Azure retires individual sizes rather than whole families, the API often covers only part of a group — 44 of the 204 groups both sources knew — so a naive merge would leave one group holding both units. The rows backfilled from the retired files were therefore converted onto the API scale once, using the factor derived from the SKUs each group shared with the API, and the generator fails the run if a carried-forward group is ever found on the wrong scale again. The fully retired groups (roughly a third of the dataset — `Av2 Series`, `D Series`, `F Series`, and the like) have no API counterpart to convert against, so they keep the normalized scale. That is harmless as long as ratios are compared only within their own group. diff --git a/src/scripts/Update-InstanceSizeFlexibility.ps1 b/src/scripts/Update-InstanceSizeFlexibility.ps1 index 963e23855..b3cea693d 100644 --- a/src/scripts/Update-InstanceSizeFlexibility.ps1 +++ b/src/scripts/Update-InstanceSizeFlexibility.ps1 @@ -67,7 +67,7 @@ ratios are kept. Note that raw API ratios are NOT on the same scale as the retired isfratioblob.csv: the blob - normalized each group to smallest-SKU-=-1, the API returns vCPU-scaled values, and the two + normalized each group to smallest-SKU-=-1, the API returns unnormalized values, and the two differ by a per-group constant (usually 2x -- e.g. Standard_DS11_v2 is 1 in the blob and 2 in the API). The published dataset was migrated onto the API scale once, so ratios are the API's verbatim wherever it has an opinion. Ratios are only ever compared within a flexibility group. @@ -400,7 +400,7 @@ function Assert-IsfScale Fails the run if a carried-forward group sits on a different ratio scale than the API. .DESCRIPTION - The Catalogs API reports ratios as absolute vCPU counts, while the ratio files it replaced + The Catalogs API returns unnormalized ratios, while the ratio files it replaced normalized each group so its smallest SKU was 1. Both encode the same proportions in different units, differing by a per-group constant. Those units were reconciled once, in a one-time migration, so every published record now sits on the API scale. From 459231131485d39a8d5a54546be80b3cca0fe69a Mon Sep 17 00:00:00 2001 From: Roland Krummenacher Date: Tue, 8 Sep 2026 21:40:27 +0200 Subject: [PATCH 4/9] fix(open-data): parse and write ISF ratios with the invariant culture Ratios were parsed and written with the current culture. On a comma-decimal machine that corrupts the dataset in both directions: - de-DE parses "2.1" as 21, so a ratio is silently ten times too large. - fr-CH fails the parse outright, so the row is dropped. - Export-Csv writes the value back as "2,1", which breaks every consumer: the Optimization Engine's externaldata(... Ratio:double) and the Power BI partitions typed as number. CI runs on ubuntu-latest and is unaffected, but the README documents running the generator by hand, so a contributor in a comma-decimal locale would publish a corrupt file. Both parse sites and the write path now pin InvariantCulture, with a regression test that drives the generator under de-DE and asserts the round trip. Also corrects the SKU count in the changelog: it still said 2,574 from before the zero-ratio row was dropped, against 2,573 actually published. Reported by Copilot review on #2308 (the parse side; the write side turned up while verifying it). Co-Authored-By: Claude Opus 5 (1M context) --- docs-mslearn/toolkit/changelog.md | 2 +- .../Update-InstanceSizeFlexibility.Tests.ps1 | 26 +++++++++++++++++++ .../Update-InstanceSizeFlexibility.ps1 | 14 +++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index 101c0c675..4b6e61e9f 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -79,7 +79,7 @@ The following section lists features and enhancements that are currently in deve - **Added** - Added a new [Instance size flexibility](open-data.md#instance-size-flexibility) dataset that maps each ARM SKU to its instance size flexibility group and ratio, sourced from the Azure Reservations Catalogs API. It replaces the deprecated ISF ratio files hosted on `ccmstorageprod.blob.core.windows.net` ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - **Fixed** - - Fixed the instance size flexibility dataset omitting SKUs that are no longer available to purchase. The Catalogs API only returns purchasable SKUs, so retired series that reservations still cover (Av2, D, DS, Dv2, Dv3, Ev3, F, G, H, LS, NC, NV, and others) were missing. The dataset is now additive and backfilled from the retired ratio file, growing from 211 to 318 flexibility groups and from 1,353 to 2,574 SKUs ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - Fixed the instance size flexibility dataset omitting SKUs that are no longer available to purchase. The Catalogs API only returns purchasable SKUs, so retired series that reservations still cover (Av2, D, DS, Dv2, Dv3, Ev3, F, G, H, LS, NC, NV, and others) were missing. The dataset is now additive and backfilled from the retired ratio file, growing from 211 to 318 flexibility groups and from 1,353 to 2,573 SKUs ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - Fixed the generator sweeping a hardcoded list of 26 regions, which silently omitted SKUs that launch only in regions outside the list. It now enumerates every physical region from the ARM locations API, 63 at the time of the change ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - Fixed the dataset publishing a SKU whose ratio is `0`, which the Optimization Engine's benefits simulation divides by. Non-positive ratios are now dropped ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - Fixed ratios from the retired files sitting on a different scale than the Catalogs API. The retired files normalized each group so its smallest SKU was `1`; the API returns them unnormalized, so a group's smallest SKU usually isn't `1`. Because Azure retires individual sizes rather than whole families, the API covers only part of many groups, so combining the two left single groups holding both units. The backfilled rows were converted onto the API scale, and the generator now fails rather than publishing a group in two units ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). diff --git a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 index 1fe8267ed..d127eac4a 100644 --- a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 +++ b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 @@ -167,6 +167,32 @@ Describe 'Update-InstanceSizeFlexibility' { @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_D2' } + It 'Parses and writes ratios independently of the current culture' { + # On a comma-decimal culture, culture-aware parsing turns "2.1" into 21 (de-DE) or + # drops the row outright (fr-CH), and Export-Csv writes "2,1" back out, which breaks + # every consumer of the published file. + $originalCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture + try + { + [System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo]::new('de-DE') + @([PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A2_v2'; Ratio = '2.1' }) ` + | Export-Csv $outFile -NoTypeInformation + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '4.5')) + } + + Invoke-Generator $baseParams + + $raw = Get-Content $outFile -Raw + $raw | Should -BeLike '*"Standard_A2_v2","2.1"*' # carried forward, not 21 + $raw | Should -BeLike '*"Standard_D2","4.5"*' # from the API, not 45 + } + finally + { + [System.Threading.Thread]::CurrentThread.CurrentCulture = $originalCulture + } + } + It 'Skips items without ISF group or ratio properties' { Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( diff --git a/src/scripts/Update-InstanceSizeFlexibility.ps1 b/src/scripts/Update-InstanceSizeFlexibility.ps1 index b3cea693d..e6ab95192 100644 --- a/src/scripts/Update-InstanceSizeFlexibility.ps1 +++ b/src/scripts/Update-InstanceSizeFlexibility.ps1 @@ -268,7 +268,8 @@ function Get-IsfRecords # Optimization Engine's benefits simulation does exactly that -- so drop it rather than # publish a division by zero. The API returns one today (Azure Redis Cache Isolated). $parsedRatio = 0.0 - if ($flexGroup -and $armSkuName -and [double]::TryParse($ratio, [ref]$parsedRatio) -and $parsedRatio -gt 0) + $parsed = [double]::TryParse($ratio, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$parsedRatio) + if ($flexGroup -and $armSkuName -and $parsed -and $parsedRatio -gt 0) { $null = $records.Add([PSCustomObject]@{ InstanceSizeFlexibilityGroup = [string]$flexGroup @@ -333,7 +334,7 @@ function Import-IsfCsv foreach ($row in $rows) { $ratio = 0.0 - if (-not [double]::TryParse($row.Ratio, [ref]$ratio)) { continue } + if (-not [double]::TryParse($row.Ratio, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$ratio)) { continue } if ($ratio -le 0) { continue } if (-not $groupsPerSku.ContainsKey($row.ArmSkuName)) { $groupsPerSku[$row.ArmSkuName] = @{} } $groupsPerSku[$row.ArmSkuName][$row.InstanceSizeFlexibilityGroup] = $true @@ -342,7 +343,7 @@ function Import-IsfCsv foreach ($row in $rows) { $ratio = 0.0 - if (-not [double]::TryParse($row.Ratio, [ref]$ratio)) { continue } + if (-not [double]::TryParse($row.Ratio, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$ratio)) { continue } if ($ratio -le 0) { continue } if ($groupsPerSku[$row.ArmSkuName].Count -gt 1) { continue } # Same placeholder filter the API path applies, so a retired file's placeholder rows @@ -513,7 +514,12 @@ if ($Normalize) $allRecords = Get-NormalizedRecords -Records $allRecords } -$rows = $allRecords | Sort-Object InstanceSizeFlexibilityGroup, ArmSkuName +# Ratio is formatted invariantly rather than left to Export-Csv, which uses the current culture: +# on a comma-decimal machine it would publish "2,1" and break every consumer of the file. +$rows = $allRecords | + Sort-Object InstanceSizeFlexibilityGroup, ArmSkuName | + Select-Object InstanceSizeFlexibilityGroup, ArmSkuName, + @{ Name = 'Ratio'; Expression = { $_.Ratio.ToString([Globalization.CultureInfo]::InvariantCulture) } } $rows | Export-Csv -Path $OutputPath -UseQuotes Always -NoTypeInformation -Encoding utf8 Write-Host "Wrote $($rows.Count) SKUs to $OutputPath" From 69a114363941572df4a0ab09a6d7a992aa0af481 Mon Sep 17 00:00:00 2001 From: Roland Krummenacher Date: Wed, 9 Sep 2026 17:54:18 +0200 Subject: [PATCH 5/9] refactor(open-data): drop the ISF legacy backfill, keep the generator fixes Reverts the backfill of retired SKUs and everything it required: the additive merge, the shrink guard, Import-IsfCsv, Assert-IsfScale and the one-time migration onto the API scale. The generator publishes exactly what the Catalogs API returns again, and aborts without touching the file if any scope fails. The premise behind the backfill does not hold up. The dataset would have carried 1,220 rows sourced from a file Microsoft has retired, frozen forever because nothing can refresh or correct them, in a dataset whose contract is a weekly refresh from the authoritative API. Reservations on retired SKUs are better handled where they surface -- see #2300 for the Optimization Engine side. What remains are three independent defects, all of which concern the purchasable SKUs the API does return: - Region coverage: the sweep used a hardcoded list of 26 regions, so SKUs that launch in only a few regions were missing. It now enumerates every physical region from the ARM locations API (63 today). regionType is nested under metadata, and the logical groupings it marks are not valid catalog scopes. - Culture: ratios were parsed and written with the current culture, so a comma-decimal machine read "2.1" as 21 or rejected it, and wrote "2,1" back into the published file. - Zero ratios: the API returns one, and the benefits simulation workbook divides by Ratio. The published dataset goes from 1,353 to 1,363 SKUs -- no row removed, ten added by the wider region sweep. Co-Authored-By: Claude Opus 5 --- .../opendata-instance-size-flexibility.yml | 6 +- docs-mslearn/toolkit/changelog.md | 7 +- docs-mslearn/toolkit/open-data.md | 7 +- src/open-data/InstanceSizeFlexibility.csv | 1704 +++-------------- src/open-data/README.md | 12 +- .../Update-InstanceSizeFlexibility.Tests.ps1 | 160 +- .../Update-InstanceSizeFlexibility.ps1 | 212 +- 7 files changed, 291 insertions(+), 1817 deletions(-) diff --git a/.github/workflows/opendata-instance-size-flexibility.yml b/.github/workflows/opendata-instance-size-flexibility.yml index 800b84df8..370731907 100644 --- a/.github/workflows/opendata-instance-size-flexibility.yml +++ b/.github/workflows/opendata-instance-size-flexibility.yml @@ -94,13 +94,9 @@ jobs: echo "replacing the deprecated \`AutofitComboMeterData.csv\` and \`isfratioblob.csv\` files" echo "that were hosted on \`ccmstorageprod.blob.core.windows.net\` (retired 30 Aug 2026)." echo "" - echo "The dataset is additive: the Catalogs API only returns purchasable SKUs, so the" - echo "result is merged over the published file rather than replacing it. SKUs the API" - echo "no longer returns are retained." - echo "" echo "## Test plan" echo "" - echo "- [ ] Review the diff for unexpected changes (the dataset is additive, so expect additions and ratio updates only)" + echo "- [ ] Review the diff for unexpected changes (large drops in group/SKU count, etc.)" echo "- [ ] Spot-check a few SKUs against the Azure Pricing Calculator" echo "" echo "🤖 Generated by the **Update Instance Size Flexibility** workflow" diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index 4b6e61e9f..ddab3e98f 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -3,7 +3,7 @@ title: FinOps toolkit changelog description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more. author: MSBrett ms.author: brettwil -ms.date: 09/08/2026 +ms.date: 09/07/2026 ms.topic: reference ms.service: finops ms.subservice: finops-toolkit @@ -79,10 +79,9 @@ The following section lists features and enhancements that are currently in deve - **Added** - Added a new [Instance size flexibility](open-data.md#instance-size-flexibility) dataset that maps each ARM SKU to its instance size flexibility group and ratio, sourced from the Azure Reservations Catalogs API. It replaces the deprecated ISF ratio files hosted on `ccmstorageprod.blob.core.windows.net` ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - **Fixed** - - Fixed the instance size flexibility dataset omitting SKUs that are no longer available to purchase. The Catalogs API only returns purchasable SKUs, so retired series that reservations still cover (Av2, D, DS, Dv2, Dv3, Ev3, F, G, H, LS, NC, NV, and others) were missing. The dataset is now additive and backfilled from the retired ratio file, growing from 211 to 318 flexibility groups and from 1,353 to 2,573 SKUs ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - - Fixed the generator sweeping a hardcoded list of 26 regions, which silently omitted SKUs that launch only in regions outside the list. It now enumerates every physical region from the ARM locations API, 63 at the time of the change ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - Fixed the instance size flexibility generator sweeping a hardcoded list of 26 regions, which omitted SKUs that launch in only a handful of regions. It now enumerates every physical region from the ARM locations API, 63 at the time of the change ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - Fixed ratios being parsed and written with the current culture. On a comma-decimal machine `2.1` was read as `21` or rejected, and written back as `2,1`, which would break every consumer of the file ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - Fixed the dataset publishing a SKU whose ratio is `0`, which the Optimization Engine's benefits simulation divides by. Non-positive ratios are now dropped ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - - Fixed ratios from the retired files sitting on a different scale than the Catalogs API. The retired files normalized each group so its smallest SKU was `1`; the API returns them unnormalized, so a group's smallest SKU usually isn't `1`. Because Azure retires individual sizes rather than whole families, the API covers only part of many groups, so combining the two left single groups holding both units. The backfilled rows were converted onto the API scale, and the generator now fails rather than publishing a group in two units ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). **[Commitment discount eligibility](open-data.md#commitment-discount-eligibility)** diff --git a/docs-mslearn/toolkit/open-data.md b/docs-mslearn/toolkit/open-data.md index b40d90e97..75720ca0a 100644 --- a/docs-mslearn/toolkit/open-data.md +++ b/docs-mslearn/toolkit/open-data.md @@ -4,7 +4,7 @@ description: Use open data to normalize and enhance your FinOps reporting, ensur ms.topic: concept-article author: flanakin ms.author: micflan -ms.date: 09/08/2026 +ms.date: 09/09/2026 ms.service: finops ms.subservice: finops-toolkit ms.reviewer: micflan @@ -195,9 +195,8 @@ A few important notes about the data: - It covers Virtual Machines, Redis Cache, and Dedicated Host across every physical Azure region. - `ArmSkuName` is unique across the file and can be used as a join key on its own. -- Ratios are the Microsoft values within each group (the smallest SKU isn't always `1`). Compare ratios only within a flexibility group. -- The retired ratio files normalized each group so its smallest SKU was `1`, while the Catalogs API returns them unnormalized, so a group's smallest SKU usually isn't `1`. Both express the same proportions. Rows carried over from the retired files were converted onto the API scale, except for the fully retired groups that the API doesn't cover, which keep the normalized scale. -- Data is updated weekly via a GitHub Actions workflow. The dataset is additive: the Catalogs API only returns SKUs you can still purchase, so SKUs it no longer returns are kept because reservations might still cover them. +- Ratios are the raw Microsoft values within each group (the smallest SKU isn't always `1`). +- Data is updated weekly via a GitHub Actions workflow and always reflects the current API catalog, so retired SKUs are removed automatically. > [!div class="nextstepaction"] diff --git a/src/open-data/InstanceSizeFlexibility.csv b/src/open-data/InstanceSizeFlexibility.csv index 9165ac8ee..505ed64b5 100644 --- a/src/open-data/InstanceSizeFlexibility.csv +++ b/src/open-data/InstanceSizeFlexibility.csv @@ -1,11 +1,4 @@ "InstanceSizeFlexibilityGroup","ArmSkuName","Ratio" -"Av2 Series","Standard_A1_v2","1" -"Av2 Series","Standard_A2_v2","2.1" -"Av2 Series","Standard_A4_v2","4.4" -"Av2 Series","Standard_A8_v2","9.2" -"Av2 Series High Memory","Standard_A2m_v2","1" -"Av2 Series High Memory","Standard_A4m_v2","2" -"Av2 Series High Memory","Standard_A8m_v2","4" "Azure Managed Redis - Balanced","azure_managed_redis_balanced_b0","1" "Azure Managed Redis - Balanced","azure_managed_redis_balanced_b1","2" "Azure Managed Redis - Balanced","azure_managed_redis_balanced_b10","19.69" @@ -51,55 +44,6 @@ "Azure Managed Redis - Memory Optimized","azure_managed_redis_memory_optimized_m50","4" "Azure Managed Redis - Memory Optimized","azure_managed_redis_memory_optimized_m500","32" "Azure Managed Redis - Memory Optimized","azure_managed_redis_memory_optimized_m700","48" -"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_16_vCPU","4" -"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_32_vCPU","8" -"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_4_vCPU","1" -"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_48_vCPU","12" -"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_64_vCPU","16" -"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_72_vCPU","18" -"Azure Red Hat OpenShift Compute Optimized","Red_Hat_OpenShift_Compute_Optimized_v2_8_vCPU","2" -"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_1_vCPU","1" -"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_104_vCPU","104" -"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_2_vCPU","2" -"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_20_vCPU","20" -"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_24_vCPU","24" -"Azure Red Hat OpenShift General Purpose","Azure_Red_Hat_OpenShift_General_Purpose_96_vCPU","96" -"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_16_vCPU","16" -"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_32_vCPU","32" -"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_4_vCPU","4" -"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_48_vCPU","48" -"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_64_vCPU","64" -"Azure Red Hat OpenShift General Purpose","Red_Hat_OpenShift_General_Purpose_v3_8_vCPU","8" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_12_vCPU","3" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_16_vCPU","4" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_24_vCPU","6" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_4_vCPU","1" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_48_vCPU","12" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_6_vCPU","1.5" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_64_vCPU","16" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_8_vCPU","2" -"Azure Red Hat OpenShift GPU Accelerated NC","Azure_Red_Hat_OpenShift_GPU_Accelerated_NC_96_vCPU","24" -"Azure Red Hat OpenShift GPU Accelerated ND","Azure_Red_Hat_OpenShift_GPU_Accelerated_ND_96_vCPU","1" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_104_vCPU","52" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_128_vCPU","64" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_16_vCPU","8" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_192_vCPU","96" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_2_vCPU","1" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_20_vCPU","10" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_32_vCPU","16" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_4_vCPU","2" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_48_vCPU","24" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_64_vCPU","32" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_8_vCPU","4" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_80_vCPU","40" -"Azure Red Hat OpenShift Memory Optimized","Red_Hat_OpenShift_Memory_Optimized_v3_96_vCPU","48" -"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_16_vCPU","4" -"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_32_vCPU","8" -"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_4_vCPU","1" -"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_48_vCPU","12" -"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_64_vCPU","16" -"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_8_vCPU","2" -"Azure Red Hat OpenShift Storage Optimized","Azure_Red_Hat_OpenShift_Storage_Optimized_80_vCPU","20" "Azure Redis Cache Enterprise","azure_redis_cache_enterprise_e1","1" "Azure Redis Cache Enterprise","azure_redis_cache_enterprise_e10","12.03" "Azure Redis Cache Enterprise","azure_redis_cache_enterprise_e100","94.23" @@ -113,6 +57,7 @@ "Azure Redis Cache Premium","azure_redis_cache_premium_p3_cache","4" "Azure Redis Cache Premium","azure_redis_cache_premium_p4_cache","8" "Azure Redis Cache Premium","azure_redis_cache_premium_p5_cache","18.14" +"BS Series High Memory","Standard_B20ms","20.1" "Basv2 Series","Standard_B16als_v2","113.4" "Basv2 Series","Standard_B16as_v2","128.08" "Basv2 Series","Standard_B2als_v2","8" @@ -133,16 +78,6 @@ "Bpsv2 Series","Standard_B4ps_v2","31.9" "Bpsv2 Series","Standard_B8pls_v2","56.66" "Bpsv2 Series","Standard_B8ps_v2","64.04" -"BS Series","Standard_B1ls","1" -"BS Series","Standard_B1s","2" -"BS Series","Standard_B2s","8" -"BS Series High Memory","Standard_B12ms","12.05" -"BS Series High Memory","Standard_B16ms","16.05" -"BS Series High Memory","Standard_B1ms","0.5" -"BS Series High Memory","Standard_B20ms","20.1" -"BS Series High Memory","Standard_B2ms","2" -"BS Series High Memory","Standard_B4ms","4" -"BS Series High Memory","Standard_B8ms","8.05" "Bsv2 Series","Standard_B16ls_v2","113.27" "Bsv2 Series","Standard_B16s_v2","128.08" "Bsv2 Series","Standard_B2ls_v2","8" @@ -154,85 +89,6 @@ "Bsv2 Series","Standard_B4s_v2","31.92" "Bsv2 Series","Standard_B8ls_v2","56.73" "Bsv2 Series","Standard_B8s_v2","64.04" -"Copilot_Credit_Pre-Purchase_Plan","Microsoft_Copilot_Studio_Pay_As_You_Go","1" -"D Series","Standard_D1","1" -"D Series","Standard_D2","2" -"D Series","Standard_D3","4" -"D Series","Standard_D4","8" -"D Series High Memory","Standard_D11","1" -"D Series High Memory","Standard_D12","2" -"D Series High Memory","Standard_D13","4" -"D Series High Memory","Standard_D14","8" -"Dadsv5 Internal Series","Internal_D16ads_v5","8" -"Dadsv5 Internal Series","Internal_D2ads_v5","1" -"Dadsv5 Internal Series","Internal_D32ads_v5","16" -"Dadsv5 Internal Series","Internal_D48ads_v5","24" -"Dadsv5 Internal Series","Internal_D4ads_v5","2" -"Dadsv5 Internal Series","Internal_D64ads_v5","32" -"Dadsv5 Internal Series","Internal_D8ads_v5","4" -"Dadsv5 Internal Series","Internal_D96ads_v5","48" -"Dadsv5 Series","Standard_D16ads_v5","16" -"Dadsv5 Series","Standard_D2ads_v5","2" -"Dadsv5 Series","Standard_D32ads_v5","32" -"Dadsv5 Series","Standard_D48ads_v5","48" -"Dadsv5 Series","Standard_D4ads_v5","4" -"Dadsv5 Series","Standard_D64ads_v5","64" -"Dadsv5 Series","Standard_D8ads_v5","8" -"Dadsv5 Series","Standard_D96ads_v5","96" -"Dadsv5 Series DedicatedHost","dadsv5_type1","112" -"Dalsv5 Internal Series","Internal_D16als_v5","8" -"Dalsv5 Internal Series","Internal_D2als_v5","1" -"Dalsv5 Internal Series","Internal_D32als_v5","16" -"Dalsv5 Internal Series","Internal_D48als_v5","24" -"Dalsv5 Internal Series","Internal_D4als_v5","2" -"Dalsv5 Internal Series","Internal_D64als_v5","32" -"Dalsv5 Internal Series","Internal_D8als_v5","4" -"Dalsv5 Internal Series","Internal_D96als_v5","48" -"Dasv4 Series","Standard_D16as_v4","16" -"Dasv4 Series","Standard_D2as_v4","2" -"Dasv4 Series","Standard_D32as_v4","32" -"Dasv4 Series","Standard_D48as_v4","48" -"Dasv4 Series","Standard_D4ahs_v4","4" -"Dasv4 Series","Standard_D4as_v4","4" -"Dasv4 Series","Standard_D64as_v4","64" -"Dasv4 Series","Standard_D8ahs_v4","8" -"Dasv4 Series","Standard_D8as_v4","8" -"Dasv4 Series","Standard_D96as_v4","96" -"Dasv4 Series Dedicated Host","dasv4_type1","96" -"Dasv4 Series Dedicated Host","dasv4_type2","99.84" -"Dasv5 Internal Series","Internal_D16as_v5","8" -"Dasv5 Internal Series","Internal_D2as_v5","1" -"Dasv5 Internal Series","Internal_D32as_v5","16" -"Dasv5 Internal Series","Internal_D48as_v5","24" -"Dasv5 Internal Series","Internal_D4as_v5","2" -"Dasv5 Internal Series","Internal_D64as_v5","32" -"Dasv5 Internal Series","Internal_D8as_v5","4" -"Dasv5 Internal Series","Internal_D96as_v5","48" -"Dasv5 Promo Series","Standard_D16as_v5_Promo","8" -"Dasv5 Promo Series","Standard_D2as_v5_Promo","1" -"Dasv5 Promo Series","Standard_D32as_v5_Promo","16" -"Dasv5 Promo Series","Standard_D48as_v5_Promo","24" -"Dasv5 Promo Series","Standard_D4as_v5_Promo","2" -"Dasv5 Promo Series","Standard_D64as_v5_Promo","32" -"Dasv5 Promo Series","Standard_D8as_v5_Promo","4" -"Dasv5 Promo Series","Standard_D96as_v5_Promo","48" -"Dasv5 Series","Standard_D16as_v5","16" -"Dasv5 Series","Standard_D2as_v5","2" -"Dasv5 Series","Standard_D32as_v5","32" -"Dasv5 Series","Standard_D48as_v5","48" -"Dasv5 Series","Standard_D4as_v5","4" -"Dasv5 Series","Standard_D64as_v5","64" -"Dasv5 Series","Standard_D8as_v5","8" -"Dasv5 Series","Standard_D96as_v5","96" -"Dasv5 Series DedicatedHost","dasv5_type1","112" -"Dav4 Series","Standard_D16a_v4","16" -"Dav4 Series","Standard_D2a_v4","2" -"Dav4 Series","Standard_D32a_v4","32" -"Dav4 Series","Standard_D48a_v4","48" -"Dav4 Series","Standard_D4a_v4","4" -"Dav4 Series","Standard_D64a_v4","64" -"Dav4 Series","Standard_D8a_v4","8" -"Dav4 Series","Standard_D96a_v4","96" "DCadsv5-series DedicatedHost","dcadsv5 type 1","112" "DCadsv5-series Linux","Standard_DC16ads_v5","16" "DCadsv5-series Linux","Standard_DC2ads_v5","2" @@ -260,11 +116,6 @@ "DCdsv3 Series Linux","Standard_DC48ds_v3","48" "DCdsv3 Series Linux","Standard_DC4ds_v3","4" "DCdsv3 Series Linux","Standard_DC8ds_v3","8" -"DCSv2 Series","Standard_DC1s_v2","1" -"DCSv2 Series","Standard_DC2s_v2","2" -"DCSv2 Series","Standard_DC4s_v2","4" -"DCSv2 Series","Standard_DC8_v2","8" -"DCsv2 Series Dedicated Host","DCsv2 Type 1","1" "DCsv3 Series DedicatedHost","dcsv3 type1","51" "DCsv3 Series Linux","Standard_DC16s_v3","16" "DCsv3 Series Linux","Standard_DC1s_v3","1" @@ -274,6 +125,65 @@ "DCsv3 Series Linux","Standard_DC48s_v3","48" "DCsv3 Series Linux","Standard_DC4s_v3","4" "DCsv3 Series Linux","Standard_DC8s_v3","8" +"DSv2 Series","Standard_DS1_v2","1" +"DSv2 Series","Standard_DS2_v2","2" +"DSv2 Series","Standard_DS3_v2","4" +"DSv2 Series","Standard_DS4_v2","8" +"DSv2 Series","Standard_DS5_v2","16" +"DSv2 Series High Memory","Standard_DS11-1_v2","2" +"DSv2 Series High Memory","Standard_DS11_v2","2" +"DSv2 Series High Memory","Standard_DS12-1_v2","4" +"DSv2 Series High Memory","Standard_DS12-2_v2","4" +"DSv2 Series High Memory","Standard_DS12_v2","4" +"DSv2 Series High Memory","Standard_DS13-2_v2","8" +"DSv2 Series High Memory","Standard_DS13-4_v2","8" +"DSv2 Series High Memory","Standard_DS13_v2","8" +"DSv2 Series High Memory","Standard_DS14-4_v2","16" +"DSv2 Series High Memory","Standard_DS14-8_v2","16" +"DSv2 Series High Memory","Standard_DS14_v2","16" +"DSv2 Series High Memory","Standard_DS15_v2","20" +"DSv3 Series Dedicated Host","dsv3_type1","68" +"DSv3 Series Dedicated Host","dsv3_type2","76.59" +"DSv3 Series Dedicated Host","dsv3_type3","85" +"DSv3 Series Dedicated Host","dsv3_type4","106.08" +"DSv4 Series Dedicated Host","dsv4_type1","80" +"DSv4 Series Dedicated Host","dsv4_type2","96" +"Dadsv5 Series","Standard_D16ads_v5","16" +"Dadsv5 Series","Standard_D2ads_v5","2" +"Dadsv5 Series","Standard_D32ads_v5","32" +"Dadsv5 Series","Standard_D48ads_v5","48" +"Dadsv5 Series","Standard_D4ads_v5","4" +"Dadsv5 Series","Standard_D64ads_v5","64" +"Dadsv5 Series","Standard_D8ads_v5","8" +"Dadsv5 Series","Standard_D96ads_v5","96" +"Dadsv5 Series DedicatedHost","dadsv5_type1","112" +"Dasv4 Series","Standard_D16as_v4","16" +"Dasv4 Series","Standard_D2as_v4","2" +"Dasv4 Series","Standard_D32as_v4","32" +"Dasv4 Series","Standard_D48as_v4","48" +"Dasv4 Series","Standard_D4as_v4","4" +"Dasv4 Series","Standard_D64as_v4","64" +"Dasv4 Series","Standard_D8as_v4","8" +"Dasv4 Series","Standard_D96as_v4","96" +"Dasv4 Series Dedicated Host","dasv4_type1","96" +"Dasv4 Series Dedicated Host","dasv4_type2","99.84" +"Dasv5 Series","Standard_D16as_v5","16" +"Dasv5 Series","Standard_D2as_v5","2" +"Dasv5 Series","Standard_D32as_v5","32" +"Dasv5 Series","Standard_D48as_v5","48" +"Dasv5 Series","Standard_D4as_v5","4" +"Dasv5 Series","Standard_D64as_v5","64" +"Dasv5 Series","Standard_D8as_v5","8" +"Dasv5 Series","Standard_D96as_v5","96" +"Dasv5 Series DedicatedHost","dasv5_type1","112" +"Dav4 Series","Standard_D16a_v4","16" +"Dav4 Series","Standard_D2a_v4","2" +"Dav4 Series","Standard_D32a_v4","32" +"Dav4 Series","Standard_D48a_v4","48" +"Dav4 Series","Standard_D4a_v4","4" +"Dav4 Series","Standard_D64a_v4","64" +"Dav4 Series","Standard_D8a_v4","8" +"Dav4 Series","Standard_D96a_v4","96" "Ddsv4 Series","Standard_D16ds_v4","16" "Ddsv4 Series","Standard_D2ds_v4","2" "Ddsv4 Series","Standard_D32ds_v4","32" @@ -351,48 +261,6 @@ "Dpsv5 Series","Standard_D4ps_v5","4" "Dpsv5 Series","Standard_D64ps_v5","64" "Dpsv5 Series","Standard_D8ps_v5","8" -"DS Series","Standard_DS1","1" -"DS Series","Standard_DS2","2" -"DS Series","Standard_DS3","4" -"DS Series","Standard_DS4","8" -"DS Series High Memory","Standard_DS11","1" -"DS Series High Memory","Standard_DS12","2" -"DS Series High Memory","Standard_DS13","4" -"DS Series High Memory","Standard_DS14","8" -"DSv2 Series","Standard_DS1_v2","1" -"DSv2 Series","Standard_DS2_v2","2" -"DSv2 Series","Standard_DS3_v2","4" -"DSv2 Series","Standard_DS4_v2","8" -"DSv2 Series","Standard_DS5_v2","16" -"DSv2 Series High Memory","Standard_DS11_v2","2" -"DSv2 Series High Memory","Standard_DS11-1_v2","2" -"DSv2 Series High Memory","Standard_DS12_v2","4" -"DSv2 Series High Memory","Standard_DS12-1_v2","4" -"DSv2 Series High Memory","Standard_DS12-2_v2","4" -"DSv2 Series High Memory","Standard_DS13_v2","8" -"DSv2 Series High Memory","Standard_DS13-2_v2","8" -"DSv2 Series High Memory","Standard_DS13-4_v2","8" -"DSv2 Series High Memory","Standard_DS14_v2","16" -"DSv2 Series High Memory","Standard_DS14-4_v2","16" -"DSv2 Series High Memory","Standard_DS14-8_v2","16" -"DSv2 Series High Memory","Standard_DS15_v2","20" -"DSv2 Series High Memory Isolated","Standard_DS15i_v2","1" -"DSv3 Series","Standard_D16s_v3","8" -"DSv3 Series","Standard_D2s_v3","1" -"DSv3 Series","Standard_D32-16s_v3","16" -"DSv3 Series","Standard_D32-8s_v3","16" -"DSv3 Series","Standard_D32s_v3","16" -"DSv3 Series","Standard_D48s_v3","24" -"DSv3 Series","Standard_D4s_v3","2" -"DSv3 Series","Standard_D64-16s_v3","32" -"DSv3 Series","Standard_D64-32s_v3","32" -"DSv3 Series","Standard_D64s_v3","32" -"DSv3 Series","Standard_D8hs_v3","4" -"DSv3 Series","Standard_D8s_v3","4" -"DSv3 Series Dedicated Host","dsv3_type1","68" -"DSv3 Series Dedicated Host","dsv3_type2","76.59" -"DSv3 Series Dedicated Host","dsv3_type3","85" -"DSv3 Series Dedicated Host","dsv3_type4","106.08" "Dsv4 Series","Standard_D16s_v4","16" "Dsv4 Series","Standard_D2s_v4","2" "Dsv4 Series","Standard_D32s_v4","32" @@ -400,8 +268,6 @@ "Dsv4 Series","Standard_D4s_v4","4" "Dsv4 Series","Standard_D64s_v4","64" "Dsv4 Series","Standard_D8s_v4","8" -"DSv4 Series Dedicated Host","dsv4_type1","80" -"DSv4 Series Dedicated Host","dsv4_type2","96" "Dsv5 Series","Standard_D16s_v5","16" "Dsv5 Series","Standard_D2s_v5","2" "Dsv5 Series","Standard_D32s_v5","32" @@ -411,48 +277,67 @@ "Dsv5 Series","Standard_D8s_v5","8" "Dsv5 Series","Standard_D96s_v5","96" "Dsv5 Series DedicatedHost","dsv5_type1","107" -"Dv2 Series","Standard_D1_v2","1" -"Dv2 Series","Standard_D2_v2","2" -"Dv2 Series","Standard_D3_v2","4" -"Dv2 Series","Standard_D4_v2","8" -"Dv2 Series","Standard_D5_v2","16" -"Dv2 Series High Memory","Standard_D11_v2","1" -"Dv2 Series High Memory","Standard_D12_v2","2" -"Dv2 Series High Memory","Standard_D13_v2","4" -"Dv2 Series High Memory","Standard_D14_v2","8" -"Dv2 Series High Memory","Standard_D15_v2","10" -"Dv2 Series High Memory Isolated","Standard_D15i_v2","1" -"Dv3 Series","Standard_D16_v3","8" -"Dv3 Series","Standard_D2_v3","1" -"Dv3 Series","Standard_D32_v3","16" -"Dv3 Series","Standard_D4_v3","2" -"Dv3 Series","Standard_D48_v3","24" -"Dv3 Series","Standard_D64_v3","32" -"Dv3 Series","Standard_D8_v3","4" "Dv4 Series","Standard_D16_v4","16" "Dv4 Series","Standard_D2_v4","2" "Dv4 Series","Standard_D32_v4","32" -"Dv4 Series","Standard_D4_v4","4" "Dv4 Series","Standard_D48_v4","48" +"Dv4 Series","Standard_D4_v4","4" "Dv4 Series","Standard_D64_v4","64" "Dv4 Series","Standard_D8_v4","8" "Dv5 Series","Standard_D16_v5","16" "Dv5 Series","Standard_D2_v5","2" "Dv5 Series","Standard_D32_v5","32" -"Dv5 Series","Standard_D4_v5","4" "Dv5 Series","Standard_D48_v5","48" +"Dv5 Series","Standard_D4_v5","4" "Dv5 Series","Standard_D64_v5","64" "Dv5 Series","Standard_D8_v5","8" "Dv5 Series","Standard_D96_v5","96" -"Eadsv5 Internal Series","Internal_E16ads_v5","8" -"Eadsv5 Internal Series","Internal_E20ads_v5","10" -"Eadsv5 Internal Series","Internal_E2ads_v5","1" -"Eadsv5 Internal Series","Internal_E32ads_v5","16" -"Eadsv5 Internal Series","Internal_E48ads_v5","24" -"Eadsv5 Internal Series","Internal_E4ads_v5","2" -"Eadsv5 Internal Series","Internal_E64ads_v5","32" -"Eadsv5 Internal Series","Internal_E8ads_v5","4" -"Eadsv5 Internal Series","Internal_E96ads_v5","48" +"ECadsv5-series DedicatedHost","ecadsv5 type 1","112" +"ECadsv5-series Linux","Standard_EC16ads_v5","16" +"ECadsv5-series Linux","Standard_EC20ads_v5","20" +"ECadsv5-series Linux","Standard_EC2ads_v5","2" +"ECadsv5-series Linux","Standard_EC32ads_v5","32" +"ECadsv5-series Linux","Standard_EC48ads_v5","48" +"ECadsv5-series Linux","Standard_EC4ads_v5","4" +"ECadsv5-series Linux","Standard_EC64ads_v5","64" +"ECadsv5-series Linux","Standard_EC8ads_v5","8" +"ECadsv5-series Linux","Standard_EC96ads_v5","96" +"ECadsv5-series Linux","Standard_EC96iads_v5","105.6" +"ECasv5-series DedicatedHost","ecasv5 type 1","112" +"ECasv5-series Linux","Standard_EC16as_v5","16" +"ECasv5-series Linux","Standard_EC20as_v5","20" +"ECasv5-series Linux","Standard_EC2as_v5","2" +"ECasv5-series Linux","Standard_EC32as_v5","32" +"ECasv5-series Linux","Standard_EC48as_v5","48" +"ECasv5-series Linux","Standard_EC4as_v5","4" +"ECasv5-series Linux","Standard_EC64as_v5","64" +"ECasv5-series Linux","Standard_EC8as_v5","8" +"ECasv5-series Linux","Standard_EC96as_v5","96" +"ECasv5-series Linux","Standard_EC96ias_v5","105.6" +"ESv3 Series","Standard_E16-4s_v3","16" +"ESv3 Series","Standard_E16-8s_v3","16" +"ESv3 Series","Standard_E16s_v3","16" +"ESv3 Series","Standard_E20s_v3","20" +"ESv3 Series","Standard_E2s_v3","2" +"ESv3 Series","Standard_E32-16s_v3","32" +"ESv3 Series","Standard_E32-8s_v3","32" +"ESv3 Series","Standard_E32s_v3","32" +"ESv3 Series","Standard_E4-2s_v3","4" +"ESv3 Series","Standard_E48s_v3","48" +"ESv3 Series","Standard_E4s_v3","4" +"ESv3 Series","Standard_E64-16s_v3","57.6" +"ESv3 Series","Standard_E64-32s_v3","57.6" +"ESv3 Series","Standard_E64s_v3","57.6" +"ESv3 Series","Standard_E8-2s_v3","8" +"ESv3 Series","Standard_E8-4s_v3","8" +"ESv3 Series","Standard_E8s_v3","8" +"ESv3 Series Dedicated Host","esv3_type1","68" +"ESv3 Series Dedicated Host","esv3_type2","62" +"ESv3 Series Dedicated Host","esv3_type3","68.82" +"ESv3 Series Dedicated Host","esv3_type4","93" +"ESv4 Series Dedicated Host","esv4_type1","64" +"ESv4 Series Dedicated Host","esv4_type2","83.84" +"ESv4 Series Dedicated Host","standard_e64is_v4_special","64" "Eadsv5 Series","Standard_E112iads_v5","123.2" "Eadsv5 Series","Standard_E16-4ads_v5","16" "Eadsv5 Series","Standard_E16-8ads_v5","16" @@ -474,7 +359,6 @@ "Eadsv5 Series","Standard_E96-24ads_v5","96" "Eadsv5 Series","Standard_E96-48ads_v5","96" "Eadsv5 Series","Standard_E96ads_v5","96" -"Eadsv5 Series","Standard_E96iads_v5","105.4" "Eadsv5 Series DedicatedHost","eadsv5_type1","112" "Easv4 Series","Standard_E16-4as_v4","16" "Easv4 Series","Standard_E16-8as_v4","16" @@ -499,24 +383,6 @@ "Easv4 Series","Standard_E96ias_v4","96" "Easv4 Series Dedicated Host","easv4_type1","96" "Easv4 Series Dedicated Host","easv4_type2","112" -"Easv5 Internal Series","Internal_E16as_v5","8" -"Easv5 Internal Series","Internal_E20as_v5","10" -"Easv5 Internal Series","Internal_E2as_v5","1" -"Easv5 Internal Series","Internal_E32as_v5","16" -"Easv5 Internal Series","Internal_E48as_v5","24" -"Easv5 Internal Series","Internal_E4as_v5","2" -"Easv5 Internal Series","Internal_E64as_v5","32" -"Easv5 Internal Series","Internal_E8as_v5","4" -"Easv5 Internal Series","Internal_E96as_v5","48" -"Easv5 Promo Series","Standard_E16as_v5_Promo","8" -"Easv5 Promo Series","Standard_E20as_v5_Promo","10" -"Easv5 Promo Series","Standard_E2as_v5_Promo","1" -"Easv5 Promo Series","Standard_E32as_v5_Promo","16" -"Easv5 Promo Series","Standard_E48as_v5_Promo","24" -"Easv5 Promo Series","Standard_E4as_v5_Promo","2" -"Easv5 Promo Series","Standard_E64as_v5_Promo","31.9" -"Easv5 Promo Series","Standard_E8as_v5_Promo","4" -"Easv5 Promo Series","Standard_E96as_v5_Promo","47.8" "Easv5 Series","Standard_E112ias_v5","123.2" "Easv5 Series","Standard_E16-4as_v5","16" "Easv5 Series","Standard_E16-8as_v5","16" @@ -538,7 +404,6 @@ "Easv5 Series","Standard_E96-24as_v5","96" "Easv5 Series","Standard_E96-48as_v5","96" "Easv5 Series","Standard_E96as_v5","96" -"Easv5 Series","Standard_E96ias_v5","105.4" "Easv5 Series DedicatedHost","easv5_type1","112" "Eav4 Series","Standard_E16a_v4","16" "Eav4 Series","Standard_E20a_v4","20" @@ -549,7 +414,6 @@ "Eav4 Series","Standard_E64a_v4","64" "Eav4 Series","Standard_E8a_v4","8" "Eav4 Series","Standard_E96a_v4","96" -"Ebdsv5 Series","Ebdsv5","1" "Ebdsv5 Series","Standard_E112ibds_v5","123.2" "Ebdsv5 Series","Standard_E16bds_v5","16" "Ebdsv5 Series","Standard_E2bds_v5","2" @@ -560,7 +424,6 @@ "Ebdsv5 Series","Standard_E8bds_v5","8" "Ebdsv5 Series","Standard_E96bds_v5","96" "Ebdsv5 Series Dedicated Host","ebdsv5-type1","112" -"Ebsv5 Series","Ebsv5","1" "Ebsv5 Series","Standard_E112ibs_v5","123.2" "Ebsv5 Series","Standard_E16bs_v5","16" "Ebsv5 Series","Standard_E2bs_v5","2" @@ -571,52 +434,25 @@ "Ebsv5 Series","Standard_E8bs_v5","8" "Ebsv5 Series","Standard_E96bs_v5","96" "Ebsv5 Series Dedicated Host","ebsv5-type1","112" -"ECadsv5-series DedicatedHost","ecadsv5 type 1","112" -"ECadsv5-series Linux","Standard_EC16ads_v5","16" -"ECadsv5-series Linux","Standard_EC20ads_v5","20" -"ECadsv5-series Linux","Standard_EC2ads_v5","2" -"ECadsv5-series Linux","Standard_EC32ads_v5","32" -"ECadsv5-series Linux","Standard_EC48ads_v5","48" -"ECadsv5-series Linux","Standard_EC4ads_v5","4" -"ECadsv5-series Linux","Standard_EC64ads_v5","64" -"ECadsv5-series Linux","Standard_EC8ads_v5","8" -"ECadsv5-series Linux","Standard_EC96ads_v5","96" -"ECadsv5-series Linux","Standard_EC96iads_v5","105.6" -"ECasv5-series DedicatedHost","ecasv5 type 1","112" -"ECasv5-series Linux","Standard_EC16as_v5","16" -"ECasv5-series Linux","Standard_EC20as_v5","20" -"ECasv5-series Linux","Standard_EC2as_v5","2" -"ECasv5-series Linux","Standard_EC32as_v5","32" -"ECasv5-series Linux","Standard_EC48as_v5","48" -"ECasv5-series Linux","Standard_EC4as_v5","4" -"ECasv5-series Linux","Standard_EC64as_v5","64" -"ECasv5-series Linux","Standard_EC8as_v5","8" -"ECasv5-series Linux","Standard_EC96as_v5","96" -"ECasv5-series Linux","Standard_EC96ias_v5","105.6" "Edsv4 Series","Standard_E16-4ds_v4","16" "Edsv4 Series","Standard_E16-8ds_v4","16" "Edsv4 Series","Standard_E16ds_v4","16" -"Edsv4 Series","Standard_E16ds_v4_ADHType1","16" "Edsv4 Series","Standard_E20ds_v4","20" "Edsv4 Series","Standard_E2ds_v4","2" "Edsv4 Series","Standard_E32-16ds_v4","32" "Edsv4 Series","Standard_E32-8ds_v4","32" "Edsv4 Series","Standard_E32ds_v4","32" -"Edsv4 Series","Standard_E32ds_v4_ADHType1","32" "Edsv4 Series","Standard_E4-2ds_v4","4" "Edsv4 Series","Standard_E48ds_v4","48" "Edsv4 Series","Standard_E4ds_v4","4" -"Edsv4 Series","Standard_E4ds_v4_ADHType1","4" "Edsv4 Series","Standard_E64-16ds_v4","64" "Edsv4 Series","Standard_E64-32ds_v4","64" "Edsv4 Series","Standard_E64ds_v4","64" "Edsv4 Series","Standard_E8-2ds_v4","8" "Edsv4 Series","Standard_E8-4ds_v4","8" "Edsv4 Series","Standard_E8ds_v4","8" -"Edsv4 Series","Standard_E8ds_v4_ADHType1","8" "Edsv4 Series Dedicated Host","edsv4_type 1","68" "Edsv4 Series Dedicated Host","edsv4_type2","80.92" -"Edsv4 Series Isolated","Standard_E64ids_v4_SPECIAL","66.666667" "Edsv4 Series Isolated","Standard_E80ids_v4","80" "Edsv5 Series","Standard_E16-4ds_v5","16" "Edsv5 Series","Standard_E16-8ds_v5","16" @@ -648,7 +484,6 @@ "Edv4 Series","Standard_E4d_v4","4" "Edv4 Series","Standard_E64d_v4","64" "Edv4 Series","Standard_E8d_v4","8" -"Edv4 Series Isolated","Standard_E64id_v4_SPECIAL","1" "Edv5 Series","Standard_E104id_v5","114.4" "Edv5 Series","Standard_E16d_v5","16" "Edv5 Series","Standard_E20d_v5","20" @@ -659,7 +494,6 @@ "Edv5 Series","Standard_E64d_v5","64" "Edv5 Series","Standard_E8d_v5","8" "Edv5 Series","Standard_E96d_v5","96" -"Eiadmsv5-series Linux","Standard_E112_iadms_v5","1" "Epdsv5 Series","Standard_E16pds_v5","16" "Epdsv5 Series","Standard_E20pds_v5","20" "Epdsv5 Series","Standard_E2pds_v5","2" @@ -672,52 +506,23 @@ "Epsv5 Series","Standard_E32ps_v5","32" "Epsv5 Series","Standard_E4ps_v5","4" "Epsv5 Series","Standard_E8ps_v5","8" -"ESv3 Series","Standard_E16-4s_v3","16" -"ESv3 Series","Standard_E16-8s_v3","16" -"ESv3 Series","Standard_E16s_v3","16" -"ESv3 Series","Standard_E20s_v3","20" -"ESv3 Series","Standard_E2s_v3","2" -"ESv3 Series","Standard_E32-16s_v3","32" -"ESv3 Series","Standard_E32-8s_v3","32" -"ESv3 Series","Standard_E32s_v3","32" -"ESv3 Series","Standard_E4-2s_v3","4" -"ESv3 Series","Standard_E48s_v3","48" -"ESv3 Series","Standard_E4s_v3","4" -"ESv3 Series","Standard_E64-16s_v3","57.6" -"ESv3 Series","Standard_E64-32s_v3","57.6" -"ESv3 Series","Standard_E64s_v3","57.6" -"ESv3 Series","Standard_E8-2s_v3","8" -"ESv3 Series","Standard_E8-4s_v3","8" -"ESv3 Series","Standard_E8s_v3","8" -"ESv3 Series Dedicated Host","esv3_type1","68" -"ESv3 Series Dedicated Host","esv3_type2","62" -"ESv3 Series Dedicated Host","esv3_type3","68.82" -"ESv3 Series Dedicated Host","esv3_type4","93" -"ESv3 Series Isolated","Standard_E64is_v3","1" "Esv4 Series","Standard_E16-4s_v4","16" "Esv4 Series","Standard_E16-8s_v4","16" "Esv4 Series","Standard_E16s_v4","16" -"Esv4 Series","Standard_E16s_v4_ADHType1","16" "Esv4 Series","Standard_E20s_v4","20" "Esv4 Series","Standard_E2s_v4","2" "Esv4 Series","Standard_E32-16s_v4","32" "Esv4 Series","Standard_E32-8s_v4","32" "Esv4 Series","Standard_E32s_v4","32" -"Esv4 Series","Standard_E32s_v4_ADHType1","32" "Esv4 Series","Standard_E4-2s_v4","4" "Esv4 Series","Standard_E48s_v4","48" "Esv4 Series","Standard_E4s_v4","4" -"Esv4 Series","Standard_E4s_v4_ADHType1","4" "Esv4 Series","Standard_E64-16s_v4","64" "Esv4 Series","Standard_E64-32s_v4","64" "Esv4 Series","Standard_E64s_v4","64" "Esv4 Series","Standard_E8-2s_v4","8" "Esv4 Series","Standard_E8-4s_v4","8" "Esv4 Series","Standard_E8s_v4","8" -"Esv4 Series","Standard_E8s_v4_ADHType1","8" -"ESv4 Series Dedicated Host","esv4_type1","64" -"ESv4 Series Dedicated Host","esv4_type2","83.84" -"ESv4 Series Dedicated Host","standard_e64is_v4_special","64" "Esv4 Series Isolated","Standard_E80is_v4","80" "Esv5 Series","Standard_E16-4s_v5","16" "Esv5 Series","Standard_E16-8s_v5","16" @@ -741,713 +546,33 @@ "Esv5 Series","Standard_E96s_v5","96" "Esv5 Series DedicatedHost","esv5_type1","107" "Esv5 Series Isolated","Standard_E104is_v5","104" -"Ev3 Series","Standard_E16_v3","16" -"Ev3 Series","Standard_E2_v3","2" "Ev3 Series","Standard_E20_v3","20" +"Ev3 Series","Standard_E2_v3","2" "Ev3 Series","Standard_E32_v3","32" -"Ev3 Series","Standard_E4_v3","4" -"Ev3 Series","Standard_E48_v3","48" -"Ev3 Series","Standard_E64_v3","57.6" -"Ev3 Series","Standard_E8_v3","8" -"Ev3 Series Isolated","Standard_E64i_v3","1" "Ev4 Series","Standard_E16_v4","16" -"Ev4 Series","Standard_E2_v4","2" "Ev4 Series","Standard_E20_v4","20" +"Ev4 Series","Standard_E2_v4","2" "Ev4 Series","Standard_E32_v4","32" -"Ev4 Series","Standard_E4_v4","4" "Ev4 Series","Standard_E48_v4","48" +"Ev4 Series","Standard_E4_v4","4" "Ev4 Series","Standard_E64_v4","64" "Ev4 Series","Standard_E8_v4","8" -"Ev4 Series Isolated","Standard_E64i_v4_SPECIAL","1" "Ev5 Series","Standard_E104i_v5","114.4" "Ev5 Series","Standard_E16_v5","16" -"Ev5 Series","Standard_E2_v5","2" "Ev5 Series","Standard_E20_v5","20" +"Ev5 Series","Standard_E2_v5","2" "Ev5 Series","Standard_E32_v5","32" -"Ev5 Series","Standard_E4_v5","4" "Ev5 Series","Standard_E48_v5","48" +"Ev5 Series","Standard_E4_v5","4" "Ev5 Series","Standard_E64_v5","64" "Ev5 Series","Standard_E8_v5","8" "Ev5 Series","Standard_E96_v5","96" -"F Series","Standard_F1","1" -"F Series","Standard_F16","16" -"F Series","Standard_F2","2" -"F Series","Standard_F4","4" -"F Series","Standard_F8","8" -"Foundry_Agent_P3","3.3 70b FT","0.3" -"Foundry_Agent_P3","51 codex cd inp Dz","0.1" -"Foundry_Agent_P3","51 codex cd inp Gl","0.1" -"Foundry_Agent_P3","51 codex cd inp Rg","0.1" -"Foundry_Agent_P3","51 codex inp Dz","1.3" -"Foundry_Agent_P3","51 codex inp Gl","1.2" -"Foundry_Agent_P3","51 codex inp Rg","1.3" -"Foundry_Agent_P3","51 codex max cd inp Dz","0.1" -"Foundry_Agent_P3","51 codex max cd inp Gl","0.1" -"Foundry_Agent_P3","51 codex max cd inp Rg","0.1" -"Foundry_Agent_P3","51 codex max inp Dz","1.3" -"Foundry_Agent_P3","51 codex max inp Gl","1.2" -"Foundry_Agent_P3","51 codex max inp Rg","1.6" -"Foundry_Agent_P3","51 codex max opt Dz","11" -"Foundry_Agent_P3","51 codex max opt Gl","10" -"Foundry_Agent_P3","51 codex max opt Rg","12" -"Foundry_Agent_P3","51 codex mini inp Dz","0.2" -"Foundry_Agent_P3","51 codex mini inp Gl","0.2" -"Foundry_Agent_P3","51 codex mini inp Rg","0.3" -"Foundry_Agent_P3","51 codex mini opt Dz","2.2" -"Foundry_Agent_P3","51 codex mini opt Gl","2" -"Foundry_Agent_P3","51 codex mini opt Rg","2.4" -"Foundry_Agent_P3","51 codex opt Dz","11" -"Foundry_Agent_P3","51 codex opt Gl","10" -"Foundry_Agent_P3","51 codex opt Rg","12" -"Foundry_Agent_P3","52 chat 0210 cd inp Dz","0.1" -"Foundry_Agent_P3","52 chat 0210 cd inp Gl","0.1" -"Foundry_Agent_P3","52 chat 0210 cd inp Rg","0.2" -"Foundry_Agent_P3","52 chat 0210 inp Dz","2.4" -"Foundry_Agent_P3","52 chat 0210 inp Gl","1.7" -"Foundry_Agent_P3","52 chat 0210 inp Rg","1.9" -"Foundry_Agent_P3","52 chat 0210 opt Dz","15.4" -"Foundry_Agent_P3","52 chat 0210 opt Gl","14" -"Foundry_Agent_P3","52 chat 0210 opt Rg","16.9" -"Foundry_Agent_P3","52 codex cd inp Dz","0.1" -"Foundry_Agent_P3","52 codex cd inp Gl","0.2" -"Foundry_Agent_P3","52 codex cd inp Rg","0.1" -"Foundry_Agent_P3","52 codex inp Dz","1.9" -"Foundry_Agent_P3","52 codex inp Gl","2.1" -"Foundry_Agent_P3","52 codex inp Rg","1.9" -"Foundry_Agent_P3","52 codex opt Dz","15.4" -"Foundry_Agent_P3","52 codex opt Gl","14" -"Foundry_Agent_P3","52 codex opt Rg","18.4" -"Foundry_Agent_P3","A Event Analytics","1" -"Foundry_Agent_P3","Add-On Face Grouping","2" -"Foundry_Agent_P3","Add-On Formula","3" -"Foundry_Agent_P3","Add-On Layout","5" -"Foundry_Agent_P3","Agent_Commit_Units_100K","1" -"Foundry_Agent_P3","Agent_Commit_Units_20K","1" -"Foundry_Agent_P3","Agent_Commit_Units_500K","1" -"Foundry_Agent_P3","Apache Airflow job","1" -"Foundry_Agent_P3","API for GraphQL Query","1" -"Foundry_Agent_P3","Assistants-File Search-glbl","0.1" -"Foundry_Agent_P3","Assistants-File Search-regnl","0.1" -"Foundry_Agent_P3","Audio Content Extraction","0.3" -"Foundry_Agent_P3","Audio Field Extraction","0.8" -"Foundry_Agent_P3","autoscale for Data Warehouse","0.2" -"Foundry_Agent_P3","autoscale for Spark","0.2" -"Foundry_Agent_P3","Az-Code-Davinci","0.1" -"Foundry_Agent_P3","Az-Embeddings-Davinci","0.2" -"Foundry_Agent_P3","Az-Provisioned Throughput","2" -"Foundry_Agent_P3","babbage-002-FT-Hstng-glbl","1.7" -"Foundry_Agent_P3","babbage-002-FT-Hstng-regnl","1.7" -"Foundry_Agent_P3","babbage-002-FT-Trng-glbl","34" -"Foundry_Agent_P3","babbage-002-FT-Trng-regnl","34" -"Foundry_Agent_P3","Basic CC","0.1" -"Foundry_Agent_P3","Basic Doc Content Extraction","1" -"Foundry_Agent_P3","Batch2","1" -"Foundry_Agent_P3","Business","19" -"Foundry_Agent_P3","Business for non-GHE customers","19" -"Foundry_Agent_P3","C2","82.8" -"Foundry_Agent_P3","C2 Custom Model Hosting","12.5" -"Foundry_Agent_P3","C2 Custom Training","8.2" -"Foundry_Agent_P3","C3","24" -"Foundry_Agent_P3","C3 Custom Model Hosting","12.5" -"Foundry_Agent_P3","C3 Custom Training","6" -"Foundry_Agent_P3","C4","1451.6" -"Foundry_Agent_P3","C4 Custom Model Hosting","12.5" -"Foundry_Agent_P3","C4 Custom Training","4.5" -"Foundry_Agent_P3","CNV Neural HD Synthesis","48" -"Foundry_Agent_P3","Code-cushman-FineTuned-Training","26" -"Foundry_Agent_P3","Code-davinci","0.1" -"Foundry_Agent_P3","Commitment Tier App 150K hours","337500" -"Foundry_Agent_P3","Commitment Tier App 20K hours","75000" -"Foundry_Agent_P3","Commitment Tier App 400K hours","1.9" -"Foundry_Agent_P3","Commitment Tier App 50K hours","165000" -"Foundry_Agent_P3","Commitment Tier Azure 10000M","4.5" -"Foundry_Agent_P3","Commitment Tier Azure 1000M","6000" -"Foundry_Agent_P3","Commitment Tier Azure 250M","10.2" -"Foundry_Agent_P3","Commitment Tier Azure 4000M","6.8" -"Foundry_Agent_P3","Commitment Tier CLU Azure 10M","1.1" -"Foundry_Agent_P3","Commitment Tier CLU Azure 1M","1.6" -"Foundry_Agent_P3","Commitment Tier CLU Azure 25M","24000" -"Foundry_Agent_P3","Commitment Tier CLU Azure 3M","4080" -"Foundry_Agent_P3","Commitment Tier CLU Connected Cont 10M","9280" -"Foundry_Agent_P3","Commitment Tier CLU Connected Cont 1M","1280" -"Foundry_Agent_P3","Commitment Tier CLU Connected Cont 25M","19200" -"Foundry_Agent_P3","Commitment Tier CLU Connected Cont 3M","4080" -"Foundry_Agent_P3","Commitment Tier Connected 10000M","4.2" -"Foundry_Agent_P3","Commitment Tier Connected 1000M","7.1" -"Foundry_Agent_P3","Commitment Tier Connected 250M","9.7" -"Foundry_Agent_P3","Commitment Tier Connected 4000M","5.2" -"Foundry_Agent_P3","Commitment Tier CSTT Disconnected 100K","547200" -"Foundry_Agent_P3","Commitment Tier CSTT Disconnected 10K","111150" -"Foundry_Agent_P3","Commitment Tier CSTT Disconnected 2K","27360" -"Foundry_Agent_P3","Commitment Tier CSTT Disconnected 50K","427500" -"Foundry_Agent_P3","Commitment Tier Custom NTTS Disconnected 10000M","2016000" -"Foundry_Agent_P3","Commitment Tier Custom NTTS Disconnected 2000M","489600" -"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Azure 100K","0.5" -"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Azure 10K","7800" -"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Azure 2K","2400" -"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Azure 50K","30000" -"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Connected 100K","0.4" -"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Connected 10K","0.7" -"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Connected 2K","1824" -"Foundry_Agent_P3","Commitment Tier Custom Speech to Text Connected 50K","28500" -"Foundry_Agent_P3","Commitment Tier DC CLU 10M","111360" -"Foundry_Agent_P3","Commitment Tier DC CLU 1M","15360" -"Foundry_Agent_P3","Commitment Tier DC CLU 25M","288000" -"Foundry_Agent_P3","Commitment Tier DC CLU 3M","39168" -"Foundry_Agent_P3","Commitment Tier Emb 10000M","53437.5" -"Foundry_Agent_P3","Commitment Tier Emb 1000M","5.7" -"Foundry_Agent_P3","Commitment Tier Emb 250M","7.8" -"Foundry_Agent_P3","Commitment Tier Emb 4000M","6.5" -"Foundry_Agent_P3","Commitment Tier Image Azure 2.5M","1500" -"Foundry_Agent_P3","Commitment Tier Image Azure 250K","0.6" -"Foundry_Agent_P3","Commitment Tier Image Azure 6.25M","3281" -"Foundry_Agent_P3","Commitment Tier Image Azure 625K","398" -"Foundry_Agent_P3","Commitment Tier Image Con 6.25M","0.4" -"Foundry_Agent_P3","Commitment Tier Image Conn 2.5M","1425" -"Foundry_Agent_P3","Commitment Tier Image Conn 250K","0.6" -"Foundry_Agent_P3","Commitment Tier Image Conn 625K","379" -"Foundry_Agent_P3","Commitment Tier Pre-Built Azure 1000K","7.5" -"Foundry_Agent_P3","Commitment Tier Pre-Built Azure 100K","900" -"Foundry_Agent_P3","Commitment Tier Pre-Built Azure 20K","11.8" -"Foundry_Agent_P3","Commitment Tier Pre-Built Azure 500K","8" -"Foundry_Agent_P3","Commitment Tier Pre-Built Connected 1000K","6000" -"Foundry_Agent_P3","Commitment Tier Pre-Built Connected 100K","720" -"Foundry_Agent_P3","Commitment Tier Pre-Built Connected 20K","9.5" -"Foundry_Agent_P3","Commitment Tier Pre-Built Connected 500K","6.4" -"Foundry_Agent_P3","Commitment Tier Pre-Built Disconnected 1000K","90000" -"Foundry_Agent_P3","Commitment Tier Pre-Built Disconnected 100K","10800" -"Foundry_Agent_P3","Commitment Tier Pre-Built Disconnected 20K","2280" -"Foundry_Agent_P3","Commitment Tier Pre-Built Disconnected 500K","48000" -"Foundry_Agent_P3","Commitment Tier Read Azure 16000K","0.4" -"Foundry_Agent_P3","Commitment Tier Read Azure 2000K","1500" -"Foundry_Agent_P3","Commitment Tier Read Azure 500K","0.9" -"Foundry_Agent_P3","Commitment Tier Read Azure 8000K","4200" -"Foundry_Agent_P3","Commitment Tier Read Connected 16000K","6480" -"Foundry_Agent_P3","Commitment Tier Read Connected 2000K","1080" -"Foundry_Agent_P3","Commitment Tier Read Connected 500K","0.6" -"Foundry_Agent_P3","Commitment Tier Read Connected 8000K","0.4" -"Foundry_Agent_P3","Commitment Tier Read Disconnected 16000K","77760" -"Foundry_Agent_P3","Commitment Tier Read Disconnected 2000K","12960" -"Foundry_Agent_P3","Commitment Tier Read Disconnected 500K","4050" -"Foundry_Agent_P3","Commitment Tier Read Disconnected 8000K","56700" -"Foundry_Agent_P3","Commitment Tier STT AddOn 100K","171000" -"Foundry_Agent_P3","Commitment Tier STT AddOn 10K","27787.5" -"Foundry_Agent_P3","Commitment Tier STT AddOn 2K","5472" -"Foundry_Agent_P3","Commitment Tier STT AddOn 50K","106875" -"Foundry_Agent_P3","Commitment Tier STT AddOn Azure 100K","15000" -"Foundry_Agent_P3","Commitment Tier STT AddOn Azure 10K","2437.5" -"Foundry_Agent_P3","Commitment Tier STT AddOn Azure 2K","480" -"Foundry_Agent_P3","Commitment Tier STT AddOn Azure 50K","0.1" -"Foundry_Agent_P3","Commitment Tier STT AddOn Connected 100K","0.1" -"Foundry_Agent_P3","Commitment Tier STT AddOn Connected 10K","0.1" -"Foundry_Agent_P3","Commitment Tier STT AddOn Connected 2K","0.2" -"Foundry_Agent_P3","Commitment Tier STT AddOn Connected 50K","8906.2" -"Foundry_Agent_P3","Commitment Tier Summarization 10M","67200" -"Foundry_Agent_P3","Commitment Tier Summarization 1M","15360" -"Foundry_Agent_P3","Commitment Tier Summarization 3M","31680" -"Foundry_Agent_P3","Commitment Tier Summarization Azure 10M","0.8" -"Foundry_Agent_P3","Commitment Tier Summarization Azure 3M","1.3" -"Foundry_Agent_P3","Commitment Tier Summarization Connected 10M","5600" -"Foundry_Agent_P3","Commitment Tier Summarization Connected 3M","1.1" -"Foundry_Agent_P3","Commitment Tier TA4H 10M","70000" -"Foundry_Agent_P3","Commitment Tier TA4H 1M","14" -"Foundry_Agent_P3","Commitment Tier TA4H 3M","11" -"Foundry_Agent_P3","Commitment Tier TA4H Connected 10M","5.5" -"Foundry_Agent_P3","Commitment Tier TA4H Connected 1M","14000" -"Foundry_Agent_P3","Commitment Tier TA4H Connected 3M","27500" -"Foundry_Agent_P3","Commitment Tier Txt Azure 10M","0.2" -"Foundry_Agent_P3","Commitment Tier Txt Azure 1M","338" -"Foundry_Agent_P3","Commitment Tier Txt Azure 2.5M","0.3" -"Foundry_Agent_P3","Commitment Tier Txt Azure 25M","6563" -"Foundry_Agent_P3","Commitment Tier Txt Conn 10M","2850" -"Foundry_Agent_P3","Commitment Tier Txt Conn 1M","0.3" -"Foundry_Agent_P3","Commitment Tier Txt Conn 2.5M","0.3" -"Foundry_Agent_P3","Commitment Tier Txt Conn 25M","6234" -"Foundry_Agent_P3","Compute Pool","0.2" -"Foundry_Agent_P3","Copilot and AI","0.3" -"Foundry_Agent_P3","Cosmos DB backup storage","0.3" -"Foundry_Agent_P3","Csms DB in MS Fabric","1" -"Foundry_Agent_P3","Custom - Fast Transcription","0.4" -"Foundry_Agent_P3","Custom Image Classification","20" -"Foundry_Agent_P3","Custom Object Detection","2" -"Foundry_Agent_P3","Custom Speech to Text Batch Teams","0.2" -"Foundry_Agent_P3","D3","9" -"Foundry_Agent_P3","Data Movement","0.2" -"Foundry_Agent_P3","Data Orchestration","1" -"Foundry_Agent_P3","Data Warehouse","1" -"Foundry_Agent_P3","davinci-002-FT-Hstng-glbl","1.7" -"Foundry_Agent_P3","davinci-002-FT-Hstng-regnl","1.7" -"Foundry_Agent_P3","davinci-002-FT-Trng-glbl","50" -"Foundry_Agent_P3","davinci-002-FT-Trng-regnl","50" -"Foundry_Agent_P3","dbt job","1" -"Foundry_Agent_P3","Digital Twin Builder","0.2" -"Foundry_Agent_P3","Digital Twin Builder Operation","1" -"Foundry_Agent_P3","Digital Twin Builder Query","0.2" -"Foundry_Agent_P3","Doc AI DZone 2505","3.2" -"Foundry_Agent_P3","Doc AI glbl 2505","3" -"Foundry_Agent_P3","Doc AI regnl 2505","3.6" -"Foundry_Agent_P3","Document Field Extraction","22" -"Foundry_Agent_P3","Embed Internal","16" -"Foundry_Agent_P3","embedding-davinci-regnl","0.2" -"Foundry_Agent_P3","Enterprise","39" -"Foundry_Agent_P3","Eventhouse","0.1" -"Foundry_Agent_P3","Eventstream Connector","1" -"Foundry_Agent_P3","Eventstream Data Traffic","0.2" -"Foundry_Agent_P3","Eventstream Flat","1" -"Foundry_Agent_P3","Eventstream Processor","0.2" -"Foundry_Agent_P3","Fabric Meter 15","1" -"Foundry_Agent_P3","Fabric Meter 23","0.5" -"Foundry_Agent_P3","Fabric Meter 27","1" -"Foundry_Agent_P3","Fabric Meter 28","1" -"Foundry_Agent_P3","Fabric Meter 29","1" -"Foundry_Agent_P3","Fabric Meter 31","0.2" -"Foundry_Agent_P3","Fabric Meter 34","1" -"Foundry_Agent_P3","Fabric Meter 36","0.2" -"Foundry_Agent_P3","Fabric Meter 37","1" -"Foundry_Agent_P3","Fabric Meter 38","1" -"Foundry_Agent_P3","Fabric Meter 39","1" -"Foundry_Agent_P3","Fabric Meter 40","1" -"Foundry_Agent_P3","Fabric Meter 41","1" -"Foundry_Agent_P3","Fabric Meter 42","1" -"Foundry_Agent_P3","Fabric Meter 43","1" -"Foundry_Agent_P3","Fabric Meter 44","1" -"Foundry_Agent_P3","Fabric Meter 45","1" -"Foundry_Agent_P3","Fabric Meter 46","0.2" -"Foundry_Agent_P3","Fabric Meter 47","1" -"Foundry_Agent_P3","Fabric Meter 48","1" -"Foundry_Agent_P3","Fabric Meter 49","0.2" -"Foundry_Agent_P3","Fabric Meter 50","0.1" -"Foundry_Agent_P3","Fabric Meter 51","1" -"Foundry_Agent_P3","Fabric Meter 52","0.2" -"Foundry_Agent_P3","Fabric Meter 53","0.1" -"Foundry_Agent_P3","Fabric Meter 54","1" -"Foundry_Agent_P3","Fabric Meter 55","1" -"Foundry_Agent_P3","Fabric Meter 56","1" -"Foundry_Agent_P3","Fabric Meter 57","0.1" -"Foundry_Agent_P3","Fabric Meter 58","0.2" -"Foundry_Agent_P3","Fabric Meter 59","1" -"Foundry_Agent_P3","Fabric Meter 60","1" -"Foundry_Agent_P3","Fabric_Capacity_CU_Hour","0.1" -"Foundry_Agent_P3","Fabric_Capacity_Data_Movement_Incremental_copy","1" -"Foundry_Agent_P3","Face Transaction","1" -"Foundry_Agent_P3","Fast Transcription","0.3" -"Foundry_Agent_P3","File Based Speech Translation Input","1" -"Foundry_Agent_P3","file-search-tool-calls-datazone","2.7" -"Foundry_Agent_P3","file-search-tool-calls-glbl","2.5" -"Foundry_Agent_P3","file-search-tool-calls-rgnl","3.4" -"Foundry_Agent_P3","Flux 1.1 Pro Dzone","44" -"Foundry_Agent_P3","Flux 1.1 Pro glbl","40" -"Foundry_Agent_P3","Flux 1.1 Pro regnl","48.3" -"Foundry_Agent_P3","gpt 4.5 0227 Outp glbl","0.1" -"Foundry_Agent_P3","GPT 5 Batch Inpt DZone","0.6" -"Foundry_Agent_P3","GPT 5 Batch Inpt Glbl","0.6" -"Foundry_Agent_P3","GPT 5 Batch outpt DZone","5.5" -"Foundry_Agent_P3","GPT 5 Batch outpt Glbl","5" -"Foundry_Agent_P3","GPT 5 cchd Inpt DZone","0.1" -"Foundry_Agent_P3","GPT 5 cchd Inpt Glbl","0.1" -"Foundry_Agent_P3","GPT 5 cchd Inpt Rgnl","0.1" -"Foundry_Agent_P3","GPT 5 Chat cchd Inpt DZone","0.1" -"Foundry_Agent_P3","GPT 5 Chat cchd Inpt Glbl","0.1" -"Foundry_Agent_P3","GPT 5 Chat cchd Inpt Rgnl","0.1" -"Foundry_Agent_P3","GPT 5 Chat Inpt DZone","1.3" -"Foundry_Agent_P3","GPT 5 Chat Inpt Glbl","1.2" -"Foundry_Agent_P3","GPT 5 Chat Inpt Rgnl","1.5" -"Foundry_Agent_P3","GPT 5 Chat outpt DZone","13.7" -"Foundry_Agent_P3","GPT 5 Chat outpt Glbl","12.5" -"Foundry_Agent_P3","GPT 5 Chat outpt Rgnl","12" -"Foundry_Agent_P3","GPT 5 Inpt DZone","1.3" -"Foundry_Agent_P3","GPT 5 Inpt Glbl","1.2" -"Foundry_Agent_P3","GPT 5 Inpt Rgnl","1.3" -"Foundry_Agent_P3","GPT 5 Mini Batch Inpt DZone","0.1" -"Foundry_Agent_P3","GPT 5 Mini Batch Inpt Glbl","0.1" -"Foundry_Agent_P3","GPT 5 Mini Batch outpt DZone","1.3" -"Foundry_Agent_P3","GPT 5 Mini Batch outpt Glbl","1" -"Foundry_Agent_P3","GPT 5 Mini Inpt DZone","0.2" -"Foundry_Agent_P3","GPT 5 Mini Inpt Glbl","0.2" -"Foundry_Agent_P3","GPT 5 Mini Inpt Rgnl","0.3" -"Foundry_Agent_P3","GPT 5 Mini outpt DZone","2.7" -"Foundry_Agent_P3","GPT 5 Mini outpt Glbl","2" -"Foundry_Agent_P3","GPT 5 Mini outpt Rgnl","2.4" -"Foundry_Agent_P3","gpt 5 mini Prty Inp Dzone","0.4" -"Foundry_Agent_P3","gpt 5 mini Prty Inp glbl","0.4" -"Foundry_Agent_P3","gpt 5 mini Prty Outp Dzone","3.9" -"Foundry_Agent_P3","gpt 5 mini Prty Outp glbl","3.6" -"Foundry_Agent_P3","GPT 5 Nano Batch outpt DZone","0.2" -"Foundry_Agent_P3","GPT 5 Nano Batch outpt Glbl","0.2" -"Foundry_Agent_P3","GPT 5 Nano outpt DZone","0.4" -"Foundry_Agent_P3","GPT 5 Nano outpt Glbl","0.4" -"Foundry_Agent_P3","GPT 5 Nano outpt Rgnl","0.4" -"Foundry_Agent_P3","GPT 5 outpt DZone","11" -"Foundry_Agent_P3","GPT 5 outpt Glbl","10" -"Foundry_Agent_P3","GPT 5 outpt Rgnl","12" -"Foundry_Agent_P3","gpt 5 pro out dzone","0.1" -"Foundry_Agent_P3","gpt 5 pro out glbl","0.1" -"Foundry_Agent_P3","gpt 5 Prty cchd Inp Dzone","0.2" -"Foundry_Agent_P3","gpt 5 Prty cchd Inp glbl","0.3" -"Foundry_Agent_P3","gpt 5 Prty Inp Dzone","2.7" -"Foundry_Agent_P3","gpt 5 Prty Inp glbl","2.5" -"Foundry_Agent_P3","gpt 5 Prty Outp Dzone","22" -"Foundry_Agent_P3","gpt 5 Prty Outp glbl","20" -"Foundry_Agent_P3","GPT 5.2 Batch inp Dz","0.9" -"Foundry_Agent_P3","GPT 5.2 Batch inp Gl","0.8" -"Foundry_Agent_P3","GPT 5.2 Batch opt Dz","7.7" -"Foundry_Agent_P3","GPT 5.2 Batch opt Gl","7" -"Foundry_Agent_P3","GPT 5.2 cd inp Dz","0.1" -"Foundry_Agent_P3","GPT 5.2 cd inp Gl","0.1" -"Foundry_Agent_P3","GPT 5.2 cd inp Rg","0.1" -"Foundry_Agent_P3","GPT 5.2 chat cd inp Dz","0.1" -"Foundry_Agent_P3","GPT 5.2 chat cd inp Gl","0.1" -"Foundry_Agent_P3","GPT 5.2 chat cd inp Rg","0.2" -"Foundry_Agent_P3","GPT 5.2 chat inp Dz","1.9" -"Foundry_Agent_P3","GPT 5.2 chat inp Gl","1.7" -"Foundry_Agent_P3","GPT 5.2 chat inp Rg","2.1" -"Foundry_Agent_P3","GPT 5.2 chat opt Dz","19.2" -"Foundry_Agent_P3","GPT 5.2 chat opt Gl","14" -"Foundry_Agent_P3","GPT 5.2 chat opt Rg","19.2" -"Foundry_Agent_P3","GPT 5.2 inp Dz","1.9" -"Foundry_Agent_P3","GPT 5.2 inp Gl","1.7" -"Foundry_Agent_P3","GPT 5.2 inp Rg","1.9" -"Foundry_Agent_P3","GPT 5.2 opt Dz","15.4" -"Foundry_Agent_P3","GPT 5.2 opt Gl","14" -"Foundry_Agent_P3","GPT 5.2 opt Rg","16.9" -"Foundry_Agent_P3","GPT 5.2 pro Batch inp Dz","11.5" -"Foundry_Agent_P3","GPT 5.2 pro Batch inp Gl","13.1" -"Foundry_Agent_P3","GPT 5.2 pro Batch opt Dz","92.4" -"Foundry_Agent_P3","GPT 5.2 pro Batch opt Gl","84" -"Foundry_Agent_P3","GPT 5.2 pro inp Dz","23.1" -"Foundry_Agent_P3","GPT 5.2 pro inp Gl","21" -"Foundry_Agent_P3","GPT 5.2 pro inp Rg","27.7" -"Foundry_Agent_P3","GPT 5.2 pro opt Dz","184.8" -"Foundry_Agent_P3","GPT 5.2 pro opt Gl","168" -"Foundry_Agent_P3","GPT 5.2 pro opt Rg","203.2" -"Foundry_Agent_P3","GPT 51 Batch inp Dz","0.6" -"Foundry_Agent_P3","GPT 51 Batch inp Gl","0.6" -"Foundry_Agent_P3","GPT 51 Batch opt Dz","5.5" -"Foundry_Agent_P3","GPT 51 Batch opt Gl","5" -"Foundry_Agent_P3","GPT 51 cd inp Dz","0.1" -"Foundry_Agent_P3","GPT 51 cd inp Gl","0.1" -"Foundry_Agent_P3","GPT 51 cd inp Rg","0.1" -"Foundry_Agent_P3","GPT 51 chat cd inp Dz","0.1" -"Foundry_Agent_P3","GPT 51 chat cd inp Gl","0.1" -"Foundry_Agent_P3","GPT 51 chat cd inp Rg","0.1" -"Foundry_Agent_P3","GPT 51 chat inp Dz","1.3" -"Foundry_Agent_P3","GPT 51 chat inp Gl","1.2" -"Foundry_Agent_P3","GPT 51 chat inp Rg","1.3" -"Foundry_Agent_P3","GPT 51 chat opt Dz","11" -"Foundry_Agent_P3","GPT 51 chat opt Gl","12.5" -"Foundry_Agent_P3","GPT 51 chat opt Rg","12" -"Foundry_Agent_P3","GPT 51 inp Dz","1.3" -"Foundry_Agent_P3","GPT 51 inp Gl","1.2" -"Foundry_Agent_P3","GPT 51 inp Rg","1.5" -"Foundry_Agent_P3","GPT 51 opt Dz","11" -"Foundry_Agent_P3","GPT 51 opt Gl","10" -"Foundry_Agent_P3","GPT 51 opt Rg","12" -"Foundry_Agent_P3","gpt aud mn in DZ 1215","11" -"Foundry_Agent_P3","gpt aud mn in gl 1215","10" -"Foundry_Agent_P3","gpt aud mn in rg 1215","11" -"Foundry_Agent_P3","gpt aud mn out DZ 1215","22" -"Foundry_Agent_P3","gpt aud mn out gl 1215","20" -"Foundry_Agent_P3","gpt aud mn out rg 1215","22" -"Foundry_Agent_P3","gpt aud mn txt in DZ 1215","0.6" -"Foundry_Agent_P3","gpt aud mn txt in gl 1215","0.5" -"Foundry_Agent_P3","gpt aud mn txt in rg 1215","0.6" -"Foundry_Agent_P3","gpt aud mn txt out DZ 1215","2.6" -"Foundry_Agent_P3","gpt aud mn txt out gl 1215","2.3" -"Foundry_Agent_P3","gpt aud mn txt out rg 1215","2.9" -"Foundry_Agent_P3","gpt img 1.5 in cd img DZ","2.2" -"Foundry_Agent_P3","gpt img 1.5 in cd img gl","2.5" -"Foundry_Agent_P3","gpt img 1.5 in cd txt DZ","1.3" -"Foundry_Agent_P3","gpt img 1.5 in cd txt gl","1.2" -"Foundry_Agent_P3","gpt img 1.5 in img DZ","8.8" -"Foundry_Agent_P3","gpt img 1.5 in img gl","8" -"Foundry_Agent_P3","gpt img 1.5 in txt DZ","5.5" -"Foundry_Agent_P3","gpt img 1.5 in txt gl","6.2" -"Foundry_Agent_P3","gpt img 1.5 out img DZ","35.2" -"Foundry_Agent_P3","gpt img 1.5 out img gl","40" -"Foundry_Agent_P3","gpt img 1.5 out txt DZ","11" -"Foundry_Agent_P3","gpt img 1.5 out txt gl","10" -"Foundry_Agent_P3","gpt rt aud mn cd in DZ 1215","0.3" -"Foundry_Agent_P3","gpt rt aud mn cd in gl 1215","0.2" -"Foundry_Agent_P3","gpt rt aud mn cd in rg 1215","0.3" -"Foundry_Agent_P3","gpt rt aud mn in DZ 1215","11" -"Foundry_Agent_P3","gpt rt aud mn in gl 1215","10" -"Foundry_Agent_P3","gpt rt aud mn in rg 1215","11" -"Foundry_Agent_P3","gpt rt aud mn out DZ 1215","22" -"Foundry_Agent_P3","gpt rt aud mn out gl 1215","20" -"Foundry_Agent_P3","gpt rt aud mn out rg 1215","26.3" -"Foundry_Agent_P3","gpt rt img mn in DZ 1215","0.8" -"Foundry_Agent_P3","gpt rt img mn in gl 1215","0.8" -"Foundry_Agent_P3","gpt rt img mn in rg 1215","0.9" -"Foundry_Agent_P3","gpt rt txt mn in DZ 1215","0.6" -"Foundry_Agent_P3","gpt rt txt mn in gl 1215","0.5" -"Foundry_Agent_P3","gpt rt txt mn in rg 1215","0.7" -"Foundry_Agent_P3","gpt rt txt mn out DZ 1215","2.6" -"Foundry_Agent_P3","gpt rt txt mn Out gl 1215","2.3" -"Foundry_Agent_P3","gpt rt txt mn out rg 1215","2.6" -"Foundry_Agent_P3","gpt-35-turbo16K-FT-Hstng-glbl","1.7" -"Foundry_Agent_P3","gpt-35-turbo16K-FT-Hstng-regnl","2.1" -"Foundry_Agent_P3","gpt-35-turbo16K-FT-Trng-regnl","85" -"Foundry_Agent_P3","gpt-35-turbo4K-FT-Hstng-glbl","2.1" -"Foundry_Agent_P3","gpt-35-turbo4K-FT-Hstng-regnl","2.1" -"Foundry_Agent_P3","gpt-35-turbo4K-FT-Trng-regnl","49.5" -"Foundry_Agent_P3","gpt-4-32K-Outp-glbl","0.1" -"Foundry_Agent_P3","gpt-4-32K-Output-regional","0.1" -"Foundry_Agent_P3","gpt-4-8K-FT-Hstng-glbl","6.2" -"Foundry_Agent_P3","gpt-4-8K-FT-Hstng-regnl","6.2" -"Foundry_Agent_P3","gpt-4-8K-FT-Trng-regnl","127.5" -"Foundry_Agent_P3","gpt-4-8K-FT-Trng-regnl tkn","0.1" -"Foundry_Agent_P3","gpt-4.1-ft hosting global","1.7" -"Foundry_Agent_P3","gpt-4.1-ft hosting regional","1.7" -"Foundry_Agent_P3","gpt-4.1-mini-ft hosting global","1.7" -"Foundry_Agent_P3","gpt-4.1-mini-ft hosting regional","1.7" -"Foundry_Agent_P3","gpt-4.1-nano-ft hosting global","1.7" -"Foundry_Agent_P3","gpt-4.1-nano-ft hosting regional","1.7" -"Foundry_Agent_P3","gpt-4o-0806-FT-Hstng-glbl","1.7" -"Foundry_Agent_P3","gpt-4o-0806-FT-Hstng-regnl","1.8" -"Foundry_Agent_P3","gpt-4o-mini-0718-FT-Hstng-glbl","1.7" -"Foundry_Agent_P3","gpt-4o-mini-0718-FT-Hstng-regnl","1.8" -"Foundry_Agent_P3","gpt4o mn trscb aud in dz 1215","3.2" -"Foundry_Agent_P3","gpt4o mn trscb aud in gl 1215","3" -"Foundry_Agent_P3","gpt4o mn trscb aud in rg 1215","3.9" -"Foundry_Agent_P3","gpt4o mn trscb txt in dz 1215","1.3" -"Foundry_Agent_P3","gpt4o mn trscb txt in gl 1215","1.2" -"Foundry_Agent_P3","gpt4o mn trscb txt in rg 1215","1.3" -"Foundry_Agent_P3","gpt4o mn trscb txt out dz 1215","5.5" -"Foundry_Agent_P3","gpt4o mn trscb txt out gl 1215","5" -"Foundry_Agent_P3","gpt4o mn trscb txt out rg 1215","6" -"Foundry_Agent_P3","gpt4o mn tts aud out dz 1215","13.1" -"Foundry_Agent_P3","gpt4o mn tts aud out gl 1215","12" -"Foundry_Agent_P3","gpt4o mn tts aud out rg 1215","14.5" -"Foundry_Agent_P3","gpt4o mn tts txt in dz 1215","0.6" -"Foundry_Agent_P3","gpt4o mn tts txt in gl 1215","0.5" -"Foundry_Agent_P3","gpt4o mn tts txt in rg 1215","0.6" -"Foundry_Agent_P3","gpt4o realtimePrvw audio inp glbl","0.1" -"Foundry_Agent_P3","gpt4o realtimePrvw audio inp regn","0.1" -"Foundry_Agent_P3","gpt4o realtimePrvw audio outp glbl","0.2" -"Foundry_Agent_P3","gpt4o realtimePrvw audio outp regn","0.2" -"Foundry_Agent_P3","gpt4o realtimePrvwAudInp DataZone","0.1" -"Foundry_Agent_P3","gpt4o realtimePrvwAudOutp DataZone","0.2" -"Foundry_Agent_P3","Graph data management","1" -"Foundry_Agent_P3","Graph data science","1" -"Foundry_Agent_P3","High Scale DF Comp","0.2" -"Foundry_Agent_P3","Image Field Extraction","6" -"Foundry_Agent_P3","Image Retrieval - Query","0.1" -"Foundry_Agent_P3","Image-DALL-E-2-glbl","2.5" -"Foundry_Agent_P3","Image-DALL-E-2-regnl","2" -"Foundry_Agent_P3","Image-Dall-E-3 HD HighRes-glbl","12" -"Foundry_Agent_P3","Image-Dall-E-3 HD HighRes-regnl EP","13.1" -"Foundry_Agent_P3","Image-Dall-E-3 HD LowRes-glbl","8" -"Foundry_Agent_P3","Image-Dall-E-3 HD LowRes-regnl EP","10" -"Foundry_Agent_P3","Image-Dall-E-3 Std HighRes-glbl","10" -"Foundry_Agent_P3","Image-Dall-E-3 Std HighRes-regnl EP","8.8" -"Foundry_Agent_P3","Image-Dall-E-3 Std LowRes-glbl","5" -"Foundry_Agent_P3","Image-Dall-E-3 Std LowRes-regnl EP","4.4" -"Foundry_Agent_P3","Internal Personal Voice","6.2" -"Foundry_Agent_P3","Internal Service Charge","1000" -"Foundry_Agent_P3","Kontext Pro Dzone","44" -"Foundry_Agent_P3","Kontext Pro glbl","40" -"Foundry_Agent_P3","Kontext Pro regnl","48.3" -"Foundry_Agent_P3","Layout","5" -"Foundry_Agent_P3","Liveness","15" -"Foundry_Agent_P3","Liveness and Verification","18.6" -"Foundry_Agent_P3","M1","3" -"Foundry_Agent_P3","M2","3.2" -"Foundry_Agent_P3","Map processing","1" -"Foundry_Agent_P3","Map services","1" -"Foundry_Agent_P3","ML Model Endpoint","1" -"Foundry_Agent_P3","Model Router","0.1" -"Foundry_Agent_P3","Model Router Datazone","0.1" -"Foundry_Agent_P3","MultiRecognizerSpeechToTextTeams","1.1" -"Foundry_Agent_P3","Neural HD Text to Speech","22" -"Foundry_Agent_P3","o1-pro Batch Outp Data Zone","0.3" -"Foundry_Agent_P3","o1-pro Batch Outp glbl","0.2" -"Foundry_Agent_P3","o1-pro Inp Data Zone","0.1" -"Foundry_Agent_P3","o1-pro Inp glbl","0.1" -"Foundry_Agent_P3","o1-pro Inp regnl","0.1" -"Foundry_Agent_P3","o1-pro Outp Data Zone","0.6" -"Foundry_Agent_P3","o1-pro Outp glbl","0.5" -"Foundry_Agent_P3","o1-pro Outp regnl","0.7" -"Foundry_Agent_P3","o3-deep research 0626-inp-cchd-dzone","2.7" -"Foundry_Agent_P3","o3-deep research 0626-inp-cchd-glbl","2.5" -"Foundry_Agent_P3","o3-deep research 0626-inp-dzone","11" -"Foundry_Agent_P3","o3-deep research 0626-inp-glbl","10" -"Foundry_Agent_P3","o3-deep research 0626-out-dzone","44" -"Foundry_Agent_P3","o3-deep research 0626-out-glbl","40" -"Foundry_Agent_P3","o3-mini RFT Training global","100" -"Foundry_Agent_P3","o3-mini RFT Training regional","110" -"Foundry_Agent_P3","o3-mini-ft hosting global","1" -"Foundry_Agent_P3","o3-mini-ft hosting regional","1.1" -"Foundry_Agent_P3","o4 mini dev RFT Training glbl","50" -"Foundry_Agent_P3","o4-mini RFT Training global","100" -"Foundry_Agent_P3","o4-mini RFT Training regional","121" -"Foundry_Agent_P3","o4-mini-ft hosting global","1.7" -"Foundry_Agent_P3","o4-mini-ft hosting regional","1.7" -"Foundry_Agent_P3","OAI-based Neural Text to Speech","15" -"Foundry_Agent_P3","OCR 1125 Dzone","2.2" -"Foundry_Agent_P3","OCR 1125 glbl","2" -"Foundry_Agent_P3","OCR DZone","1.1" -"Foundry_Agent_P3","OCR glbl","1" -"Foundry_Agent_P3","OCR regnl","1.2" -"Foundry_Agent_P3","OneLake BCDR Iterative Read Operation via proxy","0.2" -"Foundry_Agent_P3","OneLake BCDR Iterative Read Operations","1" -"Foundry_Agent_P3","OneLake BCDR Iterative Write Operations","0.1" -"Foundry_Agent_P3","OneLake BCDR Iterative Write Operations via proxy","1" -"Foundry_Agent_P3","OneLake BCDR Other Operations","1" -"Foundry_Agent_P3","OneLake BCDR Other Operations via proxy","1" -"Foundry_Agent_P3","OneLake BCDR Read Operations","0.1" -"Foundry_Agent_P3","OneLake BCDR Read Operations via proxy","1" -"Foundry_Agent_P3","OneLake BCDR Write Operations","1" -"Foundry_Agent_P3","OneLake BCDR Write Operations via proxy","0.2" -"Foundry_Agent_P3","OneLake Cache","0.2" -"Foundry_Agent_P3","OneLake diagnostics","1" -"Foundry_Agent_P3","OneLake Iterative Read Operations","1" -"Foundry_Agent_P3","OneLake Iterative Read Operations via proxy","0.2" -"Foundry_Agent_P3","OneLake Iterative Write Operations","1" -"Foundry_Agent_P3","OneLake Iterative Write Operations via proxy","1" -"Foundry_Agent_P3","OneLake Other Operations","1" -"Foundry_Agent_P3","OneLake Other Operations via proxy","1" -"Foundry_Agent_P3","OneLake Read Operations","1" -"Foundry_Agent_P3","OneLake Read Operations via proxy","1" -"Foundry_Agent_P3","OneLake Security","1" -"Foundry_Agent_P3","OneLake Write Operations","1" -"Foundry_Agent_P3","Phi-3-Medium-128K-Instruct-Finetuned","0.8" -"Foundry_Agent_P3","Phi-3-Medium-4K-Instruct-Finetuned","0.8" -"Foundry_Agent_P3","Phi-3-Mini-128K-Instruct-Finetuned","0.8" -"Foundry_Agent_P3","Phi-3-Small-128K-Instruct-Finetuned","0.8" -"Foundry_Agent_P3","Phi-3.5-Mini-Instruct-Finetuned","0.8" -"Foundry_Agent_P3","Phi-4-Mini-FT","0.8" -"Foundry_Agent_P3","Photo Avatar Creation","2000" -"Foundry_Agent_P3","Power BI","1" -"Foundry_Agent_P3","Provisioned Data Zone","1.1" -"Foundry_Agent_P3","Provisioned Global","1" -"Foundry_Agent_P3","Provisioned Throughput - Available","2" -"Foundry_Agent_P3","Provisioned Throughput Units","312" -"Foundry_Agent_P3","Provisioned Throughput Units Overage","2" -"Foundry_Agent_P3","Real Time Speech Translation Cstm Audio Output","2" -"Foundry_Agent_P3","Real Time Speech Translation Std Audio Output","1.5" -"Foundry_Agent_P3","Real Time Speech Translation Text Output","10" -"Foundry_Agent_P3","Rerank v4 Fast DZ","2.2" -"Foundry_Agent_P3","Rerank v4 Fast Glbl","2" -"Foundry_Agent_P3","Rerank v4 Pro DZ","2.7" -"Foundry_Agent_P3","Rerank v4 Pro Glbl","2.5" -"Foundry_Agent_P3","RTI Event Listener and Alert","1" -"Foundry_Agent_P3","RTI Event Operations","1" -"Foundry_Agent_P3","S1 Custom Model Hosting","10" -"Foundry_Agent_P3","S1 Custom Training","12.5" -"Foundry_Agent_P3","S1 Custom Translation","40" -"Foundry_Agent_P3","S1 Document","15" -"Foundry_Agent_P3","S1 Image","10" -"Foundry_Agent_P3","S1 Standard","15" -"Foundry_Agent_P3","S2","8.2" -"Foundry_Agent_P3","S2 Custom Model Hosting","12.5" -"Foundry_Agent_P3","S3","6" -"Foundry_Agent_P3","S3 Custom Model Hosting","10" -"Foundry_Agent_P3","S4","5.6" -"Foundry_Agent_P3","S4 Custom Model Hosting","10" -"Foundry_Agent_P3","Shelf Image Composition","2.5" -"Foundry_Agent_P3","Shelf Planogram Compliance","5" -"Foundry_Agent_P3","Shelf Product Recognition","5" -"Foundry_Agent_P3","Sora 1080p 1-5s glbl","1.3" -"Foundry_Agent_P3","Sora 1080p 1-5s regnl","1.6" -"Foundry_Agent_P3","Sora 1080p 11-15s glbl","2.8" -"Foundry_Agent_P3","Sora 1080p 11-15s regnl","2.8" -"Foundry_Agent_P3","Sora 1080p 16-20s glbl","3.6" -"Foundry_Agent_P3","Sora 1080p 16-20s regnl","3.9" -"Foundry_Agent_P3","Sora 1080p 6-10s glbl","1.8" -"Foundry_Agent_P3","Sora 1080p 6-10s regnl","2" -"Foundry_Agent_P3","Sora 1080p Sq 1-5s glbl","0.5" -"Foundry_Agent_P3","Sora 1080p Sq 1-5s regnl","0.5" -"Foundry_Agent_P3","Sora 1080p Sq 11-15s glbl","1.1" -"Foundry_Agent_P3","Sora 1080p Sq 11-15s regnl","1.1" -"Foundry_Agent_P3","Sora 1080p Sq 16-20s glbl","1.3" -"Foundry_Agent_P3","Sora 1080p Sq 16-20s regnl","1.6" -"Foundry_Agent_P3","Sora 1080p Sq 6-10s glbl","0.7" -"Foundry_Agent_P3","Sora 1080p Sq 6-10s regnl","0.8" -"Foundry_Agent_P3","Sora 2 dzone","0.1" -"Foundry_Agent_P3","Sora 2 glbl","0.1" -"Foundry_Agent_P3","Sora 2 pro dzone","0.3" -"Foundry_Agent_P3","Sora 2 pro glbl","0.2" -"Foundry_Agent_P3","Sora 2 pro high res dzone","0.5" -"Foundry_Agent_P3","Sora 2 pro high res glbl","0.5" -"Foundry_Agent_P3","Sora 2 pro high res rgnl","0.6" -"Foundry_Agent_P3","Sora 2 pro rgnl","0.3" -"Foundry_Agent_P3","Sora 2 rgnl","0.1" -"Foundry_Agent_P3","Sora 480p 1-20s glbl","0.2" -"Foundry_Agent_P3","Sora 480p 1-20s regnl","0.2" -"Foundry_Agent_P3","Sora 480p Sq 1-20s glbl","0.1" -"Foundry_Agent_P3","Sora 480p Sq 1-20s regnl","0.1" -"Foundry_Agent_P3","Sora 720p 1-5s glbl","0.4" -"Foundry_Agent_P3","Sora 720p 1-5s regnl","0.4" -"Foundry_Agent_P3","Sora 720p 11-15s glbl","0.6" -"Foundry_Agent_P3","Sora 720p 11-15s regnl","0.6" -"Foundry_Agent_P3","Sora 720p 16-20s glbl","0.7" -"Foundry_Agent_P3","Sora 720p 16-20s regnl","0.9" -"Foundry_Agent_P3","Sora 720p 6-10s glbl","0.5" -"Foundry_Agent_P3","Sora 720p 6-10s regnl","0.5" -"Foundry_Agent_P3","Sora 720p Sq 1-20s glbl","0.2" -"Foundry_Agent_P3","Sora 720p Sq 1-20s regnl","0.2" -"Foundry_Agent_P3","Spark Mem Op","1" -"Foundry_Agent_P3","Spatial Presenter","5" -"Foundry_Agent_P3","Speech-Text to Speech HD-global","30" -"Foundry_Agent_P3","Speech-Text to Speech HD-Regional","36.2" -"Foundry_Agent_P3","Speech-Text to Speech-global","15" -"Foundry_Agent_P3","Speech-Text to Speech-Regional","15" -"Foundry_Agent_P3","Speech-to-Text-Batch-Whisper-glbl","0.3" -"Foundry_Agent_P3","Speech-to-Text-Batch-Whisper-regnl","0.4" -"Foundry_Agent_P3","SQL database in Microsoft Fabric","0.2" -"Foundry_Agent_P3","SQL database in Microsoft Fabric - LR","0.2" -"Foundry_Agent_P3","SQL Storage","0.2" -"Foundry_Agent_P3","SRE","0.1" -"Foundry_Agent_P3","SSIS in Fabric","1" -"Foundry_Agent_P3","Standard","0.3" -"Foundry_Agent_P3","Standard Doc Content Extraction","5" -"Foundry_Agent_P3","Standard Pay As You Go","15" -"Foundry_Agent_P3","Standard S1 CC","0.3" -"Foundry_Agent_P3","Standard S2 CC","1.9" -"Foundry_Agent_P3","Standard S3 CC","2.9" -"Foundry_Agent_P3","Standard Streaming","0.5" -"Foundry_Agent_P3","Storage","0.2" -"Foundry_Agent_P3","Storage Optimized L1 CC","4.2" -"Foundry_Agent_P3","Storage Optimized L2 CC","8.4" -"Foundry_Agent_P3","Text to Speech - Personal Voice","600" -"Foundry_Agent_P3","TTS Custom Avatar Batch","2" -"Foundry_Agent_P3","TTS Custom Avatar Hosting","0.5" -"Foundry_Agent_P3","TTS Custom Avatar Realtime","0.5" -"Foundry_Agent_P3","TTS Custom Avatar Training","15" -"Foundry_Agent_P3","TTS HD Custom Avatar Batch","2.7" -"Foundry_Agent_P3","TTS HD Custom Avatar Realtime","0.8" -"Foundry_Agent_P3","TTS HD Standard Avatar Batch","1.3" -"Foundry_Agent_P3","TTS HD Standard Avatar Realtime","0.6" -"Foundry_Agent_P3","TTS Standard Avatar Batch","1" -"Foundry_Agent_P3","TTS Standard Avatar Realtime","0.6" -"Foundry_Agent_P3","user data functions","0.1" -"Foundry_Agent_P3","User Messages","0.2" -"Foundry_Agent_P3","Vectorize Image","0.1" -"Foundry_Agent_P3","Video Content Extraction","1" -"Foundry_Agent_P3","Video Field Extraction","9" -"Foundry_Agent_P3","Video Retrieval - Query","0.2" -"Foundry_Agent_P3","Video Retrieval - Summary","6" -"Foundry_Agent_P3","Video Retrieval and Description - Ingestion","3" -"Foundry_Agent_P3","Video Translation AddOn PersonalVoice","0.2" -"Foundry_Agent_P3","Video Translation Automated","1" -"Foundry_Agent_P3","Video Translation Cstm Audio Output","20" -"Foundry_Agent_P3","Video Translation Edit Text to Video","0.2" -"Foundry_Agent_P3","Video Translation Input","5" -"Foundry_Agent_P3","Video Translation Std Audio Output","15" -"Foundry_Agent_P3","VNet Data Gateway","1" -"Foundry_Agent_P3","Voice Conversion - Standard","0.1" -"FS Series","Standard_F16s","16" -"FS Series","Standard_F1s","1" -"FS Series","Standard_F2s","2" -"FS Series","Standard_F4s","4" -"FS Series","Standard_F8s","8" "FSv2 Series","Standard_F16s_v2","16" "FSv2 Series","Standard_F2s_v2","2" "FSv2 Series","Standard_F32s_v2","32" "FSv2 Series","Standard_F48s_v2","48" "FSv2 Series","Standard_F4s_v2","4" "FSv2 Series","Standard_F64s_v2","64" -"FSv2 Series","Standard_F72fs_v2","72" "FSv2 Series","Standard_F72s_v2","72" "FSv2 Series","Standard_F8s_v2","8" "FSv2 Series Dedicated Host","fsv2 type3","93.6" @@ -1459,98 +584,38 @@ "FX Series Linux","Standard_FX36mds","36" "FX Series Linux","Standard_FX48mds","48" "FX Series Linux","Standard_FX4mds","4" -"G Series","Standard_G1","1" -"G Series","Standard_G2","2" -"G Series","Standard_G3","4" -"G Series","Standard_G4","8" -"G Series","Standard_G5","14.2" -"Gen7 IaaS LI_internal series Linux","Internal_Gen7_IaaS_LI","1" -"GS Series","Standard_GS1","1" -"GS Series","Standard_GS2","2" -"GS Series","Standard_GS3","4" -"GS Series","Standard_GS4","8" -"GS Series","Standard_GS4-4","8" -"GS Series","Standard_GS4-8","8" -"GS Series","Standard_GS5","14.2" -"GS Series","Standard_GS5-16","14.2" -"GS Series","Standard_GS5-8","14.2" -"H Series","Standard_H16","2" -"H Series","Standard_H8","1" -"H Series High Memory","Standard_H16m","2" -"H Series High Memory","Standard_H8m","1" -"H Series High Memory Low Latency","Standard_H16mr","1" -"H Series Low Latency","Standard_H16r","1" +"HBSv2 Series Low Latency","Standard_HB120-16rs_v2","120" +"HBSv2 Series Low Latency","Standard_HB120-32rs_v2","120" +"HBSv2 Series Low Latency","Standard_HB120-64rs_v2","120" +"HBSv2 Series Low Latency","Standard_HB120-96rs_v2","120" "HBrsv3 Series Low Latency","Standard_HB120-16rs_v3","120" "HBrsv3 Series Low Latency","Standard_HB120-32rs_v3","120" "HBrsv3 Series Low Latency","Standard_HB120-64rs_v3","120" "HBrsv3 Series Low Latency","Standard_HB120-96rs_v3","120" "HBrsv3 Series Low Latency","Standard_HB120rs_v3","120" -"HBS Series","Standard_HB60-15rs","1" -"HBS Series","Standard_HB60-30rs","1" -"HBS Series","Standard_HB60-45rs","1" -"HBS Series","Standard_HB60rs","1" -"HBSv2 Series Low Latency","Standard_HB120-16rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-32rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-64rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-96rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120rs_v2","120" "HCS Series","Standard_HC44-16rs","44" "HCS Series","Standard_HC44-32rs","44" "HCS Series","Standard_HC44rs","44" -"Internal series Linux","Internal_NPHH_128ids","1" -"Internal series Linux","Internal_NPMM_128ids","1" -"Internal_Gen8_MM_LI Linux","Internal_Gen8_LMMM_128ids_LI","4" -"Internal_Gen8_MM_LI Linux","Internal_Gen8_LMMM_32ds_LI","1" -"Internal_Gen8_MM_LI Linux","Internal_Gen8_LMMM_64ds_LI","2" +"LSv2 Series Dedicated Host","lsv2_type1","80" "Lasv3 Series DedicatedHost","lasv3_type1","80" -"Lasv3 Series Linux","Standard_L112ias_v3","123.2" "Lasv3 Series Linux","Standard_L16as_v3","16" "Lasv3 Series Linux","Standard_L32as_v3","32" "Lasv3 Series Linux","Standard_L48as_v3","48" "Lasv3 Series Linux","Standard_L64as_v3","64" "Lasv3 Series Linux","Standard_L80as_v3","80" "Lasv3 Series Linux","Standard_L8as_v3","8" -"Lasv3 Series Linux","Standard_L96ias_v3","104.8" -"LS Series","Standard_L16s","4" -"LS Series","Standard_L32s","8" -"LS Series","Standard_L4s","1" -"LS Series","Standard_L8s","2" -"LSv2 Series","Standard_L16s_v2","2" -"LSv2 Series","Standard_L32s_v2","4" -"LSv2 Series","Standard_L48s_v2","6" -"LSv2 Series","Standard_L64s_v2","8" -"LSv2 Series","Standard_L80s_v2","10" -"LSv2 Series","Standard_L8s_v2","1" -"LSv2 Series","Standard_L96s_v2","12" -"LSv2 Series Dedicated Host","lsv2_type1","80" -"LSv2 Series Isolated","Standard_L88is_v2","1" -"Lsv2_Internal-Series Linux","Internal_L128is_v2","1" "Lsv3 Series DedicatedHost","lsv3_type1","80" -"Lsv3 Series Linux","Standard_L104is_v3","104" -"Lsv3 Series Linux","Standard_L112is_v3","112" "Lsv3 Series Linux","Standard_L16s_v3","16" "Lsv3 Series Linux","Standard_L32s_v3","32" "Lsv3 Series Linux","Standard_L48s_v3","48" "Lsv3 Series Linux","Standard_L64s_v3","64" "Lsv3 Series Linux","Standard_L80s_v3","80" "Lsv3 Series Linux","Standard_L8s_v3","8" -"Lsv3 Series Linux","Standard_L96is_v3","96" -"MdSv2 Series 32 Disk","Standard_M32dms_v2","1" -"MdSv2 Series 64 Disk","Standard_M64ds_v2","1" -"Mdsv2 Series Dedicated Host","mdsv2medmem_type1","1" -"MdSv2 Series Disk","Standard_M192idms_v2","1" -"MdSv2 Series Disk 192s","Standard_M192ids_v2","1" -"MdSv2 Series Fractional High Memory Disk","Standard_M128ds_v2","1" -"MdSv2 Series High Memory Disk","Standard_M128dms_v2","1" -"Mdsv2 Series HM Dedicated Host","mdmsv2medmem _type1","1" -"MdSv2 Series Memory Disk","Standard_M64dms_v2","1" "MS Series","Standard_M128","2" "MS Series","Standard_M128s","2" "MS Series","Standard_M64","1" "MS Series","Standard_M64s","1" "MS Series Dedicated Host","ms_type1","1" -"MS Series Fractional","Standard_M16s","1" -"MS Series Fractional","Standard_M32s","1.3" "MS Series Fractional High Memory","Standard_M16-4ms","2" "MS Series Fractional High Memory","Standard_M16-8ms","2" "MS Series Fractional High Memory","Standard_M16ms","2" @@ -1563,6 +628,7 @@ "MS Series Fractional Large","Standard_M32ls","1" "MS Series Fractional Large","Standard_M64ls","1.9" "MS Series Fractional Tiny","Standard_M32ts","1" +"MS Series HM Dedicated Host","msm_type1","1" "MS Series High Memory","Standard_M128-32ms","2.6" "MS Series High Memory","Standard_M128-64ms","2.6" "MS Series High Memory","Standard_M128m","2.6" @@ -1571,52 +637,35 @@ "MS Series High Memory","Standard_M64-32ms","1" "MS Series High Memory","Standard_M64m","1" "MS Series High Memory","Standard_M64ms","1" -"MS Series HM Dedicated Host","msm_type1","1" -"MSv2 Series","Standard_M208-104s_v2","1" -"MSv2 Series","Standard_M208-52s_v2","1" "MSv2 Series","Standard_M208s_v2","1" -"MSv2 Series","Standard_M416-104s_v2","2.2" "MSv2 Series","Standard_M416-208s_v2","2.2" -"MSv2 Series","Standard_M416is_v2","2.2" "MSv2 Series","Standard_M416s_v2","2.2" "MSv2 Series 192ms","Standard_M192ims_v2","1" "MSv2 Series 32","Standard_M32ms_v2","1" "MSv2 Series 64","Standard_M64s_v2","1" "MSv2 Series Dedicated Host","msv2_type1","1" "MSv2 Series Disk 192s","Standard_M192is_v2","1" -"MSv2 Series Fractional","Standard_M192s_v2","8" -"MSv2 Series Fractional","Standard_M24s_v2","1" -"MSv2 Series Fractional","Standard_M48s_v2","2" -"MSv2 Series Fractional","Standard_M96s_v2","4" -"MSv2 Series Fractional High Memory","Standard_M192ms_v2","8" -"MSv2 Series Fractional High Memory","Standard_M24ms_v2","1" -"MSv2 Series Fractional High Memory","Standard_M48ms_v2","2" -"MSv2 Series Fractional High Memory","Standard_M96ms_v2","4" "MSv2 Series Fractional High Memory 128s","Standard_M128s_v2","1" -"MSv2 Series High Memory","Standard_M208-104ms_v2","4.4" -"MSv2 Series High Memory","Standard_M208-52ms_v2","4.4" +"MSv2 Series HM Dedicated Host","msmv2_type1","1" "MSv2 Series High Memory","Standard_M208ms_v2","4.4" -"MSv2 Series High Memory","Standard_M416-104ms_v2","9.8" "MSv2 Series High Memory","Standard_M416-208ms_v2","9.8" "MSv2 Series High Memory","Standard_M416ms_v2","9.8" "MSv2 Series High Memory","Standard_M416s_10_v2","8.16" "MSv2 Series High Memory","Standard_M416s_8_v2","6.5" "MSv2 Series High Memory","Standard_M416s_9_v2","7.36" -"MSv2 Series High Memory","Standard_M64-32ms_v2","1" "MSv2 Series High Memory 128ms","Standard_M128ms_v2","1" -"MSv2 Series HM Dedicated Host","msmv2_type1","1" "MSv2 Series MedMem Dedicated Host","msv2medmem type1","1" "MSv2 Series MedMem HM Dedicated Host","mmsv2medmem-type1","1" -"MSv2 Series MedMem HM Dedicated Host","Msmv2MedMem Type1","1" "MSv2 Series Memory","Standard_M64ms_v2","1" -"Msv2 XS Large Series","Standard_M832ixs","1" -"Msv2 XS Large Series","Standard_M832ixs_v2","1.8" -"MSv2 XS Series","Standard_M420ixs_v2","1" -"MSv2 XS Series","Standard_M420xs_v2","1" -"NC Series","Standard_NC12","2" -"NC Series","Standard_NC24","4" -"NC Series","Standard_NC6","1" -"NC Series Low Latency","Standard_NC24r","1" +"MdSv2 Series 32 Disk","Standard_M32dms_v2","1" +"MdSv2 Series 64 Disk","Standard_M64ds_v2","1" +"MdSv2 Series Disk","Standard_M192idms_v2","1" +"MdSv2 Series Disk 192s","Standard_M192ids_v2","1" +"MdSv2 Series Fractional High Memory Disk","Standard_M128ds_v2","1" +"MdSv2 Series High Memory Disk","Standard_M128dms_v2","1" +"MdSv2 Series Memory Disk","Standard_M64dms_v2","1" +"Mdsv2 Series Dedicated Host","mdsv2medmem_type1","1" +"Mdsv2 Series HM Dedicated Host","mdmsv2medmem _type1","1" "NCads A100 v4 Series Linux","Standard_NC24ads_A100_v4","24" "NCads A100 v4 Series Linux","Standard_NC48ads_A100_v4","48" "NCads A100 v4 Series Linux","Standard_NC96ads_A100_v4","96" @@ -1627,33 +676,14 @@ "NCasA10_v4 Linux","Standard_NC16ads_A10_v4","16" "NCasA10_v4 Linux","Standard_NC32ads_A10_v4","32" "NCasA10_v4 Linux","Standard_NC8ads_A10_v4","8" -"NCSv2 Series","Standard_NC12s_v2","2" -"NCSv2 Series","Standard_NC24s_v2","4" -"NCSv2 Series","Standard_NC6s_v2","1" -"NCSv2 Series Low Latency","Standard_NC24rs_v2","1" -"NCSv3 Series","Standard_NC12s_v3","2" -"NCSv3 Series","Standard_NC24s_v3","4" -"NCSv3 Series","Standard_NC6s_v3","1" -"NCSv3 Series Low Latency","Standard_NC24rs_v3","1" "NDamsr A100 v4 Series","ndamsra100v4_type1","96" -"NDamsr A100 v4 Series Linux","Standard_ND112amsr_A100_v4","106.56" -"NDamsr A100 v4 Series Linux","Standard_ND112asr_A100_v4","106.56" -"NDamsr A100 v4 Series Linux","Standard_ND96ams_A100_v4","106.56" "NDamsr A100 v4 Series Linux","Standard_ND96amsr_A100_v4","106.56" -"NDasr A100 v4 Series","ndasra100v4_type1","105.6" -"NDasr A100 v4 Series","Standard_ND96asr_A100_v4","96" "NDasr A100 v4 Series","Standard_ND96asr_v4","96" +"NDasr A100 v4 Series","ndasra100v4_type1","105.6" "NDrSv2 Series Low Latency","Standard_ND40rs_v2","40" -"NDS Series","Standard_ND12s","2" -"NDS Series","Standard_ND24s","4" -"NDS Series","Standard_ND6s","1" -"NDS Series Low Latency","Standard_ND24rs","1" "NP Series","Standard_NP10s","10" "NP Series","Standard_NP20s","20" "NP Series","Standard_NP40s","40" -"NV Series","Standard_NV12","2" -"NV Series","Standard_NV24","4" -"NV Series","Standard_NV6","1" "NVadsA10_v5 DedicatedHost","nvadsa10v5_type1","72" "NVadsA10_v5 Linux","Standard_NV12ads_A10_v5","12" "NVadsA10_v5 Linux","Standard_NV18ads_A10_v5","21.12" @@ -1661,82 +691,40 @@ "NVadsA10_v5 Linux","Standard_NV36ads_A10_v5","42.3" "NVadsA10_v5 Linux","Standard_NV6ads_A10_v5","6" "NVadsA10_v5 Linux","Standard_NV72ads_A10_v5","86.16" -"NVasv4 Series","Standard_NV16as_v4","4" -"NVasv4 Series","Standard_NV32as_v4","8" -"NVasv4 Series","Standard_NV4as_v4","1" -"NVasv4 Series","Standard_NV8as_v4","2" -"NVasv4 Series Dedicated Host","NVasv4_Type1","1" -"NVSv3 Series","Standard_NV12s_v3","1" -"NVSv3 Series","Standard_NV24s_v3","2" -"NVSv3 Series","Standard_NV48s_v3","4" -"NVSv3 Series Dedicated Host","NVsv3_Type1","1" -"NVSv3 Series High Memory","Standard_NV24ms_v3","1" -"NVSv3 Series High Memory","Standard_NV32ms_v3","1.2" -"Red Hat Enterprise Linux","Red Hat Enterprise Linux ARM64 1-4 vCPU","1" -"Red Hat Enterprise Linux","Red Hat Enterprise Linux ARM64 5plus vCPU","2.1" -"Red Hat Enterprise Linux","Red Hat Enterprise Linux for ARM64 1-4 vCPU","1" -"Red Hat Enterprise Linux","Red Hat Enterprise Linux for ARM64 5plus vCPU","1" -"Red Hat Enterprise Linux","Red Hat Enterprise Linux for ARM64 BYOS","1" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_1_4_vCPU_VM","1" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_1_vCPU_VM","1" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_12_vCPU_VM","9" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_120_vCPU_VM","80" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_128_vCPU_VM","85.3" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_144_vCPU_VM","96" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_16_vCPU_VM","12" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_192_vCPU_VM","128" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_2_vCPU_VM","2" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_20_vCPU_VM","15" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_208_vCPU_VM","138.6" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_24_vCPU_VM","18" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_32_vCPU_VM","24" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_4_vCPU_VM","4" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_40_vCPU_VM","30" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_416_vCPU_VM","277.3" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_420_vCPU_VM","280" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_44_vCPU_VM","33" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_48_vCPU_VM","36" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_5_vCPU_VM","2.1" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_52_vCPU_VM","39" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_6_vCPU_VM","6" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_60_vCPU_VM","45" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_64_vCPU_VM","48" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_72_vCPU_VM","54" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_8_vCPU_VM","8" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_80_vCPU_VM","60" -"Red Hat Enterprise Linux","Red_Hat_Enterprise_Linux_96_vCPU_VM","72" -"Red Hat Enterprise Linux for SAP with HA","RHEL_SAP_HA_1-4_vCPU","1" -"Red Hat Enterprise Linux for SAP with HA","RHEL_SAP_HA_5plus_vCPU","2.3" -"Red Hat Enterprise Linux with HA","RHEL_HA_1-4_vCPU","1" -"Red Hat Enterprise Linux with HA","RHEL_HA_5plus_vCPU","2" -"RHEL for SAP Business Applications","52 vCPU VM","1" -"SQL on IaaS","Standard_SQLG7_AMD_IaaS","1" -"SQLG7","SQLG7 IaaS","1" -"SQLG7","SQLG7 NP104s","1" -"SQLG7","Standard_SQLG7_AMD_NVME","2" -"SQLG7","Standard_SQLG7_NVME","1.6" -"SUSE Enterprise Linux Server for SQL with HA","SUSE_Enterprise_Linux_Server_for_SQL_with_HA_1-2_vCPU","1" -"SUSE Enterprise Linux Server for SQL with HA","SUSE_Enterprise_Linux_Server_for_SQL_with_HA_3-4_vCPU","1.9" -"SUSE Enterprise Linux Server for SQL with HA","SUSE_Enterprise_Linux_Server_for_SQL_with_HA_5_vCPU","2.1" -"SUSE Linux Enterprise Server for HPC Priority","SLES_HPC_Priority_1-2_vCPU_VM","1" -"SUSE Linux Enterprise Server for HPC Priority","SLES_HPC_Priority_3-4_vCPU_VM","2" -"SUSE Linux Enterprise Server for HPC Priority","SLES_HPC_Priority_5plus_vCPU_VM","2.6" -"SUSE Linux Enterprise Server for HPC Standard","SLES_HPC_Standard_1-2_vCPU_VM","1" -"SUSE Linux Enterprise Server for HPC Standard","SLES_HPC_Standard_3-4_vCPU_VM","1.9" -"SUSE Linux Enterprise Server for HPC Standard","SLES_HPC_Standard_5plus_vCPU_VM","2.9" -"SUSE Linux Enterprise Server for SAP Standard","SLES_SAP_Priority_1-2_vCPU_VM","1" -"SUSE Linux Enterprise Server for SAP Standard","SLES_SAP_Priority_3-4_vCPU_VM","2" -"SUSE Linux Enterprise Server for SAP Standard","SLES_SAP_Priority_5plus_vCPU_VM","2.4" -"SUSE Linux Enterprise Server for SAP Standard","SUSE_for_SAP_Linux_Enterprise_Server_1_2_vCPU_VM","1" -"SUSE Linux Enterprise Server for SAP Standard","SUSE_for_SAP_Linux_Enterprise_Server_3_4_vCPU_VM","2" -"SUSE Linux Enterprise Server for SAP Standard","SUSE_for_SAP_Linux_Enterprise_Server_5_vCPU_VM","2.4" -"SUSE Linux Enterprise Server Priority","SLES_Priority_1_vCPU_VM","1" -"SUSE Linux Enterprise Server Priority","SLES_Priority_2-4_vCPU_VM","2" -"SUSE Linux Enterprise Server Priority","SLES_Priority_6_vCPU_VM","3" -"SUSE Linux Enterprise Server Priority","SLES_Priority_8plus_vCPU_VM","3.2" -"SUSE Linux Enterprise Server Standard","SLES_Standard_1-2_vCPU_VM","1" -"SUSE Linux Enterprise Server Standard","SLES_Standard_3-4_vCPU_VM","1.9" -"SUSE Linux Enterprise Server Standard","SLES_Standard_5plus_vCPU_VM","2.3" +"Virtual Machines DCadsv6-series Linux","Standard_DC16ads_v6","16" +"Virtual Machines DCadsv6-series Linux","Standard_DC2ads_v6","2" +"Virtual Machines DCadsv6-series Linux","Standard_DC32ads_v6","32" +"Virtual Machines DCadsv6-series Linux","Standard_DC48ads_v6","48" +"Virtual Machines DCadsv6-series Linux","Standard_DC4ads_v6","4" +"Virtual Machines DCadsv6-series Linux","Standard_DC64ads_v6","64" +"Virtual Machines DCadsv6-series Linux","Standard_DC8ads_v6","8" +"Virtual Machines DCadsv6-series Linux","Standard_DC96ads_v6","96" +"Virtual Machines DCasv6-series Linux","Standard_DC16as_v6","16" +"Virtual Machines DCasv6-series Linux","Standard_DC2as_v6","2" +"Virtual Machines DCasv6-series Linux","Standard_DC32as_v6","32" +"Virtual Machines DCasv6-series Linux","Standard_DC48as_v6","48" +"Virtual Machines DCasv6-series Linux","Standard_DC4as_v6","4" +"Virtual Machines DCasv6-series Linux","Standard_DC64as_v6","64" +"Virtual Machines DCasv6-series Linux","Standard_DC8as_v6","8" +"Virtual Machines DCasv6-series Linux","Standard_DC96as_v6","96" +"Virtual Machines DCedsv6-series Linux","Standard_DC128eds_v6","128" +"Virtual Machines DCedsv6-series Linux","Standard_DC16eds_v6","16" +"Virtual Machines DCedsv6-series Linux","Standard_DC2eds_v6","2" +"Virtual Machines DCedsv6-series Linux","Standard_DC32eds_v6","32" +"Virtual Machines DCedsv6-series Linux","Standard_DC48eds_v6","48" +"Virtual Machines DCedsv6-series Linux","Standard_DC4eds_v6","4" +"Virtual Machines DCedsv6-series Linux","Standard_DC64eds_v6","64" +"Virtual Machines DCedsv6-series Linux","Standard_DC8eds_v6","8" +"Virtual Machines DCedsv6-series Linux","Standard_DC96eds_v6","96" +"Virtual Machines DCesv6-series Linux","Standard_DC128es_v6","128" +"Virtual Machines DCesv6-series Linux","Standard_DC16es_v6","16" +"Virtual Machines DCesv6-series Linux","Standard_DC2es_v6","2" +"Virtual Machines DCesv6-series Linux","Standard_DC32es_v6","32" +"Virtual Machines DCesv6-series Linux","Standard_DC48es_v6","48" +"Virtual Machines DCesv6-series Linux","Standard_DC4es_v6","4" +"Virtual Machines DCesv6-series Linux","Standard_DC64es_v6","64" +"Virtual Machines DCesv6-series Linux","Standard_DC8es_v6","8" +"Virtual Machines DCesv6-series Linux","Standard_DC96es_v6","96" "Virtual Machines Dadsv6-series Linux","Standard_D16ads_v6","16" "Virtual Machines Dadsv6-series Linux","Standard_D2ads_v6","2" "Virtual Machines Dadsv6-series Linux","Standard_D32ads_v6","32" @@ -1810,40 +798,6 @@ "Virtual Machines Dasv7-series Linux","Standard_D64as_v7","64" "Virtual Machines Dasv7-series Linux","Standard_D8as_v7","8" "Virtual Machines Dasv7-series Linux","Standard_D96as_v7","96" -"Virtual Machines DCadsv6-series Linux","Standard_DC16ads_v6","16" -"Virtual Machines DCadsv6-series Linux","Standard_DC2ads_v6","2" -"Virtual Machines DCadsv6-series Linux","Standard_DC32ads_v6","32" -"Virtual Machines DCadsv6-series Linux","Standard_DC48ads_v6","48" -"Virtual Machines DCadsv6-series Linux","Standard_DC4ads_v6","4" -"Virtual Machines DCadsv6-series Linux","Standard_DC64ads_v6","64" -"Virtual Machines DCadsv6-series Linux","Standard_DC8ads_v6","8" -"Virtual Machines DCadsv6-series Linux","Standard_DC96ads_v6","96" -"Virtual Machines DCasv6-series Linux","Standard_DC16as_v6","16" -"Virtual Machines DCasv6-series Linux","Standard_DC2as_v6","2" -"Virtual Machines DCasv6-series Linux","Standard_DC32as_v6","32" -"Virtual Machines DCasv6-series Linux","Standard_DC48as_v6","48" -"Virtual Machines DCasv6-series Linux","Standard_DC4as_v6","4" -"Virtual Machines DCasv6-series Linux","Standard_DC64as_v6","64" -"Virtual Machines DCasv6-series Linux","Standard_DC8as_v6","8" -"Virtual Machines DCasv6-series Linux","Standard_DC96as_v6","96" -"Virtual Machines DCedsv6-series Linux","Standard_DC128eds_v6","128" -"Virtual Machines DCedsv6-series Linux","Standard_DC16eds_v6","16" -"Virtual Machines DCedsv6-series Linux","Standard_DC2eds_v6","2" -"Virtual Machines DCedsv6-series Linux","Standard_DC32eds_v6","32" -"Virtual Machines DCedsv6-series Linux","Standard_DC48eds_v6","48" -"Virtual Machines DCedsv6-series Linux","Standard_DC4eds_v6","4" -"Virtual Machines DCedsv6-series Linux","Standard_DC64eds_v6","64" -"Virtual Machines DCedsv6-series Linux","Standard_DC8eds_v6","8" -"Virtual Machines DCedsv6-series Linux","Standard_DC96eds_v6","96" -"Virtual Machines DCesv6-series Linux","Standard_DC128es_v6","128" -"Virtual Machines DCesv6-series Linux","Standard_DC16es_v6","16" -"Virtual Machines DCesv6-series Linux","Standard_DC2es_v6","2" -"Virtual Machines DCesv6-series Linux","Standard_DC32es_v6","32" -"Virtual Machines DCesv6-series Linux","Standard_DC48es_v6","48" -"Virtual Machines DCesv6-series Linux","Standard_DC4es_v6","4" -"Virtual Machines DCesv6-series Linux","Standard_DC64es_v6","64" -"Virtual Machines DCesv6-series Linux","Standard_DC8es_v6","8" -"Virtual Machines DCesv6-series Linux","Standard_DC96es_v6","96" "Virtual Machines Ddsv6-series DedicatedHost","ddsv6_type1","192" "Virtual Machines Ddsv6-series Linux","Standard_D128ds_v6","127.56" "Virtual Machines Ddsv6-series Linux","Standard_D16ds_v6","16" @@ -1912,25 +866,19 @@ "Virtual Machines Dpdsv6-series Linux","Standard_D16pds_v6","16" "Virtual Machines Dpdsv6-series Linux","Standard_D2pds_v6","2" "Virtual Machines Dpdsv6-series Linux","Standard_D32pds_v6","32" -"Virtual Machines Dpdsv6-series Linux","Standard_D32pdus_v6","32" "Virtual Machines Dpdsv6-series Linux","Standard_D48pds_v6","48" "Virtual Machines Dpdsv6-series Linux","Standard_D4pds_v6","4" "Virtual Machines Dpdsv6-series Linux","Standard_D64pds_v6","64" -"Virtual Machines Dpdsv6-series Linux","Standard_D64pdus_v6","64" "Virtual Machines Dpdsv6-series Linux","Standard_D8pds_v6","8" "Virtual Machines Dpdsv6-series Linux","Standard_D96pds_v6","96" -"Virtual Machines Dpdsv6-series Linux","Standard_D96pdus_v6","96" "Virtual Machines Dpldsv6-series Linux","Standard_D16plds_v6","16" "Virtual Machines Dpldsv6-series Linux","Standard_D2plds_v6","2" "Virtual Machines Dpldsv6-series Linux","Standard_D32plds_v6","32" -"Virtual Machines Dpldsv6-series Linux","Standard_D32pldus_v6","32" "Virtual Machines Dpldsv6-series Linux","Standard_D48plds_v6","48" "Virtual Machines Dpldsv6-series Linux","Standard_D4plds_v6","4" "Virtual Machines Dpldsv6-series Linux","Standard_D64plds_v6","64" -"Virtual Machines Dpldsv6-series Linux","Standard_D64pldus_v6","64" "Virtual Machines Dpldsv6-series Linux","Standard_D8plds_v6","8" "Virtual Machines Dpldsv6-series Linux","Standard_D96plds_v6","96" -"Virtual Machines Dpldsv6-series Linux","Standard_D96pldus_v6","96" "Virtual Machines Dplsv6-series Linux","Standard_D16pls_v6","16" "Virtual Machines Dplsv6-series Linux","Standard_D2pls_v6","2" "Virtual Machines Dplsv6-series Linux","Standard_D32pls_v6","32" @@ -1958,22 +906,43 @@ "Virtual Machines Dsv6-series Linux","Standard_D64s_v6","63.88" "Virtual Machines Dsv6-series Linux","Standard_D8s_v6","8" "Virtual Machines Dsv6-series Linux","Standard_D96s_v6","95.8" -"Virtual Machines Eadsv6-series Linux","Standard_E16-4ads_v6","16" -"Virtual Machines Eadsv6-series Linux","Standard_E16-8ads_v6","16" +"Virtual Machines ECadsv6-series Linux","Standard_EC16ads_v6","16" +"Virtual Machines ECadsv6-series Linux","Standard_EC2ads_v6","2" +"Virtual Machines ECadsv6-series Linux","Standard_EC32ads_v6","32" +"Virtual Machines ECadsv6-series Linux","Standard_EC48ads_v6","48" +"Virtual Machines ECadsv6-series Linux","Standard_EC4ads_v6","4" +"Virtual Machines ECadsv6-series Linux","Standard_EC64ads_v6","64" +"Virtual Machines ECadsv6-series Linux","Standard_EC8ads_v6","8" +"Virtual Machines ECadsv6-series Linux","Standard_EC96ads_v6","96" +"Virtual Machines ECasv6-series Linux","Standard_EC16as_v6","16" +"Virtual Machines ECasv6-series Linux","Standard_EC2as_v6","2" +"Virtual Machines ECasv6-series Linux","Standard_EC32as_v6","32" +"Virtual Machines ECasv6-series Linux","Standard_EC48as_v6","48" +"Virtual Machines ECasv6-series Linux","Standard_EC4as_v6","4" +"Virtual Machines ECasv6-series Linux","Standard_EC64as_v6","64" +"Virtual Machines ECasv6-series Linux","Standard_EC8as_v6","8" +"Virtual Machines ECasv6-series Linux","Standard_EC96as_v6","96" +"Virtual Machines ECedsv6-series Linux","Standard_EC16eds_v6","16" +"Virtual Machines ECedsv6-series Linux","Standard_EC2eds_v6","2" +"Virtual Machines ECedsv6-series Linux","Standard_EC32eds_v6","32" +"Virtual Machines ECedsv6-series Linux","Standard_EC48eds_v6","48" +"Virtual Machines ECedsv6-series Linux","Standard_EC4eds_v6","4" +"Virtual Machines ECedsv6-series Linux","Standard_EC64eds_v6","64" +"Virtual Machines ECedsv6-series Linux","Standard_EC8eds_v6","8" +"Virtual Machines ECesv6-series Linux","Standard_EC16es_v6","16" +"Virtual Machines ECesv6-series Linux","Standard_EC2es_v6","2" +"Virtual Machines ECesv6-series Linux","Standard_EC32es_v6","32" +"Virtual Machines ECesv6-series Linux","Standard_EC48es_v6","48" +"Virtual Machines ECesv6-series Linux","Standard_EC4es_v6","4" +"Virtual Machines ECesv6-series Linux","Standard_EC64es_v6","64" +"Virtual Machines ECesv6-series Linux","Standard_EC8es_v6","8" "Virtual Machines Eadsv6-series Linux","Standard_E16ads_v6","16" "Virtual Machines Eadsv6-series Linux","Standard_E20ads_v6","20" "Virtual Machines Eadsv6-series Linux","Standard_E2ads_v6","2" -"Virtual Machines Eadsv6-series Linux","Standard_E32-16ads_v6","32" -"Virtual Machines Eadsv6-series Linux","Standard_E32-8ads_v6","32" "Virtual Machines Eadsv6-series Linux","Standard_E32ads_v6","32" -"Virtual Machines Eadsv6-series Linux","Standard_E4-2ads_v6","4" "Virtual Machines Eadsv6-series Linux","Standard_E48ads_v6","48" "Virtual Machines Eadsv6-series Linux","Standard_E4ads_v6","4" -"Virtual Machines Eadsv6-series Linux","Standard_E64-16ads_v6","64" -"Virtual Machines Eadsv6-series Linux","Standard_E64-32ads_v6","64" "Virtual Machines Eadsv6-series Linux","Standard_E64ads_v6","64" -"Virtual Machines Eadsv6-series Linux","Standard_E8-2ads_v6","8" -"Virtual Machines Eadsv6-series Linux","Standard_E8-4ads_v6","8" "Virtual Machines Eadsv6-series Linux","Standard_E8ads_v6","8" "Virtual Machines Eadsv6-series Linux","Standard_E96-24ads_v6","96.14" "Virtual Machines Eadsv6-series Linux","Standard_E96-48ads_v6","96.14" @@ -2002,25 +971,14 @@ "Virtual Machines Eadsv7-series Linux","Standard_E96-48ads_v7","96" "Virtual Machines Eadsv7-series Linux","Standard_E96ads_v7","96" "Virtual Machines Easv6-series DedicatedHost","easv6_type1","144" -"Virtual Machines Easv6-series Linux","Standard_E16-4as_v6","16" -"Virtual Machines Easv6-series Linux","Standard_E16-8as_v6","16" "Virtual Machines Easv6-series Linux","Standard_E16as_v6","16" "Virtual Machines Easv6-series Linux","Standard_E20as_v6","20" "Virtual Machines Easv6-series Linux","Standard_E2as_v6","2" -"Virtual Machines Easv6-series Linux","Standard_E32-16as_v6","32" -"Virtual Machines Easv6-series Linux","Standard_E32-8as_v6","32" "Virtual Machines Easv6-series Linux","Standard_E32as_v6","32" -"Virtual Machines Easv6-series Linux","Standard_E4-2as_v6","4" "Virtual Machines Easv6-series Linux","Standard_E48as_v6","48" "Virtual Machines Easv6-series Linux","Standard_E4as_v6","4" -"Virtual Machines Easv6-series Linux","Standard_E64-16as_v6","64" -"Virtual Machines Easv6-series Linux","Standard_E64-32as_v6","64" "Virtual Machines Easv6-series Linux","Standard_E64as_v6","64.1" -"Virtual Machines Easv6-series Linux","Standard_E8-2as_v6","8" -"Virtual Machines Easv6-series Linux","Standard_E8-4as_v6","8" "Virtual Machines Easv6-series Linux","Standard_E8as_v6","8" -"Virtual Machines Easv6-series Linux","Standard_E96-24as_v6","96" -"Virtual Machines Easv6-series Linux","Standard_E96-48as_v6","96" "Virtual Machines Easv6-series Linux","Standard_E96as_v6","96.16" "Virtual Machines Easv7-series Linux","Standard_E128-32as_v7","128" "Virtual Machines Easv7-series Linux","Standard_E128-64as_v7","128" @@ -2045,58 +1003,6 @@ "Virtual Machines Easv7-series Linux","Standard_E96-24as_v7","96" "Virtual Machines Easv7-series Linux","Standard_E96-48as_v7","96" "Virtual Machines Easv7-series Linux","Standard_E96as_v7","96" -"Virtual Machines Ebdsv6-Series Linux","Standard_E128bds_v6","64" -"Virtual Machines Ebdsv6-Series Linux","Standard_E16bds_v6","8" -"Virtual Machines Ebdsv6-Series Linux","Standard_E192ibds_v6","96" -"Virtual Machines Ebdsv6-Series Linux","Standard_E2bds_v6","1" -"Virtual Machines Ebdsv6-Series Linux","Standard_E32bds_v6","16" -"Virtual Machines Ebdsv6-Series Linux","Standard_E48bds_v6","24" -"Virtual Machines Ebdsv6-Series Linux","Standard_E4bds_v6","2" -"Virtual Machines Ebdsv6-Series Linux","Standard_E64bds_v6","32" -"Virtual Machines Ebdsv6-Series Linux","Standard_E8bds_v6","4" -"Virtual Machines Ebdsv6-Series Linux","Standard_E96bds_v6","48" -"Virtual Machines Ebsv6-Series Linux","Standard_E128bs_v6","64" -"Virtual Machines Ebsv6-Series Linux","Standard_E16bs_v6","8" -"Virtual Machines Ebsv6-Series Linux","Standard_E192ibs_v6","96" -"Virtual Machines Ebsv6-Series Linux","Standard_E2bs_v6","1" -"Virtual Machines Ebsv6-Series Linux","Standard_E32bs_v6","16" -"Virtual Machines Ebsv6-Series Linux","Standard_E48bs_v6","24" -"Virtual Machines Ebsv6-Series Linux","Standard_E4bs_v6","2" -"Virtual Machines Ebsv6-Series Linux","Standard_E64bs_v6","32" -"Virtual Machines Ebsv6-Series Linux","Standard_E8bs_v6","4" -"Virtual Machines Ebsv6-Series Linux","Standard_E96bs_v6","48" -"Virtual Machines ECadsv6-series Linux","Standard_EC16ads_v6","16" -"Virtual Machines ECadsv6-series Linux","Standard_EC2ads_v6","2" -"Virtual Machines ECadsv6-series Linux","Standard_EC32ads_v6","32" -"Virtual Machines ECadsv6-series Linux","Standard_EC48ads_v6","48" -"Virtual Machines ECadsv6-series Linux","Standard_EC4ads_v6","4" -"Virtual Machines ECadsv6-series Linux","Standard_EC64ads_v6","64" -"Virtual Machines ECadsv6-series Linux","Standard_EC8ads_v6","8" -"Virtual Machines ECadsv6-series Linux","Standard_EC96ads_v6","96" -"Virtual Machines ECasv6-series Linux","Standard_EC16as_v6","16" -"Virtual Machines ECasv6-series Linux","Standard_EC2as_v6","2" -"Virtual Machines ECasv6-series Linux","Standard_EC32as_v6","32" -"Virtual Machines ECasv6-series Linux","Standard_EC48as_v6","48" -"Virtual Machines ECasv6-series Linux","Standard_EC4as_v6","4" -"Virtual Machines ECasv6-series Linux","Standard_EC64as_v6","64" -"Virtual Machines ECasv6-series Linux","Standard_EC8as_v6","8" -"Virtual Machines ECasv6-series Linux","Standard_EC96as_v6","96" -"Virtual Machines ECedsv6-series Linux","Standard_EC128eds_v6","128" -"Virtual Machines ECedsv6-series Linux","Standard_EC16eds_v6","16" -"Virtual Machines ECedsv6-series Linux","Standard_EC2eds_v6","2" -"Virtual Machines ECedsv6-series Linux","Standard_EC32eds_v6","32" -"Virtual Machines ECedsv6-series Linux","Standard_EC48eds_v6","48" -"Virtual Machines ECedsv6-series Linux","Standard_EC4eds_v6","4" -"Virtual Machines ECedsv6-series Linux","Standard_EC64eds_v6","64" -"Virtual Machines ECedsv6-series Linux","Standard_EC8eds_v6","8" -"Virtual Machines ECesv6-series Linux","Standard_EC128es_v6","128" -"Virtual Machines ECesv6-series Linux","Standard_EC16es_v6","16" -"Virtual Machines ECesv6-series Linux","Standard_EC2es_v6","2" -"Virtual Machines ECesv6-series Linux","Standard_EC32es_v6","32" -"Virtual Machines ECesv6-series Linux","Standard_EC48es_v6","48" -"Virtual Machines ECesv6-series Linux","Standard_EC4es_v6","4" -"Virtual Machines ECesv6-series Linux","Standard_EC64es_v6","64" -"Virtual Machines ECesv6-series Linux","Standard_EC8es_v6","8" "Virtual Machines Edsv6-series Linux","Standard_E128-32ds_v6","127.62" "Virtual Machines Edsv6-series Linux","Standard_E128-64ds_v6","127.62" "Virtual Machines Edsv6-series Linux","Standard_E128ds_v6","127.62" @@ -2130,10 +1036,6 @@ "Virtual Machines Endv6-series Linux","Standard_E64nds_v6","64" "Virtual Machines Endv6-series Linux","Standard_E8nds_v6","8" "Virtual Machines Endv6-series Linux","Standard_E96nds_v6","96" -"Virtual Machines Ensv6special-series Linux","Standard_E16ns_v6_Special","16" -"Virtual Machines Ensv6special-series Linux","Standard_E36ns_v6_Special","1" -"Virtual Machines Ensv6special-series Linux","Standard_E72ns_v6_Special","72" -"Virtual Machines Ensv6special-series Linux","Standard_E8ns_v6_Special","8" "Virtual Machines Env6-series Linux","Standard_E128ns_v6","128" "Virtual Machines Env6-series Linux","Standard_E16ns_v6","16" "Virtual Machines Env6-series Linux","Standard_E2ns_v6","2" @@ -2146,14 +1048,11 @@ "Virtual Machines Epdsv6-series Linux","Standard_E16pds_v6","16" "Virtual Machines Epdsv6-series Linux","Standard_E2pds_v6","2" "Virtual Machines Epdsv6-series Linux","Standard_E32pds_v6","32" -"Virtual Machines Epdsv6-series Linux","Standard_E32pdus_v6","32" "Virtual Machines Epdsv6-series Linux","Standard_E48pds_v6","48" "Virtual Machines Epdsv6-series Linux","Standard_E4pds_v6","4" "Virtual Machines Epdsv6-series Linux","Standard_E64pds_v6","64" -"Virtual Machines Epdsv6-series Linux","Standard_E64pdus_v6","64" "Virtual Machines Epdsv6-series Linux","Standard_E8pds_v6","8" "Virtual Machines Epdsv6-series Linux","Standard_E96pds_v6","96" -"Virtual Machines Epdsv6-series Linux","Standard_E96pdus_v6","96" "Virtual Machines Epsv6-series Linux","Standard_E16ps_v6","16" "Virtual Machines Epsv6-series Linux","Standard_E2ps_v6","2" "Virtual Machines Epsv6-series Linux","Standard_E32ps_v6","32" @@ -2187,6 +1086,58 @@ "Virtual Machines Esv6-series Linux","Standard_E96-24s_v6","96.22" "Virtual Machines Esv6-series Linux","Standard_E96-48s_v6","96.22" "Virtual Machines Esv6-series Linux","Standard_E96s_v6","96.22" +"Virtual Machines FXmdsv2-series Linux","Standard_FX12-6mds_v2","12" +"Virtual Machines FXmdsv2-series Linux","Standard_FX12mds_v2","12" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16-4mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16-8mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24-12mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24-6mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX2mds_v2","2" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32-16mds_v2","32" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32-8mds_v2","32" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32mds_v2","32" +"Virtual Machines FXmdsv2-series Linux","Standard_FX4-2mds_v2","4" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48-12mds_v2","48" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48-24mds_v2","48" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48mds_v2","48" +"Virtual Machines FXmdsv2-series Linux","Standard_FX4mds_v2","4" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64-16mds_v2","63.9" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64-32mds_v2","63.9" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64mds_v2","63.9" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8-2mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8-4mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96-24mds_v2","95.84" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96-48mds_v2","95.84" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96mds_v2","95.84" +"Virtual Machines FXmsv2-series Linux","Standard_FX12-6ms_v2","12" +"Virtual Machines FXmsv2-series Linux","Standard_FX12ms_v2","12" +"Virtual Machines FXmsv2-series Linux","Standard_FX16-4ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX16-8ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX16ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX24-12ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX24-6ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX24ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX2ms_v2","2" +"Virtual Machines FXmsv2-series Linux","Standard_FX32-16ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX32-8ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX32ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX4-2ms_v2","4" +"Virtual Machines FXmsv2-series Linux","Standard_FX48-12ms_v2","48" +"Virtual Machines FXmsv2-series Linux","Standard_FX48-24ms_v2","48" +"Virtual Machines FXmsv2-series Linux","Standard_FX48ms_v2","48" +"Virtual Machines FXmsv2-series Linux","Standard_FX4ms_v2","4" +"Virtual Machines FXmsv2-series Linux","Standard_FX64-16ms_v2","64" +"Virtual Machines FXmsv2-series Linux","Standard_FX64-32ms_v2","64" +"Virtual Machines FXmsv2-series Linux","Standard_FX64ms_v2","64" +"Virtual Machines FXmsv2-series Linux","Standard_FX8-2ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX8-4ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX8ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX96-24ms_v2","96.14" +"Virtual Machines FXmsv2-series Linux","Standard_FX96-48ms_v2","96.14" +"Virtual Machines FXmsv2-series Linux","Standard_FX96ms_v2","96.14" "Virtual Machines Fadsv7-series Linux","Standard_F16ads_v7","16" "Virtual Machines Fadsv7-series Linux","Standard_F1ads_v7","1" "Virtual Machines Fadsv7-series Linux","Standard_F2ads_v7","2" @@ -2206,13 +1157,11 @@ "Virtual Machines Faldsv7-series Linux","Standard_F80alds_v7","80" "Virtual Machines Faldsv7-series Linux","Standard_F8alds_v7","8" "Virtual Machines Falsv6-series Linux","Standard_F16als_v6","16" -"Virtual Machines Falsv6-series Linux","Standard_F1als_v6","1" "Virtual Machines Falsv6-series Linux","Standard_F2als_v6","2" "Virtual Machines Falsv6-series Linux","Standard_F32als_v6","32" "Virtual Machines Falsv6-series Linux","Standard_F48als_v6","48" "Virtual Machines Falsv6-series Linux","Standard_F4als_v6","4" "Virtual Machines Falsv6-series Linux","Standard_F64als_v6","64" -"Virtual Machines Falsv6-series Linux","Standard_F72als_v6","72" "Virtual Machines Falsv6-series Linux","Standard_F8als_v6","8" "Virtual Machines Falsv7-series Linux","Standard_F16als_v7","16" "Virtual Machines Falsv7-series Linux","Standard_F1als_v7","1" @@ -2244,13 +1193,11 @@ "Virtual Machines Famdsv7-series Linux","Standard_F80amds_v7","80" "Virtual Machines Famdsv7-series Linux","Standard_F8amds_v7","8" "Virtual Machines Famsv6-series Linux","Standard_F16ams_v6","16" -"Virtual Machines Famsv6-series Linux","Standard_F1ams_v6","1" "Virtual Machines Famsv6-series Linux","Standard_F2ams_v6","2" "Virtual Machines Famsv6-series Linux","Standard_F32ams_v6","32" "Virtual Machines Famsv6-series Linux","Standard_F48ams_v6","48" "Virtual Machines Famsv6-series Linux","Standard_F4ams_v6","4" "Virtual Machines Famsv6-series Linux","Standard_F64ams_v6","64" -"Virtual Machines Famsv6-series Linux","Standard_F72iams_v6","72" "Virtual Machines Famsv6-series Linux","Standard_F8ams_v6","8" "Virtual Machines Famsv7-series Linux","Standard_F16-4ams_v7","16" "Virtual Machines Famsv7-series Linux","Standard_F16-8ams_v7","16" @@ -2273,13 +1220,11 @@ "Virtual Machines Famsv7-series Linux","Standard_F80ams_v7","80" "Virtual Machines Famsv7-series Linux","Standard_F8ams_v7","8" "Virtual Machines Fasv6-series Linux","Standard_F16as_v6","16" -"Virtual Machines Fasv6-series Linux","Standard_F1as_v6","1" "Virtual Machines Fasv6-series Linux","Standard_F2as_v6","2" "Virtual Machines Fasv6-series Linux","Standard_F32as_v6","32" "Virtual Machines Fasv6-series Linux","Standard_F48as_v6","48" "Virtual Machines Fasv6-series Linux","Standard_F4as_v6","4" "Virtual Machines Fasv6-series Linux","Standard_F64as_v6","64" -"Virtual Machines Fasv6-series Linux","Standard_F72as_v6","72" "Virtual Machines Fasv6-series Linux","Standard_F8as_v6","8" "Virtual Machines Fasv7-series Linux","Standard_F16as_v7","16" "Virtual Machines Fasv7-series Linux","Standard_F1as_v7","1" @@ -2290,58 +1235,6 @@ "Virtual Machines Fasv7-series Linux","Standard_F64as_v7","64" "Virtual Machines Fasv7-series Linux","Standard_F80as_v7","80" "Virtual Machines Fasv7-series Linux","Standard_F8as_v7","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX12-6mds_v2","12" -"Virtual Machines FXmdsv2-series Linux","Standard_FX12mds_v2","12" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16-4mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16-8mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24-12mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24-6mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX2mds_v2","2" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32-16mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32-8mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX4-2mds_v2","4" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48-12mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48-24mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX4mds_v2","4" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64-16mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64-32mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8-2mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8-4mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96-24mds_v2","95.84" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96-48mds_v2","95.84" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96mds_v2","95.84" -"Virtual Machines FXmsv2-series Linux","Standard_FX12-6ms_v2","12" -"Virtual Machines FXmsv2-series Linux","Standard_FX12ms_v2","12" -"Virtual Machines FXmsv2-series Linux","Standard_FX16-4ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX16-8ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX16ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX24-12ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX24-6ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX24ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX2ms_v2","2" -"Virtual Machines FXmsv2-series Linux","Standard_FX32-16ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX32-8ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX32ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX4-2ms_v2","4" -"Virtual Machines FXmsv2-series Linux","Standard_FX48-12ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX48-24ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX48ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX4ms_v2","4" -"Virtual Machines FXmsv2-series Linux","Standard_FX64-16ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX64-32ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX64ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX8-2ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX8-4ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX8ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX96-24ms_v2","96.14" -"Virtual Machines FXmsv2-series Linux","Standard_FX96-48ms_v2","96.14" -"Virtual Machines FXmsv2-series Linux","Standard_FX96ms_v2","96.14" "Virtual Machines HBrsv4-series Linux","Standard_HB176-144rs_v4","176" "Virtual Machines HBrsv4-series Linux","Standard_HB176-24rs_v4","176" "Virtual Machines HBrsv4-series Linux","Standard_HB176-48rs_v4","176" @@ -2354,14 +1247,6 @@ "Virtual Machines HBrsv5 Linux","Standard_HB368-336rs_v5","368" "Virtual Machines HBrsv5 Linux","Standard_HB368-48rs_v5","368" "Virtual Machines HBrsv5 Linux","Standard_HB368-96rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368FC-144rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368FC-192rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368FC-240rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368FC-288rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368FC-336rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368FC-48rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368FC-96rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368FCrs_v5","368" "Virtual Machines HBrsv5 Linux","Standard_HB368rs_v5","368" "Virtual Machines HXrs Linux","Standard_HX176-144rs","176" "Virtual Machines HXrs Linux","Standard_HX176-24rs","176" @@ -2370,44 +1255,29 @@ "Virtual Machines HXrs Linux","Standard_HX176rs","176" "Virtual Machines Laosv4-series Linux","Standard_L12aos_v4","12" "Virtual Machines Laosv4-series Linux","Standard_L16aos_v4","16" -"Virtual Machines Laosv4-series Linux","Standard_L16aous_v4","16" "Virtual Machines Laosv4-series Linux","Standard_L24aos_v4","24" "Virtual Machines Laosv4-series Linux","Standard_L2aos_v4","2" "Virtual Machines Laosv4-series Linux","Standard_L32aos_v4","32" -"Virtual Machines Laosv4-series Linux","Standard_L32aous_v4","32" "Virtual Machines Laosv4-series Linux","Standard_L4aos_v4","4" "Virtual Machines Laosv4-series Linux","Standard_L8aos_v4","8" "Virtual Machines Lasv4 Series Linux","Standard_L16as_v4","16" -"Virtual Machines Lasv4 Series Linux","Standard_L16aus_v4","16" "Virtual Machines Lasv4 Series Linux","Standard_L2as_v4","2" "Virtual Machines Lasv4 Series Linux","Standard_L32as_v4","32" -"Virtual Machines Lasv4 Series Linux","Standard_L32aus_v4","32" "Virtual Machines Lasv4 Series Linux","Standard_L48as_v4","48" -"Virtual Machines Lasv4 Series Linux","Standard_L48aus_v4","48" "Virtual Machines Lasv4 Series Linux","Standard_L4as_v4","4" "Virtual Machines Lasv4 Series Linux","Standard_L64as_v4","64" -"Virtual Machines Lasv4 Series Linux","Standard_L64aus_v4","64" "Virtual Machines Lasv4 Series Linux","Standard_L80as_v4","80" -"Virtual Machines Lasv4 Series Linux","Standard_L80aus_v4","80" "Virtual Machines Lasv4 Series Linux","Standard_L8as_v4","8" "Virtual Machines Lasv4 Series Linux","Standard_L96as_v4","96" -"Virtual Machines Lasv4 Series Linux","Standard_L96aus_v4","96" -"Virtual Machines Lsv4 Series Linux","L192isv4","192" "Virtual Machines Lsv4 Series Linux","Standard_L16s_v4","16" -"Virtual Machines Lsv4 Series Linux","Standard_L16us_v4","16" "Virtual Machines Lsv4 Series Linux","Standard_L2s_v4","2" "Virtual Machines Lsv4 Series Linux","Standard_L32s_v4","32" -"Virtual Machines Lsv4 Series Linux","Standard_L32us_v4","32" "Virtual Machines Lsv4 Series Linux","Standard_L48s_v4","48" -"Virtual Machines Lsv4 Series Linux","Standard_L48us_v4","48" "Virtual Machines Lsv4 Series Linux","Standard_L4s_v4","4" "Virtual Machines Lsv4 Series Linux","Standard_L64s_v4","64" -"Virtual Machines Lsv4 Series Linux","Standard_L64us_v4","64" "Virtual Machines Lsv4 Series Linux","Standard_L80s_v4","80" -"Virtual Machines Lsv4 Series Linux","Standard_L80us_v4","80" "Virtual Machines Lsv4 Series Linux","Standard_L8s_v4","8" "Virtual Machines Lsv4 Series Linux","Standard_L96s_v4","96" -"Virtual Machines Lsv4 Series Linux","Standard_L96us_v4","96" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128-64bds_3_v3","31.5" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128-64bds_v3","8" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128bds_3_v3","31.5" @@ -2415,7 +1285,6 @@ "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M16bds_v3","1" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176-88bds_4_v3","43" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176-88bds_v3","11" -"Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176bds_3_v3","24.6" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176bds_4_v3","43" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M176bds_v3","11" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M32bds_v3","2" @@ -2430,7 +1299,6 @@ "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M128bs_v3","8" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M16bs_v3","1" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M176-88bs_v3","11" -"Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M176bs_3_v3","24.6" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M176bs_v3","11" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M32bs_v3","2" "Virtual Machines Mbsv3 Medium Memory Series Linux","Standard_M416bs_v3","34.4" @@ -2442,90 +1310,36 @@ "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds_6_v3","1" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds_8_v3","1.33" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds_9_v3","416" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds-104_6_v3","1.005" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds-104_8_v3","1.3065" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds-208_6_v3","1.005" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M416ds-208_8_v3","1.3065" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M624ds_12_v3","2" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M624ds-156_12_v3","2.01" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M624ds-312_12_v3","2.01" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ds_12_v3","2.01" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ds-208_12_v3","2.01" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ds-416_12_v3","2.01" "Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ids_16_v3","2.96" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ids-208_16_v3","2.9145" -"Virtual Machines Mdsv3 High Memory Series Linux","Standard_M832ids-416_16_v3","2.9145" "Virtual Machines Mdsv3 Medium Memory Series DedicatedHost","mdsv3medmem_type1","1" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M12ds_v3","1" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M12ds-6_v3","1.008621" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds_2_v3","9.985345" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds_3_v3","11.7" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds_4_v3","16.2" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds-44_3_v3","11.7" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds-44_4_v3","16.238793" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds-88_3_v3","11.7" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M176ds-88_4_v3","16.238793" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M24ds_v3","2" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M24ds-12_v3","2.017241" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M24ds-6_v3","2.017241" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M48ds_1_v3","4.1" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M48ds-12_1_v3","4.034483" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M48ds-24_1_v3","4.034483" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds_1_v3","6.1" "Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds_2_v3","8.1" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds-24_1_v3","6.051724" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds-24_2_v3","8.068966" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds-48_1_v3","6.051724" -"Virtual Machines Mdsv3 Medium Memory Series Linux","Standard_M96ds-48_2_v3","8.068966" -"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M1792ixds_32_v3","2.8" -"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M832ixds_24_v3","1.8" -"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M832xds_16_v3","1" -"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M896ixds_24_v3","1.9" -"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M896ixds_32_v3","2.6" -"Virtual Machines Mdsv3 Very High Memory Series Linux","Standard_M896xds_16_v3","1.3" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_10_v3","416" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_12_v3","416" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_6_v3","1" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_8_v3","1.33" "Virtual Machines Msv3 High Memory Series Linux","Standard_M416s_9_v3","416" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M416s-104_6_v3","1.005" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M416s-104_8_v3","1.3065" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M416s-208_6_v3","1.005" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M416s-208_8_v3","1.3065" "Virtual Machines Msv3 High Memory Series Linux","Standard_M624s_12_v3","2" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M624s-156_12_v3","2.01" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M624s-312_12_v3","2.01" "Virtual Machines Msv3 High Memory Series Linux","Standard_M832is_16_v3","2.96" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M832is-208_16_v3","2.9145" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M832is-416_16_v3","2.9145" "Virtual Machines Msv3 High Memory Series Linux","Standard_M832s_12_v3","2.01" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M832s-208_12_v3","2.01" -"Virtual Machines Msv3 High Memory Series Linux","Standard_M832s-416_12_v3","2.01" "Virtual Machines Msv3 Medium Memory Series DedicatedHost","msv3medmem_type1","1" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M12s_v3","1" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M12s-6_v32","1.006211" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s_2_v3","9.961491" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s_3_v3","11.6" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s_4_v3","16.2" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s-44_3_v3","11.571429" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s-44_4_v3","16.2" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s-88_3_v3","11.571429" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M176s-88_4_v3","16.2" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M24s_v3","2" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M24s-12_v3","2.012422" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M24s-6_v3","2.012422" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M48s_1_v3","4" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M48s-12_1_v3","4.024845" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M48s-24_1_v3","4.024845" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s_1_v3","6.1" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s_2_v3","8.1" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s-24_1_v3","6.037267" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s-24_2_v3","8.049689" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s-48_1_v3","6.037267" -"Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s-48_2_v3","8.049689" +"Virtual Machines NCCadsH100_v5_series Linux","Standard_NCC40ads_H100_v5","40" "Virtual Machines NCadsH100_v5-series Linux","Standard_NC40ads_H100_v5","40" "Virtual Machines NCadsH100_v5-series Linux","Standard_NC80adis_H100_v5","80" -"Virtual Machines NCCadsH100_v5_series Linux","Standard_NCC40ads_H100_v5","40" "Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC144ds_xl_RTXPRO6000BSE_v6","144" "Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC288ds_xl_RTXPRO6000BSE_v6","288" "Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC36ds_xl_RTXPRO6000BSE_v6","36" @@ -2537,38 +1351,14 @@ "Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC72lds_xl_RTXPRO6000BSE_v6","72" "Virtual Machines ND MI300X v5 Series Linux","Standard_ND96is_MI300X_v5","96" "Virtual Machines ND MI300X v5 Series Linux","Standard_ND96isr_MI300X_v5","96" -"Virtual Machines NDamsf A100 v4-Series Linux","Standard_ND96ams_A100_flex_v4","1" -"Virtual Machines NDamsrf A100 v4-Series Linux","Standard_ND96amsf_A100_v4","1" -"Virtual Machines NDamsrf A100 v4-Series Linux","Standard_ND96amsrf_A100_v4","1.1" -"Virtual Machines NDs GB200 v6-Series Linux","Standard_ND128is_GB200_v6","1" -"Virtual Machines NDs H100 v5 Series Linux","Standard_ND96is_noIB_H100_v5","1" -"Virtual Machines NDs H200 v5 Series Linux","Standard_ND96is_H200_v5","1" -"Virtual Machines NDs MI300X v5 Series Linux","Standard ND96is noIB MI300X v5","1" -"Virtual Machines NDsf GB200 v6-Series Linux","Standard_ND128isf_GB200_v6","1" -"Virtual Machines NDsf H100 v5 Series Linux","Standard_ND96is_flex_H100_v5","1" -"Virtual Machines NDsf H200 v5 Series Linux","Standard_ND96isf_H200_v5","1" -"Virtual Machines NDsf MI300X v5-Series Linux","Standard ND96isf MI300X v5","1" -"Virtual Machines NDsr GB200 ETH Metal v6-Series Linux","ND144_ETH_GB200_Metal_v6","1" -"Virtual Machines NDsr GB200 ETH v6-Series Linux","Standard_ND128isr_ETH_GB200_v6","1" "Virtual Machines NDsr GB200 NDR v6 Series Linux","Standard_ND128isr_NDR_GB200_v6","128" "Virtual Machines NDsr GB300 v6-Series Linux","Standard_ND128isr_GB300_v6","128" -"Virtual Machines NDsr H100 v5-Series Linux","Standard_ND96is_H100_v5","96.872727" "Virtual Machines NDsr H100 v5-Series Linux","Standard_ND96isr_H100_v5","106.56" "Virtual Machines NDsr H200 v5 Series Linux","Standard_ND96isr_H200_v5","96" -"Virtual Machines NDsr INFE H100 v5 Series Linux","Standard ND96isr INFE H100 v5","1" -"Virtual Machines NDsrf GB200 ETH v6-Series Linux","Standard_ND128isrf_ETH_GB200_v6","1" -"Virtual Machines NDsrf GB200 NDR v6 Series Linux","Standard_ND128isrf_NDR_GB200_v6","1" -"Virtual Machines Ndsrf H100 V5-Series Linux","Standard_ND96isf_H100_v5","1" -"Virtual Machines Ndsrf H100 V5-Series Linux","Standard_ND96isrf_H100_v5","1.1" -"Virtual Machines NDsrf H200 v5 Series Linux","Standard_ND96isrf_H200_v5","1" -"Virtual Machines NDsrf MI300X v5-Series Linux","Standard ND96isrf MI300X v5","1" "Virtual Machines NGads_V620_v1 Linux","Standard_NG16ads_V620_v1","16" -"Virtual Machines NGads_V620_v1 Linux","Standard_NG32adms_V620","41.6" "Virtual Machines NGads_V620_v1 Linux","Standard_NG32ads_V620_v1","32" "Virtual Machines NGads_V620_v1 Linux","Standard_NG8ads_V620_v1","8" -"Virtual Machines NMads MA35D Linux","Standard_NM16ads_MA35D","1" "Virtual Machines NVads_V710_v5 Linux","Standard_NV12ads_V710_v5","12" "Virtual Machines NVads_V710_v5 Linux","Standard_NV24ads_V710_v5","24" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV28adms_V710_v5","28.4" "Virtual Machines NVads_V710_v5 Linux","Standard_NV4ads_V710_v5","4" "Virtual Machines NVads_V710_v5 Linux","Standard_NV8ads_V710_v5","8" diff --git a/src/open-data/README.md b/src/open-data/README.md index d2848535f..abcdae540 100644 --- a/src/open-data/README.md +++ b/src/open-data/README.md @@ -41,20 +41,12 @@ To update manually:
-The [InstanceSizeFlexibility.csv](./InstanceSizeFlexibility.csv) file maps each ARM SKU to its instance size flexibility (ISF) group and ratio. ISF lets a reservation apply across multiple SKUs in the same flexibility group; the ratio is the relative weight of each SKU within its group. It covers Virtual Machines, Redis Cache, and Dedicated Host, unioned across every physical region the ARM locations API reports (ISF groups are region-stable, but SKU availability is not, and new GPU and specialty SKUs often launch in only a handful of regions). The Microsoft ratios are kept as-is (they don't always start at `1` for the smallest SKU); pass `-Normalize` to rescale each group so its smallest SKU is `1`. This data is updated weekly by the [Update Instance Size Flexibility](../../.github/workflows/opendata-instance-size-flexibility.yml) workflow, which queries the [Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api). +The [InstanceSizeFlexibility.csv](./InstanceSizeFlexibility.csv) file maps each ARM SKU to its instance size flexibility (ISF) group and ratio. ISF lets a reservation apply across multiple SKUs in the same flexibility group; the ratio is the relative weight of each SKU within its group. It covers Virtual Machines, Redis Cache, and Dedicated Host, unioned across every physical region the ARM locations API reports (ISF groups are region-stable, but SKU availability is not, and new GPU and specialty SKUs often launch in only a handful of regions). The raw Microsoft ratios are kept as-is (they don't always start at `1` for the smallest SKU) for drop-in parity with the deprecated files; pass `-Normalize` to rescale each group so its smallest SKU is `1`. This data is updated weekly by the [Update Instance Size Flexibility](../../.github/workflows/opendata-instance-size-flexibility.yml) workflow, which queries the [Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api). Each run publishes exactly what the API returns, so records Microsoft retires from the catalog disappear from the file on the next update. -The dataset is additive. The Catalogs API only returns SKUs that are still purchasable, so a destructive write drops retired series (Av2, D, DS, Dv2, F, G, H, NC, NV, and others) that customers still hold reservations against ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). Each run merges the API result over the previously published file, keyed on `ArmSkuName`, so the live API wins wherever it has an opinion and everything else carries forward. The published file is therefore the floor for those groups, and the run fails rather than publishing a dataset smaller than the last one. - -Ratios are only comparable within a flexibility group, and the ratios the Catalogs API returns are used verbatim. - -The retired files were on a different scale: they normalized each group so its smallest SKU was `1`, while the API leaves them unnormalized -- only 52 of its 211 groups start at `1`, against 432 of 433 in the retired files. Both encode the same proportions, differing by a per-group constant (usually 2×, e.g. `Standard_DS11_v2` is `1` in the retired file and `2` in the API). Because Azure retires individual sizes rather than whole families, the API often covers only part of a group — 44 of the 204 groups both sources knew — so a naive merge would leave one group holding both units. The rows backfilled from the retired files were therefore converted onto the API scale once, using the factor derived from the SKUs each group shared with the API, and the generator fails the run if a carried-forward group is ever found on the wrong scale again. - -The fully retired groups (roughly a third of the dataset — `Av2 Series`, `D Series`, `F Series`, and the like) have no API counterpart to convert against, so they keep the normalized scale. That is harmless as long as ratios are compared only within their own group. +SKUs whose ratio is not a positive number are dropped. The API returns one such row today (`azure_redis_cache_isolated_i100` at `0`); a zero carries no flexibility information and consumers divide by `Ratio`, so publishing it would hand them a division by zero. Ratios are also parsed and written with the invariant culture, so a comma-decimal machine can't publish `"2,1"`. This dataset replaces two deprecated static CSVs that were hosted on `ccmstorageprod.blob.core.windows.net` (`AutofitComboMeterData.csv` and `isfratioblob.csv` / `aka.ms/isf`), which Microsoft is retiring (no updates after 9 May 2026, removed 30 Aug 2026). -SKUs whose ratio is not a positive number are dropped. The API returns one such row today (`azure_redis_cache_isolated_i100` at `0`); a zero carries no flexibility information and consumers divide by `Ratio`, so publishing it would hand them a division by zero. - The file uses the canonical three-column Catalogs API schema: `InstanceSizeFlexibilityGroup`, `ArmSkuName`, `Ratio`. This is a 1:1 match for the deprecated `isfratioblob.csv`. `ArmSkuName` is unique across the whole file and is safe to use as a standalone join key; both the generator and a unit test enforce this. The deprecated `AutofitComboMeterData.csv` also carried Cost Management connector columns (`ResourceLocation`, meter IDs, composite key, normalized SKU) that are not part of the Catalogs API and aren't reproducible from it; consumers that relied on them (e.g. the Power BI model's join key) should join on `ArmSkuName` instead. Block Blob storage also exposes ISF metadata in the Catalogs API, but it is intentionally excluded: its entries carry meter-style catalog names rather than real ARM SKU names, every ratio is `1`, and its groups are region-specific — which would duplicate `ArmSkuName` values and break the join-key guarantee above. Pass `-ReservedResourceType` explicitly to generate it if needed. diff --git a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 index d127eac4a..396ccf43d 100644 --- a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 +++ b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 @@ -42,7 +42,7 @@ Describe 'Update-InstanceSizeFlexibility' { Mock Get-AzContext { @{ Subscription = @{ Id = '00000000-0000-0000-0000-000000000000' } } } Mock Start-Sleep {} $outFile = Join-Path $TestDrive 'InstanceSizeFlexibility.csv' - if (Test-Path $outFile) { Remove-Item $outFile -Force } # the generator merges into an existing file + if (Test-Path $outFile) { Remove-Item $outFile -Force } # the generator replaces the file, so start clean $baseParams = @{ OutputPath = $outFile Location = @('eastus') @@ -154,7 +154,7 @@ Describe 'Update-InstanceSizeFlexibility' { It 'Skips SKUs the API reports with a zero ratio' { # A zero ratio carries no flexibility information, and the Optimization Engine's - # benefits simulation divides by it. The API returns one (Azure Redis Cache Isolated). + # benefits simulation divides by it. Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( (New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '1'), @@ -168,24 +168,24 @@ Describe 'Update-InstanceSizeFlexibility' { } It 'Parses and writes ratios independently of the current culture' { - # On a comma-decimal culture, culture-aware parsing turns "2.1" into 21 (de-DE) or - # drops the row outright (fr-CH), and Export-Csv writes "2,1" back out, which breaks - # every consumer of the published file. + # A comma-decimal culture reads "2.1" as 21 (de-DE) or rejects it (fr-CH), and + # Export-Csv writes "2,1" back out, which breaks every consumer of the file. $originalCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture try { [System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo]::new('de-DE') - @([PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A2_v2'; Ratio = '2.1' }) ` - | Export-Csv $outFile -NoTypeInformation Mock Invoke-AzRestMethod { - New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '4.5')) + New-CatalogResponse -Items @( + (New-CatalogItem -Sku 'Standard_A2_v2' -Group 'Av2 Series' -Ratio '2.1'), + (New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '4.5') + ) } Invoke-Generator $baseParams $raw = Get-Content $outFile -Raw - $raw | Should -BeLike '*"Standard_A2_v2","2.1"*' # carried forward, not 21 - $raw | Should -BeLike '*"Standard_D2","4.5"*' # from the API, not 45 + $raw | Should -BeLike '*"Standard_A2_v2","2.1"*' + $raw | Should -BeLike '*"Standard_D2","4.5"*' } finally { @@ -220,11 +220,11 @@ Describe 'Update-InstanceSizeFlexibility' { } } - Context 'Additive merge' { - It 'Carries forward published records the API no longer returns' { + Context 'Convergence' { + It 'Replaces the output with exactly what the API returned, removing retired records' { @( [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'DSeries'; ArmSkuName = 'Standard_D2'; Ratio = '1' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '2' } + [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'DSeries'; ArmSkuName = 'Standard_Retired'; Ratio = '2' } ) | Export-Csv $outFile -NoTypeInformation Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( @@ -235,52 +235,8 @@ Describe 'Update-InstanceSizeFlexibility' { Invoke-Generator $baseParams - # Standard_A1_v2 is no longer purchasable, so the API omits it, but reservations still - # cover it -- issue #2300. - @(Import-Csv $outFile).ArmSkuName | Should -Be @('Standard_A1_v2', 'Standard_D2', 'Standard_D8') - } - - It 'Lets the API supersede a published record for the same SKU' { - @([PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'DSeries'; ArmSkuName = 'Standard_D2'; Ratio = '1' }) ` - | Export-Csv $outFile -NoTypeInformation - Mock Invoke-AzRestMethod { - New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries v2' -Ratio '4')) - } - - Invoke-Generator $baseParams - $rows = @(Import-Csv $outFile) - $rows.Count | Should -Be 1 - $rows[0].InstanceSizeFlexibilityGroup | Should -Be 'DSeries v2' - $rows[0].Ratio | Should -Be '4' - } - - It 'Drops published SKUs that map to more than one flexibility group' { - # Ambiguous SKUs would break the ArmSkuName join key that Power BI's model - # relationship and the Optimization Engine's externaldata() joins depend on. - @( - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'PTU_Area_US East'; ArmSkuName = 'Provisioned_Managed'; Ratio = '1' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'PTU_Area_EU West'; ArmSkuName = 'Provisioned_Managed'; Ratio = '1' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '1' } - ) | Export-Csv $outFile -NoTypeInformation - Mock Invoke-AzRestMethod { New-CatalogResponse -Items @() } - - Invoke-Generator $baseParams - - @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_A1_v2' - } - - It 'Ignores published rows with a blank, non-numeric or non-positive ratio' { - @( - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'MDC_PrePurchase_Plan'; ArmSkuName = 'Free'; Ratio = '' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Azure Redis Cache Isolated'; ArmSkuName = 'azure_redis_cache_isolated_i100'; Ratio = '0' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '1' } - ) | Export-Csv $outFile -NoTypeInformation - Mock Invoke-AzRestMethod { New-CatalogResponse -Items @() } - - Invoke-Generator $baseParams - - @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_A1_v2' + $rows.ArmSkuName | Should -Be @('Standard_D2', 'Standard_D8') # retired record is gone } It 'Fails instead of publishing when the same SKU appears in multiple flexibility groups' { @@ -311,85 +267,6 @@ Describe 'Update-InstanceSizeFlexibility' { } } - Context 'Ratio scale' { - It 'Fails when a carried-forward group is on a different scale than the API' { - # The retired files normalized each group to smallest-SKU-=-1; the API reports vCPU - # counts. Azure retires individual sizes, so the API returns only part of Ev3 Series - # and merging per SKU would leave both units in one group. - @( - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E2_v3'; Ratio = '1' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E4_v3'; Ratio = '2' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E8_v3'; Ratio = '4' } - ) | Export-Csv $outFile -NoTypeInformation - Mock Invoke-AzRestMethod { - New-CatalogResponse -Items @( - (New-CatalogItem -Sku 'Standard_E2_v3' -Group 'Ev3 Series' -Ratio '2'), - (New-CatalogItem -Sku 'Standard_E4_v3' -Group 'Ev3 Series' -Ratio '4') - ) - } - - { Invoke-Generator $baseParams } | Should -Throw -ExpectedMessage '*different ratio scale*' - } - - It 'Accepts a migrated group whose ratios already match the API' { - @( - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E2_v3'; Ratio = '2' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E4_v3'; Ratio = '4' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Ev3 Series'; ArmSkuName = 'Standard_E8_v3'; Ratio = '8' } - ) | Export-Csv $outFile -NoTypeInformation - Mock Invoke-AzRestMethod { - New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_E2_v3' -Group 'Ev3 Series' -Ratio '2')) - } - - Invoke-Generator $baseParams - - $rows = @(Import-Csv $outFile) - $rows.Count | Should -Be 3 - ($rows | Where-Object ArmSkuName -eq 'Standard_E8_v3').Ratio | Should -Be '8' - } - - It 'Takes a small ratio correction from the API without failing the run' { - # A genuine correction from Microsoft is small; only scale-sized gaps are fatal. - @([PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'DSeries'; ArmSkuName = 'Standard_D2'; Ratio = '2' }) ` - | Export-Csv $outFile -NoTypeInformation - Mock Invoke-AzRestMethod { - New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '2.1')) - } - - Invoke-Generator $baseParams - - @(Import-Csv $outFile).Ratio | Should -Be '2.1' - } - - It 'Ignores a group the API does not cover' { - @( - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '1' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A2_v2'; Ratio = '2.1' } - ) | Export-Csv $outFile -NoTypeInformation - Mock Invoke-AzRestMethod { - New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '2')) - } - - Invoke-Generator $baseParams - - $rows = @(Import-Csv $outFile) - ($rows | Where-Object ArmSkuName -eq 'Standard_A1_v2').Ratio | Should -Be '1' - ($rows | Where-Object ArmSkuName -eq 'Standard_A2_v2').Ratio | Should -Be '2.1' - } - - It 'Drops placeholder SKU names carried in the published file' { - @( - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'NV Series'; ArmSkuName = 'arm_sku_name_placeholder'; Ratio = '1' }, - [PSCustomObject]@{ InstanceSizeFlexibilityGroup = 'Av2 Series'; ArmSkuName = 'Standard_A1_v2'; Ratio = '1' } - ) | Export-Csv $outFile -NoTypeInformation - Mock Invoke-AzRestMethod { New-CatalogResponse -Items @() } - - Invoke-Generator $baseParams - - @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_A1_v2' - } - } - Context 'Region enumeration' { BeforeEach { function New-LocationsResponse @@ -425,8 +302,7 @@ Describe 'Update-InstanceSizeFlexibility' { Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*/locations?*' } Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*location=eastus*' } Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*location=switzerlandnorth*' } - # Logical groupings are not valid catalog scopes, and neither is an entry whose - # metadata is missing entirely. + # Logical groupings are not valid catalog scopes, and neither is an entry with no metadata. Should -Invoke Invoke-AzRestMethod -Exactly -Times 0 -ParameterFilter { $Uri -like '*location=global*' } Should -Invoke Invoke-AzRestMethod -Exactly -Times 0 -ParameterFilter { $Uri -like '*location=nometadata*' } } @@ -445,8 +321,7 @@ Describe 'Update-InstanceSizeFlexibility' { else { New-CatalogResponse -Items @() } } - { Invoke-Generator @{ OutputPath = $outFile } } | - Should -Throw -ExpectedMessage '*no physical regions*' + { Invoke-Generator @{ OutputPath = $outFile } } | Should -Throw -ExpectedMessage '*no physical regions*' } It 'Fails when the locations API returns an error' { @@ -455,8 +330,7 @@ Describe 'Update-InstanceSizeFlexibility' { else { New-CatalogResponse -Items @() } } - { Invoke-Generator @{ OutputPath = $outFile } } | - Should -Throw -ExpectedMessage '*HTTP 403 enumerating regions*' + { Invoke-Generator @{ OutputPath = $outFile } } | Should -Throw -ExpectedMessage '*HTTP 403 enumerating regions*' } } diff --git a/src/scripts/Update-InstanceSizeFlexibility.ps1 b/src/scripts/Update-InstanceSizeFlexibility.ps1 index e6ab95192..af49446ec 100644 --- a/src/scripts/Update-InstanceSizeFlexibility.ps1 +++ b/src/scripts/Update-InstanceSizeFlexibility.ps1 @@ -25,12 +25,6 @@ .PARAMETER OutputPath Path to the output CSV file. Defaults to src/open-data/InstanceSizeFlexibility.csv. - The file is merged into, not replaced. The Catalogs API only returns SKUs that are still - purchasable, so retired series (Av2, D/DS v1, Dv2, F, G, H, NC, NV, ...) are absent from it - even though customers still hold active reservations covering them. The published file is - therefore the floor that keeps those groups in the dataset, and the run fails rather than - publishing a smaller one. - .PARAMETER SubscriptionId Subscription to use for the Catalogs API call. Defaults to the subscription in the current Azure context. @@ -43,9 +37,11 @@ Defaults to every physical region the subscription's cloud exposes, enumerated from the ARM locations API. A hardcoded list has to be hand-maintained as Azure adds regions, and new GPU and specialty SKUs routinely launch in a handful of regions first, so any SKU that lands - outside the list is missing from the dataset until someone notices. That is no longer - recoverable now that the retired blob can't backfill it. Pass an explicit list to narrow the - sweep (tests do). + outside the list is missing from the dataset until someone notices. Pass an explicit list to + narrow the sweep (tests do). + + .PARAMETER LocationApiVersion + ARM locations API version, used only when -Location is not supplied. Default = 2022-12-01. .PARAMETER ReservedResourceType One or more reserved resource types to extract ISF ratios for. Default is VirtualMachines, @@ -58,23 +54,11 @@ .PARAMETER ApiVersion Catalogs API version. Default = 2022-03-01. - .PARAMETER LocationApiVersion - ARM locations API version, used only when -Location is not supplied. Default = 2022-12-01. - .PARAMETER Normalize Normalize ratios so the smallest SKU in each flexibility group has a ratio of 1. The raw API ratios don't always start at 1 (e.g. BS Series starts at 0.25). When omitted, the raw Microsoft - ratios are kept. - - Note that raw API ratios are NOT on the same scale as the retired isfratioblob.csv: the blob - normalized each group to smallest-SKU-=-1, the API returns unnormalized values, and the two - differ by a per-group constant (usually 2x -- e.g. Standard_DS11_v2 is 1 in the blob and 2 in - the API). The published dataset was migrated onto the API scale once, so ratios are the API's - verbatim wherever it has an opinion. Ratios are only ever compared within a flexibility group. - - The groups the API doesn't cover at all -- the fully retired series, roughly a third of the - dataset -- necessarily keep the blob's normalized scale, because there is no API value to - reconcile them against. That is harmless as long as ratios stay within their group. + ratios are kept for drop-in parity with the deprecated isfratioblob.csv / + AutofitComboMeterData.csv files that downstream tools (Power BI, Optimization Engine) expect. .EXAMPLE ./Update-InstanceSizeFlexibility.ps1 @@ -264,9 +248,10 @@ function Get-IsfRecords # 'arm_sku_name_placeholder'); skip them so they don't leak into the public CSV. if ($armSkuName -like '*placeholder*') { continue } - # A ratio of 0 carries no flexibility information and consumers divide by it -- the - # Optimization Engine's benefits simulation does exactly that -- so drop it rather than - # publish a division by zero. The API returns one today (Azure Redis Cache Isolated). + # Parsed with the invariant culture: the API returns "2.1", which a comma-decimal culture + # reads as 21 (de-DE) or rejects outright (fr-CH). A ratio of 0 carries no flexibility + # information and consumers divide by it -- the Optimization Engine's benefits simulation + # does exactly that -- so drop it rather than publish a division by zero. $parsedRatio = 0.0 $parsed = [double]::TryParse($ratio, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$parsedRatio) if ($flexGroup -and $armSkuName -and $parsed -and $parsedRatio -gt 0) @@ -310,63 +295,13 @@ function Get-NormalizedRecords return $normalized } -function Import-IsfCsv -{ - <# - .SYNOPSIS - Reads an ISF CSV into records, dropping rows that cannot serve as usable open data. - - .DESCRIPTION - Drops rows with a blank, non-numeric or non-positive ratio, and drops every row for an - ArmSkuName that the file maps to more than one flexibility group, which would break the - ArmSkuName join key that Power BI's model relationship and the Optimization Engine's - externaldata() joins both depend on. - #> - param( - [string]$Path - ) - - $records = [System.Collections.ArrayList]::new() - if (-not $Path -or -not (Test-Path $Path)) { return $records } - - $rows = Import-Csv -Path $Path - $groupsPerSku = @{} - foreach ($row in $rows) - { - $ratio = 0.0 - if (-not [double]::TryParse($row.Ratio, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$ratio)) { continue } - if ($ratio -le 0) { continue } - if (-not $groupsPerSku.ContainsKey($row.ArmSkuName)) { $groupsPerSku[$row.ArmSkuName] = @{} } - $groupsPerSku[$row.ArmSkuName][$row.InstanceSizeFlexibilityGroup] = $true - } - - foreach ($row in $rows) - { - $ratio = 0.0 - if (-not [double]::TryParse($row.Ratio, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$ratio)) { continue } - if ($ratio -le 0) { continue } - if ($groupsPerSku[$row.ArmSkuName].Count -gt 1) { continue } - # Same placeholder filter the API path applies, so a retired file's placeholder rows - # can't linger in the published dataset. - if ($row.ArmSkuName -like '*placeholder*') { continue } - $null = $records.Add([PSCustomObject]@{ - InstanceSizeFlexibilityGroup = [string]$row.InstanceSizeFlexibilityGroup - ArmSkuName = [string]$row.ArmSkuName - Ratio = $ratio - }) - } - - return $records -} - # ----------------------------------------------------------------------- # Step 1: Fetch ISF ratios for each reserved resource type across all regions # ----------------------------------------------------------------------- -# The dataset is additive: the API result is merged over the previously published file. The API -# only returns SKUs that are still purchasable, so a destructive write drops retired series that -# customers still hold reservations against (issue #2300). Any scope that still fails after -# retries aborts the whole run without touching the output file; the weekly workflow then fails -# and the last published dataset stays as-is. +# The output is exactly what the API returns for a fully successful run so the dataset always +# converges on the Catalogs API (records Microsoft retires disappear on the next run). Any scope +# that still fails after retries aborts the whole run without touching the output file; the +# weekly workflow then fails and the last published dataset stays as-is. $seen = @{} foreach ($type in $ReservedResourceType) { @@ -384,129 +319,18 @@ foreach ($type in $ReservedResourceType) Write-Host " $type`: $($typeKeys.Count) distinct SKUs with ISF ratios across $($Location.Count) region(s)" } -$apiRecords = @($seen.Values) +$allRecords = @($seen.Values) # ArmSkuName is documented as a safe standalone join key, so fail hard if the API ever returns # the same SKU in multiple flexibility groups instead of silently publishing ambiguous data. -$duplicateSkus = $apiRecords | Group-Object ArmSkuName | Where-Object Count -gt 1 -if ($duplicateSkus) -{ - throw "Duplicate ArmSkuName values across flexibility groups: $($duplicateSkus.Name -join ', '). ArmSkuName must stay unique; investigate before publishing." -} - -function Assert-IsfScale -{ - <# - .SYNOPSIS - Fails the run if a carried-forward group sits on a different ratio scale than the API. - - .DESCRIPTION - The Catalogs API returns unnormalized ratios, while the ratio files it replaced - normalized each group so its smallest SKU was 1. Both encode the same proportions in - different units, differing by a per-group constant. Those units were reconciled once, in a - one-time migration, so every published record now sits on the API scale. - - Azure retires individual sizes rather than whole families, so the API commonly returns only - part of a group. If a carried-forward record were ever on the other scale, the group would - silently mix units -- Ev3 Series ending up with Standard_E2_v3 at 2 from the API next to - Standard_E4_v3 at 2 from the older file, which is not just wrong but non-monotonic. - - Scale mismatches are large (the observed factors run from 2x to 80x) while a genuine ratio - correction from Microsoft is small and should simply be taken, so this compares the median - factor across the SKUs a group shares with the API and only fails on a scale-sized gap. - #> - param( - [object[]]$Published, - [object[]]$Api, - - # Well above any plausible ratio correction, well below the smallest observed unit change. - [double]$MaxFactor = 1.5 - ) - - $apiByGroup = @{} - foreach ($record in $Api) - { - if (-not $apiByGroup.ContainsKey($record.InstanceSizeFlexibilityGroup)) - { - $apiByGroup[$record.InstanceSizeFlexibilityGroup] = @{} - } - $apiByGroup[$record.InstanceSizeFlexibilityGroup][$record.ArmSkuName] = $record.Ratio - } - - $conflicts = [System.Collections.ArrayList]::new() - foreach ($group in ($Published | Group-Object InstanceSizeFlexibilityGroup)) - { - if (-not $apiByGroup.ContainsKey($group.Name)) { continue } - - $apiRatios = $apiByGroup[$group.Name] - $observed = @( - $group.Group | - Where-Object { $_.Ratio -and $apiRatios.ContainsKey($_.ArmSkuName) } | - ForEach-Object { $apiRatios[$_.ArmSkuName] / $_.Ratio } - ) - if ($observed.Count -eq 0) { continue } - - $sorted = @($observed | Sort-Object) - $factor = $sorted[[Math]::Floor($sorted.Count / 2)] - if ($factor -gt $MaxFactor -or $factor -lt (1 / $MaxFactor)) - { - $null = $conflicts.Add("$($group.Name) (published ratios are $([Math]::Round($factor, 3))x off the API)") - } - } - - if ($conflicts.Count -gt 0) - { - throw "These flexibility groups are on a different ratio scale than the Catalogs API, so merging them would publish one group in two units: $($conflicts -join '; '). The published dataset was migrated onto the API scale once; re-migrate these groups instead of publishing." - } -} - -# ----------------------------------------------------------------------- -# Step 2: Merge over the previously published file -# ----------------------------------------------------------------------- -# Keyed on ArmSkuName, lowest precedence first, so the live API wins wherever it has an opinion -# and rows it no longer returns are carried forward instead of dropped. Carried-forward records -# were migrated onto the API's scale once, and the check below keeps them there. -$publishedRecords = @(Import-IsfCsv -Path $OutputPath) -Assert-IsfScale -Published $publishedRecords -Api $apiRecords - -$merged = [ordered]@{} -$sources = @( - @{ Name = 'published'; Records = $publishedRecords } - @{ Name = 'API'; Records = $apiRecords } -) -foreach ($source in $sources) -{ - $added = 0 - $updated = 0 - foreach ($record in $source.Records) - { - if ($merged.Contains($record.ArmSkuName)) { $updated++ } else { $added++ } - $merged[$record.ArmSkuName] = $record - } - Write-Host " $($source.Name): $($source.Records.Count) records ($added new, $updated superseding an earlier source)" -} - -$allRecords = @($merged.Values) -Write-Host "Merged to $($allRecords.Count) SKUs across $(($allRecords | Group-Object InstanceSizeFlexibilityGroup).Count) flexibility groups" - -# The merge is keyed on ArmSkuName and every source is filtered to one group per SKU, so this can -# only fire if that changes. Keep the invariant checked rather than assumed. $duplicateSkus = $allRecords | Group-Object ArmSkuName | Where-Object Count -gt 1 if ($duplicateSkus) { - throw "Duplicate ArmSkuName values after merge: $($duplicateSkus.Name -join ', '). ArmSkuName must stay unique; investigate before publishing." -} - -# The published dataset must never shrink: downstream consumers join on SKUs that may no longer be -# purchasable but are still covered by active reservations. -$previousCount = (Import-IsfCsv -Path $OutputPath).Count -if ($allRecords.Count -lt $previousCount) -{ - throw "Merged output has $($allRecords.Count) SKUs but the published file has $previousCount. The dataset must not shrink; investigate before publishing." + throw "Duplicate ArmSkuName values across flexibility groups: $($duplicateSkus.Name -join ', '). ArmSkuName must stay unique; investigate before publishing." } # ----------------------------------------------------------------------- -# Step 3: Normalize, sort, and write output +# Step 2: Normalize, sort, and write output # ----------------------------------------------------------------------- if ($Normalize) { From 26bd5f7d8a7cfa4c0098d541a0ed1d0eb676f23b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 9 Sep 2026 15:55:10 +0000 Subject: [PATCH 6/9] chore: Update ms.date in docs-mslearn files --- docs-mslearn/toolkit/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index ddab3e98f..2c43d8db6 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -3,7 +3,7 @@ title: FinOps toolkit changelog description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more. author: MSBrett ms.author: brettwil -ms.date: 09/07/2026 +ms.date: 09/09/2026 ms.topic: reference ms.service: finops ms.subservice: finops-toolkit From 96bf14d6fd6c1ef61b1108535567f7615ea80063 Mon Sep 17 00:00:00 2001 From: Roland Krummenacher Date: Wed, 9 Sep 2026 18:07:00 +0200 Subject: [PATCH 7/9] fix(aoe): keep reservations visible when their SKU has no ISF ratio The reservation workbooks join the instance size flexibility open data with kind=inner. The Catalogs API that feeds it only returns SKUs that can still be purchased, so an active reservation on a retired size has no row to match and is dropped from the report entirely -- not shown at zero, absent. The customer keeps paying for a reservation the tool stops mentioning. Reservations run one or three years and outlive the sellability of their size, so this is reachable in normal use. All seven ISF joins in reservations-usage.json become leftouter, with the group and ratio falling back to the SKU itself: | extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0) Without that fallback a plain leftouter is worse than the current behaviour: Ratio and ISFGroup come back null, every unmatched reservation collapses into one null bucket, and the utilization column reads empty. Ratio 1 is correct for these rows. Util7Days_s comes from Azure and already accounts for flexibility, so the percentage is right; the ratio only converts between group units, which is a no-op for a single-SKU group. reservations-potential.json and benefits-simulation.json keep kind=inner. They model what to buy, where restricting to purchasable SKUs is correct. Also points the changelog entries for the culture and zero-ratio fixes at this PR rather than #2300, which they have nothing to do with. Note the workbook KQL is not executed by any test in this repo, so this change is reasoned rather than verified. Fixes #2300 Co-Authored-By: Claude Opus 5 --- docs-mslearn/toolkit/changelog.md | 7 +++++-- .../views/workbooks/reservations-usage.json | 10 +++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index ddab3e98f..b0e64fa7a 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -60,6 +60,9 @@ The following section lists features and enhancements that are currently in deve ### [Optimization Engine](optimization-engine/overview.md) +- **Fixed** + - Fixed reservations disappearing from the reservation workbooks when their SKU is no longer sold. The instance size flexibility joins required a match, so an active reservation on a retired size was dropped from the report entirely rather than shown with its utilization ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - **Added** - Added a comprehensive [Azure Optimization Engine reference](optimization-engine/reference.md) for runbooks, schedules, variables, Log Analytics tables, and SQL Database tables ([#1271](https://github.com/microsoft/finops-toolkit/issues/1271)). - **Changed** @@ -80,8 +83,8 @@ The following section lists features and enhancements that are currently in deve - Added a new [Instance size flexibility](open-data.md#instance-size-flexibility) dataset that maps each ARM SKU to its instance size flexibility group and ratio, sourced from the Azure Reservations Catalogs API. It replaces the deprecated ISF ratio files hosted on `ccmstorageprod.blob.core.windows.net` ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - **Fixed** - Fixed the instance size flexibility generator sweeping a hardcoded list of 26 regions, which omitted SKUs that launch in only a handful of regions. It now enumerates every physical region from the ARM locations API, 63 at the time of the change ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - - Fixed ratios being parsed and written with the current culture. On a comma-decimal machine `2.1` was read as `21` or rejected, and written back as `2,1`, which would break every consumer of the file ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - - Fixed the dataset publishing a SKU whose ratio is `0`, which the Optimization Engine's benefits simulation divides by. Non-positive ratios are now dropped ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). + - Fixed ratios being parsed and written with the current culture. On a comma-decimal machine `2.1` was read as `21` or rejected, and written back as `2,1`, which would break every consumer of the file ([#2308](https://github.com/microsoft/finops-toolkit/pull/2308)). + - Fixed the dataset publishing a SKU whose ratio is `0`, which the Optimization Engine's benefits simulation divides by. Non-positive ratios are now dropped ([#2308](https://github.com/microsoft/finops-toolkit/pull/2308)). **[Commitment discount eligibility](open-data.md#commitment-discount-eligibility)** diff --git a/src/optimization-engine/views/workbooks/reservations-usage.json b/src/optimization-engine/views/workbooks/reservations-usage.json index 51277b3ce..b35474706 100644 --- a/src/optimization-engine/views/workbooks/reservations-usage.json +++ b/src/optimization-engine/views/workbooks/reservations-usage.json @@ -536,7 +536,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| distinct MeterID_g, OnDemandUnitPrice\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s;\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UsedQuantity = todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100\r\n | extend UsedQuantity30d = todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100\r\n | extend SKUName_s=tolower(SKUName_s)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, UsedQuantity, UsedQuantity30d, TotalReservedQuantity_s, Term_s, AppliedScopeType_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s, Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), UsedQuantity, UsedQuantity30d, Term_s, AppliedScopeType_s\r\n| join kind=inner ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| join kind=leftouter ( ReservationOnDemandMeters ) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter ( ReservationPricesheet ) on SkuName and Location_s and Term_s\r\n| join kind=leftouter ( OnDemandPriceSheet ) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| extend AvgRIsUsedInSmallestRatio = Ratio * AvgRIsUsedDaily\r\n| summarize TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), AvgRIsUsedDaily=sum(AvgRIsUsedInSmallestRatio), UsedQuantity=sum(UsedQuantity*Ratio), UsedQuantity30d=sum(UsedQuantity30d*Ratio), AvgDiscountPercent=avg(DiscountPercent) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = UsedQuantity/TotalReservedQuantity_s*100, Util30Days_s = UsedQuantity30d/TotalReservedQuantity_s*100\r\n| extend AvgRIUsagePercentInSmallestRatio = round(AvgRIsUsedDaily / TotalReservedQuantity_s * 100, 1)\r\n| extend AvgDiscountPercent=iif(AvgDiscountPercent > 0.0, AvgDiscountPercent, 0.0)\r\n| extend SavingsMargin=round(todouble(Util7Days_s))-100.0+AvgDiscountPercent \r\n| project-away AvgRIUsagePercentInSmallestRatio, AvgRIsUsedDaily\r\n| project-reorder ISFGroup, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UsedQuantity, Util30Days_s, UsedQuantity30d\r\n| order by Util7Days_s asc", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| distinct MeterID_g, OnDemandUnitPrice\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s;\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UsedQuantity = todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100\r\n | extend UsedQuantity30d = todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100\r\n | extend SKUName_s=tolower(SKUName_s)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, UsedQuantity, UsedQuantity30d, TotalReservedQuantity_s, Term_s, AppliedScopeType_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s, Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), UsedQuantity, UsedQuantity30d, Term_s, AppliedScopeType_s\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| join kind=leftouter ( ReservationOnDemandMeters ) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter ( ReservationPricesheet ) on SkuName and Location_s and Term_s\r\n| join kind=leftouter ( OnDemandPriceSheet ) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| extend AvgRIsUsedInSmallestRatio = Ratio * AvgRIsUsedDaily\r\n| summarize TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), AvgRIsUsedDaily=sum(AvgRIsUsedInSmallestRatio), UsedQuantity=sum(UsedQuantity*Ratio), UsedQuantity30d=sum(UsedQuantity30d*Ratio), AvgDiscountPercent=avg(DiscountPercent) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = UsedQuantity/TotalReservedQuantity_s*100, Util30Days_s = UsedQuantity30d/TotalReservedQuantity_s*100\r\n| extend AvgRIUsagePercentInSmallestRatio = round(AvgRIsUsedDaily / TotalReservedQuantity_s * 100, 1)\r\n| extend AvgDiscountPercent=iif(AvgDiscountPercent > 0.0, AvgDiscountPercent, 0.0)\r\n| extend SavingsMargin=round(todouble(Util7Days_s))-100.0+AvgDiscountPercent \r\n| project-away AvgRIUsagePercentInSmallestRatio, AvgRIsUsedDaily\r\n| project-reorder ISFGroup, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UsedQuantity, Util30Days_s, UsedQuantity30d\r\n| order by Util7Days_s asc", "size": 0, "showAnalytics": true, "title": "Reservation Usage Details grouped by ISF group (click on a line for more details)", @@ -817,7 +817,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend ConsumedSize = iif(isnotempty(VMSize), VMSize, strcat(MeterSubCategory_s, ' ', MeterName_s))\r\n| extend UsedRIs = todouble(Quantity_s) / 24 * Ratio\r\n| summarize round(sum(UsedRIs),1) by todatetime(Date_s), ConsumedSize", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend ConsumedSize = iif(isnotempty(VMSize), VMSize, strcat(MeterSubCategory_s, ' ', MeterName_s))\r\n| extend UsedRIs = todouble(Quantity_s) / 24 * Ratio\r\n| summarize round(sum(UsedRIs),1) by todatetime(Date_s), ConsumedSize", "size": 0, "aggregation": 3, "showAnalytics": true, @@ -851,7 +851,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet absoluteRIBought = toscalar(AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}')\r\n and TimeGenerated < todatetime('{LookbackPeriod:endISO}')\r\n and ChargeType_s == 'Usage'\r\n and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| summarize (datetime_diff('Day',max(todatetime(Date_s)),min(todatetime(Date_s)))+1)*{selectedQuantity});\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend UsedRIs = todouble(Quantity_s) * Ratio / 24\r\n| summarize UsedRIPercentage=round(sum(UsedRIs) / absoluteRIBought * 100, 2) by ResourceId, SubscriptionId\r\n| join kind=leftouter ( \r\n AzureOptimizationResourceContainersV1_CL \r\n | where TimeGenerated > ago(1d) and ContainerType_s == 'microsoft.resources/subscriptions'\r\n | project Subscription=ContainerName_s, SubscriptionId=SubscriptionGuid_g\r\n) on SubscriptionId\r\n| project-away SubscriptionId*\r\n| project-reorder ResourceId, Subscription, UsedRIPercentage\r\n| order by ResourceId asc, UsedRIPercentage", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet absoluteRIBought = toscalar(AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}')\r\n and TimeGenerated < todatetime('{LookbackPeriod:endISO}')\r\n and ChargeType_s == 'Usage'\r\n and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| summarize (datetime_diff('Day',max(todatetime(Date_s)),min(todatetime(Date_s)))+1)*{selectedQuantity});\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend UsedRIs = todouble(Quantity_s) * Ratio / 24\r\n| summarize UsedRIPercentage=round(sum(UsedRIs) / absoluteRIBought * 100, 2) by ResourceId, SubscriptionId\r\n| join kind=leftouter ( \r\n AzureOptimizationResourceContainersV1_CL \r\n | where TimeGenerated > ago(1d) and ContainerType_s == 'microsoft.resources/subscriptions'\r\n | project Subscription=ContainerName_s, SubscriptionId=SubscriptionGuid_g\r\n) on SubscriptionId\r\n| project-away SubscriptionId*\r\n| project-reorder ResourceId, Subscription, UsedRIPercentage\r\n| order by ResourceId asc, UsedRIPercentage", "size": 1, "showAnalytics": true, "title": "Average Daily Reservation Usage by Resource (click on a line in the table above)", @@ -892,7 +892,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet absoluteRIBought = toscalar(AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}')\r\n and TimeGenerated < todatetime('{LookbackPeriod:endISO}')\r\n and ChargeType_s == 'Usage'\r\n and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| summarize (datetime_diff('Day',max(todatetime(Date_s)),min(todatetime(Date_s)))+1)*{selectedQuantity});\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend Tags_s = iif(Tags_s startswith \"{\", Tags_s, strcat(\"{\", Tags_s, \"}\"))\r\n| extend AggregatorTag = tostring(parse_json(Tags_s)['{Aggregator}'])\r\n| extend UsedRIs = todouble(Quantity_s) * Ratio / 24\r\n| summarize UsedRIPercentage=round(sum(UsedRIs) / absoluteRIBought * 100, 2) by AggregatorTag, SubscriptionId\r\n| join kind=leftouter ( \r\n AzureOptimizationResourceContainersV1_CL \r\n | where TimeGenerated > ago(1d) and ContainerType_s == 'microsoft.resources/subscriptions'\r\n | project Subscription=ContainerName_s, SubscriptionId=SubscriptionGuid_g\r\n) on SubscriptionId\r\n| project-away SubscriptionId*\r\n| project-reorder AggregatorTag, Subscription, UsedRIPercentage\r\n| order by AggregatorTag asc, UsedRIPercentage", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet absoluteRIBought = toscalar(AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}')\r\n and TimeGenerated < todatetime('{LookbackPeriod:endISO}')\r\n and ChargeType_s == 'Usage'\r\n and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| summarize (datetime_diff('Day',max(todatetime(Date_s)),min(todatetime(Date_s)))+1)*{selectedQuantity});\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend Tags_s = iif(Tags_s startswith \"{\", Tags_s, strcat(\"{\", Tags_s, \"}\"))\r\n| extend AggregatorTag = tostring(parse_json(Tags_s)['{Aggregator}'])\r\n| extend UsedRIs = todouble(Quantity_s) * Ratio / 24\r\n| summarize UsedRIPercentage=round(sum(UsedRIs) / absoluteRIBought * 100, 2) by AggregatorTag, SubscriptionId\r\n| join kind=leftouter ( \r\n AzureOptimizationResourceContainersV1_CL \r\n | where TimeGenerated > ago(1d) and ContainerType_s == 'microsoft.resources/subscriptions'\r\n | project Subscription=ContainerName_s, SubscriptionId=SubscriptionGuid_g\r\n) on SubscriptionId\r\n| project-away SubscriptionId*\r\n| project-reorder AggregatorTag, Subscription, UsedRIPercentage\r\n| order by AggregatorTag asc, UsedRIPercentage", "size": 1, "showAnalytics": true, "title": "Average Daily Reservation Usage by Tag (click on a line in the table above)", @@ -1310,7 +1310,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| summarize TotalUnusedCost = sum(todouble(CostInBillingCurrency_s)) by ReservationId_g\r\n| where round(TotalUnusedCost) > 0\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s=tolower(SKUName_s), Location_s, TotalReservedQuantity_s, Term_s, AppliedScopeType_s, UnusedQuantity, UnusedQuantity30d\r\n) on ReservationId_g\r\n| project-away ReservationId_g1\r\n| join kind=inner ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| summarize TotalUnusedCost=sum(TotalUnusedCost), TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), UnusedQuantity=sum(UnusedQuantity*Ratio), UnusedQuantity30d=sum(UnusedQuantity30d*Ratio) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = (1-UnusedQuantity/TotalReservedQuantity_s)*100, Util30Days_s = (1-UnusedQuantity30d/TotalReservedQuantity_s)*100\r\n| project-reorder ISFGroup, TotalUnusedCost, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UnusedQuantity, Util30Days_s\r\n| order by TotalUnusedCost", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| summarize TotalUnusedCost = sum(todouble(CostInBillingCurrency_s)) by ReservationId_g\r\n| where round(TotalUnusedCost) > 0\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s=tolower(SKUName_s), Location_s, TotalReservedQuantity_s, Term_s, AppliedScopeType_s, UnusedQuantity, UnusedQuantity30d\r\n) on ReservationId_g\r\n| project-away ReservationId_g1\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| summarize TotalUnusedCost=sum(TotalUnusedCost), TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), UnusedQuantity=sum(UnusedQuantity*Ratio), UnusedQuantity30d=sum(UnusedQuantity30d*Ratio) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = (1-UnusedQuantity/TotalReservedQuantity_s)*100, Util30Days_s = (1-UnusedQuantity30d/TotalReservedQuantity_s)*100\r\n| project-reorder ISFGroup, TotalUnusedCost, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UnusedQuantity, Util30Days_s\r\n| order by TotalUnusedCost", "size": 2, "showAnalytics": true, "title": "Unused Reservations Details (grouped by Instance Size Flexibility group)", From a8bb300594394e469737b6c85814d64069564117 Mon Sep 17 00:00:00 2001 From: Roland Krummenacher Date: Wed, 9 Sep 2026 18:25:47 +0200 Subject: [PATCH 8/9] fix(open-data): normalize ISF ratios so each group starts at 1 The Catalogs API leaves ratios unnormalized -- only 52 of its 211 groups have a smallest SKU of 1, which Microsoft's documentation calls out (BS Series starts at 0.25, Ddsv5 Series at 2) alongside a normalization step of its own. The retired isfratioblob.csv this dataset replaced was normalized, so #2222 silently changed the scale under every consumer. That matters because the Optimization Engine converts quantities into units of a group's smallest SKU -- AvgRIsUsedInSmallestRatio is the variable's own name -- and multiplying by a ratio that doesn't start at 1 inflates the absolute figures by a per-group constant. Utilization percentages carry the factor on both sides and were never wrong; the displayed quantities were. Normalizing loses nothing: ratios are only meaningful within their group, and both forms carry identical proportions. It also makes the leftouter fix in this PR coherent. An unmatched reservation falls back to Ratio 1, which is implicitly "smallest SKU = 1"; next to an unnormalized group that would put two rows of one table in different units. Against the retired file, 1,223 of the 1,291 rows they share now agree. The 68 that don't split cleanly: - 12 groups / 52 rows where the API no longer returns the historically smallest SKU, so normalization anchors on a different one. BS Series High Memory is down to Standard_B20ms alone, which normalizes to 1 rather than 40.2. Internally consistent, since no other SKU of that group remains. - 11 groups / 16 rows, all dedicated host, where the API and the retired file disagree on the proportions themselves rather than the unit. The API is the newer source. -Normalize is replaced by -Raw, so the switch names the departure from the default rather than the default itself. Fixes #2309 Co-Authored-By: Claude Opus 5 --- docs-mslearn/toolkit/changelog.md | 1 + docs-mslearn/toolkit/open-data.md | 2 +- src/open-data/InstanceSizeFlexibility.csv | 2200 ++++++++--------- src/open-data/README.md | 2 +- .../Update-InstanceSizeFlexibility.Tests.ps1 | 33 +- .../Update-InstanceSizeFlexibility.ps1 | 24 +- 6 files changed, 1142 insertions(+), 1120 deletions(-) diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index 05cb6f1d8..264ee8f01 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -84,6 +84,7 @@ The following section lists features and enhancements that are currently in deve - **Fixed** - Fixed the instance size flexibility generator sweeping a hardcoded list of 26 regions, which omitted SKUs that launch in only a handful of regions. It now enumerates every physical region from the ARM locations API, 63 at the time of the change ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - Fixed ratios being parsed and written with the current culture. On a comma-decimal machine `2.1` was read as `21` or rejected, and written back as `2,1`, which would break every consumer of the file ([#2308](https://github.com/microsoft/finops-toolkit/pull/2308)). + - Fixed the dataset publishing unnormalized ratios. The Catalogs API leaves them unnormalized, so a group's smallest SKU is usually not `1`, while the retired ratio file it replaced was normalized and the Optimization Engine converts quantities into units of a group's smallest SKU. Absolute quantities in the reservation workbooks were inflated by a per-group constant as a result. Each group is now normalized, matching the retired file for 1,223 of the 1,291 rows they share ([#2309](https://github.com/microsoft/finops-toolkit/issues/2309)). - Fixed the dataset publishing a SKU whose ratio is `0`, which the Optimization Engine's benefits simulation divides by. Non-positive ratios are now dropped ([#2308](https://github.com/microsoft/finops-toolkit/pull/2308)). **[Commitment discount eligibility](open-data.md#commitment-discount-eligibility)** diff --git a/docs-mslearn/toolkit/open-data.md b/docs-mslearn/toolkit/open-data.md index 75720ca0a..b05a6b6a6 100644 --- a/docs-mslearn/toolkit/open-data.md +++ b/docs-mslearn/toolkit/open-data.md @@ -195,7 +195,7 @@ A few important notes about the data: - It covers Virtual Machines, Redis Cache, and Dedicated Host across every physical Azure region. - `ArmSkuName` is unique across the file and can be used as a join key on its own. -- Ratios are the raw Microsoft values within each group (the smallest SKU isn't always `1`). +- Ratios are normalized so the smallest SKU in each flexibility group has a ratio of `1`. Compare ratios only within a flexibility group. - Data is updated weekly via a GitHub Actions workflow and always reflects the current API catalog, so retired SKUs are removed automatically. diff --git a/src/open-data/InstanceSizeFlexibility.csv b/src/open-data/InstanceSizeFlexibility.csv index 505ed64b5..fb75c27bc 100644 --- a/src/open-data/InstanceSizeFlexibility.csv +++ b/src/open-data/InstanceSizeFlexibility.csv @@ -57,57 +57,57 @@ "Azure Redis Cache Premium","azure_redis_cache_premium_p3_cache","4" "Azure Redis Cache Premium","azure_redis_cache_premium_p4_cache","8" "Azure Redis Cache Premium","azure_redis_cache_premium_p5_cache","18.14" -"BS Series High Memory","Standard_B20ms","20.1" -"Basv2 Series","Standard_B16als_v2","113.4" -"Basv2 Series","Standard_B16as_v2","128.08" -"Basv2 Series","Standard_B2als_v2","8" -"Basv2 Series","Standard_B2as_v2","16" -"Basv2 Series","Standard_B2ats_v2","2" -"Basv2 Series","Standard_B32als_v2","226.6" -"Basv2 Series","Standard_B32as_v2","255.96" -"Basv2 Series","Standard_B4als_v2","28.3" -"Basv2 Series","Standard_B4as_v2","31.92" -"Basv2 Series","Standard_B8als_v2","56.6" -"Basv2 Series","Standard_B8as_v2","64.04" -"Bpsv2 Series","Standard_B16pls_v2","113.34" -"Bpsv2 Series","Standard_B16ps_v2","128.1" -"Bpsv2 Series","Standard_B2pls_v2","8" -"Bpsv2 Series","Standard_B2ps_v2","16" -"Bpsv2 Series","Standard_B2pts_v2","2" -"Bpsv2 Series","Standard_B4pls_v2","28.34" -"Bpsv2 Series","Standard_B4ps_v2","31.9" -"Bpsv2 Series","Standard_B8pls_v2","56.66" -"Bpsv2 Series","Standard_B8ps_v2","64.04" -"Bsv2 Series","Standard_B16ls_v2","113.27" -"Bsv2 Series","Standard_B16s_v2","128.08" -"Bsv2 Series","Standard_B2ls_v2","8" -"Bsv2 Series","Standard_B2s_v2","16" -"Bsv2 Series","Standard_B2ts_v2","2" -"Bsv2 Series","Standard_B32ls_v2","226.73" -"Bsv2 Series","Standard_B32s_v2","255.96" -"Bsv2 Series","Standard_B4ls_v2","28.27" -"Bsv2 Series","Standard_B4s_v2","31.92" -"Bsv2 Series","Standard_B8ls_v2","56.73" -"Bsv2 Series","Standard_B8s_v2","64.04" -"DCadsv5-series DedicatedHost","dcadsv5 type 1","112" -"DCadsv5-series Linux","Standard_DC16ads_v5","16" -"DCadsv5-series Linux","Standard_DC2ads_v5","2" -"DCadsv5-series Linux","Standard_DC32ads_v5","32" -"DCadsv5-series Linux","Standard_DC48ads_v5","48" -"DCadsv5-series Linux","Standard_DC4ads_v5","4" -"DCadsv5-series Linux","Standard_DC64ads_v5","64" -"DCadsv5-series Linux","Standard_DC8ads_v5","8" -"DCadsv5-series Linux","Standard_DC96ads_v5","96" -"DCasv5-series DedicatedHost","dcasv5 type 1","112" -"DCasv5-series Linux","Standard_DC16as_v5","16" -"DCasv5-series Linux","Standard_DC2as_v5","2" -"DCasv5-series Linux","Standard_DC32as_v5","32" -"DCasv5-series Linux","Standard_DC48as_v5","48" -"DCasv5-series Linux","Standard_DC4as_v5","4" -"DCasv5-series Linux","Standard_DC64as_v5","64" -"DCasv5-series Linux","Standard_DC8as_v5","8" -"DCasv5-series Linux","Standard_DC96as_v5","96" -"DCdsv3 Series DedicatedHost","dcdsv3 type1","60" +"BS Series High Memory","Standard_B20ms","1" +"Basv2 Series","Standard_B16als_v2","56.7" +"Basv2 Series","Standard_B16as_v2","64.04" +"Basv2 Series","Standard_B2als_v2","4" +"Basv2 Series","Standard_B2as_v2","8" +"Basv2 Series","Standard_B2ats_v2","1" +"Basv2 Series","Standard_B32als_v2","113.3" +"Basv2 Series","Standard_B32as_v2","127.98" +"Basv2 Series","Standard_B4als_v2","14.15" +"Basv2 Series","Standard_B4as_v2","15.96" +"Basv2 Series","Standard_B8als_v2","28.3" +"Basv2 Series","Standard_B8as_v2","32.02" +"Bpsv2 Series","Standard_B16pls_v2","56.67" +"Bpsv2 Series","Standard_B16ps_v2","64.05" +"Bpsv2 Series","Standard_B2pls_v2","4" +"Bpsv2 Series","Standard_B2ps_v2","8" +"Bpsv2 Series","Standard_B2pts_v2","1" +"Bpsv2 Series","Standard_B4pls_v2","14.17" +"Bpsv2 Series","Standard_B4ps_v2","15.95" +"Bpsv2 Series","Standard_B8pls_v2","28.33" +"Bpsv2 Series","Standard_B8ps_v2","32.02" +"Bsv2 Series","Standard_B16ls_v2","56.635" +"Bsv2 Series","Standard_B16s_v2","64.04" +"Bsv2 Series","Standard_B2ls_v2","4" +"Bsv2 Series","Standard_B2s_v2","8" +"Bsv2 Series","Standard_B2ts_v2","1" +"Bsv2 Series","Standard_B32ls_v2","113.365" +"Bsv2 Series","Standard_B32s_v2","127.98" +"Bsv2 Series","Standard_B4ls_v2","14.135" +"Bsv2 Series","Standard_B4s_v2","15.96" +"Bsv2 Series","Standard_B8ls_v2","28.365" +"Bsv2 Series","Standard_B8s_v2","32.02" +"DCadsv5-series DedicatedHost","dcadsv5 type 1","1" +"DCadsv5-series Linux","Standard_DC16ads_v5","8" +"DCadsv5-series Linux","Standard_DC2ads_v5","1" +"DCadsv5-series Linux","Standard_DC32ads_v5","16" +"DCadsv5-series Linux","Standard_DC48ads_v5","24" +"DCadsv5-series Linux","Standard_DC4ads_v5","2" +"DCadsv5-series Linux","Standard_DC64ads_v5","32" +"DCadsv5-series Linux","Standard_DC8ads_v5","4" +"DCadsv5-series Linux","Standard_DC96ads_v5","48" +"DCasv5-series DedicatedHost","dcasv5 type 1","1" +"DCasv5-series Linux","Standard_DC16as_v5","8" +"DCasv5-series Linux","Standard_DC2as_v5","1" +"DCasv5-series Linux","Standard_DC32as_v5","16" +"DCasv5-series Linux","Standard_DC48as_v5","24" +"DCasv5-series Linux","Standard_DC4as_v5","2" +"DCasv5-series Linux","Standard_DC64as_v5","32" +"DCasv5-series Linux","Standard_DC8as_v5","4" +"DCasv5-series Linux","Standard_DC96as_v5","48" +"DCdsv3 Series DedicatedHost","dcdsv3 type1","1" "DCdsv3 Series Linux","Standard_DC16ds_v3","16" "DCdsv3 Series Linux","Standard_DC1ds_v3","1" "DCdsv3 Series Linux","Standard_DC24ds_v3","24" @@ -116,7 +116,7 @@ "DCdsv3 Series Linux","Standard_DC48ds_v3","48" "DCdsv3 Series Linux","Standard_DC4ds_v3","4" "DCdsv3 Series Linux","Standard_DC8ds_v3","8" -"DCsv3 Series DedicatedHost","dcsv3 type1","51" +"DCsv3 Series DedicatedHost","dcsv3 type1","1" "DCsv3 Series Linux","Standard_DC16s_v3","16" "DCsv3 Series Linux","Standard_DC1s_v3","1" "DCsv3 Series Linux","Standard_DC24s_v3","24" @@ -130,487 +130,487 @@ "DSv2 Series","Standard_DS3_v2","4" "DSv2 Series","Standard_DS4_v2","8" "DSv2 Series","Standard_DS5_v2","16" -"DSv2 Series High Memory","Standard_DS11-1_v2","2" -"DSv2 Series High Memory","Standard_DS11_v2","2" -"DSv2 Series High Memory","Standard_DS12-1_v2","4" -"DSv2 Series High Memory","Standard_DS12-2_v2","4" -"DSv2 Series High Memory","Standard_DS12_v2","4" -"DSv2 Series High Memory","Standard_DS13-2_v2","8" -"DSv2 Series High Memory","Standard_DS13-4_v2","8" -"DSv2 Series High Memory","Standard_DS13_v2","8" -"DSv2 Series High Memory","Standard_DS14-4_v2","16" -"DSv2 Series High Memory","Standard_DS14-8_v2","16" -"DSv2 Series High Memory","Standard_DS14_v2","16" -"DSv2 Series High Memory","Standard_DS15_v2","20" -"DSv3 Series Dedicated Host","dsv3_type1","68" -"DSv3 Series Dedicated Host","dsv3_type2","76.59" -"DSv3 Series Dedicated Host","dsv3_type3","85" -"DSv3 Series Dedicated Host","dsv3_type4","106.08" -"DSv4 Series Dedicated Host","dsv4_type1","80" -"DSv4 Series Dedicated Host","dsv4_type2","96" -"Dadsv5 Series","Standard_D16ads_v5","16" -"Dadsv5 Series","Standard_D2ads_v5","2" -"Dadsv5 Series","Standard_D32ads_v5","32" -"Dadsv5 Series","Standard_D48ads_v5","48" -"Dadsv5 Series","Standard_D4ads_v5","4" -"Dadsv5 Series","Standard_D64ads_v5","64" -"Dadsv5 Series","Standard_D8ads_v5","8" -"Dadsv5 Series","Standard_D96ads_v5","96" -"Dadsv5 Series DedicatedHost","dadsv5_type1","112" -"Dasv4 Series","Standard_D16as_v4","16" -"Dasv4 Series","Standard_D2as_v4","2" -"Dasv4 Series","Standard_D32as_v4","32" -"Dasv4 Series","Standard_D48as_v4","48" -"Dasv4 Series","Standard_D4as_v4","4" -"Dasv4 Series","Standard_D64as_v4","64" -"Dasv4 Series","Standard_D8as_v4","8" -"Dasv4 Series","Standard_D96as_v4","96" -"Dasv4 Series Dedicated Host","dasv4_type1","96" -"Dasv4 Series Dedicated Host","dasv4_type2","99.84" -"Dasv5 Series","Standard_D16as_v5","16" -"Dasv5 Series","Standard_D2as_v5","2" -"Dasv5 Series","Standard_D32as_v5","32" -"Dasv5 Series","Standard_D48as_v5","48" -"Dasv5 Series","Standard_D4as_v5","4" -"Dasv5 Series","Standard_D64as_v5","64" -"Dasv5 Series","Standard_D8as_v5","8" -"Dasv5 Series","Standard_D96as_v5","96" -"Dasv5 Series DedicatedHost","dasv5_type1","112" -"Dav4 Series","Standard_D16a_v4","16" -"Dav4 Series","Standard_D2a_v4","2" -"Dav4 Series","Standard_D32a_v4","32" -"Dav4 Series","Standard_D48a_v4","48" -"Dav4 Series","Standard_D4a_v4","4" -"Dav4 Series","Standard_D64a_v4","64" -"Dav4 Series","Standard_D8a_v4","8" -"Dav4 Series","Standard_D96a_v4","96" -"Ddsv4 Series","Standard_D16ds_v4","16" -"Ddsv4 Series","Standard_D2ds_v4","2" -"Ddsv4 Series","Standard_D32ds_v4","32" -"Ddsv4 Series","Standard_D48ds_v4","48" -"Ddsv4 Series","Standard_D4ds_v4","4" -"Ddsv4 Series","Standard_D64ds_v4","64" -"Ddsv4 Series","Standard_D8ds_v4","8" -"Ddsv4 Series Dedicated Host","ddsv4_type 1","68" -"Ddsv4 Series Dedicated Host","ddsv4_type2","80.92" -"Ddsv5 Series","Standard_D16ds_v5","16" -"Ddsv5 Series","Standard_D2ds_v5","2" -"Ddsv5 Series","Standard_D32ds_v5","32" -"Ddsv5 Series","Standard_D48ds_v5","48" -"Ddsv5 Series","Standard_D4ds_v5","4" -"Ddsv5 Series","Standard_D64ds_v5","64" -"Ddsv5 Series","Standard_D8ds_v5","8" -"Ddsv5 Series","Standard_D96ds_v5","96" -"Ddsv5 Series DedicatedHost","ddsv5_type1","107" -"Ddv4 Series","Standard_D16d_v4","16" -"Ddv4 Series","Standard_D2d_v4","2" -"Ddv4 Series","Standard_D32d_v4","32" -"Ddv4 Series","Standard_D48d_v4","48" -"Ddv4 Series","Standard_D4d_v4","4" -"Ddv4 Series","Standard_D64d_v4","64" -"Ddv4 Series","Standard_D8d_v4","8" -"Ddv5 Series","Standard_D16d_v5","16" -"Ddv5 Series","Standard_D2d_v5","2" -"Ddv5 Series","Standard_D32d_v5","32" -"Ddv5 Series","Standard_D48d_v5","48" -"Ddv5 Series","Standard_D4d_v5","4" -"Ddv5 Series","Standard_D64d_v5","64" -"Ddv5 Series","Standard_D8d_v5","8" -"Ddv5 Series","Standard_D96d_v5","96" -"Dldsv5 Series","Standard_D16lds_v5","16" -"Dldsv5 Series","Standard_D2lds_v5","2" -"Dldsv5 Series","Standard_D32lds_v5","32" -"Dldsv5 Series","Standard_D48lds_v5","48" -"Dldsv5 Series","Standard_D4lds_v5","4" -"Dldsv5 Series","Standard_D64lds_v5","64" -"Dldsv5 Series","Standard_D8lds_v5","8" -"Dldsv5 Series","Standard_D96lds_v5","96" -"Dlsv5 Series","Standard_D16ls_v5","16" -"Dlsv5 Series","Standard_D2ls_v5","2" -"Dlsv5 Series","Standard_D32ls_v5","32" -"Dlsv5 Series","Standard_D48ls_v5","48" -"Dlsv5 Series","Standard_D4ls_v5","4" -"Dlsv5 Series","Standard_D64ls_v5","64" -"Dlsv5 Series","Standard_D8ls_v5","8" -"Dlsv5 Series","Standard_D96ls_v5","96" -"Dpdsv5 Series","Standard_D16pds_v5","16" -"Dpdsv5 Series","Standard_D2pds_v5","2" -"Dpdsv5 Series","Standard_D32pds_v5","32" -"Dpdsv5 Series","Standard_D48pds_v5","48" -"Dpdsv5 Series","Standard_D4pds_v5","4" -"Dpdsv5 Series","Standard_D64pds_v5","64" -"Dpdsv5 Series","Standard_D8pds_v5","8" -"Dpldsv5 Series","Standard_D16plds_v5","16" -"Dpldsv5 Series","Standard_D2plds_v5","2" -"Dpldsv5 Series","Standard_D32plds_v5","32" -"Dpldsv5 Series","Standard_D48plds_v5","48" -"Dpldsv5 Series","Standard_D4plds_v5","4" -"Dpldsv5 Series","Standard_D64plds_v5","64" -"Dpldsv5 Series","Standard_D8plds_v5","8" -"Dplsv5 Series","Standard_D16pls_v5","16" -"Dplsv5 Series","Standard_D2pls_v5","2" -"Dplsv5 Series","Standard_D32pls_v5","32" -"Dplsv5 Series","Standard_D48pls_v5","48" -"Dplsv5 Series","Standard_D4pls_v5","4" -"Dplsv5 Series","Standard_D64pls_v5","64" -"Dplsv5 Series","Standard_D8pls_v5","8" -"Dpsv5 Series","Standard_D16ps_v5","16" -"Dpsv5 Series","Standard_D2ps_v5","2" -"Dpsv5 Series","Standard_D32ps_v5","32" -"Dpsv5 Series","Standard_D48ps_v5","48" -"Dpsv5 Series","Standard_D4ps_v5","4" -"Dpsv5 Series","Standard_D64ps_v5","64" -"Dpsv5 Series","Standard_D8ps_v5","8" -"Dsv4 Series","Standard_D16s_v4","16" -"Dsv4 Series","Standard_D2s_v4","2" -"Dsv4 Series","Standard_D32s_v4","32" -"Dsv4 Series","Standard_D48s_v4","48" -"Dsv4 Series","Standard_D4s_v4","4" -"Dsv4 Series","Standard_D64s_v4","64" -"Dsv4 Series","Standard_D8s_v4","8" -"Dsv5 Series","Standard_D16s_v5","16" -"Dsv5 Series","Standard_D2s_v5","2" -"Dsv5 Series","Standard_D32s_v5","32" -"Dsv5 Series","Standard_D48s_v5","48" -"Dsv5 Series","Standard_D4s_v5","4" -"Dsv5 Series","Standard_D64s_v5","64" -"Dsv5 Series","Standard_D8s_v5","8" -"Dsv5 Series","Standard_D96s_v5","96" -"Dsv5 Series DedicatedHost","dsv5_type1","107" -"Dv4 Series","Standard_D16_v4","16" -"Dv4 Series","Standard_D2_v4","2" -"Dv4 Series","Standard_D32_v4","32" -"Dv4 Series","Standard_D48_v4","48" -"Dv4 Series","Standard_D4_v4","4" -"Dv4 Series","Standard_D64_v4","64" -"Dv4 Series","Standard_D8_v4","8" -"Dv5 Series","Standard_D16_v5","16" -"Dv5 Series","Standard_D2_v5","2" -"Dv5 Series","Standard_D32_v5","32" -"Dv5 Series","Standard_D48_v5","48" -"Dv5 Series","Standard_D4_v5","4" -"Dv5 Series","Standard_D64_v5","64" -"Dv5 Series","Standard_D8_v5","8" -"Dv5 Series","Standard_D96_v5","96" -"ECadsv5-series DedicatedHost","ecadsv5 type 1","112" -"ECadsv5-series Linux","Standard_EC16ads_v5","16" -"ECadsv5-series Linux","Standard_EC20ads_v5","20" -"ECadsv5-series Linux","Standard_EC2ads_v5","2" -"ECadsv5-series Linux","Standard_EC32ads_v5","32" -"ECadsv5-series Linux","Standard_EC48ads_v5","48" -"ECadsv5-series Linux","Standard_EC4ads_v5","4" -"ECadsv5-series Linux","Standard_EC64ads_v5","64" -"ECadsv5-series Linux","Standard_EC8ads_v5","8" -"ECadsv5-series Linux","Standard_EC96ads_v5","96" -"ECadsv5-series Linux","Standard_EC96iads_v5","105.6" -"ECasv5-series DedicatedHost","ecasv5 type 1","112" -"ECasv5-series Linux","Standard_EC16as_v5","16" -"ECasv5-series Linux","Standard_EC20as_v5","20" -"ECasv5-series Linux","Standard_EC2as_v5","2" -"ECasv5-series Linux","Standard_EC32as_v5","32" -"ECasv5-series Linux","Standard_EC48as_v5","48" -"ECasv5-series Linux","Standard_EC4as_v5","4" -"ECasv5-series Linux","Standard_EC64as_v5","64" -"ECasv5-series Linux","Standard_EC8as_v5","8" -"ECasv5-series Linux","Standard_EC96as_v5","96" -"ECasv5-series Linux","Standard_EC96ias_v5","105.6" -"ESv3 Series","Standard_E16-4s_v3","16" -"ESv3 Series","Standard_E16-8s_v3","16" -"ESv3 Series","Standard_E16s_v3","16" -"ESv3 Series","Standard_E20s_v3","20" -"ESv3 Series","Standard_E2s_v3","2" -"ESv3 Series","Standard_E32-16s_v3","32" -"ESv3 Series","Standard_E32-8s_v3","32" -"ESv3 Series","Standard_E32s_v3","32" -"ESv3 Series","Standard_E4-2s_v3","4" -"ESv3 Series","Standard_E48s_v3","48" -"ESv3 Series","Standard_E4s_v3","4" -"ESv3 Series","Standard_E64-16s_v3","57.6" -"ESv3 Series","Standard_E64-32s_v3","57.6" -"ESv3 Series","Standard_E64s_v3","57.6" -"ESv3 Series","Standard_E8-2s_v3","8" -"ESv3 Series","Standard_E8-4s_v3","8" -"ESv3 Series","Standard_E8s_v3","8" -"ESv3 Series Dedicated Host","esv3_type1","68" -"ESv3 Series Dedicated Host","esv3_type2","62" -"ESv3 Series Dedicated Host","esv3_type3","68.82" -"ESv3 Series Dedicated Host","esv3_type4","93" -"ESv4 Series Dedicated Host","esv4_type1","64" -"ESv4 Series Dedicated Host","esv4_type2","83.84" -"ESv4 Series Dedicated Host","standard_e64is_v4_special","64" -"Eadsv5 Series","Standard_E112iads_v5","123.2" -"Eadsv5 Series","Standard_E16-4ads_v5","16" -"Eadsv5 Series","Standard_E16-8ads_v5","16" -"Eadsv5 Series","Standard_E16ads_v5","16" -"Eadsv5 Series","Standard_E20ads_v5","20" -"Eadsv5 Series","Standard_E2ads_v5","2" -"Eadsv5 Series","Standard_E32-16ads_v5","32" -"Eadsv5 Series","Standard_E32-8ads_v5","32" -"Eadsv5 Series","Standard_E32ads_v5","32" -"Eadsv5 Series","Standard_E4-2ads_v5","4" -"Eadsv5 Series","Standard_E48ads_v5","48" -"Eadsv5 Series","Standard_E4ads_v5","4" -"Eadsv5 Series","Standard_E64-16ads_v5","64" -"Eadsv5 Series","Standard_E64-32ads_v5","64" -"Eadsv5 Series","Standard_E64ads_v5","64" -"Eadsv5 Series","Standard_E8-2ads_v5","8" -"Eadsv5 Series","Standard_E8-4ads_v5","8" -"Eadsv5 Series","Standard_E8ads_v5","8" -"Eadsv5 Series","Standard_E96-24ads_v5","96" -"Eadsv5 Series","Standard_E96-48ads_v5","96" -"Eadsv5 Series","Standard_E96ads_v5","96" -"Eadsv5 Series DedicatedHost","eadsv5_type1","112" -"Easv4 Series","Standard_E16-4as_v4","16" -"Easv4 Series","Standard_E16-8as_v4","16" -"Easv4 Series","Standard_E16as_v4","16" -"Easv4 Series","Standard_E20as_v4","20" -"Easv4 Series","Standard_E2as_v4","2" -"Easv4 Series","Standard_E32-16as_v4","32" -"Easv4 Series","Standard_E32-8as_v4","32" -"Easv4 Series","Standard_E32as_v4","32" -"Easv4 Series","Standard_E4-2as_v4","4" -"Easv4 Series","Standard_E48as_v4","48" -"Easv4 Series","Standard_E4as_v4","4" -"Easv4 Series","Standard_E64-16as_v4","64" -"Easv4 Series","Standard_E64-32as_v4","64" -"Easv4 Series","Standard_E64as_v4","64" -"Easv4 Series","Standard_E8-2as_v4","8" -"Easv4 Series","Standard_E8-4as_v4","8" -"Easv4 Series","Standard_E8as_v4","8" -"Easv4 Series","Standard_E96-24as_v4","96" -"Easv4 Series","Standard_E96-48as_v4","96" -"Easv4 Series","Standard_E96as_v4","96" -"Easv4 Series","Standard_E96ias_v4","96" -"Easv4 Series Dedicated Host","easv4_type1","96" -"Easv4 Series Dedicated Host","easv4_type2","112" -"Easv5 Series","Standard_E112ias_v5","123.2" -"Easv5 Series","Standard_E16-4as_v5","16" -"Easv5 Series","Standard_E16-8as_v5","16" -"Easv5 Series","Standard_E16as_v5","16" -"Easv5 Series","Standard_E20as_v5","20" -"Easv5 Series","Standard_E2as_v5","2" -"Easv5 Series","Standard_E32-16as_v5","32" -"Easv5 Series","Standard_E32-8as_v5","32" -"Easv5 Series","Standard_E32as_v5","32" -"Easv5 Series","Standard_E4-2as_v5","4" -"Easv5 Series","Standard_E48as_v5","48" -"Easv5 Series","Standard_E4as_v5","4" -"Easv5 Series","Standard_E64-16as_v5","64" -"Easv5 Series","Standard_E64-32as_v5","64" -"Easv5 Series","Standard_E64as_v5","64" -"Easv5 Series","Standard_E8-2as_v5","8" -"Easv5 Series","Standard_E8-4as_v5","8" -"Easv5 Series","Standard_E8as_v5","8" -"Easv5 Series","Standard_E96-24as_v5","96" -"Easv5 Series","Standard_E96-48as_v5","96" -"Easv5 Series","Standard_E96as_v5","96" -"Easv5 Series DedicatedHost","easv5_type1","112" -"Eav4 Series","Standard_E16a_v4","16" -"Eav4 Series","Standard_E20a_v4","20" -"Eav4 Series","Standard_E2a_v4","2" -"Eav4 Series","Standard_E32a_v4","32" -"Eav4 Series","Standard_E48a_v4","48" -"Eav4 Series","Standard_E4a_v4","4" -"Eav4 Series","Standard_E64a_v4","64" -"Eav4 Series","Standard_E8a_v4","8" -"Eav4 Series","Standard_E96a_v4","96" -"Ebdsv5 Series","Standard_E112ibds_v5","123.2" -"Ebdsv5 Series","Standard_E16bds_v5","16" -"Ebdsv5 Series","Standard_E2bds_v5","2" -"Ebdsv5 Series","Standard_E32bds_v5","32" -"Ebdsv5 Series","Standard_E48bds_v5","48" -"Ebdsv5 Series","Standard_E4bds_v5","4" -"Ebdsv5 Series","Standard_E64bds_v5","64" -"Ebdsv5 Series","Standard_E8bds_v5","8" -"Ebdsv5 Series","Standard_E96bds_v5","96" -"Ebdsv5 Series Dedicated Host","ebdsv5-type1","112" -"Ebsv5 Series","Standard_E112ibs_v5","123.2" -"Ebsv5 Series","Standard_E16bs_v5","16" -"Ebsv5 Series","Standard_E2bs_v5","2" -"Ebsv5 Series","Standard_E32bs_v5","32" -"Ebsv5 Series","Standard_E48bs_v5","48" -"Ebsv5 Series","Standard_E4bs_v5","4" -"Ebsv5 Series","Standard_E64bs_v5","64" -"Ebsv5 Series","Standard_E8bs_v5","8" -"Ebsv5 Series","Standard_E96bs_v5","96" -"Ebsv5 Series Dedicated Host","ebsv5-type1","112" -"Edsv4 Series","Standard_E16-4ds_v4","16" -"Edsv4 Series","Standard_E16-8ds_v4","16" -"Edsv4 Series","Standard_E16ds_v4","16" -"Edsv4 Series","Standard_E20ds_v4","20" -"Edsv4 Series","Standard_E2ds_v4","2" -"Edsv4 Series","Standard_E32-16ds_v4","32" -"Edsv4 Series","Standard_E32-8ds_v4","32" -"Edsv4 Series","Standard_E32ds_v4","32" -"Edsv4 Series","Standard_E4-2ds_v4","4" -"Edsv4 Series","Standard_E48ds_v4","48" -"Edsv4 Series","Standard_E4ds_v4","4" -"Edsv4 Series","Standard_E64-16ds_v4","64" -"Edsv4 Series","Standard_E64-32ds_v4","64" -"Edsv4 Series","Standard_E64ds_v4","64" -"Edsv4 Series","Standard_E8-2ds_v4","8" -"Edsv4 Series","Standard_E8-4ds_v4","8" -"Edsv4 Series","Standard_E8ds_v4","8" -"Edsv4 Series Dedicated Host","edsv4_type 1","68" -"Edsv4 Series Dedicated Host","edsv4_type2","80.92" -"Edsv4 Series Isolated","Standard_E80ids_v4","80" -"Edsv5 Series","Standard_E16-4ds_v5","16" -"Edsv5 Series","Standard_E16-8ds_v5","16" -"Edsv5 Series","Standard_E16ds_v5","16" -"Edsv5 Series","Standard_E20ds_v5","20" -"Edsv5 Series","Standard_E2ds_v5","2" -"Edsv5 Series","Standard_E32-16ds_v5","32" -"Edsv5 Series","Standard_E32-8ds_v5","32" -"Edsv5 Series","Standard_E32ds_v5","32" -"Edsv5 Series","Standard_E4-2ds_v5","4" -"Edsv5 Series","Standard_E48ds_v5","48" -"Edsv5 Series","Standard_E4ds_v5","4" -"Edsv5 Series","Standard_E64-16ds_v5","64" -"Edsv5 Series","Standard_E64-32ds_v5","64" -"Edsv5 Series","Standard_E64ds_v5","64" -"Edsv5 Series","Standard_E8-2ds_v5","8" -"Edsv5 Series","Standard_E8-4ds_v5","8" -"Edsv5 Series","Standard_E8ds_v5","8" -"Edsv5 Series","Standard_E96-24ds_v5","96" -"Edsv5 Series","Standard_E96-48ds_v5","96" -"Edsv5 Series","Standard_E96ds_v5","96" -"Edsv5 Series DedicatedHost","edsv5_type1","107" -"Edsv5 Series Isolated","Standard_E104ids_v5","104" -"Edv4 Series","Standard_E16d_v4","16" -"Edv4 Series","Standard_E20d_v4","20" -"Edv4 Series","Standard_E2d_v4","2" -"Edv4 Series","Standard_E32d_v4","32" -"Edv4 Series","Standard_E48d_v4","48" -"Edv4 Series","Standard_E4d_v4","4" -"Edv4 Series","Standard_E64d_v4","64" -"Edv4 Series","Standard_E8d_v4","8" -"Edv5 Series","Standard_E104id_v5","114.4" -"Edv5 Series","Standard_E16d_v5","16" -"Edv5 Series","Standard_E20d_v5","20" -"Edv5 Series","Standard_E2d_v5","2" -"Edv5 Series","Standard_E32d_v5","32" -"Edv5 Series","Standard_E48d_v5","48" -"Edv5 Series","Standard_E4d_v5","4" -"Edv5 Series","Standard_E64d_v5","64" -"Edv5 Series","Standard_E8d_v5","8" -"Edv5 Series","Standard_E96d_v5","96" -"Epdsv5 Series","Standard_E16pds_v5","16" -"Epdsv5 Series","Standard_E20pds_v5","20" -"Epdsv5 Series","Standard_E2pds_v5","2" -"Epdsv5 Series","Standard_E32pds_v5","32" -"Epdsv5 Series","Standard_E4pds_v5","4" -"Epdsv5 Series","Standard_E8pds_v5","8" -"Epsv5 Series","Standard_E16ps_v5","16" -"Epsv5 Series","Standard_E20ps_v5","20" -"Epsv5 Series","Standard_E2ps_v5","2" -"Epsv5 Series","Standard_E32ps_v5","32" -"Epsv5 Series","Standard_E4ps_v5","4" -"Epsv5 Series","Standard_E8ps_v5","8" -"Esv4 Series","Standard_E16-4s_v4","16" -"Esv4 Series","Standard_E16-8s_v4","16" -"Esv4 Series","Standard_E16s_v4","16" -"Esv4 Series","Standard_E20s_v4","20" -"Esv4 Series","Standard_E2s_v4","2" -"Esv4 Series","Standard_E32-16s_v4","32" -"Esv4 Series","Standard_E32-8s_v4","32" -"Esv4 Series","Standard_E32s_v4","32" -"Esv4 Series","Standard_E4-2s_v4","4" -"Esv4 Series","Standard_E48s_v4","48" -"Esv4 Series","Standard_E4s_v4","4" -"Esv4 Series","Standard_E64-16s_v4","64" -"Esv4 Series","Standard_E64-32s_v4","64" -"Esv4 Series","Standard_E64s_v4","64" -"Esv4 Series","Standard_E8-2s_v4","8" -"Esv4 Series","Standard_E8-4s_v4","8" -"Esv4 Series","Standard_E8s_v4","8" -"Esv4 Series Isolated","Standard_E80is_v4","80" -"Esv5 Series","Standard_E16-4s_v5","16" -"Esv5 Series","Standard_E16-8s_v5","16" -"Esv5 Series","Standard_E16s_v5","16" -"Esv5 Series","Standard_E20s_v5","20" -"Esv5 Series","Standard_E2s_v5","2" -"Esv5 Series","Standard_E32-16s_v5","32" -"Esv5 Series","Standard_E32-8s_v5","32" -"Esv5 Series","Standard_E32s_v5","32" -"Esv5 Series","Standard_E4-2s_v5","4" -"Esv5 Series","Standard_E48s_v5","48" -"Esv5 Series","Standard_E4s_v5","4" -"Esv5 Series","Standard_E64-16s_v5","64" -"Esv5 Series","Standard_E64-32s_v5","64" -"Esv5 Series","Standard_E64s_v5","64" -"Esv5 Series","Standard_E8-2s_v5","8" -"Esv5 Series","Standard_E8-4s_v5","8" -"Esv5 Series","Standard_E8s_v5","8" -"Esv5 Series","Standard_E96-24s_v5","96" -"Esv5 Series","Standard_E96-48s_v5","96" -"Esv5 Series","Standard_E96s_v5","96" -"Esv5 Series DedicatedHost","esv5_type1","107" -"Esv5 Series Isolated","Standard_E104is_v5","104" -"Ev3 Series","Standard_E20_v3","20" -"Ev3 Series","Standard_E2_v3","2" -"Ev3 Series","Standard_E32_v3","32" -"Ev4 Series","Standard_E16_v4","16" -"Ev4 Series","Standard_E20_v4","20" -"Ev4 Series","Standard_E2_v4","2" -"Ev4 Series","Standard_E32_v4","32" -"Ev4 Series","Standard_E48_v4","48" -"Ev4 Series","Standard_E4_v4","4" -"Ev4 Series","Standard_E64_v4","64" -"Ev4 Series","Standard_E8_v4","8" -"Ev5 Series","Standard_E104i_v5","114.4" -"Ev5 Series","Standard_E16_v5","16" -"Ev5 Series","Standard_E20_v5","20" -"Ev5 Series","Standard_E2_v5","2" -"Ev5 Series","Standard_E32_v5","32" -"Ev5 Series","Standard_E48_v5","48" -"Ev5 Series","Standard_E4_v5","4" -"Ev5 Series","Standard_E64_v5","64" -"Ev5 Series","Standard_E8_v5","8" -"Ev5 Series","Standard_E96_v5","96" -"FSv2 Series","Standard_F16s_v2","16" -"FSv2 Series","Standard_F2s_v2","2" -"FSv2 Series","Standard_F32s_v2","32" -"FSv2 Series","Standard_F48s_v2","48" -"FSv2 Series","Standard_F4s_v2","4" -"FSv2 Series","Standard_F64s_v2","64" -"FSv2 Series","Standard_F72s_v2","72" -"FSv2 Series","Standard_F8s_v2","8" -"FSv2 Series Dedicated Host","fsv2 type3","93.6" -"FSv2 Series Dedicated Host","fsv2_type2","80" -"FSv2 Series Dedicated Host","fsv2_type4","106.4" -"FX Series Dedicated Host","fxmds type1","56" -"FX Series Linux","Standard_FX12mds","12" -"FX Series Linux","Standard_FX24mds","24" -"FX Series Linux","Standard_FX36mds","36" -"FX Series Linux","Standard_FX48mds","48" -"FX Series Linux","Standard_FX4mds","4" -"HBSv2 Series Low Latency","Standard_HB120-16rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-32rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-64rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-96rs_v2","120" -"HBrsv3 Series Low Latency","Standard_HB120-16rs_v3","120" -"HBrsv3 Series Low Latency","Standard_HB120-32rs_v3","120" -"HBrsv3 Series Low Latency","Standard_HB120-64rs_v3","120" -"HBrsv3 Series Low Latency","Standard_HB120-96rs_v3","120" -"HBrsv3 Series Low Latency","Standard_HB120rs_v3","120" -"HCS Series","Standard_HC44-16rs","44" -"HCS Series","Standard_HC44-32rs","44" -"HCS Series","Standard_HC44rs","44" -"LSv2 Series Dedicated Host","lsv2_type1","80" -"Lasv3 Series DedicatedHost","lasv3_type1","80" -"Lasv3 Series Linux","Standard_L16as_v3","16" -"Lasv3 Series Linux","Standard_L32as_v3","32" -"Lasv3 Series Linux","Standard_L48as_v3","48" -"Lasv3 Series Linux","Standard_L64as_v3","64" -"Lasv3 Series Linux","Standard_L80as_v3","80" -"Lasv3 Series Linux","Standard_L8as_v3","8" -"Lsv3 Series DedicatedHost","lsv3_type1","80" -"Lsv3 Series Linux","Standard_L16s_v3","16" -"Lsv3 Series Linux","Standard_L32s_v3","32" -"Lsv3 Series Linux","Standard_L48s_v3","48" -"Lsv3 Series Linux","Standard_L64s_v3","64" -"Lsv3 Series Linux","Standard_L80s_v3","80" -"Lsv3 Series Linux","Standard_L8s_v3","8" +"DSv2 Series High Memory","Standard_DS11-1_v2","1" +"DSv2 Series High Memory","Standard_DS11_v2","1" +"DSv2 Series High Memory","Standard_DS12-1_v2","2" +"DSv2 Series High Memory","Standard_DS12-2_v2","2" +"DSv2 Series High Memory","Standard_DS12_v2","2" +"DSv2 Series High Memory","Standard_DS13-2_v2","4" +"DSv2 Series High Memory","Standard_DS13-4_v2","4" +"DSv2 Series High Memory","Standard_DS13_v2","4" +"DSv2 Series High Memory","Standard_DS14-4_v2","8" +"DSv2 Series High Memory","Standard_DS14-8_v2","8" +"DSv2 Series High Memory","Standard_DS14_v2","8" +"DSv2 Series High Memory","Standard_DS15_v2","10" +"DSv3 Series Dedicated Host","dsv3_type1","1" +"DSv3 Series Dedicated Host","dsv3_type2","1.1263" +"DSv3 Series Dedicated Host","dsv3_type3","1.25" +"DSv3 Series Dedicated Host","dsv3_type4","1.56" +"DSv4 Series Dedicated Host","dsv4_type1","1" +"DSv4 Series Dedicated Host","dsv4_type2","1.2" +"Dadsv5 Series","Standard_D16ads_v5","8" +"Dadsv5 Series","Standard_D2ads_v5","1" +"Dadsv5 Series","Standard_D32ads_v5","16" +"Dadsv5 Series","Standard_D48ads_v5","24" +"Dadsv5 Series","Standard_D4ads_v5","2" +"Dadsv5 Series","Standard_D64ads_v5","32" +"Dadsv5 Series","Standard_D8ads_v5","4" +"Dadsv5 Series","Standard_D96ads_v5","48" +"Dadsv5 Series DedicatedHost","dadsv5_type1","1" +"Dasv4 Series","Standard_D16as_v4","8" +"Dasv4 Series","Standard_D2as_v4","1" +"Dasv4 Series","Standard_D32as_v4","16" +"Dasv4 Series","Standard_D48as_v4","24" +"Dasv4 Series","Standard_D4as_v4","2" +"Dasv4 Series","Standard_D64as_v4","32" +"Dasv4 Series","Standard_D8as_v4","4" +"Dasv4 Series","Standard_D96as_v4","48" +"Dasv4 Series Dedicated Host","dasv4_type1","1" +"Dasv4 Series Dedicated Host","dasv4_type2","1.04" +"Dasv5 Series","Standard_D16as_v5","8" +"Dasv5 Series","Standard_D2as_v5","1" +"Dasv5 Series","Standard_D32as_v5","16" +"Dasv5 Series","Standard_D48as_v5","24" +"Dasv5 Series","Standard_D4as_v5","2" +"Dasv5 Series","Standard_D64as_v5","32" +"Dasv5 Series","Standard_D8as_v5","4" +"Dasv5 Series","Standard_D96as_v5","48" +"Dasv5 Series DedicatedHost","dasv5_type1","1" +"Dav4 Series","Standard_D16a_v4","8" +"Dav4 Series","Standard_D2a_v4","1" +"Dav4 Series","Standard_D32a_v4","16" +"Dav4 Series","Standard_D48a_v4","24" +"Dav4 Series","Standard_D4a_v4","2" +"Dav4 Series","Standard_D64a_v4","32" +"Dav4 Series","Standard_D8a_v4","4" +"Dav4 Series","Standard_D96a_v4","48" +"Ddsv4 Series","Standard_D16ds_v4","8" +"Ddsv4 Series","Standard_D2ds_v4","1" +"Ddsv4 Series","Standard_D32ds_v4","16" +"Ddsv4 Series","Standard_D48ds_v4","24" +"Ddsv4 Series","Standard_D4ds_v4","2" +"Ddsv4 Series","Standard_D64ds_v4","32" +"Ddsv4 Series","Standard_D8ds_v4","4" +"Ddsv4 Series Dedicated Host","ddsv4_type 1","1" +"Ddsv4 Series Dedicated Host","ddsv4_type2","1.19" +"Ddsv5 Series","Standard_D16ds_v5","8" +"Ddsv5 Series","Standard_D2ds_v5","1" +"Ddsv5 Series","Standard_D32ds_v5","16" +"Ddsv5 Series","Standard_D48ds_v5","24" +"Ddsv5 Series","Standard_D4ds_v5","2" +"Ddsv5 Series","Standard_D64ds_v5","32" +"Ddsv5 Series","Standard_D8ds_v5","4" +"Ddsv5 Series","Standard_D96ds_v5","48" +"Ddsv5 Series DedicatedHost","ddsv5_type1","1" +"Ddv4 Series","Standard_D16d_v4","8" +"Ddv4 Series","Standard_D2d_v4","1" +"Ddv4 Series","Standard_D32d_v4","16" +"Ddv4 Series","Standard_D48d_v4","24" +"Ddv4 Series","Standard_D4d_v4","2" +"Ddv4 Series","Standard_D64d_v4","32" +"Ddv4 Series","Standard_D8d_v4","4" +"Ddv5 Series","Standard_D16d_v5","8" +"Ddv5 Series","Standard_D2d_v5","1" +"Ddv5 Series","Standard_D32d_v5","16" +"Ddv5 Series","Standard_D48d_v5","24" +"Ddv5 Series","Standard_D4d_v5","2" +"Ddv5 Series","Standard_D64d_v5","32" +"Ddv5 Series","Standard_D8d_v5","4" +"Ddv5 Series","Standard_D96d_v5","48" +"Dldsv5 Series","Standard_D16lds_v5","8" +"Dldsv5 Series","Standard_D2lds_v5","1" +"Dldsv5 Series","Standard_D32lds_v5","16" +"Dldsv5 Series","Standard_D48lds_v5","24" +"Dldsv5 Series","Standard_D4lds_v5","2" +"Dldsv5 Series","Standard_D64lds_v5","32" +"Dldsv5 Series","Standard_D8lds_v5","4" +"Dldsv5 Series","Standard_D96lds_v5","48" +"Dlsv5 Series","Standard_D16ls_v5","8" +"Dlsv5 Series","Standard_D2ls_v5","1" +"Dlsv5 Series","Standard_D32ls_v5","16" +"Dlsv5 Series","Standard_D48ls_v5","24" +"Dlsv5 Series","Standard_D4ls_v5","2" +"Dlsv5 Series","Standard_D64ls_v5","32" +"Dlsv5 Series","Standard_D8ls_v5","4" +"Dlsv5 Series","Standard_D96ls_v5","48" +"Dpdsv5 Series","Standard_D16pds_v5","8" +"Dpdsv5 Series","Standard_D2pds_v5","1" +"Dpdsv5 Series","Standard_D32pds_v5","16" +"Dpdsv5 Series","Standard_D48pds_v5","24" +"Dpdsv5 Series","Standard_D4pds_v5","2" +"Dpdsv5 Series","Standard_D64pds_v5","32" +"Dpdsv5 Series","Standard_D8pds_v5","4" +"Dpldsv5 Series","Standard_D16plds_v5","8" +"Dpldsv5 Series","Standard_D2plds_v5","1" +"Dpldsv5 Series","Standard_D32plds_v5","16" +"Dpldsv5 Series","Standard_D48plds_v5","24" +"Dpldsv5 Series","Standard_D4plds_v5","2" +"Dpldsv5 Series","Standard_D64plds_v5","32" +"Dpldsv5 Series","Standard_D8plds_v5","4" +"Dplsv5 Series","Standard_D16pls_v5","8" +"Dplsv5 Series","Standard_D2pls_v5","1" +"Dplsv5 Series","Standard_D32pls_v5","16" +"Dplsv5 Series","Standard_D48pls_v5","24" +"Dplsv5 Series","Standard_D4pls_v5","2" +"Dplsv5 Series","Standard_D64pls_v5","32" +"Dplsv5 Series","Standard_D8pls_v5","4" +"Dpsv5 Series","Standard_D16ps_v5","8" +"Dpsv5 Series","Standard_D2ps_v5","1" +"Dpsv5 Series","Standard_D32ps_v5","16" +"Dpsv5 Series","Standard_D48ps_v5","24" +"Dpsv5 Series","Standard_D4ps_v5","2" +"Dpsv5 Series","Standard_D64ps_v5","32" +"Dpsv5 Series","Standard_D8ps_v5","4" +"Dsv4 Series","Standard_D16s_v4","8" +"Dsv4 Series","Standard_D2s_v4","1" +"Dsv4 Series","Standard_D32s_v4","16" +"Dsv4 Series","Standard_D48s_v4","24" +"Dsv4 Series","Standard_D4s_v4","2" +"Dsv4 Series","Standard_D64s_v4","32" +"Dsv4 Series","Standard_D8s_v4","4" +"Dsv5 Series","Standard_D16s_v5","8" +"Dsv5 Series","Standard_D2s_v5","1" +"Dsv5 Series","Standard_D32s_v5","16" +"Dsv5 Series","Standard_D48s_v5","24" +"Dsv5 Series","Standard_D4s_v5","2" +"Dsv5 Series","Standard_D64s_v5","32" +"Dsv5 Series","Standard_D8s_v5","4" +"Dsv5 Series","Standard_D96s_v5","48" +"Dsv5 Series DedicatedHost","dsv5_type1","1" +"Dv4 Series","Standard_D16_v4","8" +"Dv4 Series","Standard_D2_v4","1" +"Dv4 Series","Standard_D32_v4","16" +"Dv4 Series","Standard_D48_v4","24" +"Dv4 Series","Standard_D4_v4","2" +"Dv4 Series","Standard_D64_v4","32" +"Dv4 Series","Standard_D8_v4","4" +"Dv5 Series","Standard_D16_v5","8" +"Dv5 Series","Standard_D2_v5","1" +"Dv5 Series","Standard_D32_v5","16" +"Dv5 Series","Standard_D48_v5","24" +"Dv5 Series","Standard_D4_v5","2" +"Dv5 Series","Standard_D64_v5","32" +"Dv5 Series","Standard_D8_v5","4" +"Dv5 Series","Standard_D96_v5","48" +"ECadsv5-series DedicatedHost","ecadsv5 type 1","1" +"ECadsv5-series Linux","Standard_EC16ads_v5","8" +"ECadsv5-series Linux","Standard_EC20ads_v5","10" +"ECadsv5-series Linux","Standard_EC2ads_v5","1" +"ECadsv5-series Linux","Standard_EC32ads_v5","16" +"ECadsv5-series Linux","Standard_EC48ads_v5","24" +"ECadsv5-series Linux","Standard_EC4ads_v5","2" +"ECadsv5-series Linux","Standard_EC64ads_v5","32" +"ECadsv5-series Linux","Standard_EC8ads_v5","4" +"ECadsv5-series Linux","Standard_EC96ads_v5","48" +"ECadsv5-series Linux","Standard_EC96iads_v5","52.8" +"ECasv5-series DedicatedHost","ecasv5 type 1","1" +"ECasv5-series Linux","Standard_EC16as_v5","8" +"ECasv5-series Linux","Standard_EC20as_v5","10" +"ECasv5-series Linux","Standard_EC2as_v5","1" +"ECasv5-series Linux","Standard_EC32as_v5","16" +"ECasv5-series Linux","Standard_EC48as_v5","24" +"ECasv5-series Linux","Standard_EC4as_v5","2" +"ECasv5-series Linux","Standard_EC64as_v5","32" +"ECasv5-series Linux","Standard_EC8as_v5","4" +"ECasv5-series Linux","Standard_EC96as_v5","48" +"ECasv5-series Linux","Standard_EC96ias_v5","52.8" +"ESv3 Series","Standard_E16-4s_v3","8" +"ESv3 Series","Standard_E16-8s_v3","8" +"ESv3 Series","Standard_E16s_v3","8" +"ESv3 Series","Standard_E20s_v3","10" +"ESv3 Series","Standard_E2s_v3","1" +"ESv3 Series","Standard_E32-16s_v3","16" +"ESv3 Series","Standard_E32-8s_v3","16" +"ESv3 Series","Standard_E32s_v3","16" +"ESv3 Series","Standard_E4-2s_v3","2" +"ESv3 Series","Standard_E48s_v3","24" +"ESv3 Series","Standard_E4s_v3","2" +"ESv3 Series","Standard_E64-16s_v3","28.8" +"ESv3 Series","Standard_E64-32s_v3","28.8" +"ESv3 Series","Standard_E64s_v3","28.8" +"ESv3 Series","Standard_E8-2s_v3","4" +"ESv3 Series","Standard_E8-4s_v3","4" +"ESv3 Series","Standard_E8s_v3","4" +"ESv3 Series Dedicated Host","esv3_type1","1.0968" +"ESv3 Series Dedicated Host","esv3_type2","1" +"ESv3 Series Dedicated Host","esv3_type3","1.11" +"ESv3 Series Dedicated Host","esv3_type4","1.5" +"ESv4 Series Dedicated Host","esv4_type1","1" +"ESv4 Series Dedicated Host","esv4_type2","1.31" +"ESv4 Series Dedicated Host","standard_e64is_v4_special","1" +"Eadsv5 Series","Standard_E112iads_v5","61.6" +"Eadsv5 Series","Standard_E16-4ads_v5","8" +"Eadsv5 Series","Standard_E16-8ads_v5","8" +"Eadsv5 Series","Standard_E16ads_v5","8" +"Eadsv5 Series","Standard_E20ads_v5","10" +"Eadsv5 Series","Standard_E2ads_v5","1" +"Eadsv5 Series","Standard_E32-16ads_v5","16" +"Eadsv5 Series","Standard_E32-8ads_v5","16" +"Eadsv5 Series","Standard_E32ads_v5","16" +"Eadsv5 Series","Standard_E4-2ads_v5","2" +"Eadsv5 Series","Standard_E48ads_v5","24" +"Eadsv5 Series","Standard_E4ads_v5","2" +"Eadsv5 Series","Standard_E64-16ads_v5","32" +"Eadsv5 Series","Standard_E64-32ads_v5","32" +"Eadsv5 Series","Standard_E64ads_v5","32" +"Eadsv5 Series","Standard_E8-2ads_v5","4" +"Eadsv5 Series","Standard_E8-4ads_v5","4" +"Eadsv5 Series","Standard_E8ads_v5","4" +"Eadsv5 Series","Standard_E96-24ads_v5","48" +"Eadsv5 Series","Standard_E96-48ads_v5","48" +"Eadsv5 Series","Standard_E96ads_v5","48" +"Eadsv5 Series DedicatedHost","eadsv5_type1","1" +"Easv4 Series","Standard_E16-4as_v4","8" +"Easv4 Series","Standard_E16-8as_v4","8" +"Easv4 Series","Standard_E16as_v4","8" +"Easv4 Series","Standard_E20as_v4","10" +"Easv4 Series","Standard_E2as_v4","1" +"Easv4 Series","Standard_E32-16as_v4","16" +"Easv4 Series","Standard_E32-8as_v4","16" +"Easv4 Series","Standard_E32as_v4","16" +"Easv4 Series","Standard_E4-2as_v4","2" +"Easv4 Series","Standard_E48as_v4","24" +"Easv4 Series","Standard_E4as_v4","2" +"Easv4 Series","Standard_E64-16as_v4","32" +"Easv4 Series","Standard_E64-32as_v4","32" +"Easv4 Series","Standard_E64as_v4","32" +"Easv4 Series","Standard_E8-2as_v4","4" +"Easv4 Series","Standard_E8-4as_v4","4" +"Easv4 Series","Standard_E8as_v4","4" +"Easv4 Series","Standard_E96-24as_v4","48" +"Easv4 Series","Standard_E96-48as_v4","48" +"Easv4 Series","Standard_E96as_v4","48" +"Easv4 Series","Standard_E96ias_v4","48" +"Easv4 Series Dedicated Host","easv4_type1","1" +"Easv4 Series Dedicated Host","easv4_type2","1.1667" +"Easv5 Series","Standard_E112ias_v5","61.6" +"Easv5 Series","Standard_E16-4as_v5","8" +"Easv5 Series","Standard_E16-8as_v5","8" +"Easv5 Series","Standard_E16as_v5","8" +"Easv5 Series","Standard_E20as_v5","10" +"Easv5 Series","Standard_E2as_v5","1" +"Easv5 Series","Standard_E32-16as_v5","16" +"Easv5 Series","Standard_E32-8as_v5","16" +"Easv5 Series","Standard_E32as_v5","16" +"Easv5 Series","Standard_E4-2as_v5","2" +"Easv5 Series","Standard_E48as_v5","24" +"Easv5 Series","Standard_E4as_v5","2" +"Easv5 Series","Standard_E64-16as_v5","32" +"Easv5 Series","Standard_E64-32as_v5","32" +"Easv5 Series","Standard_E64as_v5","32" +"Easv5 Series","Standard_E8-2as_v5","4" +"Easv5 Series","Standard_E8-4as_v5","4" +"Easv5 Series","Standard_E8as_v5","4" +"Easv5 Series","Standard_E96-24as_v5","48" +"Easv5 Series","Standard_E96-48as_v5","48" +"Easv5 Series","Standard_E96as_v5","48" +"Easv5 Series DedicatedHost","easv5_type1","1" +"Eav4 Series","Standard_E16a_v4","8" +"Eav4 Series","Standard_E20a_v4","10" +"Eav4 Series","Standard_E2a_v4","1" +"Eav4 Series","Standard_E32a_v4","16" +"Eav4 Series","Standard_E48a_v4","24" +"Eav4 Series","Standard_E4a_v4","2" +"Eav4 Series","Standard_E64a_v4","32" +"Eav4 Series","Standard_E8a_v4","4" +"Eav4 Series","Standard_E96a_v4","48" +"Ebdsv5 Series","Standard_E112ibds_v5","61.6" +"Ebdsv5 Series","Standard_E16bds_v5","8" +"Ebdsv5 Series","Standard_E2bds_v5","1" +"Ebdsv5 Series","Standard_E32bds_v5","16" +"Ebdsv5 Series","Standard_E48bds_v5","24" +"Ebdsv5 Series","Standard_E4bds_v5","2" +"Ebdsv5 Series","Standard_E64bds_v5","32" +"Ebdsv5 Series","Standard_E8bds_v5","4" +"Ebdsv5 Series","Standard_E96bds_v5","48" +"Ebdsv5 Series Dedicated Host","ebdsv5-type1","1" +"Ebsv5 Series","Standard_E112ibs_v5","61.6" +"Ebsv5 Series","Standard_E16bs_v5","8" +"Ebsv5 Series","Standard_E2bs_v5","1" +"Ebsv5 Series","Standard_E32bs_v5","16" +"Ebsv5 Series","Standard_E48bs_v5","24" +"Ebsv5 Series","Standard_E4bs_v5","2" +"Ebsv5 Series","Standard_E64bs_v5","32" +"Ebsv5 Series","Standard_E8bs_v5","4" +"Ebsv5 Series","Standard_E96bs_v5","48" +"Ebsv5 Series Dedicated Host","ebsv5-type1","1" +"Edsv4 Series","Standard_E16-4ds_v4","8" +"Edsv4 Series","Standard_E16-8ds_v4","8" +"Edsv4 Series","Standard_E16ds_v4","8" +"Edsv4 Series","Standard_E20ds_v4","10" +"Edsv4 Series","Standard_E2ds_v4","1" +"Edsv4 Series","Standard_E32-16ds_v4","16" +"Edsv4 Series","Standard_E32-8ds_v4","16" +"Edsv4 Series","Standard_E32ds_v4","16" +"Edsv4 Series","Standard_E4-2ds_v4","2" +"Edsv4 Series","Standard_E48ds_v4","24" +"Edsv4 Series","Standard_E4ds_v4","2" +"Edsv4 Series","Standard_E64-16ds_v4","32" +"Edsv4 Series","Standard_E64-32ds_v4","32" +"Edsv4 Series","Standard_E64ds_v4","32" +"Edsv4 Series","Standard_E8-2ds_v4","4" +"Edsv4 Series","Standard_E8-4ds_v4","4" +"Edsv4 Series","Standard_E8ds_v4","4" +"Edsv4 Series Dedicated Host","edsv4_type 1","1" +"Edsv4 Series Dedicated Host","edsv4_type2","1.19" +"Edsv4 Series Isolated","Standard_E80ids_v4","1" +"Edsv5 Series","Standard_E16-4ds_v5","8" +"Edsv5 Series","Standard_E16-8ds_v5","8" +"Edsv5 Series","Standard_E16ds_v5","8" +"Edsv5 Series","Standard_E20ds_v5","10" +"Edsv5 Series","Standard_E2ds_v5","1" +"Edsv5 Series","Standard_E32-16ds_v5","16" +"Edsv5 Series","Standard_E32-8ds_v5","16" +"Edsv5 Series","Standard_E32ds_v5","16" +"Edsv5 Series","Standard_E4-2ds_v5","2" +"Edsv5 Series","Standard_E48ds_v5","24" +"Edsv5 Series","Standard_E4ds_v5","2" +"Edsv5 Series","Standard_E64-16ds_v5","32" +"Edsv5 Series","Standard_E64-32ds_v5","32" +"Edsv5 Series","Standard_E64ds_v5","32" +"Edsv5 Series","Standard_E8-2ds_v5","4" +"Edsv5 Series","Standard_E8-4ds_v5","4" +"Edsv5 Series","Standard_E8ds_v5","4" +"Edsv5 Series","Standard_E96-24ds_v5","48" +"Edsv5 Series","Standard_E96-48ds_v5","48" +"Edsv5 Series","Standard_E96ds_v5","48" +"Edsv5 Series DedicatedHost","edsv5_type1","1" +"Edsv5 Series Isolated","Standard_E104ids_v5","1" +"Edv4 Series","Standard_E16d_v4","8" +"Edv4 Series","Standard_E20d_v4","10" +"Edv4 Series","Standard_E2d_v4","1" +"Edv4 Series","Standard_E32d_v4","16" +"Edv4 Series","Standard_E48d_v4","24" +"Edv4 Series","Standard_E4d_v4","2" +"Edv4 Series","Standard_E64d_v4","32" +"Edv4 Series","Standard_E8d_v4","4" +"Edv5 Series","Standard_E104id_v5","57.2" +"Edv5 Series","Standard_E16d_v5","8" +"Edv5 Series","Standard_E20d_v5","10" +"Edv5 Series","Standard_E2d_v5","1" +"Edv5 Series","Standard_E32d_v5","16" +"Edv5 Series","Standard_E48d_v5","24" +"Edv5 Series","Standard_E4d_v5","2" +"Edv5 Series","Standard_E64d_v5","32" +"Edv5 Series","Standard_E8d_v5","4" +"Edv5 Series","Standard_E96d_v5","48" +"Epdsv5 Series","Standard_E16pds_v5","8" +"Epdsv5 Series","Standard_E20pds_v5","10" +"Epdsv5 Series","Standard_E2pds_v5","1" +"Epdsv5 Series","Standard_E32pds_v5","16" +"Epdsv5 Series","Standard_E4pds_v5","2" +"Epdsv5 Series","Standard_E8pds_v5","4" +"Epsv5 Series","Standard_E16ps_v5","8" +"Epsv5 Series","Standard_E20ps_v5","10" +"Epsv5 Series","Standard_E2ps_v5","1" +"Epsv5 Series","Standard_E32ps_v5","16" +"Epsv5 Series","Standard_E4ps_v5","2" +"Epsv5 Series","Standard_E8ps_v5","4" +"Esv4 Series","Standard_E16-4s_v4","8" +"Esv4 Series","Standard_E16-8s_v4","8" +"Esv4 Series","Standard_E16s_v4","8" +"Esv4 Series","Standard_E20s_v4","10" +"Esv4 Series","Standard_E2s_v4","1" +"Esv4 Series","Standard_E32-16s_v4","16" +"Esv4 Series","Standard_E32-8s_v4","16" +"Esv4 Series","Standard_E32s_v4","16" +"Esv4 Series","Standard_E4-2s_v4","2" +"Esv4 Series","Standard_E48s_v4","24" +"Esv4 Series","Standard_E4s_v4","2" +"Esv4 Series","Standard_E64-16s_v4","32" +"Esv4 Series","Standard_E64-32s_v4","32" +"Esv4 Series","Standard_E64s_v4","32" +"Esv4 Series","Standard_E8-2s_v4","4" +"Esv4 Series","Standard_E8-4s_v4","4" +"Esv4 Series","Standard_E8s_v4","4" +"Esv4 Series Isolated","Standard_E80is_v4","1" +"Esv5 Series","Standard_E16-4s_v5","8" +"Esv5 Series","Standard_E16-8s_v5","8" +"Esv5 Series","Standard_E16s_v5","8" +"Esv5 Series","Standard_E20s_v5","10" +"Esv5 Series","Standard_E2s_v5","1" +"Esv5 Series","Standard_E32-16s_v5","16" +"Esv5 Series","Standard_E32-8s_v5","16" +"Esv5 Series","Standard_E32s_v5","16" +"Esv5 Series","Standard_E4-2s_v5","2" +"Esv5 Series","Standard_E48s_v5","24" +"Esv5 Series","Standard_E4s_v5","2" +"Esv5 Series","Standard_E64-16s_v5","32" +"Esv5 Series","Standard_E64-32s_v5","32" +"Esv5 Series","Standard_E64s_v5","32" +"Esv5 Series","Standard_E8-2s_v5","4" +"Esv5 Series","Standard_E8-4s_v5","4" +"Esv5 Series","Standard_E8s_v5","4" +"Esv5 Series","Standard_E96-24s_v5","48" +"Esv5 Series","Standard_E96-48s_v5","48" +"Esv5 Series","Standard_E96s_v5","48" +"Esv5 Series DedicatedHost","esv5_type1","1" +"Esv5 Series Isolated","Standard_E104is_v5","1" +"Ev3 Series","Standard_E20_v3","10" +"Ev3 Series","Standard_E2_v3","1" +"Ev3 Series","Standard_E32_v3","16" +"Ev4 Series","Standard_E16_v4","8" +"Ev4 Series","Standard_E20_v4","10" +"Ev4 Series","Standard_E2_v4","1" +"Ev4 Series","Standard_E32_v4","16" +"Ev4 Series","Standard_E48_v4","24" +"Ev4 Series","Standard_E4_v4","2" +"Ev4 Series","Standard_E64_v4","32" +"Ev4 Series","Standard_E8_v4","4" +"Ev5 Series","Standard_E104i_v5","57.2" +"Ev5 Series","Standard_E16_v5","8" +"Ev5 Series","Standard_E20_v5","10" +"Ev5 Series","Standard_E2_v5","1" +"Ev5 Series","Standard_E32_v5","16" +"Ev5 Series","Standard_E48_v5","24" +"Ev5 Series","Standard_E4_v5","2" +"Ev5 Series","Standard_E64_v5","32" +"Ev5 Series","Standard_E8_v5","4" +"Ev5 Series","Standard_E96_v5","48" +"FSv2 Series","Standard_F16s_v2","8" +"FSv2 Series","Standard_F2s_v2","1" +"FSv2 Series","Standard_F32s_v2","16" +"FSv2 Series","Standard_F48s_v2","24" +"FSv2 Series","Standard_F4s_v2","2" +"FSv2 Series","Standard_F64s_v2","32" +"FSv2 Series","Standard_F72s_v2","36" +"FSv2 Series","Standard_F8s_v2","4" +"FSv2 Series Dedicated Host","fsv2 type3","1.17" +"FSv2 Series Dedicated Host","fsv2_type2","1" +"FSv2 Series Dedicated Host","fsv2_type4","1.33" +"FX Series Dedicated Host","fxmds type1","1" +"FX Series Linux","Standard_FX12mds","3" +"FX Series Linux","Standard_FX24mds","6" +"FX Series Linux","Standard_FX36mds","9" +"FX Series Linux","Standard_FX48mds","12" +"FX Series Linux","Standard_FX4mds","1" +"HBSv2 Series Low Latency","Standard_HB120-16rs_v2","1" +"HBSv2 Series Low Latency","Standard_HB120-32rs_v2","1" +"HBSv2 Series Low Latency","Standard_HB120-64rs_v2","1" +"HBSv2 Series Low Latency","Standard_HB120-96rs_v2","1" +"HBrsv3 Series Low Latency","Standard_HB120-16rs_v3","1" +"HBrsv3 Series Low Latency","Standard_HB120-32rs_v3","1" +"HBrsv3 Series Low Latency","Standard_HB120-64rs_v3","1" +"HBrsv3 Series Low Latency","Standard_HB120-96rs_v3","1" +"HBrsv3 Series Low Latency","Standard_HB120rs_v3","1" +"HCS Series","Standard_HC44-16rs","1" +"HCS Series","Standard_HC44-32rs","1" +"HCS Series","Standard_HC44rs","1" +"LSv2 Series Dedicated Host","lsv2_type1","1" +"Lasv3 Series DedicatedHost","lasv3_type1","1" +"Lasv3 Series Linux","Standard_L16as_v3","2" +"Lasv3 Series Linux","Standard_L32as_v3","4" +"Lasv3 Series Linux","Standard_L48as_v3","6" +"Lasv3 Series Linux","Standard_L64as_v3","8" +"Lasv3 Series Linux","Standard_L80as_v3","10" +"Lasv3 Series Linux","Standard_L8as_v3","1" +"Lsv3 Series DedicatedHost","lsv3_type1","1" +"Lsv3 Series Linux","Standard_L16s_v3","2" +"Lsv3 Series Linux","Standard_L32s_v3","4" +"Lsv3 Series Linux","Standard_L48s_v3","6" +"Lsv3 Series Linux","Standard_L64s_v3","8" +"Lsv3 Series Linux","Standard_L80s_v3","10" +"Lsv3 Series Linux","Standard_L8s_v3","1" "MS Series","Standard_M128","2" "MS Series","Standard_M128s","2" "MS Series","Standard_M64","1" @@ -647,12 +647,12 @@ "MSv2 Series Disk 192s","Standard_M192is_v2","1" "MSv2 Series Fractional High Memory 128s","Standard_M128s_v2","1" "MSv2 Series HM Dedicated Host","msmv2_type1","1" -"MSv2 Series High Memory","Standard_M208ms_v2","4.4" -"MSv2 Series High Memory","Standard_M416-208ms_v2","9.8" -"MSv2 Series High Memory","Standard_M416ms_v2","9.8" -"MSv2 Series High Memory","Standard_M416s_10_v2","8.16" -"MSv2 Series High Memory","Standard_M416s_8_v2","6.5" -"MSv2 Series High Memory","Standard_M416s_9_v2","7.36" +"MSv2 Series High Memory","Standard_M208ms_v2","1" +"MSv2 Series High Memory","Standard_M416-208ms_v2","2.2273" +"MSv2 Series High Memory","Standard_M416ms_v2","2.2273" +"MSv2 Series High Memory","Standard_M416s_10_v2","1.8545" +"MSv2 Series High Memory","Standard_M416s_8_v2","1.4773" +"MSv2 Series High Memory","Standard_M416s_9_v2","1.6727" "MSv2 Series High Memory 128ms","Standard_M128ms_v2","1" "MSv2 Series MedMem Dedicated Host","msv2medmem type1","1" "MSv2 Series MedMem HM Dedicated Host","mmsv2medmem-type1","1" @@ -666,478 +666,478 @@ "MdSv2 Series Memory Disk","Standard_M64dms_v2","1" "Mdsv2 Series Dedicated Host","mdsv2medmem_type1","1" "Mdsv2 Series HM Dedicated Host","mdmsv2medmem _type1","1" -"NCads A100 v4 Series Linux","Standard_NC24ads_A100_v4","24" -"NCads A100 v4 Series Linux","Standard_NC48ads_A100_v4","48" -"NCads A100 v4 Series Linux","Standard_NC96ads_A100_v4","96" -"NCas T4 v3 Series","Standard_NC16as_T4_v3","9.16" -"NCas T4 v3 Series","Standard_NC4as_T4_v3","4" -"NCas T4 v3 Series","Standard_NC64as_T4_v3","33.08" -"NCas T4 v3 Series","Standard_NC8as_T4_v3","5.72" -"NCasA10_v4 Linux","Standard_NC16ads_A10_v4","16" -"NCasA10_v4 Linux","Standard_NC32ads_A10_v4","32" -"NCasA10_v4 Linux","Standard_NC8ads_A10_v4","8" -"NDamsr A100 v4 Series","ndamsra100v4_type1","96" -"NDamsr A100 v4 Series Linux","Standard_ND96amsr_A100_v4","106.56" -"NDasr A100 v4 Series","Standard_ND96asr_v4","96" -"NDasr A100 v4 Series","ndasra100v4_type1","105.6" -"NDrSv2 Series Low Latency","Standard_ND40rs_v2","40" -"NP Series","Standard_NP10s","10" -"NP Series","Standard_NP20s","20" -"NP Series","Standard_NP40s","40" -"NVadsA10_v5 DedicatedHost","nvadsa10v5_type1","72" -"NVadsA10_v5 Linux","Standard_NV12ads_A10_v5","12" -"NVadsA10_v5 Linux","Standard_NV18ads_A10_v5","21.12" -"NVadsA10_v5 Linux","Standard_NV36adms_A10_v5","59.76" -"NVadsA10_v5 Linux","Standard_NV36ads_A10_v5","42.3" -"NVadsA10_v5 Linux","Standard_NV6ads_A10_v5","6" -"NVadsA10_v5 Linux","Standard_NV72ads_A10_v5","86.16" -"Virtual Machines DCadsv6-series Linux","Standard_DC16ads_v6","16" -"Virtual Machines DCadsv6-series Linux","Standard_DC2ads_v6","2" -"Virtual Machines DCadsv6-series Linux","Standard_DC32ads_v6","32" -"Virtual Machines DCadsv6-series Linux","Standard_DC48ads_v6","48" -"Virtual Machines DCadsv6-series Linux","Standard_DC4ads_v6","4" -"Virtual Machines DCadsv6-series Linux","Standard_DC64ads_v6","64" -"Virtual Machines DCadsv6-series Linux","Standard_DC8ads_v6","8" -"Virtual Machines DCadsv6-series Linux","Standard_DC96ads_v6","96" -"Virtual Machines DCasv6-series Linux","Standard_DC16as_v6","16" -"Virtual Machines DCasv6-series Linux","Standard_DC2as_v6","2" -"Virtual Machines DCasv6-series Linux","Standard_DC32as_v6","32" -"Virtual Machines DCasv6-series Linux","Standard_DC48as_v6","48" -"Virtual Machines DCasv6-series Linux","Standard_DC4as_v6","4" -"Virtual Machines DCasv6-series Linux","Standard_DC64as_v6","64" -"Virtual Machines DCasv6-series Linux","Standard_DC8as_v6","8" -"Virtual Machines DCasv6-series Linux","Standard_DC96as_v6","96" -"Virtual Machines DCedsv6-series Linux","Standard_DC128eds_v6","128" -"Virtual Machines DCedsv6-series Linux","Standard_DC16eds_v6","16" -"Virtual Machines DCedsv6-series Linux","Standard_DC2eds_v6","2" -"Virtual Machines DCedsv6-series Linux","Standard_DC32eds_v6","32" -"Virtual Machines DCedsv6-series Linux","Standard_DC48eds_v6","48" -"Virtual Machines DCedsv6-series Linux","Standard_DC4eds_v6","4" -"Virtual Machines DCedsv6-series Linux","Standard_DC64eds_v6","64" -"Virtual Machines DCedsv6-series Linux","Standard_DC8eds_v6","8" -"Virtual Machines DCedsv6-series Linux","Standard_DC96eds_v6","96" -"Virtual Machines DCesv6-series Linux","Standard_DC128es_v6","128" -"Virtual Machines DCesv6-series Linux","Standard_DC16es_v6","16" -"Virtual Machines DCesv6-series Linux","Standard_DC2es_v6","2" -"Virtual Machines DCesv6-series Linux","Standard_DC32es_v6","32" -"Virtual Machines DCesv6-series Linux","Standard_DC48es_v6","48" -"Virtual Machines DCesv6-series Linux","Standard_DC4es_v6","4" -"Virtual Machines DCesv6-series Linux","Standard_DC64es_v6","64" -"Virtual Machines DCesv6-series Linux","Standard_DC8es_v6","8" -"Virtual Machines DCesv6-series Linux","Standard_DC96es_v6","96" -"Virtual Machines Dadsv6-series Linux","Standard_D16ads_v6","16" -"Virtual Machines Dadsv6-series Linux","Standard_D2ads_v6","2" -"Virtual Machines Dadsv6-series Linux","Standard_D32ads_v6","32" -"Virtual Machines Dadsv6-series Linux","Standard_D48ads_v6","48" -"Virtual Machines Dadsv6-series Linux","Standard_D4ads_v6","4" -"Virtual Machines Dadsv6-series Linux","Standard_D64ads_v6","64" -"Virtual Machines Dadsv6-series Linux","Standard_D8ads_v6","8" -"Virtual Machines Dadsv6-series Linux","Standard_D96ads_v6","96" -"Virtual Machines Dadsv7-series Linux","Standard_D128ads_v7","128" -"Virtual Machines Dadsv7-series Linux","Standard_D160ads_v7","160" -"Virtual Machines Dadsv7-series Linux","Standard_D16ads_v7","16" -"Virtual Machines Dadsv7-series Linux","Standard_D2ads_v7","2" -"Virtual Machines Dadsv7-series Linux","Standard_D32ads_v7","32" -"Virtual Machines Dadsv7-series Linux","Standard_D48ads_v7","48" -"Virtual Machines Dadsv7-series Linux","Standard_D4ads_v7","4" -"Virtual Machines Dadsv7-series Linux","Standard_D64ads_v7","64" -"Virtual Machines Dadsv7-series Linux","Standard_D8ads_v7","8" -"Virtual Machines Dadsv7-series Linux","Standard_D96ads_v7","96" -"Virtual Machines Daldsv6-series Linux","Standard_D16alds_v6","16" -"Virtual Machines Daldsv6-series Linux","Standard_D2alds_v6","2" -"Virtual Machines Daldsv6-series Linux","Standard_D32alds_v6","32" -"Virtual Machines Daldsv6-series Linux","Standard_D48alds_v6","48" -"Virtual Machines Daldsv6-series Linux","Standard_D4alds_v6","4" -"Virtual Machines Daldsv6-series Linux","Standard_D64alds_v6","64" -"Virtual Machines Daldsv6-series Linux","Standard_D8alds_v6","8" -"Virtual Machines Daldsv6-series Linux","Standard_D96alds_v6","96" -"Virtual Machines Daldsv7-series Linux","Standard_D128alds_v7","128" -"Virtual Machines Daldsv7-series Linux","Standard_D160alds_v7","160" -"Virtual Machines Daldsv7-series Linux","Standard_D16alds_v7","16" -"Virtual Machines Daldsv7-series Linux","Standard_D2alds_v7","2" -"Virtual Machines Daldsv7-series Linux","Standard_D32alds_v7","32" -"Virtual Machines Daldsv7-series Linux","Standard_D48alds_v7","48" -"Virtual Machines Daldsv7-series Linux","Standard_D4alds_v7","4" -"Virtual Machines Daldsv7-series Linux","Standard_D64alds_v7","64" -"Virtual Machines Daldsv7-series Linux","Standard_D8alds_v7","8" -"Virtual Machines Daldsv7-series Linux","Standard_D96alds_v7","96" -"Virtual Machines Dalsv6-series Linux","Standard_D16als_v6","16" -"Virtual Machines Dalsv6-series Linux","Standard_D2als_v6","2" -"Virtual Machines Dalsv6-series Linux","Standard_D32als_v6","32" -"Virtual Machines Dalsv6-series Linux","Standard_D48als_v6","48" -"Virtual Machines Dalsv6-series Linux","Standard_D4als_v6","4" -"Virtual Machines Dalsv6-series Linux","Standard_D64als_v6","64" -"Virtual Machines Dalsv6-series Linux","Standard_D8als_v6","8" -"Virtual Machines Dalsv6-series Linux","Standard_D96als_v6","96" -"Virtual Machines Dalsv7-series Linux","Standard_D128als_v7","128" -"Virtual Machines Dalsv7-series Linux","Standard_D160als_v7","160" -"Virtual Machines Dalsv7-series Linux","Standard_D16als_v7","16" -"Virtual Machines Dalsv7-series Linux","Standard_D2als_v7","2" -"Virtual Machines Dalsv7-series Linux","Standard_D32als_v7","32" -"Virtual Machines Dalsv7-series Linux","Standard_D48als_v7","48" -"Virtual Machines Dalsv7-series Linux","Standard_D4als_v7","4" -"Virtual Machines Dalsv7-series Linux","Standard_D64als_v7","64" -"Virtual Machines Dalsv7-series Linux","Standard_D8als_v7","8" -"Virtual Machines Dalsv7-series Linux","Standard_D96als_v7","96" -"Virtual Machines Dasv6-series DedicatedHost","dasv6_type1","144" -"Virtual Machines Dasv6-series Linux","Standard_D16as_v6","16" -"Virtual Machines Dasv6-series Linux","Standard_D2as_v6","2" -"Virtual Machines Dasv6-series Linux","Standard_D32as_v6","32" -"Virtual Machines Dasv6-series Linux","Standard_D48as_v6","48" -"Virtual Machines Dasv6-series Linux","Standard_D4as_v6","4" -"Virtual Machines Dasv6-series Linux","Standard_D64as_v6","64" -"Virtual Machines Dasv6-series Linux","Standard_D8as_v6","8" -"Virtual Machines Dasv6-series Linux","Standard_D96as_v6","96" -"Virtual Machines Dasv7-series Linux","Standard_D128as_v7","128" -"Virtual Machines Dasv7-series Linux","Standard_D160as_v7","160" -"Virtual Machines Dasv7-series Linux","Standard_D16as_v7","16" -"Virtual Machines Dasv7-series Linux","Standard_D2as_v7","2" -"Virtual Machines Dasv7-series Linux","Standard_D32as_v7","32" -"Virtual Machines Dasv7-series Linux","Standard_D48as_v7","48" -"Virtual Machines Dasv7-series Linux","Standard_D4as_v7","4" -"Virtual Machines Dasv7-series Linux","Standard_D64as_v7","64" -"Virtual Machines Dasv7-series Linux","Standard_D8as_v7","8" -"Virtual Machines Dasv7-series Linux","Standard_D96as_v7","96" -"Virtual Machines Ddsv6-series DedicatedHost","ddsv6_type1","192" -"Virtual Machines Ddsv6-series Linux","Standard_D128ds_v6","127.56" -"Virtual Machines Ddsv6-series Linux","Standard_D16ds_v6","16" -"Virtual Machines Ddsv6-series Linux","Standard_D192ds_v6","191.36" -"Virtual Machines Ddsv6-series Linux","Standard_D2ds_v6","2" -"Virtual Machines Ddsv6-series Linux","Standard_D32ds_v6","31.88" -"Virtual Machines Ddsv6-series Linux","Standard_D48ds_v6","47.84" -"Virtual Machines Ddsv6-series Linux","Standard_D4ds_v6","4" -"Virtual Machines Ddsv6-series Linux","Standard_D64ds_v6","63.8" -"Virtual Machines Ddsv6-series Linux","Standard_D8ds_v6","8" -"Virtual Machines Ddsv6-series Linux","Standard_D96ds_v6","95.68" -"Virtual Machines Dldsv6-series Linux","Standard_D128lds_v6","128.36" -"Virtual Machines Dldsv6-series Linux","Standard_D16lds_v6","16" -"Virtual Machines Dldsv6-series Linux","Standard_D2lds_v6","2" -"Virtual Machines Dldsv6-series Linux","Standard_D32lds_v6","32" -"Virtual Machines Dldsv6-series Linux","Standard_D48lds_v6","48.14" -"Virtual Machines Dldsv6-series Linux","Standard_D4lds_v6","4" -"Virtual Machines Dldsv6-series Linux","Standard_D64lds_v6","64.18" -"Virtual Machines Dldsv6-series Linux","Standard_D8lds_v6","8" -"Virtual Machines Dldsv6-series Linux","Standard_D96lds_v6","96.28" -"Virtual Machines Dlsv6-Series Linux","Standard_D128ls_v6","128" -"Virtual Machines Dlsv6-Series Linux","Standard_D16ls_v6","16" -"Virtual Machines Dlsv6-Series Linux","Standard_D2ls_v6","2" -"Virtual Machines Dlsv6-Series Linux","Standard_D32ls_v6","32" -"Virtual Machines Dlsv6-Series Linux","Standard_D48ls_v6","48" -"Virtual Machines Dlsv6-Series Linux","Standard_D4ls_v6","4" -"Virtual Machines Dlsv6-Series Linux","Standard_D64ls_v6","64" -"Virtual Machines Dlsv6-Series Linux","Standard_D8ls_v6","8" -"Virtual Machines Dlsv6-Series Linux","Standard_D96ls_v6","96" -"Virtual Machines Dndv6-series Linux","Standard_D128nds_v6","128" -"Virtual Machines Dndv6-series Linux","Standard_D16nds_v6","16" -"Virtual Machines Dndv6-series Linux","Standard_D2nds_v6","2" -"Virtual Machines Dndv6-series Linux","Standard_D32nds_v6","32" -"Virtual Machines Dndv6-series Linux","Standard_D48nds_v6","48" -"Virtual Machines Dndv6-series Linux","Standard_D4nds_v6","4" -"Virtual Machines Dndv6-series Linux","Standard_D64nds_v6","64" -"Virtual Machines Dndv6-series Linux","Standard_D8nds_v6","8" -"Virtual Machines Dndv6-series Linux","Standard_D96nds_v6","96" -"Virtual Machines Dnldv6-series Linux","Standard_D128nlds_v6","128" -"Virtual Machines Dnldv6-series Linux","Standard_D16nlds_v6","16" -"Virtual Machines Dnldv6-series Linux","Standard_D2nlds_v6","2" -"Virtual Machines Dnldv6-series Linux","Standard_D32nlds_v6","32" -"Virtual Machines Dnldv6-series Linux","Standard_D48nlds_v6","48" -"Virtual Machines Dnldv6-series Linux","Standard_D4nlds_v6","4" -"Virtual Machines Dnldv6-series Linux","Standard_D64nlds_v6","64" -"Virtual Machines Dnldv6-series Linux","Standard_D8nlds_v6","8" -"Virtual Machines Dnldv6-series Linux","Standard_D96nlds_v6","96" -"Virtual Machines Dnlv6-series Linux","Standard_D128nls_v6","128" -"Virtual Machines Dnlv6-series Linux","Standard_D16nls_v6","16" -"Virtual Machines Dnlv6-series Linux","Standard_D2nls_v6","2" -"Virtual Machines Dnlv6-series Linux","Standard_D32nls_v6","32" -"Virtual Machines Dnlv6-series Linux","Standard_D48nls_v6","48" -"Virtual Machines Dnlv6-series Linux","Standard_D4nls_v6","4" -"Virtual Machines Dnlv6-series Linux","Standard_D64nls_v6","64" -"Virtual Machines Dnlv6-series Linux","Standard_D8nls_v6","8" -"Virtual Machines Dnlv6-series Linux","Standard_D96nls_v6","96" -"Virtual Machines Dnv6-series Linux","Standard_D128ns_v6","128" -"Virtual Machines Dnv6-series Linux","Standard_D16ns_v6","16" -"Virtual Machines Dnv6-series Linux","Standard_D2ns_v6","2" -"Virtual Machines Dnv6-series Linux","Standard_D32ns_v6","32" -"Virtual Machines Dnv6-series Linux","Standard_D48ns_v6","48" -"Virtual Machines Dnv6-series Linux","Standard_D4ns_v6","4" -"Virtual Machines Dnv6-series Linux","Standard_D64ns_v6","64" -"Virtual Machines Dnv6-series Linux","Standard_D8ns_v6","8" -"Virtual Machines Dnv6-series Linux","Standard_D96ns_v6","96" -"Virtual Machines Dpdsv6-series Linux","Standard_D16pds_v6","16" -"Virtual Machines Dpdsv6-series Linux","Standard_D2pds_v6","2" -"Virtual Machines Dpdsv6-series Linux","Standard_D32pds_v6","32" -"Virtual Machines Dpdsv6-series Linux","Standard_D48pds_v6","48" -"Virtual Machines Dpdsv6-series Linux","Standard_D4pds_v6","4" -"Virtual Machines Dpdsv6-series Linux","Standard_D64pds_v6","64" -"Virtual Machines Dpdsv6-series Linux","Standard_D8pds_v6","8" -"Virtual Machines Dpdsv6-series Linux","Standard_D96pds_v6","96" -"Virtual Machines Dpldsv6-series Linux","Standard_D16plds_v6","16" -"Virtual Machines Dpldsv6-series Linux","Standard_D2plds_v6","2" -"Virtual Machines Dpldsv6-series Linux","Standard_D32plds_v6","32" -"Virtual Machines Dpldsv6-series Linux","Standard_D48plds_v6","48" -"Virtual Machines Dpldsv6-series Linux","Standard_D4plds_v6","4" -"Virtual Machines Dpldsv6-series Linux","Standard_D64plds_v6","64" -"Virtual Machines Dpldsv6-series Linux","Standard_D8plds_v6","8" -"Virtual Machines Dpldsv6-series Linux","Standard_D96plds_v6","96" -"Virtual Machines Dplsv6-series Linux","Standard_D16pls_v6","16" -"Virtual Machines Dplsv6-series Linux","Standard_D2pls_v6","2" -"Virtual Machines Dplsv6-series Linux","Standard_D32pls_v6","32" -"Virtual Machines Dplsv6-series Linux","Standard_D48pls_v6","48" -"Virtual Machines Dplsv6-series Linux","Standard_D4pls_v6","4" -"Virtual Machines Dplsv6-series Linux","Standard_D64pls_v6","64" -"Virtual Machines Dplsv6-series Linux","Standard_D8pls_v6","8" -"Virtual Machines Dplsv6-series Linux","Standard_D96pls_v6","96" -"Virtual Machines Dpsv6-series Linux","Standard_D16ps_v6","16" -"Virtual Machines Dpsv6-series Linux","Standard_D2ps_v6","2" -"Virtual Machines Dpsv6-series Linux","Standard_D32ps_v6","32" -"Virtual Machines Dpsv6-series Linux","Standard_D48ps_v6","48" -"Virtual Machines Dpsv6-series Linux","Standard_D4ps_v6","4" -"Virtual Machines Dpsv6-series Linux","Standard_D64ps_v6","64" -"Virtual Machines Dpsv6-series Linux","Standard_D8ps_v6","8" -"Virtual Machines Dpsv6-series Linux","Standard_D96ps_v6","96" -"Virtual Machines Dsv6-series DedicatedHost","dsv6_type1","192" -"Virtual Machines Dsv6-series Linux","Standard_D128s_v6","127.74" -"Virtual Machines Dsv6-series Linux","Standard_D16s_v6","16" -"Virtual Machines Dsv6-series Linux","Standard_D192s_v6","191.62" -"Virtual Machines Dsv6-series Linux","Standard_D2s_v6","2" -"Virtual Machines Dsv6-series Linux","Standard_D32s_v6","32" -"Virtual Machines Dsv6-series Linux","Standard_D48s_v6","48" -"Virtual Machines Dsv6-series Linux","Standard_D4s_v6","4" -"Virtual Machines Dsv6-series Linux","Standard_D64s_v6","63.88" -"Virtual Machines Dsv6-series Linux","Standard_D8s_v6","8" -"Virtual Machines Dsv6-series Linux","Standard_D96s_v6","95.8" -"Virtual Machines ECadsv6-series Linux","Standard_EC16ads_v6","16" -"Virtual Machines ECadsv6-series Linux","Standard_EC2ads_v6","2" -"Virtual Machines ECadsv6-series Linux","Standard_EC32ads_v6","32" -"Virtual Machines ECadsv6-series Linux","Standard_EC48ads_v6","48" -"Virtual Machines ECadsv6-series Linux","Standard_EC4ads_v6","4" -"Virtual Machines ECadsv6-series Linux","Standard_EC64ads_v6","64" -"Virtual Machines ECadsv6-series Linux","Standard_EC8ads_v6","8" -"Virtual Machines ECadsv6-series Linux","Standard_EC96ads_v6","96" -"Virtual Machines ECasv6-series Linux","Standard_EC16as_v6","16" -"Virtual Machines ECasv6-series Linux","Standard_EC2as_v6","2" -"Virtual Machines ECasv6-series Linux","Standard_EC32as_v6","32" -"Virtual Machines ECasv6-series Linux","Standard_EC48as_v6","48" -"Virtual Machines ECasv6-series Linux","Standard_EC4as_v6","4" -"Virtual Machines ECasv6-series Linux","Standard_EC64as_v6","64" -"Virtual Machines ECasv6-series Linux","Standard_EC8as_v6","8" -"Virtual Machines ECasv6-series Linux","Standard_EC96as_v6","96" -"Virtual Machines ECedsv6-series Linux","Standard_EC16eds_v6","16" -"Virtual Machines ECedsv6-series Linux","Standard_EC2eds_v6","2" -"Virtual Machines ECedsv6-series Linux","Standard_EC32eds_v6","32" -"Virtual Machines ECedsv6-series Linux","Standard_EC48eds_v6","48" -"Virtual Machines ECedsv6-series Linux","Standard_EC4eds_v6","4" -"Virtual Machines ECedsv6-series Linux","Standard_EC64eds_v6","64" -"Virtual Machines ECedsv6-series Linux","Standard_EC8eds_v6","8" -"Virtual Machines ECesv6-series Linux","Standard_EC16es_v6","16" -"Virtual Machines ECesv6-series Linux","Standard_EC2es_v6","2" -"Virtual Machines ECesv6-series Linux","Standard_EC32es_v6","32" -"Virtual Machines ECesv6-series Linux","Standard_EC48es_v6","48" -"Virtual Machines ECesv6-series Linux","Standard_EC4es_v6","4" -"Virtual Machines ECesv6-series Linux","Standard_EC64es_v6","64" -"Virtual Machines ECesv6-series Linux","Standard_EC8es_v6","8" -"Virtual Machines Eadsv6-series Linux","Standard_E16ads_v6","16" -"Virtual Machines Eadsv6-series Linux","Standard_E20ads_v6","20" -"Virtual Machines Eadsv6-series Linux","Standard_E2ads_v6","2" -"Virtual Machines Eadsv6-series Linux","Standard_E32ads_v6","32" -"Virtual Machines Eadsv6-series Linux","Standard_E48ads_v6","48" -"Virtual Machines Eadsv6-series Linux","Standard_E4ads_v6","4" -"Virtual Machines Eadsv6-series Linux","Standard_E64ads_v6","64" -"Virtual Machines Eadsv6-series Linux","Standard_E8ads_v6","8" -"Virtual Machines Eadsv6-series Linux","Standard_E96-24ads_v6","96.14" -"Virtual Machines Eadsv6-series Linux","Standard_E96-48ads_v6","96.14" -"Virtual Machines Eadsv6-series Linux","Standard_E96ads_v6","96.14" -"Virtual Machines Eadsv7-series Linux","Standard_E128-32ads_v7","128" -"Virtual Machines Eadsv7-series Linux","Standard_E128-64ads_v7","128" -"Virtual Machines Eadsv7-series Linux","Standard_E128ads_v7","128" -"Virtual Machines Eadsv7-series Linux","Standard_E16-4ads_v7","16" -"Virtual Machines Eadsv7-series Linux","Standard_E16-8ads_v7","16" -"Virtual Machines Eadsv7-series Linux","Standard_E160ads_v7","160" -"Virtual Machines Eadsv7-series Linux","Standard_E16ads_v7","16" -"Virtual Machines Eadsv7-series Linux","Standard_E2ads_v7","2" -"Virtual Machines Eadsv7-series Linux","Standard_E32-16ads_v7","32" -"Virtual Machines Eadsv7-series Linux","Standard_E32-8ads_v7","32" -"Virtual Machines Eadsv7-series Linux","Standard_E32ads_v7","32" -"Virtual Machines Eadsv7-series Linux","Standard_E4-2ads_v7","4" -"Virtual Machines Eadsv7-series Linux","Standard_E48ads_v7","48" -"Virtual Machines Eadsv7-series Linux","Standard_E4ads_v7","4" -"Virtual Machines Eadsv7-series Linux","Standard_E64-16ads_v7","64" -"Virtual Machines Eadsv7-series Linux","Standard_E64-32ads_v7","64" -"Virtual Machines Eadsv7-series Linux","Standard_E64ads_v7","64" -"Virtual Machines Eadsv7-series Linux","Standard_E8-2ads_v7","8" -"Virtual Machines Eadsv7-series Linux","Standard_E8-4ads_v7","8" -"Virtual Machines Eadsv7-series Linux","Standard_E8ads_v7","8" -"Virtual Machines Eadsv7-series Linux","Standard_E96-24ads_v7","96" -"Virtual Machines Eadsv7-series Linux","Standard_E96-48ads_v7","96" -"Virtual Machines Eadsv7-series Linux","Standard_E96ads_v7","96" -"Virtual Machines Easv6-series DedicatedHost","easv6_type1","144" -"Virtual Machines Easv6-series Linux","Standard_E16as_v6","16" -"Virtual Machines Easv6-series Linux","Standard_E20as_v6","20" -"Virtual Machines Easv6-series Linux","Standard_E2as_v6","2" -"Virtual Machines Easv6-series Linux","Standard_E32as_v6","32" -"Virtual Machines Easv6-series Linux","Standard_E48as_v6","48" -"Virtual Machines Easv6-series Linux","Standard_E4as_v6","4" -"Virtual Machines Easv6-series Linux","Standard_E64as_v6","64.1" -"Virtual Machines Easv6-series Linux","Standard_E8as_v6","8" -"Virtual Machines Easv6-series Linux","Standard_E96as_v6","96.16" -"Virtual Machines Easv7-series Linux","Standard_E128-32as_v7","128" -"Virtual Machines Easv7-series Linux","Standard_E128-64as_v7","128" -"Virtual Machines Easv7-series Linux","Standard_E128as_v7","128" -"Virtual Machines Easv7-series Linux","Standard_E16-4as_v7","16" -"Virtual Machines Easv7-series Linux","Standard_E16-8as_v7","16" -"Virtual Machines Easv7-series Linux","Standard_E160as_v7","160" -"Virtual Machines Easv7-series Linux","Standard_E16as_v7","16" -"Virtual Machines Easv7-series Linux","Standard_E2as_v7","2" -"Virtual Machines Easv7-series Linux","Standard_E32-16as_v7","32" -"Virtual Machines Easv7-series Linux","Standard_E32-8as_v7","32" -"Virtual Machines Easv7-series Linux","Standard_E32as_v7","32" -"Virtual Machines Easv7-series Linux","Standard_E4-2as_v7","4" -"Virtual Machines Easv7-series Linux","Standard_E48as_v7","48" -"Virtual Machines Easv7-series Linux","Standard_E4as_v7","4" -"Virtual Machines Easv7-series Linux","Standard_E64-16as_v7","64" -"Virtual Machines Easv7-series Linux","Standard_E64-32as_v7","64" -"Virtual Machines Easv7-series Linux","Standard_E64as_v7","64" -"Virtual Machines Easv7-series Linux","Standard_E8-2as_v7","8" -"Virtual Machines Easv7-series Linux","Standard_E8-4as_v7","8" -"Virtual Machines Easv7-series Linux","Standard_E8as_v7","8" -"Virtual Machines Easv7-series Linux","Standard_E96-24as_v7","96" -"Virtual Machines Easv7-series Linux","Standard_E96-48as_v7","96" -"Virtual Machines Easv7-series Linux","Standard_E96as_v7","96" -"Virtual Machines Edsv6-series Linux","Standard_E128-32ds_v6","127.62" -"Virtual Machines Edsv6-series Linux","Standard_E128-64ds_v6","127.62" -"Virtual Machines Edsv6-series Linux","Standard_E128ds_v6","127.62" -"Virtual Machines Edsv6-series Linux","Standard_E16-4ds_v6","16" -"Virtual Machines Edsv6-series Linux","Standard_E16-8ds_v6","16" -"Virtual Machines Edsv6-series Linux","Standard_E16ds_v6","16" -"Virtual Machines Edsv6-series Linux","Standard_E192ids_v6","210.58" -"Virtual Machines Edsv6-series Linux","Standard_E20ds_v6","20" -"Virtual Machines Edsv6-series Linux","Standard_E2ds_v6","2" -"Virtual Machines Edsv6-series Linux","Standard_E32-16ds_v6","32" -"Virtual Machines Edsv6-series Linux","Standard_E32-8ds_v6","32" -"Virtual Machines Edsv6-series Linux","Standard_E32ds_v6","32" -"Virtual Machines Edsv6-series Linux","Standard_E4-2ds_v6","4" -"Virtual Machines Edsv6-series Linux","Standard_E48ds_v6","47.86" -"Virtual Machines Edsv6-series Linux","Standard_E4ds_v6","4" -"Virtual Machines Edsv6-series Linux","Standard_E64-16ds_v6","63.82" -"Virtual Machines Edsv6-series Linux","Standard_E64-32ds_v6","63.82" -"Virtual Machines Edsv6-series Linux","Standard_E64ds_v6","63.82" -"Virtual Machines Edsv6-series Linux","Standard_E8-2ds_v6","8" -"Virtual Machines Edsv6-series Linux","Standard_E8-4ds_v6","8" -"Virtual Machines Edsv6-series Linux","Standard_E8ds_v6","8" -"Virtual Machines Edsv6-series Linux","Standard_E96-24ds_v6","95.72" -"Virtual Machines Edsv6-series Linux","Standard_E96-48ds_v6","95.72" -"Virtual Machines Edsv6-series Linux","Standard_E96ds_v6","95.72" -"Virtual Machines Endv6-series Linux","Standard_E128nds_v6","128" -"Virtual Machines Endv6-series Linux","Standard_E16nds_v6","16" -"Virtual Machines Endv6-series Linux","Standard_E2nds_v6","2" -"Virtual Machines Endv6-series Linux","Standard_E32nds_v6","32" -"Virtual Machines Endv6-series Linux","Standard_E48nds_v6","48" -"Virtual Machines Endv6-series Linux","Standard_E4nds_v6","4" -"Virtual Machines Endv6-series Linux","Standard_E64nds_v6","64" -"Virtual Machines Endv6-series Linux","Standard_E8nds_v6","8" -"Virtual Machines Endv6-series Linux","Standard_E96nds_v6","96" -"Virtual Machines Env6-series Linux","Standard_E128ns_v6","128" -"Virtual Machines Env6-series Linux","Standard_E16ns_v6","16" -"Virtual Machines Env6-series Linux","Standard_E2ns_v6","2" -"Virtual Machines Env6-series Linux","Standard_E32ns_v6","32" -"Virtual Machines Env6-series Linux","Standard_E48ns_v6","48" -"Virtual Machines Env6-series Linux","Standard_E4ns_v6","4" -"Virtual Machines Env6-series Linux","Standard_E64ns_v6","64" -"Virtual Machines Env6-series Linux","Standard_E8ns_v6","8" -"Virtual Machines Env6-series Linux","Standard_E96ns_v6","96" -"Virtual Machines Epdsv6-series Linux","Standard_E16pds_v6","16" -"Virtual Machines Epdsv6-series Linux","Standard_E2pds_v6","2" -"Virtual Machines Epdsv6-series Linux","Standard_E32pds_v6","32" -"Virtual Machines Epdsv6-series Linux","Standard_E48pds_v6","48" -"Virtual Machines Epdsv6-series Linux","Standard_E4pds_v6","4" -"Virtual Machines Epdsv6-series Linux","Standard_E64pds_v6","64" -"Virtual Machines Epdsv6-series Linux","Standard_E8pds_v6","8" -"Virtual Machines Epdsv6-series Linux","Standard_E96pds_v6","96" -"Virtual Machines Epsv6-series Linux","Standard_E16ps_v6","16" -"Virtual Machines Epsv6-series Linux","Standard_E2ps_v6","2" -"Virtual Machines Epsv6-series Linux","Standard_E32ps_v6","32" -"Virtual Machines Epsv6-series Linux","Standard_E48ps_v6","48" -"Virtual Machines Epsv6-series Linux","Standard_E4ps_v6","4" -"Virtual Machines Epsv6-series Linux","Standard_E64ps_v6","64" -"Virtual Machines Epsv6-series Linux","Standard_E8ps_v6","8" -"Virtual Machines Epsv6-series Linux","Standard_E96ps_v6","96" -"Virtual Machines Esv6-series DedicatedHost","esv6_type1","192" -"Virtual Machines Esv6-series Linux","Standard_E128-32s_v6","128.28" -"Virtual Machines Esv6-series Linux","Standard_E128-64s_v6","128.28" -"Virtual Machines Esv6-series Linux","Standard_E128s_v6","128.28" -"Virtual Machines Esv6-series Linux","Standard_E16-4s_v6","16" -"Virtual Machines Esv6-series Linux","Standard_E16-8s_v6","16" -"Virtual Machines Esv6-series Linux","Standard_E16s_v6","16" -"Virtual Machines Esv6-series Linux","Standard_E192is_v6","211.68" -"Virtual Machines Esv6-series Linux","Standard_E20s_v6","20" -"Virtual Machines Esv6-series Linux","Standard_E2s_v6","2" -"Virtual Machines Esv6-series Linux","Standard_E32-16s_v6","32" -"Virtual Machines Esv6-series Linux","Standard_E32-8s_v6","32" -"Virtual Machines Esv6-series Linux","Standard_E32s_v6","32" -"Virtual Machines Esv6-series Linux","Standard_E4-2s_v6","4" -"Virtual Machines Esv6-series Linux","Standard_E48s_v6","48.1" -"Virtual Machines Esv6-series Linux","Standard_E4s_v6","4" -"Virtual Machines Esv6-series Linux","Standard_E64-16s_v6","64.16" -"Virtual Machines Esv6-series Linux","Standard_E64-32s_v6","64.16" -"Virtual Machines Esv6-series Linux","Standard_E64s_v6","64.16" -"Virtual Machines Esv6-series Linux","Standard_E8-2s_v6","8" -"Virtual Machines Esv6-series Linux","Standard_E8-4s_v6","8" -"Virtual Machines Esv6-series Linux","Standard_E8s_v6","8" -"Virtual Machines Esv6-series Linux","Standard_E96-24s_v6","96.22" -"Virtual Machines Esv6-series Linux","Standard_E96-48s_v6","96.22" -"Virtual Machines Esv6-series Linux","Standard_E96s_v6","96.22" -"Virtual Machines FXmdsv2-series Linux","Standard_FX12-6mds_v2","12" -"Virtual Machines FXmdsv2-series Linux","Standard_FX12mds_v2","12" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16-4mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16-8mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24-12mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24-6mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX2mds_v2","2" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32-16mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32-8mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX4-2mds_v2","4" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48-12mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48-24mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX4mds_v2","4" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64-16mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64-32mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8-2mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8-4mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96-24mds_v2","95.84" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96-48mds_v2","95.84" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96mds_v2","95.84" -"Virtual Machines FXmsv2-series Linux","Standard_FX12-6ms_v2","12" -"Virtual Machines FXmsv2-series Linux","Standard_FX12ms_v2","12" -"Virtual Machines FXmsv2-series Linux","Standard_FX16-4ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX16-8ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX16ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX24-12ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX24-6ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX24ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX2ms_v2","2" -"Virtual Machines FXmsv2-series Linux","Standard_FX32-16ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX32-8ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX32ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX4-2ms_v2","4" -"Virtual Machines FXmsv2-series Linux","Standard_FX48-12ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX48-24ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX48ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX4ms_v2","4" -"Virtual Machines FXmsv2-series Linux","Standard_FX64-16ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX64-32ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX64ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX8-2ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX8-4ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX8ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX96-24ms_v2","96.14" -"Virtual Machines FXmsv2-series Linux","Standard_FX96-48ms_v2","96.14" -"Virtual Machines FXmsv2-series Linux","Standard_FX96ms_v2","96.14" +"NCads A100 v4 Series Linux","Standard_NC24ads_A100_v4","1" +"NCads A100 v4 Series Linux","Standard_NC48ads_A100_v4","2" +"NCads A100 v4 Series Linux","Standard_NC96ads_A100_v4","4" +"NCas T4 v3 Series","Standard_NC16as_T4_v3","2.29" +"NCas T4 v3 Series","Standard_NC4as_T4_v3","1" +"NCas T4 v3 Series","Standard_NC64as_T4_v3","8.27" +"NCas T4 v3 Series","Standard_NC8as_T4_v3","1.43" +"NCasA10_v4 Linux","Standard_NC16ads_A10_v4","2" +"NCasA10_v4 Linux","Standard_NC32ads_A10_v4","4" +"NCasA10_v4 Linux","Standard_NC8ads_A10_v4","1" +"NDamsr A100 v4 Series","ndamsra100v4_type1","1" +"NDamsr A100 v4 Series Linux","Standard_ND96amsr_A100_v4","1" +"NDasr A100 v4 Series","Standard_ND96asr_v4","1" +"NDasr A100 v4 Series","ndasra100v4_type1","1.1" +"NDrSv2 Series Low Latency","Standard_ND40rs_v2","1" +"NP Series","Standard_NP10s","1" +"NP Series","Standard_NP20s","2" +"NP Series","Standard_NP40s","4" +"NVadsA10_v5 DedicatedHost","nvadsa10v5_type1","1" +"NVadsA10_v5 Linux","Standard_NV12ads_A10_v5","2" +"NVadsA10_v5 Linux","Standard_NV18ads_A10_v5","3.52" +"NVadsA10_v5 Linux","Standard_NV36adms_A10_v5","9.96" +"NVadsA10_v5 Linux","Standard_NV36ads_A10_v5","7.05" +"NVadsA10_v5 Linux","Standard_NV6ads_A10_v5","1" +"NVadsA10_v5 Linux","Standard_NV72ads_A10_v5","14.36" +"Virtual Machines DCadsv6-series Linux","Standard_DC16ads_v6","8" +"Virtual Machines DCadsv6-series Linux","Standard_DC2ads_v6","1" +"Virtual Machines DCadsv6-series Linux","Standard_DC32ads_v6","16" +"Virtual Machines DCadsv6-series Linux","Standard_DC48ads_v6","24" +"Virtual Machines DCadsv6-series Linux","Standard_DC4ads_v6","2" +"Virtual Machines DCadsv6-series Linux","Standard_DC64ads_v6","32" +"Virtual Machines DCadsv6-series Linux","Standard_DC8ads_v6","4" +"Virtual Machines DCadsv6-series Linux","Standard_DC96ads_v6","48" +"Virtual Machines DCasv6-series Linux","Standard_DC16as_v6","8" +"Virtual Machines DCasv6-series Linux","Standard_DC2as_v6","1" +"Virtual Machines DCasv6-series Linux","Standard_DC32as_v6","16" +"Virtual Machines DCasv6-series Linux","Standard_DC48as_v6","24" +"Virtual Machines DCasv6-series Linux","Standard_DC4as_v6","2" +"Virtual Machines DCasv6-series Linux","Standard_DC64as_v6","32" +"Virtual Machines DCasv6-series Linux","Standard_DC8as_v6","4" +"Virtual Machines DCasv6-series Linux","Standard_DC96as_v6","48" +"Virtual Machines DCedsv6-series Linux","Standard_DC128eds_v6","64" +"Virtual Machines DCedsv6-series Linux","Standard_DC16eds_v6","8" +"Virtual Machines DCedsv6-series Linux","Standard_DC2eds_v6","1" +"Virtual Machines DCedsv6-series Linux","Standard_DC32eds_v6","16" +"Virtual Machines DCedsv6-series Linux","Standard_DC48eds_v6","24" +"Virtual Machines DCedsv6-series Linux","Standard_DC4eds_v6","2" +"Virtual Machines DCedsv6-series Linux","Standard_DC64eds_v6","32" +"Virtual Machines DCedsv6-series Linux","Standard_DC8eds_v6","4" +"Virtual Machines DCedsv6-series Linux","Standard_DC96eds_v6","48" +"Virtual Machines DCesv6-series Linux","Standard_DC128es_v6","64" +"Virtual Machines DCesv6-series Linux","Standard_DC16es_v6","8" +"Virtual Machines DCesv6-series Linux","Standard_DC2es_v6","1" +"Virtual Machines DCesv6-series Linux","Standard_DC32es_v6","16" +"Virtual Machines DCesv6-series Linux","Standard_DC48es_v6","24" +"Virtual Machines DCesv6-series Linux","Standard_DC4es_v6","2" +"Virtual Machines DCesv6-series Linux","Standard_DC64es_v6","32" +"Virtual Machines DCesv6-series Linux","Standard_DC8es_v6","4" +"Virtual Machines DCesv6-series Linux","Standard_DC96es_v6","48" +"Virtual Machines Dadsv6-series Linux","Standard_D16ads_v6","8" +"Virtual Machines Dadsv6-series Linux","Standard_D2ads_v6","1" +"Virtual Machines Dadsv6-series Linux","Standard_D32ads_v6","16" +"Virtual Machines Dadsv6-series Linux","Standard_D48ads_v6","24" +"Virtual Machines Dadsv6-series Linux","Standard_D4ads_v6","2" +"Virtual Machines Dadsv6-series Linux","Standard_D64ads_v6","32" +"Virtual Machines Dadsv6-series Linux","Standard_D8ads_v6","4" +"Virtual Machines Dadsv6-series Linux","Standard_D96ads_v6","48" +"Virtual Machines Dadsv7-series Linux","Standard_D128ads_v7","64" +"Virtual Machines Dadsv7-series Linux","Standard_D160ads_v7","80" +"Virtual Machines Dadsv7-series Linux","Standard_D16ads_v7","8" +"Virtual Machines Dadsv7-series Linux","Standard_D2ads_v7","1" +"Virtual Machines Dadsv7-series Linux","Standard_D32ads_v7","16" +"Virtual Machines Dadsv7-series Linux","Standard_D48ads_v7","24" +"Virtual Machines Dadsv7-series Linux","Standard_D4ads_v7","2" +"Virtual Machines Dadsv7-series Linux","Standard_D64ads_v7","32" +"Virtual Machines Dadsv7-series Linux","Standard_D8ads_v7","4" +"Virtual Machines Dadsv7-series Linux","Standard_D96ads_v7","48" +"Virtual Machines Daldsv6-series Linux","Standard_D16alds_v6","8" +"Virtual Machines Daldsv6-series Linux","Standard_D2alds_v6","1" +"Virtual Machines Daldsv6-series Linux","Standard_D32alds_v6","16" +"Virtual Machines Daldsv6-series Linux","Standard_D48alds_v6","24" +"Virtual Machines Daldsv6-series Linux","Standard_D4alds_v6","2" +"Virtual Machines Daldsv6-series Linux","Standard_D64alds_v6","32" +"Virtual Machines Daldsv6-series Linux","Standard_D8alds_v6","4" +"Virtual Machines Daldsv6-series Linux","Standard_D96alds_v6","48" +"Virtual Machines Daldsv7-series Linux","Standard_D128alds_v7","64" +"Virtual Machines Daldsv7-series Linux","Standard_D160alds_v7","80" +"Virtual Machines Daldsv7-series Linux","Standard_D16alds_v7","8" +"Virtual Machines Daldsv7-series Linux","Standard_D2alds_v7","1" +"Virtual Machines Daldsv7-series Linux","Standard_D32alds_v7","16" +"Virtual Machines Daldsv7-series Linux","Standard_D48alds_v7","24" +"Virtual Machines Daldsv7-series Linux","Standard_D4alds_v7","2" +"Virtual Machines Daldsv7-series Linux","Standard_D64alds_v7","32" +"Virtual Machines Daldsv7-series Linux","Standard_D8alds_v7","4" +"Virtual Machines Daldsv7-series Linux","Standard_D96alds_v7","48" +"Virtual Machines Dalsv6-series Linux","Standard_D16als_v6","8" +"Virtual Machines Dalsv6-series Linux","Standard_D2als_v6","1" +"Virtual Machines Dalsv6-series Linux","Standard_D32als_v6","16" +"Virtual Machines Dalsv6-series Linux","Standard_D48als_v6","24" +"Virtual Machines Dalsv6-series Linux","Standard_D4als_v6","2" +"Virtual Machines Dalsv6-series Linux","Standard_D64als_v6","32" +"Virtual Machines Dalsv6-series Linux","Standard_D8als_v6","4" +"Virtual Machines Dalsv6-series Linux","Standard_D96als_v6","48" +"Virtual Machines Dalsv7-series Linux","Standard_D128als_v7","64" +"Virtual Machines Dalsv7-series Linux","Standard_D160als_v7","80" +"Virtual Machines Dalsv7-series Linux","Standard_D16als_v7","8" +"Virtual Machines Dalsv7-series Linux","Standard_D2als_v7","1" +"Virtual Machines Dalsv7-series Linux","Standard_D32als_v7","16" +"Virtual Machines Dalsv7-series Linux","Standard_D48als_v7","24" +"Virtual Machines Dalsv7-series Linux","Standard_D4als_v7","2" +"Virtual Machines Dalsv7-series Linux","Standard_D64als_v7","32" +"Virtual Machines Dalsv7-series Linux","Standard_D8als_v7","4" +"Virtual Machines Dalsv7-series Linux","Standard_D96als_v7","48" +"Virtual Machines Dasv6-series DedicatedHost","dasv6_type1","1" +"Virtual Machines Dasv6-series Linux","Standard_D16as_v6","8" +"Virtual Machines Dasv6-series Linux","Standard_D2as_v6","1" +"Virtual Machines Dasv6-series Linux","Standard_D32as_v6","16" +"Virtual Machines Dasv6-series Linux","Standard_D48as_v6","24" +"Virtual Machines Dasv6-series Linux","Standard_D4as_v6","2" +"Virtual Machines Dasv6-series Linux","Standard_D64as_v6","32" +"Virtual Machines Dasv6-series Linux","Standard_D8as_v6","4" +"Virtual Machines Dasv6-series Linux","Standard_D96as_v6","48" +"Virtual Machines Dasv7-series Linux","Standard_D128as_v7","64" +"Virtual Machines Dasv7-series Linux","Standard_D160as_v7","80" +"Virtual Machines Dasv7-series Linux","Standard_D16as_v7","8" +"Virtual Machines Dasv7-series Linux","Standard_D2as_v7","1" +"Virtual Machines Dasv7-series Linux","Standard_D32as_v7","16" +"Virtual Machines Dasv7-series Linux","Standard_D48as_v7","24" +"Virtual Machines Dasv7-series Linux","Standard_D4as_v7","2" +"Virtual Machines Dasv7-series Linux","Standard_D64as_v7","32" +"Virtual Machines Dasv7-series Linux","Standard_D8as_v7","4" +"Virtual Machines Dasv7-series Linux","Standard_D96as_v7","48" +"Virtual Machines Ddsv6-series DedicatedHost","ddsv6_type1","1" +"Virtual Machines Ddsv6-series Linux","Standard_D128ds_v6","63.78" +"Virtual Machines Ddsv6-series Linux","Standard_D16ds_v6","8" +"Virtual Machines Ddsv6-series Linux","Standard_D192ds_v6","95.68" +"Virtual Machines Ddsv6-series Linux","Standard_D2ds_v6","1" +"Virtual Machines Ddsv6-series Linux","Standard_D32ds_v6","15.94" +"Virtual Machines Ddsv6-series Linux","Standard_D48ds_v6","23.92" +"Virtual Machines Ddsv6-series Linux","Standard_D4ds_v6","2" +"Virtual Machines Ddsv6-series Linux","Standard_D64ds_v6","31.9" +"Virtual Machines Ddsv6-series Linux","Standard_D8ds_v6","4" +"Virtual Machines Ddsv6-series Linux","Standard_D96ds_v6","47.84" +"Virtual Machines Dldsv6-series Linux","Standard_D128lds_v6","64.18" +"Virtual Machines Dldsv6-series Linux","Standard_D16lds_v6","8" +"Virtual Machines Dldsv6-series Linux","Standard_D2lds_v6","1" +"Virtual Machines Dldsv6-series Linux","Standard_D32lds_v6","16" +"Virtual Machines Dldsv6-series Linux","Standard_D48lds_v6","24.07" +"Virtual Machines Dldsv6-series Linux","Standard_D4lds_v6","2" +"Virtual Machines Dldsv6-series Linux","Standard_D64lds_v6","32.09" +"Virtual Machines Dldsv6-series Linux","Standard_D8lds_v6","4" +"Virtual Machines Dldsv6-series Linux","Standard_D96lds_v6","48.14" +"Virtual Machines Dlsv6-Series Linux","Standard_D128ls_v6","64" +"Virtual Machines Dlsv6-Series Linux","Standard_D16ls_v6","8" +"Virtual Machines Dlsv6-Series Linux","Standard_D2ls_v6","1" +"Virtual Machines Dlsv6-Series Linux","Standard_D32ls_v6","16" +"Virtual Machines Dlsv6-Series Linux","Standard_D48ls_v6","24" +"Virtual Machines Dlsv6-Series Linux","Standard_D4ls_v6","2" +"Virtual Machines Dlsv6-Series Linux","Standard_D64ls_v6","32" +"Virtual Machines Dlsv6-Series Linux","Standard_D8ls_v6","4" +"Virtual Machines Dlsv6-Series Linux","Standard_D96ls_v6","48" +"Virtual Machines Dndv6-series Linux","Standard_D128nds_v6","64" +"Virtual Machines Dndv6-series Linux","Standard_D16nds_v6","8" +"Virtual Machines Dndv6-series Linux","Standard_D2nds_v6","1" +"Virtual Machines Dndv6-series Linux","Standard_D32nds_v6","16" +"Virtual Machines Dndv6-series Linux","Standard_D48nds_v6","24" +"Virtual Machines Dndv6-series Linux","Standard_D4nds_v6","2" +"Virtual Machines Dndv6-series Linux","Standard_D64nds_v6","32" +"Virtual Machines Dndv6-series Linux","Standard_D8nds_v6","4" +"Virtual Machines Dndv6-series Linux","Standard_D96nds_v6","48" +"Virtual Machines Dnldv6-series Linux","Standard_D128nlds_v6","64" +"Virtual Machines Dnldv6-series Linux","Standard_D16nlds_v6","8" +"Virtual Machines Dnldv6-series Linux","Standard_D2nlds_v6","1" +"Virtual Machines Dnldv6-series Linux","Standard_D32nlds_v6","16" +"Virtual Machines Dnldv6-series Linux","Standard_D48nlds_v6","24" +"Virtual Machines Dnldv6-series Linux","Standard_D4nlds_v6","2" +"Virtual Machines Dnldv6-series Linux","Standard_D64nlds_v6","32" +"Virtual Machines Dnldv6-series Linux","Standard_D8nlds_v6","4" +"Virtual Machines Dnldv6-series Linux","Standard_D96nlds_v6","48" +"Virtual Machines Dnlv6-series Linux","Standard_D128nls_v6","64" +"Virtual Machines Dnlv6-series Linux","Standard_D16nls_v6","8" +"Virtual Machines Dnlv6-series Linux","Standard_D2nls_v6","1" +"Virtual Machines Dnlv6-series Linux","Standard_D32nls_v6","16" +"Virtual Machines Dnlv6-series Linux","Standard_D48nls_v6","24" +"Virtual Machines Dnlv6-series Linux","Standard_D4nls_v6","2" +"Virtual Machines Dnlv6-series Linux","Standard_D64nls_v6","32" +"Virtual Machines Dnlv6-series Linux","Standard_D8nls_v6","4" +"Virtual Machines Dnlv6-series Linux","Standard_D96nls_v6","48" +"Virtual Machines Dnv6-series Linux","Standard_D128ns_v6","64" +"Virtual Machines Dnv6-series Linux","Standard_D16ns_v6","8" +"Virtual Machines Dnv6-series Linux","Standard_D2ns_v6","1" +"Virtual Machines Dnv6-series Linux","Standard_D32ns_v6","16" +"Virtual Machines Dnv6-series Linux","Standard_D48ns_v6","24" +"Virtual Machines Dnv6-series Linux","Standard_D4ns_v6","2" +"Virtual Machines Dnv6-series Linux","Standard_D64ns_v6","32" +"Virtual Machines Dnv6-series Linux","Standard_D8ns_v6","4" +"Virtual Machines Dnv6-series Linux","Standard_D96ns_v6","48" +"Virtual Machines Dpdsv6-series Linux","Standard_D16pds_v6","8" +"Virtual Machines Dpdsv6-series Linux","Standard_D2pds_v6","1" +"Virtual Machines Dpdsv6-series Linux","Standard_D32pds_v6","16" +"Virtual Machines Dpdsv6-series Linux","Standard_D48pds_v6","24" +"Virtual Machines Dpdsv6-series Linux","Standard_D4pds_v6","2" +"Virtual Machines Dpdsv6-series Linux","Standard_D64pds_v6","32" +"Virtual Machines Dpdsv6-series Linux","Standard_D8pds_v6","4" +"Virtual Machines Dpdsv6-series Linux","Standard_D96pds_v6","48" +"Virtual Machines Dpldsv6-series Linux","Standard_D16plds_v6","8" +"Virtual Machines Dpldsv6-series Linux","Standard_D2plds_v6","1" +"Virtual Machines Dpldsv6-series Linux","Standard_D32plds_v6","16" +"Virtual Machines Dpldsv6-series Linux","Standard_D48plds_v6","24" +"Virtual Machines Dpldsv6-series Linux","Standard_D4plds_v6","2" +"Virtual Machines Dpldsv6-series Linux","Standard_D64plds_v6","32" +"Virtual Machines Dpldsv6-series Linux","Standard_D8plds_v6","4" +"Virtual Machines Dpldsv6-series Linux","Standard_D96plds_v6","48" +"Virtual Machines Dplsv6-series Linux","Standard_D16pls_v6","8" +"Virtual Machines Dplsv6-series Linux","Standard_D2pls_v6","1" +"Virtual Machines Dplsv6-series Linux","Standard_D32pls_v6","16" +"Virtual Machines Dplsv6-series Linux","Standard_D48pls_v6","24" +"Virtual Machines Dplsv6-series Linux","Standard_D4pls_v6","2" +"Virtual Machines Dplsv6-series Linux","Standard_D64pls_v6","32" +"Virtual Machines Dplsv6-series Linux","Standard_D8pls_v6","4" +"Virtual Machines Dplsv6-series Linux","Standard_D96pls_v6","48" +"Virtual Machines Dpsv6-series Linux","Standard_D16ps_v6","8" +"Virtual Machines Dpsv6-series Linux","Standard_D2ps_v6","1" +"Virtual Machines Dpsv6-series Linux","Standard_D32ps_v6","16" +"Virtual Machines Dpsv6-series Linux","Standard_D48ps_v6","24" +"Virtual Machines Dpsv6-series Linux","Standard_D4ps_v6","2" +"Virtual Machines Dpsv6-series Linux","Standard_D64ps_v6","32" +"Virtual Machines Dpsv6-series Linux","Standard_D8ps_v6","4" +"Virtual Machines Dpsv6-series Linux","Standard_D96ps_v6","48" +"Virtual Machines Dsv6-series DedicatedHost","dsv6_type1","1" +"Virtual Machines Dsv6-series Linux","Standard_D128s_v6","63.87" +"Virtual Machines Dsv6-series Linux","Standard_D16s_v6","8" +"Virtual Machines Dsv6-series Linux","Standard_D192s_v6","95.81" +"Virtual Machines Dsv6-series Linux","Standard_D2s_v6","1" +"Virtual Machines Dsv6-series Linux","Standard_D32s_v6","16" +"Virtual Machines Dsv6-series Linux","Standard_D48s_v6","24" +"Virtual Machines Dsv6-series Linux","Standard_D4s_v6","2" +"Virtual Machines Dsv6-series Linux","Standard_D64s_v6","31.94" +"Virtual Machines Dsv6-series Linux","Standard_D8s_v6","4" +"Virtual Machines Dsv6-series Linux","Standard_D96s_v6","47.9" +"Virtual Machines ECadsv6-series Linux","Standard_EC16ads_v6","8" +"Virtual Machines ECadsv6-series Linux","Standard_EC2ads_v6","1" +"Virtual Machines ECadsv6-series Linux","Standard_EC32ads_v6","16" +"Virtual Machines ECadsv6-series Linux","Standard_EC48ads_v6","24" +"Virtual Machines ECadsv6-series Linux","Standard_EC4ads_v6","2" +"Virtual Machines ECadsv6-series Linux","Standard_EC64ads_v6","32" +"Virtual Machines ECadsv6-series Linux","Standard_EC8ads_v6","4" +"Virtual Machines ECadsv6-series Linux","Standard_EC96ads_v6","48" +"Virtual Machines ECasv6-series Linux","Standard_EC16as_v6","8" +"Virtual Machines ECasv6-series Linux","Standard_EC2as_v6","1" +"Virtual Machines ECasv6-series Linux","Standard_EC32as_v6","16" +"Virtual Machines ECasv6-series Linux","Standard_EC48as_v6","24" +"Virtual Machines ECasv6-series Linux","Standard_EC4as_v6","2" +"Virtual Machines ECasv6-series Linux","Standard_EC64as_v6","32" +"Virtual Machines ECasv6-series Linux","Standard_EC8as_v6","4" +"Virtual Machines ECasv6-series Linux","Standard_EC96as_v6","48" +"Virtual Machines ECedsv6-series Linux","Standard_EC16eds_v6","8" +"Virtual Machines ECedsv6-series Linux","Standard_EC2eds_v6","1" +"Virtual Machines ECedsv6-series Linux","Standard_EC32eds_v6","16" +"Virtual Machines ECedsv6-series Linux","Standard_EC48eds_v6","24" +"Virtual Machines ECedsv6-series Linux","Standard_EC4eds_v6","2" +"Virtual Machines ECedsv6-series Linux","Standard_EC64eds_v6","32" +"Virtual Machines ECedsv6-series Linux","Standard_EC8eds_v6","4" +"Virtual Machines ECesv6-series Linux","Standard_EC16es_v6","8" +"Virtual Machines ECesv6-series Linux","Standard_EC2es_v6","1" +"Virtual Machines ECesv6-series Linux","Standard_EC32es_v6","16" +"Virtual Machines ECesv6-series Linux","Standard_EC48es_v6","24" +"Virtual Machines ECesv6-series Linux","Standard_EC4es_v6","2" +"Virtual Machines ECesv6-series Linux","Standard_EC64es_v6","32" +"Virtual Machines ECesv6-series Linux","Standard_EC8es_v6","4" +"Virtual Machines Eadsv6-series Linux","Standard_E16ads_v6","8" +"Virtual Machines Eadsv6-series Linux","Standard_E20ads_v6","10" +"Virtual Machines Eadsv6-series Linux","Standard_E2ads_v6","1" +"Virtual Machines Eadsv6-series Linux","Standard_E32ads_v6","16" +"Virtual Machines Eadsv6-series Linux","Standard_E48ads_v6","24" +"Virtual Machines Eadsv6-series Linux","Standard_E4ads_v6","2" +"Virtual Machines Eadsv6-series Linux","Standard_E64ads_v6","32" +"Virtual Machines Eadsv6-series Linux","Standard_E8ads_v6","4" +"Virtual Machines Eadsv6-series Linux","Standard_E96-24ads_v6","48.07" +"Virtual Machines Eadsv6-series Linux","Standard_E96-48ads_v6","48.07" +"Virtual Machines Eadsv6-series Linux","Standard_E96ads_v6","48.07" +"Virtual Machines Eadsv7-series Linux","Standard_E128-32ads_v7","64" +"Virtual Machines Eadsv7-series Linux","Standard_E128-64ads_v7","64" +"Virtual Machines Eadsv7-series Linux","Standard_E128ads_v7","64" +"Virtual Machines Eadsv7-series Linux","Standard_E16-4ads_v7","8" +"Virtual Machines Eadsv7-series Linux","Standard_E16-8ads_v7","8" +"Virtual Machines Eadsv7-series Linux","Standard_E160ads_v7","80" +"Virtual Machines Eadsv7-series Linux","Standard_E16ads_v7","8" +"Virtual Machines Eadsv7-series Linux","Standard_E2ads_v7","1" +"Virtual Machines Eadsv7-series Linux","Standard_E32-16ads_v7","16" +"Virtual Machines Eadsv7-series Linux","Standard_E32-8ads_v7","16" +"Virtual Machines Eadsv7-series Linux","Standard_E32ads_v7","16" +"Virtual Machines Eadsv7-series Linux","Standard_E4-2ads_v7","2" +"Virtual Machines Eadsv7-series Linux","Standard_E48ads_v7","24" +"Virtual Machines Eadsv7-series Linux","Standard_E4ads_v7","2" +"Virtual Machines Eadsv7-series Linux","Standard_E64-16ads_v7","32" +"Virtual Machines Eadsv7-series Linux","Standard_E64-32ads_v7","32" +"Virtual Machines Eadsv7-series Linux","Standard_E64ads_v7","32" +"Virtual Machines Eadsv7-series Linux","Standard_E8-2ads_v7","4" +"Virtual Machines Eadsv7-series Linux","Standard_E8-4ads_v7","4" +"Virtual Machines Eadsv7-series Linux","Standard_E8ads_v7","4" +"Virtual Machines Eadsv7-series Linux","Standard_E96-24ads_v7","48" +"Virtual Machines Eadsv7-series Linux","Standard_E96-48ads_v7","48" +"Virtual Machines Eadsv7-series Linux","Standard_E96ads_v7","48" +"Virtual Machines Easv6-series DedicatedHost","easv6_type1","1" +"Virtual Machines Easv6-series Linux","Standard_E16as_v6","8" +"Virtual Machines Easv6-series Linux","Standard_E20as_v6","10" +"Virtual Machines Easv6-series Linux","Standard_E2as_v6","1" +"Virtual Machines Easv6-series Linux","Standard_E32as_v6","16" +"Virtual Machines Easv6-series Linux","Standard_E48as_v6","24" +"Virtual Machines Easv6-series Linux","Standard_E4as_v6","2" +"Virtual Machines Easv6-series Linux","Standard_E64as_v6","32.05" +"Virtual Machines Easv6-series Linux","Standard_E8as_v6","4" +"Virtual Machines Easv6-series Linux","Standard_E96as_v6","48.08" +"Virtual Machines Easv7-series Linux","Standard_E128-32as_v7","64" +"Virtual Machines Easv7-series Linux","Standard_E128-64as_v7","64" +"Virtual Machines Easv7-series Linux","Standard_E128as_v7","64" +"Virtual Machines Easv7-series Linux","Standard_E16-4as_v7","8" +"Virtual Machines Easv7-series Linux","Standard_E16-8as_v7","8" +"Virtual Machines Easv7-series Linux","Standard_E160as_v7","80" +"Virtual Machines Easv7-series Linux","Standard_E16as_v7","8" +"Virtual Machines Easv7-series Linux","Standard_E2as_v7","1" +"Virtual Machines Easv7-series Linux","Standard_E32-16as_v7","16" +"Virtual Machines Easv7-series Linux","Standard_E32-8as_v7","16" +"Virtual Machines Easv7-series Linux","Standard_E32as_v7","16" +"Virtual Machines Easv7-series Linux","Standard_E4-2as_v7","2" +"Virtual Machines Easv7-series Linux","Standard_E48as_v7","24" +"Virtual Machines Easv7-series Linux","Standard_E4as_v7","2" +"Virtual Machines Easv7-series Linux","Standard_E64-16as_v7","32" +"Virtual Machines Easv7-series Linux","Standard_E64-32as_v7","32" +"Virtual Machines Easv7-series Linux","Standard_E64as_v7","32" +"Virtual Machines Easv7-series Linux","Standard_E8-2as_v7","4" +"Virtual Machines Easv7-series Linux","Standard_E8-4as_v7","4" +"Virtual Machines Easv7-series Linux","Standard_E8as_v7","4" +"Virtual Machines Easv7-series Linux","Standard_E96-24as_v7","48" +"Virtual Machines Easv7-series Linux","Standard_E96-48as_v7","48" +"Virtual Machines Easv7-series Linux","Standard_E96as_v7","48" +"Virtual Machines Edsv6-series Linux","Standard_E128-32ds_v6","63.81" +"Virtual Machines Edsv6-series Linux","Standard_E128-64ds_v6","63.81" +"Virtual Machines Edsv6-series Linux","Standard_E128ds_v6","63.81" +"Virtual Machines Edsv6-series Linux","Standard_E16-4ds_v6","8" +"Virtual Machines Edsv6-series Linux","Standard_E16-8ds_v6","8" +"Virtual Machines Edsv6-series Linux","Standard_E16ds_v6","8" +"Virtual Machines Edsv6-series Linux","Standard_E192ids_v6","105.29" +"Virtual Machines Edsv6-series Linux","Standard_E20ds_v6","10" +"Virtual Machines Edsv6-series Linux","Standard_E2ds_v6","1" +"Virtual Machines Edsv6-series Linux","Standard_E32-16ds_v6","16" +"Virtual Machines Edsv6-series Linux","Standard_E32-8ds_v6","16" +"Virtual Machines Edsv6-series Linux","Standard_E32ds_v6","16" +"Virtual Machines Edsv6-series Linux","Standard_E4-2ds_v6","2" +"Virtual Machines Edsv6-series Linux","Standard_E48ds_v6","23.93" +"Virtual Machines Edsv6-series Linux","Standard_E4ds_v6","2" +"Virtual Machines Edsv6-series Linux","Standard_E64-16ds_v6","31.91" +"Virtual Machines Edsv6-series Linux","Standard_E64-32ds_v6","31.91" +"Virtual Machines Edsv6-series Linux","Standard_E64ds_v6","31.91" +"Virtual Machines Edsv6-series Linux","Standard_E8-2ds_v6","4" +"Virtual Machines Edsv6-series Linux","Standard_E8-4ds_v6","4" +"Virtual Machines Edsv6-series Linux","Standard_E8ds_v6","4" +"Virtual Machines Edsv6-series Linux","Standard_E96-24ds_v6","47.86" +"Virtual Machines Edsv6-series Linux","Standard_E96-48ds_v6","47.86" +"Virtual Machines Edsv6-series Linux","Standard_E96ds_v6","47.86" +"Virtual Machines Endv6-series Linux","Standard_E128nds_v6","64" +"Virtual Machines Endv6-series Linux","Standard_E16nds_v6","8" +"Virtual Machines Endv6-series Linux","Standard_E2nds_v6","1" +"Virtual Machines Endv6-series Linux","Standard_E32nds_v6","16" +"Virtual Machines Endv6-series Linux","Standard_E48nds_v6","24" +"Virtual Machines Endv6-series Linux","Standard_E4nds_v6","2" +"Virtual Machines Endv6-series Linux","Standard_E64nds_v6","32" +"Virtual Machines Endv6-series Linux","Standard_E8nds_v6","4" +"Virtual Machines Endv6-series Linux","Standard_E96nds_v6","48" +"Virtual Machines Env6-series Linux","Standard_E128ns_v6","64" +"Virtual Machines Env6-series Linux","Standard_E16ns_v6","8" +"Virtual Machines Env6-series Linux","Standard_E2ns_v6","1" +"Virtual Machines Env6-series Linux","Standard_E32ns_v6","16" +"Virtual Machines Env6-series Linux","Standard_E48ns_v6","24" +"Virtual Machines Env6-series Linux","Standard_E4ns_v6","2" +"Virtual Machines Env6-series Linux","Standard_E64ns_v6","32" +"Virtual Machines Env6-series Linux","Standard_E8ns_v6","4" +"Virtual Machines Env6-series Linux","Standard_E96ns_v6","48" +"Virtual Machines Epdsv6-series Linux","Standard_E16pds_v6","8" +"Virtual Machines Epdsv6-series Linux","Standard_E2pds_v6","1" +"Virtual Machines Epdsv6-series Linux","Standard_E32pds_v6","16" +"Virtual Machines Epdsv6-series Linux","Standard_E48pds_v6","24" +"Virtual Machines Epdsv6-series Linux","Standard_E4pds_v6","2" +"Virtual Machines Epdsv6-series Linux","Standard_E64pds_v6","32" +"Virtual Machines Epdsv6-series Linux","Standard_E8pds_v6","4" +"Virtual Machines Epdsv6-series Linux","Standard_E96pds_v6","48" +"Virtual Machines Epsv6-series Linux","Standard_E16ps_v6","8" +"Virtual Machines Epsv6-series Linux","Standard_E2ps_v6","1" +"Virtual Machines Epsv6-series Linux","Standard_E32ps_v6","16" +"Virtual Machines Epsv6-series Linux","Standard_E48ps_v6","24" +"Virtual Machines Epsv6-series Linux","Standard_E4ps_v6","2" +"Virtual Machines Epsv6-series Linux","Standard_E64ps_v6","32" +"Virtual Machines Epsv6-series Linux","Standard_E8ps_v6","4" +"Virtual Machines Epsv6-series Linux","Standard_E96ps_v6","48" +"Virtual Machines Esv6-series DedicatedHost","esv6_type1","1" +"Virtual Machines Esv6-series Linux","Standard_E128-32s_v6","64.14" +"Virtual Machines Esv6-series Linux","Standard_E128-64s_v6","64.14" +"Virtual Machines Esv6-series Linux","Standard_E128s_v6","64.14" +"Virtual Machines Esv6-series Linux","Standard_E16-4s_v6","8" +"Virtual Machines Esv6-series Linux","Standard_E16-8s_v6","8" +"Virtual Machines Esv6-series Linux","Standard_E16s_v6","8" +"Virtual Machines Esv6-series Linux","Standard_E192is_v6","105.84" +"Virtual Machines Esv6-series Linux","Standard_E20s_v6","10" +"Virtual Machines Esv6-series Linux","Standard_E2s_v6","1" +"Virtual Machines Esv6-series Linux","Standard_E32-16s_v6","16" +"Virtual Machines Esv6-series Linux","Standard_E32-8s_v6","16" +"Virtual Machines Esv6-series Linux","Standard_E32s_v6","16" +"Virtual Machines Esv6-series Linux","Standard_E4-2s_v6","2" +"Virtual Machines Esv6-series Linux","Standard_E48s_v6","24.05" +"Virtual Machines Esv6-series Linux","Standard_E4s_v6","2" +"Virtual Machines Esv6-series Linux","Standard_E64-16s_v6","32.08" +"Virtual Machines Esv6-series Linux","Standard_E64-32s_v6","32.08" +"Virtual Machines Esv6-series Linux","Standard_E64s_v6","32.08" +"Virtual Machines Esv6-series Linux","Standard_E8-2s_v6","4" +"Virtual Machines Esv6-series Linux","Standard_E8-4s_v6","4" +"Virtual Machines Esv6-series Linux","Standard_E8s_v6","4" +"Virtual Machines Esv6-series Linux","Standard_E96-24s_v6","48.11" +"Virtual Machines Esv6-series Linux","Standard_E96-48s_v6","48.11" +"Virtual Machines Esv6-series Linux","Standard_E96s_v6","48.11" +"Virtual Machines FXmdsv2-series Linux","Standard_FX12-6mds_v2","6" +"Virtual Machines FXmdsv2-series Linux","Standard_FX12mds_v2","6" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16-4mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16-8mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24-12mds_v2","12" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24-6mds_v2","12" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24mds_v2","12" +"Virtual Machines FXmdsv2-series Linux","Standard_FX2mds_v2","1" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32-16mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32-8mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX4-2mds_v2","2" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48-12mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48-24mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX4mds_v2","2" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64-16mds_v2","31.95" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64-32mds_v2","31.95" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64mds_v2","31.95" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8-2mds_v2","4" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8-4mds_v2","4" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8mds_v2","4" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96-24mds_v2","47.92" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96-48mds_v2","47.92" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96mds_v2","47.92" +"Virtual Machines FXmsv2-series Linux","Standard_FX12-6ms_v2","6" +"Virtual Machines FXmsv2-series Linux","Standard_FX12ms_v2","6" +"Virtual Machines FXmsv2-series Linux","Standard_FX16-4ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX16-8ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX16ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX24-12ms_v2","12" +"Virtual Machines FXmsv2-series Linux","Standard_FX24-6ms_v2","12" +"Virtual Machines FXmsv2-series Linux","Standard_FX24ms_v2","12" +"Virtual Machines FXmsv2-series Linux","Standard_FX2ms_v2","1" +"Virtual Machines FXmsv2-series Linux","Standard_FX32-16ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX32-8ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX32ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX4-2ms_v2","2" +"Virtual Machines FXmsv2-series Linux","Standard_FX48-12ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX48-24ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX48ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX4ms_v2","2" +"Virtual Machines FXmsv2-series Linux","Standard_FX64-16ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX64-32ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX64ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX8-2ms_v2","4" +"Virtual Machines FXmsv2-series Linux","Standard_FX8-4ms_v2","4" +"Virtual Machines FXmsv2-series Linux","Standard_FX8ms_v2","4" +"Virtual Machines FXmsv2-series Linux","Standard_FX96-24ms_v2","48.07" +"Virtual Machines FXmsv2-series Linux","Standard_FX96-48ms_v2","48.07" +"Virtual Machines FXmsv2-series Linux","Standard_FX96ms_v2","48.07" "Virtual Machines Fadsv7-series Linux","Standard_F16ads_v7","16" "Virtual Machines Fadsv7-series Linux","Standard_F1ads_v7","1" "Virtual Machines Fadsv7-series Linux","Standard_F2ads_v7","2" @@ -1156,13 +1156,13 @@ "Virtual Machines Faldsv7-series Linux","Standard_F64alds_v7","64" "Virtual Machines Faldsv7-series Linux","Standard_F80alds_v7","80" "Virtual Machines Faldsv7-series Linux","Standard_F8alds_v7","8" -"Virtual Machines Falsv6-series Linux","Standard_F16als_v6","16" -"Virtual Machines Falsv6-series Linux","Standard_F2als_v6","2" -"Virtual Machines Falsv6-series Linux","Standard_F32als_v6","32" -"Virtual Machines Falsv6-series Linux","Standard_F48als_v6","48" -"Virtual Machines Falsv6-series Linux","Standard_F4als_v6","4" -"Virtual Machines Falsv6-series Linux","Standard_F64als_v6","64" -"Virtual Machines Falsv6-series Linux","Standard_F8als_v6","8" +"Virtual Machines Falsv6-series Linux","Standard_F16als_v6","8" +"Virtual Machines Falsv6-series Linux","Standard_F2als_v6","1" +"Virtual Machines Falsv6-series Linux","Standard_F32als_v6","16" +"Virtual Machines Falsv6-series Linux","Standard_F48als_v6","24" +"Virtual Machines Falsv6-series Linux","Standard_F4als_v6","2" +"Virtual Machines Falsv6-series Linux","Standard_F64als_v6","32" +"Virtual Machines Falsv6-series Linux","Standard_F8als_v6","4" "Virtual Machines Falsv7-series Linux","Standard_F16als_v7","16" "Virtual Machines Falsv7-series Linux","Standard_F1als_v7","1" "Virtual Machines Falsv7-series Linux","Standard_F2als_v7","2" @@ -1192,13 +1192,13 @@ "Virtual Machines Famdsv7-series Linux","Standard_F8-4amds_v7","8" "Virtual Machines Famdsv7-series Linux","Standard_F80amds_v7","80" "Virtual Machines Famdsv7-series Linux","Standard_F8amds_v7","8" -"Virtual Machines Famsv6-series Linux","Standard_F16ams_v6","16" -"Virtual Machines Famsv6-series Linux","Standard_F2ams_v6","2" -"Virtual Machines Famsv6-series Linux","Standard_F32ams_v6","32" -"Virtual Machines Famsv6-series Linux","Standard_F48ams_v6","48" -"Virtual Machines Famsv6-series Linux","Standard_F4ams_v6","4" -"Virtual Machines Famsv6-series Linux","Standard_F64ams_v6","64" -"Virtual Machines Famsv6-series Linux","Standard_F8ams_v6","8" +"Virtual Machines Famsv6-series Linux","Standard_F16ams_v6","8" +"Virtual Machines Famsv6-series Linux","Standard_F2ams_v6","1" +"Virtual Machines Famsv6-series Linux","Standard_F32ams_v6","16" +"Virtual Machines Famsv6-series Linux","Standard_F48ams_v6","24" +"Virtual Machines Famsv6-series Linux","Standard_F4ams_v6","2" +"Virtual Machines Famsv6-series Linux","Standard_F64ams_v6","32" +"Virtual Machines Famsv6-series Linux","Standard_F8ams_v6","4" "Virtual Machines Famsv7-series Linux","Standard_F16-4ams_v7","16" "Virtual Machines Famsv7-series Linux","Standard_F16-8ams_v7","16" "Virtual Machines Famsv7-series Linux","Standard_F16ams_v7","16" @@ -1219,13 +1219,13 @@ "Virtual Machines Famsv7-series Linux","Standard_F8-4ams_v7","8" "Virtual Machines Famsv7-series Linux","Standard_F80ams_v7","80" "Virtual Machines Famsv7-series Linux","Standard_F8ams_v7","8" -"Virtual Machines Fasv6-series Linux","Standard_F16as_v6","16" -"Virtual Machines Fasv6-series Linux","Standard_F2as_v6","2" -"Virtual Machines Fasv6-series Linux","Standard_F32as_v6","32" -"Virtual Machines Fasv6-series Linux","Standard_F48as_v6","48" -"Virtual Machines Fasv6-series Linux","Standard_F4as_v6","4" -"Virtual Machines Fasv6-series Linux","Standard_F64as_v6","64" -"Virtual Machines Fasv6-series Linux","Standard_F8as_v6","8" +"Virtual Machines Fasv6-series Linux","Standard_F16as_v6","8" +"Virtual Machines Fasv6-series Linux","Standard_F2as_v6","1" +"Virtual Machines Fasv6-series Linux","Standard_F32as_v6","16" +"Virtual Machines Fasv6-series Linux","Standard_F48as_v6","24" +"Virtual Machines Fasv6-series Linux","Standard_F4as_v6","2" +"Virtual Machines Fasv6-series Linux","Standard_F64as_v6","32" +"Virtual Machines Fasv6-series Linux","Standard_F8as_v6","4" "Virtual Machines Fasv7-series Linux","Standard_F16as_v7","16" "Virtual Machines Fasv7-series Linux","Standard_F1as_v7","1" "Virtual Machines Fasv7-series Linux","Standard_F2as_v7","2" @@ -1235,49 +1235,49 @@ "Virtual Machines Fasv7-series Linux","Standard_F64as_v7","64" "Virtual Machines Fasv7-series Linux","Standard_F80as_v7","80" "Virtual Machines Fasv7-series Linux","Standard_F8as_v7","8" -"Virtual Machines HBrsv4-series Linux","Standard_HB176-144rs_v4","176" -"Virtual Machines HBrsv4-series Linux","Standard_HB176-24rs_v4","176" -"Virtual Machines HBrsv4-series Linux","Standard_HB176-48rs_v4","176" -"Virtual Machines HBrsv4-series Linux","Standard_HB176-96rs_v4","176" -"Virtual Machines HBrsv4-series Linux","Standard_HB176rs_v4","176" -"Virtual Machines HBrsv5 Linux","Standard_HB368-144rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-192rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-240rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-288rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-336rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-48rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-96rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368rs_v5","368" -"Virtual Machines HXrs Linux","Standard_HX176-144rs","176" -"Virtual Machines HXrs Linux","Standard_HX176-24rs","176" -"Virtual Machines HXrs Linux","Standard_HX176-48rs","176" -"Virtual Machines HXrs Linux","Standard_HX176-96rs","176" -"Virtual Machines HXrs Linux","Standard_HX176rs","176" -"Virtual Machines Laosv4-series Linux","Standard_L12aos_v4","12" -"Virtual Machines Laosv4-series Linux","Standard_L16aos_v4","16" -"Virtual Machines Laosv4-series Linux","Standard_L24aos_v4","24" -"Virtual Machines Laosv4-series Linux","Standard_L2aos_v4","2" -"Virtual Machines Laosv4-series Linux","Standard_L32aos_v4","32" -"Virtual Machines Laosv4-series Linux","Standard_L4aos_v4","4" -"Virtual Machines Laosv4-series Linux","Standard_L8aos_v4","8" -"Virtual Machines Lasv4 Series Linux","Standard_L16as_v4","16" -"Virtual Machines Lasv4 Series Linux","Standard_L2as_v4","2" -"Virtual Machines Lasv4 Series Linux","Standard_L32as_v4","32" -"Virtual Machines Lasv4 Series Linux","Standard_L48as_v4","48" -"Virtual Machines Lasv4 Series Linux","Standard_L4as_v4","4" -"Virtual Machines Lasv4 Series Linux","Standard_L64as_v4","64" -"Virtual Machines Lasv4 Series Linux","Standard_L80as_v4","80" -"Virtual Machines Lasv4 Series Linux","Standard_L8as_v4","8" -"Virtual Machines Lasv4 Series Linux","Standard_L96as_v4","96" -"Virtual Machines Lsv4 Series Linux","Standard_L16s_v4","16" -"Virtual Machines Lsv4 Series Linux","Standard_L2s_v4","2" -"Virtual Machines Lsv4 Series Linux","Standard_L32s_v4","32" -"Virtual Machines Lsv4 Series Linux","Standard_L48s_v4","48" -"Virtual Machines Lsv4 Series Linux","Standard_L4s_v4","4" -"Virtual Machines Lsv4 Series Linux","Standard_L64s_v4","64" -"Virtual Machines Lsv4 Series Linux","Standard_L80s_v4","80" -"Virtual Machines Lsv4 Series Linux","Standard_L8s_v4","8" -"Virtual Machines Lsv4 Series Linux","Standard_L96s_v4","96" +"Virtual Machines HBrsv4-series Linux","Standard_HB176-144rs_v4","1" +"Virtual Machines HBrsv4-series Linux","Standard_HB176-24rs_v4","1" +"Virtual Machines HBrsv4-series Linux","Standard_HB176-48rs_v4","1" +"Virtual Machines HBrsv4-series Linux","Standard_HB176-96rs_v4","1" +"Virtual Machines HBrsv4-series Linux","Standard_HB176rs_v4","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-144rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-192rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-240rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-288rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-336rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-48rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-96rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368rs_v5","1" +"Virtual Machines HXrs Linux","Standard_HX176-144rs","1" +"Virtual Machines HXrs Linux","Standard_HX176-24rs","1" +"Virtual Machines HXrs Linux","Standard_HX176-48rs","1" +"Virtual Machines HXrs Linux","Standard_HX176-96rs","1" +"Virtual Machines HXrs Linux","Standard_HX176rs","1" +"Virtual Machines Laosv4-series Linux","Standard_L12aos_v4","6" +"Virtual Machines Laosv4-series Linux","Standard_L16aos_v4","8" +"Virtual Machines Laosv4-series Linux","Standard_L24aos_v4","12" +"Virtual Machines Laosv4-series Linux","Standard_L2aos_v4","1" +"Virtual Machines Laosv4-series Linux","Standard_L32aos_v4","16" +"Virtual Machines Laosv4-series Linux","Standard_L4aos_v4","2" +"Virtual Machines Laosv4-series Linux","Standard_L8aos_v4","4" +"Virtual Machines Lasv4 Series Linux","Standard_L16as_v4","8" +"Virtual Machines Lasv4 Series Linux","Standard_L2as_v4","1" +"Virtual Machines Lasv4 Series Linux","Standard_L32as_v4","16" +"Virtual Machines Lasv4 Series Linux","Standard_L48as_v4","24" +"Virtual Machines Lasv4 Series Linux","Standard_L4as_v4","2" +"Virtual Machines Lasv4 Series Linux","Standard_L64as_v4","32" +"Virtual Machines Lasv4 Series Linux","Standard_L80as_v4","40" +"Virtual Machines Lasv4 Series Linux","Standard_L8as_v4","4" +"Virtual Machines Lasv4 Series Linux","Standard_L96as_v4","48" +"Virtual Machines Lsv4 Series Linux","Standard_L16s_v4","8" +"Virtual Machines Lsv4 Series Linux","Standard_L2s_v4","1" +"Virtual Machines Lsv4 Series Linux","Standard_L32s_v4","16" +"Virtual Machines Lsv4 Series Linux","Standard_L48s_v4","24" +"Virtual Machines Lsv4 Series Linux","Standard_L4s_v4","2" +"Virtual Machines Lsv4 Series Linux","Standard_L64s_v4","32" +"Virtual Machines Lsv4 Series Linux","Standard_L80s_v4","40" +"Virtual Machines Lsv4 Series Linux","Standard_L8s_v4","4" +"Virtual Machines Lsv4 Series Linux","Standard_L96s_v4","48" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128-64bds_3_v3","31.5" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128-64bds_v3","8" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128bds_3_v3","31.5" @@ -1337,28 +1337,28 @@ "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M48s_1_v3","4" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s_1_v3","6.1" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s_2_v3","8.1" -"Virtual Machines NCCadsH100_v5_series Linux","Standard_NCC40ads_H100_v5","40" -"Virtual Machines NCadsH100_v5-series Linux","Standard_NC40ads_H100_v5","40" -"Virtual Machines NCadsH100_v5-series Linux","Standard_NC80adis_H100_v5","80" -"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC144ds_xl_RTXPRO6000BSE_v6","144" -"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC288ds_xl_RTXPRO6000BSE_v6","288" -"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC36ds_xl_RTXPRO6000BSE_v6","36" -"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC72ds_xl_RTXPRO6000BSE_v6","72" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC144lds_xl_RTXPRO6000BSE_v6","144" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC24lds_xl_RTXPRO6000BSE_v6","24" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC288lds_xl_RTXPRO6000BSE_v6","288" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC36lds_xl_RTXPRO6000BSE_v6","36" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC72lds_xl_RTXPRO6000BSE_v6","72" -"Virtual Machines ND MI300X v5 Series Linux","Standard_ND96is_MI300X_v5","96" -"Virtual Machines ND MI300X v5 Series Linux","Standard_ND96isr_MI300X_v5","96" -"Virtual Machines NDsr GB200 NDR v6 Series Linux","Standard_ND128isr_NDR_GB200_v6","128" -"Virtual Machines NDsr GB300 v6-Series Linux","Standard_ND128isr_GB300_v6","128" -"Virtual Machines NDsr H100 v5-Series Linux","Standard_ND96isr_H100_v5","106.56" -"Virtual Machines NDsr H200 v5 Series Linux","Standard_ND96isr_H200_v5","96" -"Virtual Machines NGads_V620_v1 Linux","Standard_NG16ads_V620_v1","16" -"Virtual Machines NGads_V620_v1 Linux","Standard_NG32ads_V620_v1","32" -"Virtual Machines NGads_V620_v1 Linux","Standard_NG8ads_V620_v1","8" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV12ads_V710_v5","12" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV24ads_V710_v5","24" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV4ads_V710_v5","4" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV8ads_V710_v5","8" +"Virtual Machines NCCadsH100_v5_series Linux","Standard_NCC40ads_H100_v5","1" +"Virtual Machines NCadsH100_v5-series Linux","Standard_NC40ads_H100_v5","1" +"Virtual Machines NCadsH100_v5-series Linux","Standard_NC80adis_H100_v5","2" +"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC144ds_xl_RTXPRO6000BSE_v6","4" +"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC288ds_xl_RTXPRO6000BSE_v6","8" +"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC36ds_xl_RTXPRO6000BSE_v6","1" +"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC72ds_xl_RTXPRO6000BSE_v6","2" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC144lds_xl_RTXPRO6000BSE_v6","6" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC24lds_xl_RTXPRO6000BSE_v6","1" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC288lds_xl_RTXPRO6000BSE_v6","12" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC36lds_xl_RTXPRO6000BSE_v6","1.5" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC72lds_xl_RTXPRO6000BSE_v6","3" +"Virtual Machines ND MI300X v5 Series Linux","Standard_ND96is_MI300X_v5","1" +"Virtual Machines ND MI300X v5 Series Linux","Standard_ND96isr_MI300X_v5","1" +"Virtual Machines NDsr GB200 NDR v6 Series Linux","Standard_ND128isr_NDR_GB200_v6","1" +"Virtual Machines NDsr GB300 v6-Series Linux","Standard_ND128isr_GB300_v6","1" +"Virtual Machines NDsr H100 v5-Series Linux","Standard_ND96isr_H100_v5","1" +"Virtual Machines NDsr H200 v5 Series Linux","Standard_ND96isr_H200_v5","1" +"Virtual Machines NGads_V620_v1 Linux","Standard_NG16ads_V620_v1","2" +"Virtual Machines NGads_V620_v1 Linux","Standard_NG32ads_V620_v1","4" +"Virtual Machines NGads_V620_v1 Linux","Standard_NG8ads_V620_v1","1" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV12ads_V710_v5","3" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV24ads_V710_v5","6" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV4ads_V710_v5","1" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV8ads_V710_v5","2" diff --git a/src/open-data/README.md b/src/open-data/README.md index abcdae540..1c6180b95 100644 --- a/src/open-data/README.md +++ b/src/open-data/README.md @@ -41,7 +41,7 @@ To update manually:
-The [InstanceSizeFlexibility.csv](./InstanceSizeFlexibility.csv) file maps each ARM SKU to its instance size flexibility (ISF) group and ratio. ISF lets a reservation apply across multiple SKUs in the same flexibility group; the ratio is the relative weight of each SKU within its group. It covers Virtual Machines, Redis Cache, and Dedicated Host, unioned across every physical region the ARM locations API reports (ISF groups are region-stable, but SKU availability is not, and new GPU and specialty SKUs often launch in only a handful of regions). The raw Microsoft ratios are kept as-is (they don't always start at `1` for the smallest SKU) for drop-in parity with the deprecated files; pass `-Normalize` to rescale each group so its smallest SKU is `1`. This data is updated weekly by the [Update Instance Size Flexibility](../../.github/workflows/opendata-instance-size-flexibility.yml) workflow, which queries the [Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api). Each run publishes exactly what the API returns, so records Microsoft retires from the catalog disappear from the file on the next update. +The [InstanceSizeFlexibility.csv](./InstanceSizeFlexibility.csv) file maps each ARM SKU to its instance size flexibility (ISF) group and ratio. ISF lets a reservation apply across multiple SKUs in the same flexibility group; the ratio is the relative weight of each SKU within its group. It covers Virtual Machines, Redis Cache, and Dedicated Host, unioned across every physical region the ARM locations API reports (ISF groups are region-stable, but SKU availability is not, and new GPU and specialty SKUs often launch in only a handful of regions). Each group is normalized so its smallest SKU has a ratio of `1`; pass `-Raw` to publish the Catalogs API values verbatim instead. The API leaves ratios unnormalized — only 52 of its 211 groups start at `1`, which [Microsoft's own documentation calls out](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#normalize-isf-ratios) (`BS Series` starts at `0.25`, `Ddsv5 Series` at `2`) alongside a normalization step. Both forms carry identical proportions within a group and differ by a per-group constant, and ratios are only ever meaningful within their group, so normalizing loses nothing. It is also the form the retired `isfratioblob.csv` published and the form the Optimization Engine assumes when it converts quantities into units of a group's smallest SKU. This data is updated weekly by the [Update Instance Size Flexibility](../../.github/workflows/opendata-instance-size-flexibility.yml) workflow, which queries the [Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api). Each run publishes exactly what the API returns, so records Microsoft retires from the catalog disappear from the file on the next update. SKUs whose ratio is not a positive number are dropped. The API returns one such row today (`azure_redis_cache_isolated_i100` at `0`); a zero carries no flexibility information and consumers divide by `Ratio`, so publishing it would hand them a division by zero. Ratios are also parsed and written with the invariant culture, so a comma-decimal machine can't publish `"2,1"`. diff --git a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 index 396ccf43d..b854d215e 100644 --- a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 +++ b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 @@ -176,16 +176,17 @@ Describe 'Update-InstanceSizeFlexibility' { [System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo]::new('de-DE') Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( - (New-CatalogItem -Sku 'Standard_A2_v2' -Group 'Av2 Series' -Ratio '2.1'), - (New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '4.5') + (New-CatalogItem -Sku 'Standard_A1_v2' -Group 'Av2 Series' -Ratio '2'), + (New-CatalogItem -Sku 'Standard_A2_v2' -Group 'Av2 Series' -Ratio '2.1') ) } Invoke-Generator $baseParams + # 2.1 / 2 = 1.05. Culture-aware parsing reads "2.1" as 21 and would write "10,5". $raw = Get-Content $outFile -Raw - $raw | Should -BeLike '*"Standard_A2_v2","2.1"*' - $raw | Should -BeLike '*"Standard_D2","4.5"*' + $raw | Should -BeLike '*"Standard_A1_v2","1"*' + $raw | Should -BeLike '*"Standard_A2_v2","1.05"*' } finally { @@ -341,6 +342,16 @@ Describe 'Update-InstanceSizeFlexibility' { $duplicates.Name | Should -BeNullOrEmpty } + It 'Has every flexibility group normalized to a smallest ratio of 1' { + $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" + $notNormalized = @( + $csv | Group-Object InstanceSizeFlexibilityGroup | Where-Object { + [Math]::Abs((($_.Group.Ratio | ForEach-Object { [double]$_ } | Measure-Object -Minimum).Minimum) - 1) -gt 0.0001 + } + ) + $notNormalized.Name | Should -BeNullOrEmpty + } + It 'Has no zero or negative ratios' { # Consumers multiply and divide by Ratio, so a non-positive value is unusable. $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" @@ -354,7 +365,7 @@ Describe 'Update-InstanceSizeFlexibility' { } Context 'Normalization' { - It 'Rescales each group so the smallest ratio is 1 when -Normalize is set' { + It 'Rescales each group so the smallest ratio is 1 by default' { Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( (New-CatalogItem -Sku 'Standard_B1s' -Group 'BS Series' -Ratio '0.25'), @@ -363,10 +374,7 @@ Describe 'Update-InstanceSizeFlexibility' { (New-CatalogItem -Sku 'Standard_D4' -Group 'DSeries' -Ratio '2') ) } - $params = $baseParams.Clone() - $params.Normalize = $true - - Invoke-Generator $params + Invoke-Generator $baseParams $rows = @(Import-Csv $outFile) ($rows | Where-Object ArmSkuName -eq 'Standard_B1s').Ratio | Should -Be '1' @@ -375,7 +383,7 @@ Describe 'Update-InstanceSizeFlexibility' { ($rows | Where-Object ArmSkuName -eq 'Standard_D4').Ratio | Should -Be '2' } - It 'Keeps raw ratios by default' { + It 'Keeps the API ratios verbatim when -Raw is set' { Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( (New-CatalogItem -Sku 'Standard_B1s' -Group 'BS Series' -Ratio '0.25'), @@ -383,7 +391,10 @@ Describe 'Update-InstanceSizeFlexibility' { ) } - Invoke-Generator $baseParams + $params = $baseParams.Clone() + $params.Raw = $true + + Invoke-Generator $params $rows = @(Import-Csv $outFile) ($rows | Where-Object ArmSkuName -eq 'Standard_B1s').Ratio | Should -Be '0.25' diff --git a/src/scripts/Update-InstanceSizeFlexibility.ps1 b/src/scripts/Update-InstanceSizeFlexibility.ps1 index af49446ec..05ce4b63d 100644 --- a/src/scripts/Update-InstanceSizeFlexibility.ps1 +++ b/src/scripts/Update-InstanceSizeFlexibility.ps1 @@ -54,11 +54,21 @@ .PARAMETER ApiVersion Catalogs API version. Default = 2022-03-01. - .PARAMETER Normalize - Normalize ratios so the smallest SKU in each flexibility group has a ratio of 1. The raw API - ratios don't always start at 1 (e.g. BS Series starts at 0.25). When omitted, the raw Microsoft - ratios are kept for drop-in parity with the deprecated isfratioblob.csv / - AutofitComboMeterData.csv files that downstream tools (Power BI, Optimization Engine) expect. + .PARAMETER Raw + Publish the Catalogs API ratios verbatim instead of normalizing them. + + By default each flexibility group is normalized so its smallest SKU has a ratio of 1. The API + leaves ratios unnormalized -- only 52 of 211 groups start at 1, and Microsoft's own + documentation calls this out (BS Series starts at 0.25, Ddsv5 Series at 2) and publishes a + normalization step alongside it. Both forms carry identical proportions within a group and + differ by a per-group constant. + + Normalized is the form the retired isfratioblob.csv published and the form downstream tools + assume: the Optimization Engine converts quantities into units of a group's smallest SKU, and + a ratio scale that doesn't start at 1 silently inflates those absolute figures. Ratios are only + ever meaningful within their group, so normalizing loses nothing. + + See https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#normalize-isf-ratios .EXAMPLE ./Update-InstanceSizeFlexibility.ps1 @@ -84,7 +94,7 @@ param( [string]$LocationApiVersion = '2022-12-01', - [switch]$Normalize + [switch]$Raw ) $ErrorActionPreference = 'Stop' @@ -332,7 +342,7 @@ if ($duplicateSkus) # ----------------------------------------------------------------------- # Step 2: Normalize, sort, and write output # ----------------------------------------------------------------------- -if ($Normalize) +if (-not $Raw) { Write-Host "Normalizing ratios (smallest SKU per group = 1)..." $allRecords = Get-NormalizedRecords -Records $allRecords From 6fcf79f8bc27f0a20f8253324ca44e3c9f68d870 Mon Sep 17 00:00:00 2001 From: Roland Krummenacher Date: Fri, 11 Sep 2026 13:53:49 +0200 Subject: [PATCH 9/9] fix(aoe): guard the remaining ISF joins and scope the fallback to ISF types Addresses review feedback on #2308. - Add the coalesce guard to the three ISF joins that were already leftouter before this PR and so never appeared in the diff. Without it, a reservation on a retired SKU still contributed nothing to "Unused Reservations over time (by VM count)" with Use ISF = Yes, collapsed into a single mislabeled series in the by-SKU cost chart, and showed a blank ISF group in the reservations grid. All ten ISF joins are now leftouter and guarded. - Scope the unmatched-SKU fallback to the reserved resource types that have instance size flexibility, matching the types the ISF dataset covers. Types without it keep their prior behavior in the Use ISF = Yes views and remain fully listed in the Use ISF = No views. - Extract Invoke-ArmRequest so region enumeration retries transient failures like every other ARM call in the generator. It is the first call the weekly run makes and a prerequisite for all of them, so a single 429 or 5xx failed the whole refresh before it fetched a single catalog page. - Merge the duplicate Optimization Engine "Fixed" block, replace the instance size flexibility sample table with rows that exist in the file, and fold the new dataset's fix bullets into nested notes under "Added". Co-Authored-By: Claude Opus 5 (1M context) --- docs-mslearn/toolkit/changelog.md | 14 +-- docs-mslearn/toolkit/open-data.md | 12 +- .../views/workbooks/reservations-usage.json | 10 +- .../Update-InstanceSizeFlexibility.Tests.ps1 | 30 +++++ .../Update-InstanceSizeFlexibility.ps1 | 104 +++++++++++------- 5 files changed, 108 insertions(+), 62 deletions(-) diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index 264ee8f01..46fd6d124 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -3,7 +3,7 @@ title: FinOps toolkit changelog description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more. author: MSBrett ms.author: brettwil -ms.date: 09/09/2026 +ms.date: 09/11/2026 ms.topic: reference ms.service: finops ms.subservice: finops-toolkit @@ -60,15 +60,13 @@ The following section lists features and enhancements that are currently in deve ### [Optimization Engine](optimization-engine/overview.md) -- **Fixed** - - Fixed reservations disappearing from the reservation workbooks when their SKU is no longer sold. The instance size flexibility joins required a match, so an active reservation on a retired size was dropped from the report entirely rather than shown with its utilization ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - - **Added** - Added a comprehensive [Azure Optimization Engine reference](optimization-engine/reference.md) for runbooks, schedules, variables, Log Analytics tables, and SQL Database tables ([#1271](https://github.com/microsoft/finops-toolkit/issues/1271)). - **Changed** - Switched the reservations and benefits workbooks from the retired `ccmstorageprod` isfratioblob.csv to the FinOps toolkit [Instance size flexibility](open-data.md#instance-size-flexibility) open data file ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - **Fixed** - Fixed a regression in the `AzureOptimizationConsumptionV1_CL` schema that was breaking the Reservations Usage workbook ([#2301](https://github.com/microsoft/finops-toolkit/issues/2301)). + - Fixed reservations disappearing from the reservation workbooks when their SKU is no longer sold. The instance size flexibility joins required a match, so an active reservation on a retired size was dropped from the report entirely rather than shown with its utilization. Unmatched SKUs now fall back to their own name as the flexibility group and a ratio of 1. The fallback applies to the reserved resource types that have instance size flexibility: virtual machines, Redis Cache, and dedicated hosts ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). ### [PowerShell module](powershell/powershell-commands.md) @@ -81,11 +79,9 @@ The following section lists features and enhancements that are currently in deve - **Added** - Added a new [Instance size flexibility](open-data.md#instance-size-flexibility) dataset that maps each ARM SKU to its instance size flexibility group and ratio, sourced from the Azure Reservations Catalogs API. It replaces the deprecated ISF ratio files hosted on `ccmstorageprod.blob.core.windows.net` ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). -- **Fixed** - - Fixed the instance size flexibility generator sweeping a hardcoded list of 26 regions, which omitted SKUs that launch in only a handful of regions. It now enumerates every physical region from the ARM locations API, 63 at the time of the change ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - - Fixed ratios being parsed and written with the current culture. On a comma-decimal machine `2.1` was read as `21` or rejected, and written back as `2,1`, which would break every consumer of the file ([#2308](https://github.com/microsoft/finops-toolkit/pull/2308)). - - Fixed the dataset publishing unnormalized ratios. The Catalogs API leaves them unnormalized, so a group's smallest SKU is usually not `1`, while the retired ratio file it replaced was normalized and the Optimization Engine converts quantities into units of a group's smallest SKU. Absolute quantities in the reservation workbooks were inflated by a per-group constant as a result. Each group is now normalized, matching the retired file for 1,223 of the 1,291 rows they share ([#2309](https://github.com/microsoft/finops-toolkit/issues/2309)). - - Fixed the dataset publishing a SKU whose ratio is `0`, which the Optimization Engine's benefits simulation divides by. Non-positive ratios are now dropped ([#2308](https://github.com/microsoft/finops-toolkit/pull/2308)). + - Ratios use the same scale as the retired isfratioblob.csv: each flexibility group is normalized so its smallest SKU is `1`, matching the retired file for 1,223 of the 1,291 rows the two share. The Catalogs API publishes them unnormalized, and the Optimization Engine converts quantities into units of a group's smallest SKU ([#2309](https://github.com/microsoft/finops-toolkit/issues/2309)). + - Covers every physical Azure region instead of a fixed region list, so SKUs that launch in only a handful of regions are included. + - Refreshes weekly from the live catalog, so newly released SKUs appear and retired SKUs age out without anyone republishing the file. **[Commitment discount eligibility](open-data.md#commitment-discount-eligibility)** diff --git a/docs-mslearn/toolkit/open-data.md b/docs-mslearn/toolkit/open-data.md index b05a6b6a6..99cd98f92 100644 --- a/docs-mslearn/toolkit/open-data.md +++ b/docs-mslearn/toolkit/open-data.md @@ -4,7 +4,7 @@ description: Use open data to normalize and enhance your FinOps reporting, ensur ms.topic: concept-article author: flanakin ms.author: micflan -ms.date: 09/09/2026 +ms.date: 09/11/2026 ms.service: finops ms.subservice: finops-toolkit ms.reviewer: micflan @@ -185,11 +185,11 @@ Instance size flexibility (ISF) lets a reservation apply across multiple SKUs in Sample data: -| InstanceSizeFlexibilityGroup | ArmSkuName | Ratio | -| ---------------------------- | -------------- | ----- | -| Av2 Series | Standard_A1_v2 | 1 | -| Av2 Series | Standard_A2_v2 | 2.1 | -| Av2 Series | Standard_A4_v2 | 4.44 | +| InstanceSizeFlexibilityGroup | ArmSkuName | Ratio | +| ------------------------------------ | ----------------- | ----- | +| Virtual Machines Dadsv6-series Linux | Standard_D2ads_v6 | 1 | +| Virtual Machines Dadsv6-series Linux | Standard_D4ads_v6 | 2 | +| Virtual Machines Dadsv6-series Linux | Standard_D8ads_v6 | 4 | A few important notes about the data: diff --git a/src/optimization-engine/views/workbooks/reservations-usage.json b/src/optimization-engine/views/workbooks/reservations-usage.json index b35474706..e38e06deb 100644 --- a/src/optimization-engine/views/workbooks/reservations-usage.json +++ b/src/optimization-engine/views/workbooks/reservations-usage.json @@ -536,7 +536,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| distinct MeterID_g, OnDemandUnitPrice\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s;\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UsedQuantity = todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100\r\n | extend UsedQuantity30d = todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100\r\n | extend SKUName_s=tolower(SKUName_s)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, UsedQuantity, UsedQuantity30d, TotalReservedQuantity_s, Term_s, AppliedScopeType_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s, Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), UsedQuantity, UsedQuantity30d, Term_s, AppliedScopeType_s\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| join kind=leftouter ( ReservationOnDemandMeters ) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter ( ReservationPricesheet ) on SkuName and Location_s and Term_s\r\n| join kind=leftouter ( OnDemandPriceSheet ) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| extend AvgRIsUsedInSmallestRatio = Ratio * AvgRIsUsedDaily\r\n| summarize TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), AvgRIsUsedDaily=sum(AvgRIsUsedInSmallestRatio), UsedQuantity=sum(UsedQuantity*Ratio), UsedQuantity30d=sum(UsedQuantity30d*Ratio), AvgDiscountPercent=avg(DiscountPercent) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = UsedQuantity/TotalReservedQuantity_s*100, Util30Days_s = UsedQuantity30d/TotalReservedQuantity_s*100\r\n| extend AvgRIUsagePercentInSmallestRatio = round(AvgRIsUsedDaily / TotalReservedQuantity_s * 100, 1)\r\n| extend AvgDiscountPercent=iif(AvgDiscountPercent > 0.0, AvgDiscountPercent, 0.0)\r\n| extend SavingsMargin=round(todouble(Util7Days_s))-100.0+AvgDiscountPercent \r\n| project-away AvgRIUsagePercentInSmallestRatio, AvgRIsUsedDaily\r\n| project-reorder ISFGroup, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UsedQuantity, Util30Days_s, UsedQuantity30d\r\n| order by Util7Days_s asc", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\n// The reserved resource types that have instance size flexibility, matching the types the ISF\r\n// dataset covers. Other types carry no flexibility group, so they belong in the Use ISF = No views.\r\nlet IsfResourceTypes = dynamic(['VirtualMachines', 'RedisCache', 'DedicatedHost']);\r\nlet LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| distinct MeterID_g, OnDemandUnitPrice\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s;\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | where ResourceType in~ (IsfResourceTypes)\r\n | extend UsedQuantity = todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100\r\n | extend UsedQuantity30d = todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100\r\n | extend SKUName_s=tolower(SKUName_s)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, UsedQuantity, UsedQuantity30d, TotalReservedQuantity_s, Term_s, AppliedScopeType_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s, Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), UsedQuantity, UsedQuantity30d, Term_s, AppliedScopeType_s\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| join kind=leftouter ( ReservationOnDemandMeters ) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter ( ReservationPricesheet ) on SkuName and Location_s and Term_s\r\n| join kind=leftouter ( OnDemandPriceSheet ) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| extend AvgRIsUsedInSmallestRatio = Ratio * AvgRIsUsedDaily\r\n| summarize TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), AvgRIsUsedDaily=sum(AvgRIsUsedInSmallestRatio), UsedQuantity=sum(UsedQuantity*Ratio), UsedQuantity30d=sum(UsedQuantity30d*Ratio), AvgDiscountPercent=avg(DiscountPercent) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = UsedQuantity/TotalReservedQuantity_s*100, Util30Days_s = UsedQuantity30d/TotalReservedQuantity_s*100\r\n| extend AvgRIUsagePercentInSmallestRatio = round(AvgRIsUsedDaily / TotalReservedQuantity_s * 100, 1)\r\n| extend AvgDiscountPercent=iif(AvgDiscountPercent > 0.0, AvgDiscountPercent, 0.0)\r\n| extend SavingsMargin=round(todouble(Util7Days_s))-100.0+AvgDiscountPercent \r\n| project-away AvgRIUsagePercentInSmallestRatio, AvgRIsUsedDaily\r\n| project-reorder ISFGroup, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UsedQuantity, Util30Days_s, UsedQuantity30d\r\n| order by Util7Days_s asc", "size": 0, "showAnalytics": true, "title": "Reservation Usage Details grouped by ISF group (click on a line for more details)", @@ -1057,7 +1057,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend UnusedCost = todouble(CostInBillingCurrency_s)\r\n| join kind=leftouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, SKUName_s=tolower(SKUName_s), Location_s\r\n) on ReservationId_g\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend SKUName = iif('{UseISF}' == 'Yes', strcat(ISFGroup, \" \", Location_s), strcat(SKUName_s, \" \", Location_s))\r\n| extend SKUName = iif(strlen(SKUName) < 2, 'Canceled RIs', SKUName)\r\n| summarize sum(UnusedCost) by todatetime(Date_s), SKUName", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend UnusedCost = todouble(CostInBillingCurrency_s)\r\n| join kind=leftouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, SKUName_s=tolower(SKUName_s), Location_s\r\n) on ReservationId_g\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n// coalesce is load-bearing here: KQL strings have no null, so an unmatched leftouter yields an empty\r\n// string, and coalesce is the operator that treats empty as missing (isnull(\"\") is false).\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s)\r\n| extend SKUName = iif('{UseISF}' == 'Yes', strcat(ISFGroup, \" \", Location_s), strcat(SKUName_s, \" \", Location_s))\r\n| extend SKUName = iif(strlen(SKUName) < 2, 'Canceled RIs', SKUName)\r\n| summarize sum(UnusedCost) by todatetime(Date_s), SKUName", "size": 0, "showAnalytics": true, "title": "Cost of Unused Reservations over time (by SKU)", @@ -1090,7 +1090,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend UnusedHours = todouble(Quantity_s)\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, SKUName_s=tolower(SKUName_s), Location_s\r\n) on ReservationId_g\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend SKUName = iif('{UseISF}' == 'Yes', strcat(ISFGroup, \" \", Location_s), strcat(SKUName_s, \" \", Location_s))\r\n| extend UnusedVMs = iif('{UseISF}' == 'Yes', UnusedHours * Ratio / 24, UnusedHours / 24)\r\n| summarize sum(UnusedVMs) by todatetime(Date_s), SKUName", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend UnusedHours = todouble(Quantity_s)\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, SKUName_s=tolower(SKUName_s), Location_s\r\n) on ReservationId_g\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| extend SKUName = iif('{UseISF}' == 'Yes', strcat(ISFGroup, \" \", Location_s), strcat(SKUName_s, \" \", Location_s))\r\n| extend UnusedVMs = iif('{UseISF}' == 'Yes', UnusedHours * Ratio / 24, UnusedHours / 24)\r\n| summarize sum(UnusedVMs) by todatetime(Date_s), SKUName", "size": 0, "showAnalytics": true, "title": "Unused Reservations over time (by VM count)", @@ -1310,7 +1310,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| summarize TotalUnusedCost = sum(todouble(CostInBillingCurrency_s)) by ReservationId_g\r\n| where round(TotalUnusedCost) > 0\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s=tolower(SKUName_s), Location_s, TotalReservedQuantity_s, Term_s, AppliedScopeType_s, UnusedQuantity, UnusedQuantity30d\r\n) on ReservationId_g\r\n| project-away ReservationId_g1\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| summarize TotalUnusedCost=sum(TotalUnusedCost), TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), UnusedQuantity=sum(UnusedQuantity*Ratio), UnusedQuantity30d=sum(UnusedQuantity30d*Ratio) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = (1-UnusedQuantity/TotalReservedQuantity_s)*100, Util30Days_s = (1-UnusedQuantity30d/TotalReservedQuantity_s)*100\r\n| project-reorder ISFGroup, TotalUnusedCost, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UnusedQuantity, Util30Days_s\r\n| order by TotalUnusedCost", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\n// The reserved resource types that have instance size flexibility, matching the types the ISF\r\n// dataset covers. Other types carry no flexibility group, so they belong in the Use ISF = No views.\r\nlet IsfResourceTypes = dynamic(['VirtualMachines', 'RedisCache', 'DedicatedHost']);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| summarize TotalUnusedCost = sum(todouble(CostInBillingCurrency_s)) by ReservationId_g\r\n| where round(TotalUnusedCost) > 0\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | where ResourceType in~ (IsfResourceTypes)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s=tolower(SKUName_s), Location_s, TotalReservedQuantity_s, Term_s, AppliedScopeType_s, UnusedQuantity, UnusedQuantity30d\r\n) on ReservationId_g\r\n| project-away ReservationId_g1\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| summarize TotalUnusedCost=sum(TotalUnusedCost), TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), UnusedQuantity=sum(UnusedQuantity*Ratio), UnusedQuantity30d=sum(UnusedQuantity30d*Ratio) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = (1-UnusedQuantity/TotalReservedQuantity_s)*100, Util30Days_s = (1-UnusedQuantity30d/TotalReservedQuantity_s)*100\r\n| project-reorder ISFGroup, TotalUnusedCost, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UnusedQuantity, Util30Days_s\r\n| order by TotalUnusedCost", "size": 2, "showAnalytics": true, "title": "Unused Reservations Details (grouped by Instance Size Flexibility group)", @@ -1485,7 +1485,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = materialize(AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s);\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nlet ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend skuName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, Util7Days_s, Util30Days_s, TotalReservedQuantity_s, Term_s, ExpiryDate_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s=tolower(SKUName_s), Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), Util7Days_s, Util30Days_s, Term_s, ExpiryDate_s\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s==$right.skuName\r\n| join kind=leftouter (ReservationOnDemandMeters) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter (ReservationPricesheet) on SkuName and Location_s and Term_s\r\n| join kind=leftouter (OnDemandPriceSheet) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| project-away ReservationPrice\r\n| join kind=leftouter (ReservationPricesheet) on $left.SKUName_s==$right.SkuName and Location_s and Term_s\r\n| extend HoursUntilExpiry=(todatetime(ExpiryDate_s)-now())/1h\r\n| extend TotalReservedHoursToConsume=todouble(TotalReservedQuantity_s)*HoursUntilExpiry\r\n| extend AmountRemainingToConsume = round(TotalReservedHoursToConsume * ReservationPrice, 2)\r\n| project ReservationId_g, ReservationName_s, TotalReservedQuantity_s=round(todouble(TotalReservedQuantity_s)), SKUName_s, ISFGroup, Location_s, Term_s, ExpiryDate_s, AmountRemainingToConsume, AvgRIsUsedDaily, Util7Days_s=round(todouble(Util7Days_s)), Util30Days_s=round(todouble(Util30Days_s)), DiscountPercent, SavingsMargin=round(todouble(Util7Days_s))-100.0+DiscountPercent \r\n| order by Util7Days_s asc", + "query": "let LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = materialize(AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s);\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nlet ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend skuName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, Util7Days_s, Util30Days_s, TotalReservedQuantity_s, Term_s, ExpiryDate_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s=tolower(SKUName_s), Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), Util7Days_s, Util30Days_s, Term_s, ExpiryDate_s\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s==$right.skuName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s)\r\n| join kind=leftouter (ReservationOnDemandMeters) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter (ReservationPricesheet) on SkuName and Location_s and Term_s\r\n| join kind=leftouter (OnDemandPriceSheet) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| project-away ReservationPrice\r\n| join kind=leftouter (ReservationPricesheet) on $left.SKUName_s==$right.SkuName and Location_s and Term_s\r\n| extend HoursUntilExpiry=(todatetime(ExpiryDate_s)-now())/1h\r\n| extend TotalReservedHoursToConsume=todouble(TotalReservedQuantity_s)*HoursUntilExpiry\r\n| extend AmountRemainingToConsume = round(TotalReservedHoursToConsume * ReservationPrice, 2)\r\n| project ReservationId_g, ReservationName_s, TotalReservedQuantity_s=round(todouble(TotalReservedQuantity_s)), SKUName_s, ISFGroup, Location_s, Term_s, ExpiryDate_s, AmountRemainingToConsume, AvgRIsUsedDaily, Util7Days_s=round(todouble(Util7Days_s)), Util30Days_s=round(todouble(Util30Days_s)), DiscountPercent, SavingsMargin=round(todouble(Util7Days_s))-100.0+DiscountPercent \r\n| order by Util7Days_s asc", "size": 0, "showAnalytics": true, "timeContextFromParameter": "LookbackPeriod", diff --git a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 index b854d215e..0c23bda67 100644 --- a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 +++ b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 @@ -333,6 +333,36 @@ Describe 'Update-InstanceSizeFlexibility' { { Invoke-Generator @{ OutputPath = $outFile } } | Should -Throw -ExpectedMessage '*HTTP 403 enumerating regions*' } + + It 'Retries a transient failure when enumerating regions instead of failing the run' { + # Region enumeration is a hard prerequisite for every catalog call, so a single 429 or + # 5xx here would otherwise fail the whole weekly refresh before it fetched anything. + $script:locationsCallCount = 0 + Mock Invoke-AzRestMethod { + if ($Uri -like '*/locations?*') + { + $script:locationsCallCount++ + if ($script:locationsCallCount -eq 1) + { + New-LocationsResponse -Locations @() -StatusCode 503 + } + else + { + New-LocationsResponse -Locations @(@{ name = 'eastus'; metadata = @{ regionType = 'Physical' } }) + } + } + else + { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '1')) + } + } + + Invoke-Generator @{ OutputPath = $outFile; ReservedResourceType = @('VirtualMachines') } + + @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_D2' + Should -Invoke Invoke-AzRestMethod -Exactly -Times 2 -ParameterFilter { $Uri -like '*/locations?*' } + Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*location=eastus*' } + } } Context 'Published dataset' { diff --git a/src/scripts/Update-InstanceSizeFlexibility.ps1 b/src/scripts/Update-InstanceSizeFlexibility.ps1 index 05ce4b63d..c6406267a 100644 --- a/src/scripts/Update-InstanceSizeFlexibility.ps1 +++ b/src/scripts/Update-InstanceSizeFlexibility.ps1 @@ -99,6 +99,64 @@ param( $ErrorActionPreference = 'Stop' +function Invoke-ArmRequest +{ + <# + .SYNOPSIS + Issues a GET against ARM, retrying transient failures with exponential backoff. + + .DESCRIPTION + Retries network exceptions and 429/5xx responses; non-retryable 4xx throws immediately. + Every ARM call in this script goes through here -- a single transient failure on any one + of them fails the whole weekly refresh, and the next scheduled attempt is a week away. + + .PARAMETER Description + What the call is doing, used verbatim in error and progress messages, e.g. 'enumerating + regions' or 'on VirtualMachines/eastus page 3'. + #> + param( + [string]$Uri, + [string]$Description, + [int]$MaxRetries = 5 + ) + + $retries = 0 + + while ($true) + { + try + { + $response = Invoke-AzRestMethod -Uri $Uri -Method GET + } + catch + { + $retries++ + if ($retries -gt $MaxRetries) { throw "Failed after $MaxRetries retries $Description`: $_" } + $wait = [Math]::Pow(2, $retries) * 5 + Write-Host " Error $Description, retrying in ${wait}s (attempt $retries/$MaxRetries)" + Start-Sleep -Seconds $wait + continue + } + + if ($response.StatusCode -eq 429 -or $response.StatusCode -ge 500) + { + $retries++ + if ($retries -gt $MaxRetries) { throw "Failed after $MaxRetries retries $Description (HTTP $($response.StatusCode))" } + $wait = [Math]::Pow(2, $retries) * 5 + Write-Host " HTTP $($response.StatusCode) $Description, retrying in ${wait}s (attempt $retries/$MaxRetries)" + Start-Sleep -Seconds $wait + continue + } + + if ($response.StatusCode -ge 400) + { + throw "HTTP $($response.StatusCode) $Description`: $($response.Content)" + } + + return $response + } +} + # ----------------------------------------------------------------------- # Step 0: Validate the Azure context (the Catalogs API is authenticated) # ----------------------------------------------------------------------- @@ -124,11 +182,7 @@ if (-not $Location) # Az.Accounts is the only module the workflow installs, so this uses the REST API rather than # Get-AzLocation, which lives in Az.Resources. $locationsUri = "https://management.azure.com/subscriptions/$SubscriptionId/locations?api-version=$LocationApiVersion" - $locationsResponse = Invoke-AzRestMethod -Uri $locationsUri -Method GET - if ($locationsResponse.StatusCode -ge 400) - { - throw "HTTP $($locationsResponse.StatusCode) enumerating regions: $($locationsResponse.Content)" - } + $locationsResponse = Invoke-ArmRequest -Uri $locationsUri -Description 'enumerating regions' $Location = @( ($locationsResponse.Content | ConvertFrom-Json -Depth 20).value | @@ -166,44 +220,10 @@ function Invoke-CatalogsApi while ($uri) { $page++ - $retries = 0 - $maxRetries = 5 - # Retry transient failures (network exceptions and 429/5xx) on the SAME page, without - # advancing the paging loop, so $page counts and the retry cap stay correct. - $response = $null - while ($true) - { - try - { - $response = Invoke-AzRestMethod -Uri $uri -Method GET - } - catch - { - $retries++ - if ($retries -gt $maxRetries) { throw "Failed after $maxRetries retries on $ResourceType/$Region page $page`: $_" } - $wait = [Math]::Pow(2, $retries) * 5 - Write-Host " Error on $ResourceType/$Region page $page, retrying in ${wait}s (attempt $retries/$maxRetries)" - Start-Sleep -Seconds $wait - continue - } - - if ($response.StatusCode -eq 429 -or $response.StatusCode -ge 500) - { - $retries++ - if ($retries -gt $maxRetries) { throw "Failed after $maxRetries retries on $ResourceType/$Region page $page (HTTP $($response.StatusCode))" } - $wait = [Math]::Pow(2, $retries) * 5 - Write-Host " HTTP $($response.StatusCode) on $ResourceType/$Region page $page, retrying in ${wait}s (attempt $retries/$maxRetries)" - Start-Sleep -Seconds $wait - continue - } - if ($response.StatusCode -ge 400) - { - throw "HTTP $($response.StatusCode) on $ResourceType/$Region page $page`: $($response.Content)" - } - - break - } + # Transient failures are retried on the SAME page, without advancing the paging loop, so + # $page counts and the retry cap stay correct. + $response = Invoke-ArmRequest -Uri $uri -Description "on $ResourceType/$Region page $page" $json = $response.Content | ConvertFrom-Json -Depth 100