Skip to content

Azure Resource Graph: emit resource-type-specific fields (VM SKU, managed disks, DB tier) for real-SDK discovery/cost E2E #315

Description

@NitinKumar004

Summary

The Azure Resource Graph emulator (server/azure/resourcegraph + resourcediscovery) returns a generic cross-cloud inventory rather than Azure-type-specific ARG rows. A real azure-sdk-for-go consumer that reads resource-type-specific fields (VM SKU, disk SKU/size, standalone managed disks, DB tier, etc.) cannot drive an end-to-end discovery/cost test against cloudemu today, because those fields aren't projected into the ARG response.

This blocks a real use case: pointing a production Azure discoverer + cost engine at cloudemu to verify SKU/tier/size-sensitive logic with no real account — which is otherwise cloudemu's strongest value proposition.

Evidence (real-SDK round trip)

Driving the real armresourcegraph client against httptest.NewTLSServer(azureserver.New(...)) with a VM and a CreateVolume disk seeded:

cloudP := cloudemu.NewAzure()
cloudP.VirtualMachines.RunInstances(ctx, computedriver.InstanceConfig{InstanceType: "Standard_D2s_v3"}, 1)
cloudP.VirtualMachines.CreateVolume(ctx, computedriver.VolumeConfig{Size: 4, VolumeType: "Premium_LRS"})
// ...azureserver.New(Drivers{VirtualMachines, Disks, ResourceDiscovery, SubscriptionID})...

Querying Resources | where type in~ (...) via the real SDK returns:

Expected (real Azure ARG) cloudemu today
VM row with sku.name = Standard_D2s_v3 (or properties.hardwareProfile.vmSize) VM row present, but SKU field empty — consumer reads InstanceType = ""
microsoft.compute/disks row with sku.name + properties.diskSizeGB + managedBy No disk row emitted at all (CreateVolume volume not surfaced in ARG)

Requested fidelity (fields real Azure ARG returns; needed for discovery/cost E2E)

1. Compute VMs — project into the ARG row:

  • sku.name or properties.hardwareProfile.vmSize = the VM size (e.g. Standard_D2s_v3)
  • properties.storageProfile.osDisk.osType (Linux/Windows)
  • properties.priority = Spot (interruptible pricing)
  • properties.licenseType (Windows_Server / RHEL_BYOS — Azure Hybrid Benefit)

2. Managed Disks (highest impact) — surface CreateVolume/CreateDisk volumes as first-class ARG resources of type microsoft.compute/disks with:

  • sku.name = Premium_LRS / StandardSSD_LRS / Standard_LRS / *_ZRS / PremiumV2_LRS / UltraSSD_LRS
  • properties.diskSizeGB = provisioned size
  • top-level managedBy = owning VM id (disk→VM parent link)
  • properties.diskIOPSReadWrite / properties.diskMBpsReadWrite (v2/Ultra)

3. PostgreSQL / MySQL Flexible Servermicrosoft.dbforpostgresql/flexibleservers (+ mysql) with:

  • sku.name = the compute SKU (e.g. Standard_D2ds_v5)
  • properties.highAvailability.mode (ZoneRedundant / SameZone / Disabled)

4. Event Hubsmicrosoft.eventhub/namespaces with sku.name/sku.tier (Basic / Standard / Premium).

Nice-to-have (secondary): SQL Managed Instance storage size, sqldatabase zoneRedundant, ML compute-instance vmSize + powerState.

Why it matters

With these fields, a real Azure discoverer + cost calculator can run a full offline E2E against cloudemu (discover → price → assert cost) for SKU/tier/size-sensitive logic. Today that verification stops at the SDK/protocol layer — cloudemu proves the wire round-trip and KQL, but not the resource-shape fidelity that downstream cost/rightsizing tools depend on.

Repro

Minimal armresourcegraph round-trip against azureserver.New with ResourceDiscovery wired (recipe already in server/azure/resourcegraph/sdk_test.go); seed a VM + volume as above and assert sku.name / diskSizeGB / a microsoft.compute/disks row.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions