diff --git a/.chronus/changes/add-multi-service-tests-2026-01-05-08-56-40.md b/.chronus/changes/add-multi-service-tests-2026-01-05-08-56-40.md new file mode 100644 index 0000000000..3593eaec17 --- /dev/null +++ b/.chronus/changes/add-multi-service-tests-2026-01-05-08-56-40.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@azure-tools/azure-http-specs" +--- + +Add multi-service test scenarios for older API versions and shared models. diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/client.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/client.tsp new file mode 100644 index 0000000000..9ab021422e --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/client.tsp @@ -0,0 +1,20 @@ +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.MultiServiceOlderVersions.Compute, + Azure.ResourceManager.MultiServiceOlderVersions.ComputeDisk + ], +}) +@useDependency( + Azure.ResourceManager.MultiServiceOlderVersions.Compute.Versions.v2024_11_01, + Azure.ResourceManager.MultiServiceOlderVersions.ComputeDisk.Versions.v2024_03_02 +) +namespace Azure.ResourceManager.MultiServiceOlderVersions.Combined; diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/mockapi.ts b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/mockapi.ts new file mode 100644 index 0000000000..1dfe4324c8 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/mockapi.ts @@ -0,0 +1,118 @@ +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/virtualMachinesOld/vm-old1`, + name: "vm-old1", + type: "Microsoft.Compute/virtualMachinesOld", + location: LOCATION, + properties: { + provisioningState: "Succeeded", + size: "Standard_D2s_v3", + }, +}; + +// Mock data for ComputeDisk (Disk) +const disk = { + id: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disksOld/disk-old1`, + name: "disk-old1", + type: "Microsoft.Compute/disksOld", + location: LOCATION, + properties: { + provisioningState: "Succeeded", + diskSizeGB: 128, + }, +}; + +// Scenario: Get Virtual Machine +Scenarios.Azure_ResourceManager_MultiServiceOlderVersions_Compute_VirtualMachines_get = + passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachinesOld/vm-old1`, + method: "get", + request: { + query: { + "api-version": "2024-11-01", + }, + }, + response: { + status: 200, + body: json(virtualMachine), + }, + kind: "MockApiDefinition", + }, + ]); + +// Scenario: Create or Update Virtual Machine +Scenarios.Azure_ResourceManager_MultiServiceOlderVersions_Compute_VirtualMachines_createOrUpdate = + passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachinesOld/vm-old1`, + method: "put", + request: { + query: { + "api-version": "2024-11-01", + }, + body: json({ + location: LOCATION, + properties: { + size: "Standard_D2s_v3", + }, + }), + }, + response: { + status: 200, + body: json(virtualMachine), + }, + kind: "MockApiDefinition", + }, + ]); + +// Scenario: Get Disk +Scenarios.Azure_ResourceManager_MultiServiceOlderVersions_ComputeDisk_Disks_get = passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disksOld/disk-old1`, + method: "get", + request: { + query: { + "api-version": "2024-03-02", + }, + }, + response: { + status: 200, + body: json(disk), + }, + kind: "MockApiDefinition", + }, +]); + +// Scenario: Create or Update Disk +Scenarios.Azure_ResourceManager_MultiServiceOlderVersions_ComputeDisk_Disks_createOrUpdate = + passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disksOld/disk-old1`, + method: "put", + request: { + query: { + "api-version": "2024-03-02", + }, + body: json({ + location: LOCATION, + properties: { + diskSizeGB: 128, + }, + }), + }, + response: { + status: 200, + body: json(disk), + }, + kind: "MockApiDefinition", + }, + ]); diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/service1.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/service1.tsp new file mode 100644 index 0000000000..e9bd6aa511 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/service1.tsp @@ -0,0 +1,120 @@ +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.MultiServiceOlderVersions.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 = "virtualMachinesOld", + NamePattern = "" + >; +} + +model VirtualMachineProperties { + @visibility(Lifecycle.Read) + provisioningState?: ResourceProvisioningState; + + /** + * Size of the virtual machine. Only available in version 2024-11-01. + */ + @added(Versions.v2024_11_01) + @removed(Versions.v2025_04_01) + size?: string; +} + +@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 using older API versions. This operation 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/virtualMachinesOld/vm-old1 + Expected query parameter: api-version=2024-11-01 + + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachinesOld/vm-old1", + "name": "vm-old1", + "type": "Microsoft.Compute/virtualMachinesOld", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded", + "size": "Standard_D2s_v3" + } + } + ``` + """) + 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 using older API versions. This operation 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/virtualMachinesOld/vm-old1 + Expected query parameter: api-version=2024-11-01 + Expected request body: + ```json + { + "location": "eastus", + "properties": { + "size": "Standard_D2s_v3" + } + } + ``` + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachinesOld/vm-old1", + "name": "vm-old1", + "type": "Microsoft.Compute/virtualMachinesOld", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded", + "size": "Standard_D2s_v3" + } + } + ``` + """) + createOrUpdate is ArmResourceCreateOrUpdateAsync; +} diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/service2.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/service2.tsp new file mode 100644 index 0000000000..5c45524885 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-older-versions/service2.tsp @@ -0,0 +1,123 @@ +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@typespec/spector"; + +using TypeSpec.Versioning; +using Spector; + +/** + * Compute Disk Client + */ +@armProviderNamespace("Microsoft.Compute") +@service(#{ title: "Azure Compute Disk resource management API." }) +@versioned(Versions) +namespace Azure.ResourceManager.MultiServiceOlderVersions.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 = "disksOld", + NamePattern = "" + >; +} + +/** + * Disk resource properties. + */ +model DiskProperties { + @visibility(Lifecycle.Read) + provisioningState?: ResourceProvisioningState; + + /** + * Size of the disk in GB. Only available in version 2024-03-02. + */ + @added(Versions.v2024_03_02) + @removed(Versions.v2025_01_02) + diskSizeGB?: int32; +} + +@armResourceOperations +interface Disks { + /** + * Gets information about a disk. + */ + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services using older API versions. This operation 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/disksOld/disk-old1 + Expected query parameter: api-version=2024-03-02 + + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disksOld/disk-old1", + "name": "disk-old1", + "type": "Microsoft.Compute/disksOld", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded", + "diskSizeGB": 128 + } + } + ``` + """) + get is ArmResourceRead; + + /** + * Creates or updates a disk. + */ + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services using older API versions. This operation 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/disksOld/disk-old1 + Expected query parameter: api-version=2024-03-02 + Expected request body: + ```json + { + "location": "eastus", + "properties": { + "diskSizeGB": 128 + } + } + ``` + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disksOld/disk-old1", + "name": "disk-old1", + "type": "Microsoft.Compute/disksOld", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded", + "diskSizeGB": 128 + } + } + ``` + """) + createOrUpdate is ArmResourceCreateOrUpdateAsync; +} diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/client.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/client.tsp new file mode 100644 index 0000000000..f412aa3bda --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/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.MultiServiceSharedModels.Compute, + Azure.ResourceManager.MultiServiceSharedModels.Storage + ], +}) +namespace Azure.ResourceManager.MultiServiceSharedModels.Combined; diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/mockapi.ts b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/mockapi.ts new file mode 100644 index 0000000000..b24b514b24 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/mockapi.ts @@ -0,0 +1,139 @@ +import { json, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api"; + +export const Scenarios: Record = {}; + +// Mock data constants +const SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000"; +const RESOURCE_GROUP = "test-rg"; + +const virtualMachine = { + id: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachinesShared/vm-shared1`, + name: "vm-shared1", + type: "Microsoft.Compute/virtualMachinesShared", + location: "eastus", + properties: { + provisioningState: "Succeeded", + metadata: { + createdAt: "2025-01-01T00:00:00Z", + createdBy: "user@example.com", + tags: { + environment: "production", + }, + }, + }, +}; + +const storageAccount = { + id: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/account1`, + name: "account1", + type: "Microsoft.Storage/storageAccounts", + location: "westus", + properties: { + provisioningState: "Succeeded", + metadata: { + createdAt: "2025-01-02T00:00:00Z", + createdBy: "admin@example.com", + tags: { + department: "engineering", + }, + }, + }, +}; + +// Scenario: Get Virtual Machine +Scenarios.Azure_ResourceManager_MultiServiceSharedModels_Compute_VirtualMachines_get = + passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachinesShared/vm-shared1`, + method: "get", + request: { + query: { + "api-version": "2025-05-01", + }, + }, + response: { + status: 200, + body: json(virtualMachine), + }, + kind: "MockApiDefinition", + }, + ]); + +// Scenario: Create or Update Virtual Machine +Scenarios.Azure_ResourceManager_MultiServiceSharedModels_Compute_VirtualMachines_createOrUpdate = + passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachinesShared/vm-shared1`, + method: "put", + request: { + query: { + "api-version": "2025-05-01", + }, + body: json({ + location: "eastus", + properties: { + metadata: { + createdBy: "user@example.com", + tags: { + environment: "production", + }, + }, + }, + }), + }, + response: { + status: 200, + body: json(virtualMachine), + }, + kind: "MockApiDefinition", + }, + ]); + +// Scenario: Get Storage Account +Scenarios.Azure_ResourceManager_MultiServiceSharedModels_Storage_StorageAccounts_get = + passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/account1`, + method: "get", + request: { + query: { + "api-version": "2025-02-01", + }, + }, + response: { + status: 200, + body: json(storageAccount), + }, + kind: "MockApiDefinition", + }, + ]); + +// Scenario: Create or Update Storage Account +Scenarios.Azure_ResourceManager_MultiServiceSharedModels_Storage_StorageAccounts_createOrUpdate = + passOnSuccess([ + { + uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/account1`, + method: "put", + request: { + query: { + "api-version": "2025-02-01", + }, + body: json({ + location: "westus", + properties: { + metadata: { + createdBy: "admin@example.com", + tags: { + department: "engineering", + }, + }, + }, + }), + }, + response: { + status: 200, + body: json(storageAccount), + }, + kind: "MockApiDefinition", + }, + ]); diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/service1.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/service1.tsp new file mode 100644 index 0000000000..699c7433e9 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/service1.tsp @@ -0,0 +1,131 @@ +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@typespec/spector"; +import "./shared-models.tsp"; + +using TypeSpec.Versioning; +using Spector; +using Azure.ResourceManager.MultiServiceSharedModels.Shared; + +/** + * Compute Client + */ +@armProviderNamespace("Microsoft.Compute") +@service(#{ title: "Azure Compute resource management API." }) +@versioned(Versions) +namespace Azure.ResourceManager.MultiServiceSharedModels.Compute; + +/** + * The available API versions. + */ +enum Versions { + /** + * The 2025-05-01 API version. + */ + @armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3) + v2025_05_01: "2025-05-01", +} + +/** + * Describes a Virtual Machine. + */ +model VirtualMachine is Azure.ResourceManager.TrackedResource { + ...ResourceNameParameter< + Resource = VirtualMachine, + KeyName = "vmName", + SegmentName = "virtualMachinesShared", + NamePattern = "" + >; +} + +model VirtualMachineProperties { + @visibility(Lifecycle.Read) + provisioningState?: ResourceProvisioningState; + + /** + * Shared metadata for the virtual machine. + */ + metadata?: SharedMetadata; +} + +@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 with shared models. This operation 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/virtualMachinesShared/vm-shared1 + Expected query parameter: api-version=2025-05-01 + + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachinesShared/vm-shared1", + "name": "vm-shared1", + "type": "Microsoft.Compute/virtualMachinesShared", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded", + "metadata": { + "createdAt": "2025-01-01T00:00:00Z", + "createdBy": "user@example.com", + "tags": { + "environment": "production" + } + } + } + } + ``` + """) + 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 with shared models. This operation 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/virtualMachinesShared/vm-shared1 + Expected query parameter: api-version=2025-05-01 + Expected request body: + ```json + { + "location": "eastus", + "properties": { + "metadata": { + "createdBy": "user@example.com", + "tags": { + "environment": "production" + } + } + } + } + ``` + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachinesShared/vm-shared1", + "name": "vm-shared1", + "type": "Microsoft.Compute/virtualMachinesShared", + "location": "eastus", + "properties": { + "provisioningState": "Succeeded", + "metadata": { + "createdAt": "2025-01-01T00:00:00Z", + "createdBy": "user@example.com", + "tags": { + "environment": "production" + } + } + } + } + ``` + """) + createOrUpdate is ArmResourceCreateOrUpdateAsync; +} diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/service2.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/service2.tsp new file mode 100644 index 0000000000..7a60493637 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/service2.tsp @@ -0,0 +1,134 @@ +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@typespec/spector"; +import "./shared-models.tsp"; + +using TypeSpec.Versioning; +using Spector; +using Azure.ResourceManager.MultiServiceSharedModels.Shared; + +/** + * Storage Client + */ +@armProviderNamespace("Microsoft.Storage") +@service(#{ title: "Azure Storage resource management API." }) +@versioned(Versions) +namespace Azure.ResourceManager.MultiServiceSharedModels.Storage; + +/** + * The available API versions. + */ +enum Versions { + /** + * The 2025-02-01 API version. + */ + @armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3) + v2025_02_01: "2025-02-01", +} + +/** + * Storage account resource. + */ +model StorageAccount is Azure.ResourceManager.TrackedResource { + ...ResourceNameParameter< + Resource = StorageAccount, + KeyName = "accountName", + SegmentName = "storageAccounts", + NamePattern = "" + >; +} + +/** + * Storage account properties. + */ +model StorageAccountProperties { + @visibility(Lifecycle.Read) + provisioningState?: ResourceProvisioningState; + + /** + * Shared metadata for the storage account. + */ + metadata?: SharedMetadata; +} + +@armResourceOperations +interface StorageAccounts { + /** + * Gets information about a storage account. + */ + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services with shared models. This operation should be called like this: `client.storageAccounts.get(...)`. + + GET a Storage Account. + Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/account1 + Expected query parameter: api-version=2025-02-01 + + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/account1", + "name": "account1", + "type": "Microsoft.Storage/storageAccounts", + "location": "westus", + "properties": { + "provisioningState": "Succeeded", + "metadata": { + "createdAt": "2025-01-02T00:00:00Z", + "createdBy": "admin@example.com", + "tags": { + "department": "engineering" + } + } + } + } + ``` + """) + get is ArmResourceRead; + + /** + * Creates or updates a storage account. + */ + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services with shared models. This operation should be called like this: `client.storageAccounts.createOrUpdate(...)`. + + PUT (create or update) a Storage Account. + Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/account1 + Expected query parameter: api-version=2025-02-01 + Expected request body: + ```json + { + "location": "westus", + "properties": { + "metadata": { + "createdBy": "admin@example.com", + "tags": { + "department": "engineering" + } + } + } + } + ``` + Expected response body: + ```json + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/account1", + "name": "account1", + "type": "Microsoft.Storage/storageAccounts", + "location": "westus", + "properties": { + "provisioningState": "Succeeded", + "metadata": { + "createdAt": "2025-01-02T00:00:00Z", + "createdBy": "admin@example.com", + "tags": { + "department": "engineering" + } + } + } + } + ``` + """) + createOrUpdate is ArmResourceCreateOrUpdateAsync; +} diff --git a/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/shared-models.tsp b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/shared-models.tsp new file mode 100644 index 0000000000..37f001416f --- /dev/null +++ b/packages/azure-http-specs/specs/azure/resource-manager/multi-service-shared-models/shared-models.tsp @@ -0,0 +1,21 @@ +namespace Azure.ResourceManager.MultiServiceSharedModels.Shared; + +/** + * Common metadata shared across multiple services. + */ +model SharedMetadata { + /** + * Creation timestamp of the resource. + */ + createdAt?: utcDateTime; + + /** + * Creator of the resource. + */ + createdBy?: string; + + /** + * Tags associated with the resource. + */ + tags?: Record; +}