diff --git a/.chronus/changes/specs_arm-multi-service-2025-11-18-17-31-26.md b/.chronus/changes/specs_arm-multi-service-2025-11-18-17-31-26.md new file mode 100644 index 0000000000..77f6fcb406 --- /dev/null +++ b/.chronus/changes/specs_arm-multi-service-2025-11-18-17-31-26.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@azure-tools/azure-http-specs" +--- + +Add ARM multiple services test case. \ No newline at end of file diff --git a/packages/azure-http-specs/spec-summary.md b/packages/azure-http-specs/spec-summary.md index aeaaf8e3d9..9e2475c640 100644 --- a/packages/azure-http-specs/spec-summary.md +++ b/packages/azure-http-specs/spec-summary.md @@ -1990,6 +1990,118 @@ Expected response body: } ``` +### Azure_ResourceManager_MultiService_Compute_VirtualMachines_createOrUpdate + +- Endpoint: `put https://management.azure.com` + +Test that a client can expose operations from multiple services. This operaton should be called like this: `client.virtualMachines.createOrUpdate(...)`. + +PUT (create or update) a Virtual Machine. +Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm1 +Expected query parameter: api-version=2025-04-01 +Expected request body: + +```json +{ + "location": "eastus", + "properties": {} +} +``` + +Expected response body: + +```json +{ + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm1", + "name": "vm1", + "type": "Microsoft.Compute/virtualMachines", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded" + } +} +``` + +### Azure_ResourceManager_MultiService_Compute_VirtualMachines_get + +- Endpoint: `get https://management.azure.com` + +Test that a client can expose operations from multiple services. This operaton should be called like this: `client.virtualMachines.get(...)`. + +GET a Virtual Machine. +Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm1 +Expected query parameter: api-version=2025-04-01 + +Expected response body: + +```json +{ + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm1", + "name": "vm1", + "type": "Microsoft.Compute/virtualMachines", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded" + } +} +``` + +### Azure_ResourceManager_MultiService_ComputeDisk_Disks_createOrUpdate + +- Endpoint: `put https://management.azure.com` + +Test that a client can expose operations from multiple services. This operaton should be called like this: `client.disks.createOrUpdate(...)`. + +PUT (create or update) a Disk resource. +Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disks/disk1 +Expected query parameter: api-version=2025-01-02 +Expected request body: + +```json +{ + "location": "eastus", + "properties": {} +} +``` + +Expected response body: + +```json +{ + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disks/disk1", + "name": "disk1", + "type": "Microsoft.Compute/disks", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded" + } +} +``` + +### Azure_ResourceManager_MultiService_ComputeDisk_Disks_get + +- Endpoint: `get https://management.azure.com` + +Test that a client can expose operations from multiple services. This operaton should be called like this: `client.disks.get(...)`. + +GET a Disk resource. +Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disks/disk1 +Expected query parameter: api-version=2025-01-02 + +Expected response body: + +```json +{ + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disks/disk1", + "name": "disk1", + "type": "Microsoft.Compute/disks", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded" + } +} +``` + ### Azure_ResourceManager_NonResource_NonResourceOperations_create - Endpoint: `put https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.NonResource/locations/{location}/otherParameters/{parameter}` diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service/client.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service/client.tsp new file mode 100644 index 0000000000..7dbee9a681 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service/client.tsp @@ -0,0 +1,16 @@ +import "./service1.tsp"; +import "./service2.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Versioning; +using Azure.Core; +using Azure.ResourceManager; +using Azure.ClientGenerator.Core; + +@client({ + service: [ + Azure.ResourceManager.MultiService.Compute, + Azure.ResourceManager.MultiService.ComputeDisk + ], +}) +namespace Azure.ResourceManager.MultiService.Combined; diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service/mockapi.ts b/packages/azure-http-specs/specs/azure/resource-manager/multi-service/mockapi.ts new file mode 100644 index 0000000000..a7098899dd --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service/mockapi.ts @@ -0,0 +1,111 @@ +import { json, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api"; + +export const Scenarios: Record = {}; + +// Mock data for Compute (VirtualMachine) +const SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000"; +const RESOURCE_GROUP = "test-rg"; +const LOCATION = "eastus"; + +const virtualMachine = { + id: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachines/vm1`, + name: "vm1", + type: "Microsoft.Compute/virtualMachines", + location: LOCATION, + properties: { + provisioningState: "Succeeded", + }, +}; + +// Mock data for ComputeDisk (Disk) +const disk = { + id: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disks/disk1`, + name: "disk1", + type: "Microsoft.Compute/disks", + location: LOCATION, + properties: { + provisioningState: "Succeeded", + }, +}; + +// Scenario: Get Virtual Machine +Scenarios.Azure_ResourceManager_MultiService_Compute_VirtualMachines_get = passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachines/vm1`, + method: "get", + request: { + query: { + "api-version": "2025-04-01", + }, + }, + response: { + status: 200, + body: json(virtualMachine), + }, + kind: "MockApiDefinition", + }, +]); + +// Scenario: Create or Update Virtual Machine +Scenarios.Azure_ResourceManager_MultiService_Compute_VirtualMachines_createOrUpdate = passOnSuccess( + [ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachines/vm1`, + method: "put", + request: { + query: { + "api-version": "2025-04-01", + }, + body: json({ + location: LOCATION, + properties: {}, + }), + }, + response: { + status: 200, + body: json(virtualMachine), + }, + kind: "MockApiDefinition", + }, + ], +); + +// Scenario: Get Disk +Scenarios.Azure_ResourceManager_MultiService_ComputeDisk_Disks_get = passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disks/disk1`, + method: "get", + request: { + query: { + "api-version": "2025-01-02", + }, + }, + response: { + status: 200, + body: json(disk), + }, + kind: "MockApiDefinition", + }, +]); + +// Scenario: Create or Update Disk +Scenarios.Azure_ResourceManager_MultiService_ComputeDisk_Disks_createOrUpdate = passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disks/disk1`, + method: "put", + request: { + query: { + "api-version": "2025-01-02", + }, + body: json({ + location: LOCATION, + properties: {}, + }), + }, + response: { + status: 200, + body: json(disk), + }, + kind: "MockApiDefinition", + }, +]); diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service/service1.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service/service1.tsp new file mode 100644 index 0000000000..131c840b38 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service/service1.tsp @@ -0,0 +1,109 @@ +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@typespec/spector"; + +using TypeSpec.Versioning; +using Spector; + +/** + * Compute Client + */ +@armProviderNamespace("Microsoft.Compute") +@service(#{ title: "Azure Compute resource management API." }) +@versioned(Versions) +namespace Azure.ResourceManager.MultiService.Compute; + +/** + * The available API versions. + */ +enum Versions { + /** + * The 2024-11-01 API version. + */ + @armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3) + v2024_11_01: "2024-11-01", + + /** + * The 2025-04-01 API version. + */ + @armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3) + v2025_04_01: "2025-04-01", +} + +/** + * Describes a Virtual Machine. + */ +model VirtualMachine is Azure.ResourceManager.TrackedResource { + ...ResourceNameParameter< + Resource = VirtualMachine, + KeyName = "vmName", + SegmentName = "virtualMachines", + NamePattern = "" + >; +} + +model VirtualMachineProperties { + @visibility(Lifecycle.Read) + provisioningState?: ResourceProvisioningState; +} + +@armResourceOperations +interface VirtualMachines { + /** + * Retrieves information about the model view or the instance view of a virtual machine. + */ + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services. This operaton should be called like this: `client.virtualMachines.get(...)`. + + GET a Virtual Machine. + Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm1 + Expected query parameter: api-version=2025-04-01 + + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm1", + "name": "vm1", + "type": "Microsoft.Compute/virtualMachines", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded" + } + } + ``` + """) + get is ArmResourceRead; + + /** + * The operation to create or update a virtual machine. Please note some properties can be set only during virtual machine creation. + */ + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services. This operaton should be called like this: `client.virtualMachines.createOrUpdate(...)`. + + PUT (create or update) a Virtual Machine. + Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm1 + Expected query parameter: api-version=2025-04-01 + Expected request body: + ```json + { + "location": "eastus", + "properties": {} + } + ``` + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm1", + "name": "vm1", + "type": "Microsoft.Compute/virtualMachines", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded" + } + } + ``` + """) + createOrUpdate is ArmResourceCreateOrUpdateAsync; +} diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service/service2.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service/service2.tsp new file mode 100644 index 0000000000..528b78779d --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service/service2.tsp @@ -0,0 +1,112 @@ +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@typespec/spector"; + +using TypeSpec.Versioning; +using Spector; + +/** + * Compute Client + */ +@armProviderNamespace("Microsoft.Compute") +@service(#{ title: "Azure Compute resource management API." }) +@versioned(Versions) +namespace Azure.ResourceManager.MultiService.ComputeDisk; + +/** + * The available API versions. + */ +enum Versions { + /** + * The 2024-03-02 API version. + */ + @armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3) + v2024_03_02: "2024-03-02", + + /** + * The 2025-01-02 API version. + */ + @armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3) + v2025_01_02: "2025-01-02", +} + +/** + * Disk resource. + */ +model Disk is Azure.ResourceManager.TrackedResource { + ...ResourceNameParameter< + Resource = Disk, + KeyName = "diskName", + SegmentName = "disks", + NamePattern = "" + >; +} + +/** + * Disk resource properties. + */ +model DiskProperties { + @visibility(Lifecycle.Read) + provisioningState?: ResourceProvisioningState; +} + +@armResourceOperations +interface Disks { + /** + * Gets information about a disk. + */ + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services. This operaton should be called like this: `client.disks.get(...)`. + + GET a Disk resource. + Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disks/disk1 + Expected query parameter: api-version=2025-01-02 + + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disks/disk1", + "name": "disk1", + "type": "Microsoft.Compute/disks", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded" + } + } + ``` + """) + get is ArmResourceRead; + + /** + * Creates or updates a disk. + */ + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services. This operaton should be called like this: `client.disks.createOrUpdate(...)`. + + PUT (create or update) a Disk resource. + Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disks/disk1 + Expected query parameter: api-version=2025-01-02 + Expected request body: + ```json + { + "location": "eastus", + "properties": {} + } + ``` + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disks/disk1", + "name": "disk1", + "type": "Microsoft.Compute/disks", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded" + } + } + ``` + """) + createOrUpdate is ArmResourceCreateOrUpdateAsync; +}