Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
changeKind: feature
packages:
- "@azure-tools/azure-http-specs"
---

Add ARM multiple services test case.
112 changes: 112 additions & 0 deletions packages/azure-http-specs/spec-summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -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}`
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we add another case of selecting specific version of Compute/ComputeDisk?
I think this should be a supported scenario for compute service.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Azure.ResourceManager.MultiService.ComputeDisk
],
})
namespace Azure.ResourceManager.MultiService.Combined;
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import { json, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";

export const Scenarios: Record<string, ScenarioMockApi> = {};

// 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",
},
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another thing I suggest to verify is the common models/operations between 2 services. Can we add case for it? thanks

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


// 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",
},
]);
Original file line number Diff line number Diff line change
@@ -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<VirtualMachineProperties> {
...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<VirtualMachine>;

/**
* 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<VirtualMachine>;
}
Loading
Loading