diff --git a/.chronus/changes/extension-res-2025-5-23-22-49-14.md b/.chronus/changes/extension-res-2025-5-23-22-49-14.md new file mode 100644 index 0000000000..2dd40053e0 --- /dev/null +++ b/.chronus/changes/extension-res-2025-5-23-22-49-14.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: fix +packages: + - "@azure-tools/typespec-azure-resource-manager" +--- + +Fix #2764 Add advanced extension resource support diff --git a/packages/samples/specs/resource-manager/resource-types/specific-extension/main.tsp b/packages/samples/specs/resource-manager/resource-types/specific-extension/main.tsp new file mode 100644 index 0000000000..67d82570bb --- /dev/null +++ b/packages/samples/specs/resource-manager/resource-types/specific-extension/main.tsp @@ -0,0 +1,191 @@ +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-azure-resource-manager"; + +using Http; +using Rest; +using Versioning; +using Azure.Core; +using Azure.ResourceManager; + +/** Contoso Resource Provider management API. */ +@armProviderNamespace +@service(#{ title: "ContosoProviderHubClient" }) +@versioned(Versions) +namespace Microsoft.ContosoProviderHub; + +/** Contoso API versions */ +enum Versions { + /** 2021-10-01-preview version */ + @useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) + @armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) + `2021-10-01-preview`, +} + +/** A ContosoProviderHub resource */ +model Employee is ExtensionResource { + ...ResourceNameParameter; +} + +/** Employee properties */ +model EmployeeProperties { + /** Age of employee */ + age?: int32; + + /** City of employee */ + city?: string; + + /** Profile of employee */ + @encode("base64url") + profile?: bytes; + + /** The status of the last operation. */ + @visibility(Lifecycle.Read) + provisioningState?: ProvisioningState; +} + +/** The provisioning state of a resource. */ +@lroStatus +union ProvisioningState { + ResourceProvisioningState, + + /** The resource is being provisioned */ + Provisioning: "Provisioning", + + /** The resource is updating */ + Updating: "Updating", + + /** The resource is being deleted */ + Deleting: "Deleting", + + /** The resource create request has been accepted */ + Accepted: "Accepted", + + string, +} + +interface Operations extends Azure.ResourceManager.Operations {} + +interface EmplOps { + get is Extension.Read; + + create is Extension.CreateOrReplaceAsync; + update is Extension.CustomPatchSync< + Scope, + Employee, + Azure.ResourceManager.Foundations.ResourceUpdateModel + >; + delete is Extension.DeleteWithoutOkAsync; + list is Extension.ListByTarget; + move is Extension.ActionSync; +} + +/** Virtual resource for a virtual machine */ +alias VirtualMachine = Extension.ExternalResource< + "Microsoft.Compute", + "virtualMachines", + "vmName", + NamePattern = "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$", + Description = "The name of the virtual machine" +>; + +alias Scaleset = Extension.ExternalResource< + "Microsoft.Compute", + "virtualMachineScaleSets", + "scaleSetName", + NamePattern = "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$", + Description = "The name of the virtual machine scale set" +>; + +alias VirtualMachineScaleSetVm = Extension.ExternalChildResource< + Scaleset, + "virtualMachineScaleSetVms", + "scaleSetVmName", + NamePattern = "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$", + Description = "The name of the virtual machine scale set VM" +>; + +@armResourceOperations +interface Employees extends EmplOps {} +@armResourceOperations +interface Tenants extends EmplOps {} +@armResourceOperations +interface Subscriptions extends EmplOps {} +@armResourceOperations +interface ResourceGroups extends EmplOps {} +@armResourceOperations +interface ManagementGroups extends EmplOps {} + +@armResourceOperations +interface VirtualMachines extends EmplOps {} + +@armResourceOperations +interface ScaleSetVms extends EmplOps {} + +/** Employee move request */ +model MoveRequest { + /** The moving from location */ + from: string; + + /** The moving to location */ + to: string; +} + +/** Employee move response */ +model MoveResponse { + /** The status of the move */ + movingStatus: string; +} + +alias GenericResourceParameters = { + ...ApiVersionParameter; + ...SubscriptionIdParameter; + ...ResourceGroupParameter; + + /** the provider namespace */ + @path + @segment("providers") + @key + providerNamespace: string; + + /** the resource type of the parent */ + @path @key parentType: string; + + /** the name of the parent resource */ + @path @key parentName: string; + + /** the resource type of the target resource */ + @path @key resourceType: string; + + /** the name of the target resource */ + @path @key resourceName: string; +}; + +alias ParentParameters = { + ...Extension.ExtensionProviderNamespace; + ...ParentKeysOf; +}; + +#suppress "@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator" +interface GenericOps + extends Azure.ResourceManager.Legacy.ExtensionOperations< + GenericResourceParameters, + ParentParameters, + { + ...Extension.ExtensionProviderNamespace, + ...KeysOf, + } + > {} + +@armResourceOperations +interface GenericResources { + get is GenericOps.Read; + create is GenericOps.CreateOrUpdateAsync; + update is GenericOps.CustomPatchSync< + Employee, + Azure.ResourceManager.Foundations.ResourceUpdateModel + >; + delete is GenericOps.DeleteWithoutOkAsync; + list is GenericOps.List; +} diff --git a/packages/samples/test/output/azure/resource-manager/resource-types/specific-extension/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json b/packages/samples/test/output/azure/resource-manager/resource-types/specific-extension/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json new file mode 100644 index 0000000000..1b9cb0fd9d --- /dev/null +++ b/packages/samples/test/output/azure/resource-manager/resource-types/specific-extension/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json @@ -0,0 +1,2955 @@ +{ + "swagger": "2.0", + "info": { + "title": "ContosoProviderHubClient", + "version": "2021-10-01-preview", + "description": "Contoso Resource Provider management API.", + "x-typespec-generated": [ + { + "emitter": "@azure-tools/typespec-autorest" + } + ] + }, + "schemes": [ + "https" + ], + "host": "management.azure.com", + "produces": [ + "application/json" + ], + "consumes": [ + "application/json" + ], + "security": [ + { + "azure_auth": [ + "user_impersonation" + ] + } + ], + "securityDefinitions": { + "azure_auth": { + "type": "oauth2", + "description": "Azure Active Directory OAuth2 Flow.", + "flow": "implicit", + "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/authorize", + "scopes": { + "user_impersonation": "impersonate your user account" + } + } + }, + "tags": [ + { + "name": "Operations" + }, + { + "name": "Employees" + }, + { + "name": "Tenants" + }, + { + "name": "Subscriptions" + }, + { + "name": "ResourceGroups" + }, + { + "name": "ManagementGroups" + }, + { + "name": "VirtualMachines" + }, + { + "name": "ScaleSetVms" + }, + { + "name": "GenericResources" + } + ], + "paths": { + "/{scope}/providers/Microsoft.ContosoProviderHub/employees": { + "get": { + "operationId": "Employees_List", + "tags": [ + "Employees" + ], + "description": "List Employee resources by scope", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "scope", + "in": "path", + "description": "The fully qualified Azure Resource manager identifier of the resource.", + "required": true, + "type": "string", + "x-ms-skip-url-encoding": true + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/EmployeeListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/{scope}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}": { + "get": { + "operationId": "Employees_Get", + "tags": [ + "Employees" + ], + "description": "Get a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "scope", + "in": "path", + "description": "The fully qualified Azure Resource manager identifier of the resource.", + "required": true, + "type": "string", + "x-ms-skip-url-encoding": true + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "operationId": "Employees_Create", + "tags": [ + "Employees" + ], + "description": "Create a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "scope", + "in": "path", + "description": "The fully qualified Azure Resource manager identifier of the resource.", + "required": true, + "type": "string", + "x-ms-skip-url-encoding": true + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "resource", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/Employee" + } + } + ], + "responses": { + "200": { + "description": "Resource 'Employee' update operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "201": { + "description": "Resource 'Employee' create operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + }, + "headers": { + "Azure-AsyncOperation": { + "type": "string", + "description": "A link to the status monitor" + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "azure-async-operation" + }, + "x-ms-long-running-operation": true + }, + "patch": { + "operationId": "Employees_Update", + "tags": [ + "Employees" + ], + "description": "Update a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "scope", + "in": "path", + "description": "The fully qualified Azure Resource manager identifier of the resource.", + "required": true, + "type": "string", + "x-ms-skip-url-encoding": true + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "properties", + "in": "body", + "description": "The resource properties to be updated.", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeUpdate" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "operationId": "Employees_Delete", + "tags": [ + "Employees" + ], + "description": "Delete a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "scope", + "in": "path", + "description": "The fully qualified Azure Resource manager identifier of the resource.", + "required": true, + "type": "string", + "x-ms-skip-url-encoding": true + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "202": { + "description": "Resource deletion accepted.", + "headers": { + "Location": { + "type": "string", + "description": "The Location header contains the URL where the status of the long running operation can be checked." + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "204": { + "description": "Resource does not exist." + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "location" + }, + "x-ms-long-running-operation": true + } + }, + "/{scope}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}/move": { + "post": { + "operationId": "Employees_Move", + "tags": [ + "Employees" + ], + "description": "A synchronous resource action.", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "scope", + "in": "path", + "description": "The fully qualified Azure Resource manager identifier of the resource.", + "required": true, + "type": "string", + "x-ms-skip-url-encoding": true + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "body", + "in": "body", + "description": "The content of the action request", + "required": true, + "schema": { + "$ref": "#/definitions/MoveRequest" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/MoveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + } + }, + "/providers/Microsoft.ContosoProviderHub/employees": { + "get": { + "operationId": "Tenants_List", + "tags": [ + "Tenants" + ], + "description": "List Employee resources by scope", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/EmployeeListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/providers/Microsoft.ContosoProviderHub/employees/{employeeName}": { + "get": { + "operationId": "Tenants_Get", + "tags": [ + "Tenants" + ], + "description": "Get a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "operationId": "Tenants_Create", + "tags": [ + "Tenants" + ], + "description": "Create a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "resource", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/Employee" + } + } + ], + "responses": { + "200": { + "description": "Resource 'Employee' update operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "201": { + "description": "Resource 'Employee' create operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + }, + "headers": { + "Azure-AsyncOperation": { + "type": "string", + "description": "A link to the status monitor" + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "azure-async-operation" + }, + "x-ms-long-running-operation": true + }, + "patch": { + "operationId": "Tenants_Update", + "tags": [ + "Tenants" + ], + "description": "Update a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "properties", + "in": "body", + "description": "The resource properties to be updated.", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeUpdate" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "operationId": "Tenants_Delete", + "tags": [ + "Tenants" + ], + "description": "Delete a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "202": { + "description": "Resource deletion accepted.", + "headers": { + "Location": { + "type": "string", + "description": "The Location header contains the URL where the status of the long running operation can be checked." + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "204": { + "description": "Resource does not exist." + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "location" + }, + "x-ms-long-running-operation": true + } + }, + "/providers/Microsoft.ContosoProviderHub/employees/{employeeName}/move": { + "post": { + "operationId": "Tenants_Move", + "tags": [ + "Tenants" + ], + "description": "A synchronous resource action.", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "body", + "in": "body", + "description": "The content of the action request", + "required": true, + "schema": { + "$ref": "#/definitions/MoveRequest" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/MoveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + } + }, + "/providers/Microsoft.ContosoProviderHub/operations": { + "get": { + "operationId": "Operations_List", + "tags": [ + "Operations" + ], + "description": "List the operations for the provider", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/OperationListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/providers/Microsoft.Management/managementGroups/{managementGroupName}/providers/Microsoft.ContosoProviderHub/employees": { + "get": { + "operationId": "ManagementGroups_List", + "tags": [ + "ManagementGroups" + ], + "description": "List Employee resources by scope", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "managementGroupName", + "in": "path", + "description": "The management group ID.", + "required": true, + "type": "string", + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/EmployeeListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/providers/Microsoft.Management/managementGroups/{managementGroupName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}": { + "get": { + "operationId": "ManagementGroups_Get", + "tags": [ + "ManagementGroups" + ], + "description": "Get a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "managementGroupName", + "in": "path", + "description": "The management group ID.", + "required": true, + "type": "string", + "minLength": 1 + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "operationId": "ManagementGroups_Create", + "tags": [ + "ManagementGroups" + ], + "description": "Create a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "managementGroupName", + "in": "path", + "description": "The management group ID.", + "required": true, + "type": "string", + "minLength": 1 + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "resource", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/Employee" + } + } + ], + "responses": { + "200": { + "description": "Resource 'Employee' update operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "201": { + "description": "Resource 'Employee' create operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + }, + "headers": { + "Azure-AsyncOperation": { + "type": "string", + "description": "A link to the status monitor" + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "azure-async-operation" + }, + "x-ms-long-running-operation": true + }, + "patch": { + "operationId": "ManagementGroups_Update", + "tags": [ + "ManagementGroups" + ], + "description": "Update a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "managementGroupName", + "in": "path", + "description": "The management group ID.", + "required": true, + "type": "string", + "minLength": 1 + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "properties", + "in": "body", + "description": "The resource properties to be updated.", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeUpdate" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "operationId": "ManagementGroups_Delete", + "tags": [ + "ManagementGroups" + ], + "description": "Delete a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "managementGroupName", + "in": "path", + "description": "The management group ID.", + "required": true, + "type": "string", + "minLength": 1 + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "202": { + "description": "Resource deletion accepted.", + "headers": { + "Location": { + "type": "string", + "description": "The Location header contains the URL where the status of the long running operation can be checked." + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "204": { + "description": "Resource does not exist." + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "location" + }, + "x-ms-long-running-operation": true + } + }, + "/providers/Microsoft.Management/managementGroups/{managementGroupName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}/move": { + "post": { + "operationId": "ManagementGroups_Move", + "tags": [ + "ManagementGroups" + ], + "description": "A synchronous resource action.", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "name": "managementGroupName", + "in": "path", + "description": "The management group ID.", + "required": true, + "type": "string", + "minLength": 1 + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "body", + "in": "body", + "description": "The content of the action request", + "required": true, + "schema": { + "$ref": "#/definitions/MoveRequest" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/MoveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/providers/Microsoft.ContosoProviderHub/employees": { + "get": { + "operationId": "Subscriptions_List", + "tags": [ + "Subscriptions" + ], + "description": "List Employee resources by scope", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/EmployeeListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/subscriptions/{subscriptionId}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}": { + "get": { + "operationId": "Subscriptions_Get", + "tags": [ + "Subscriptions" + ], + "description": "Get a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "operationId": "Subscriptions_Create", + "tags": [ + "Subscriptions" + ], + "description": "Create a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "resource", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/Employee" + } + } + ], + "responses": { + "200": { + "description": "Resource 'Employee' update operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "201": { + "description": "Resource 'Employee' create operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + }, + "headers": { + "Azure-AsyncOperation": { + "type": "string", + "description": "A link to the status monitor" + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "azure-async-operation" + }, + "x-ms-long-running-operation": true + }, + "patch": { + "operationId": "Subscriptions_Update", + "tags": [ + "Subscriptions" + ], + "description": "Update a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "properties", + "in": "body", + "description": "The resource properties to be updated.", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeUpdate" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "operationId": "Subscriptions_Delete", + "tags": [ + "Subscriptions" + ], + "description": "Delete a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "202": { + "description": "Resource deletion accepted.", + "headers": { + "Location": { + "type": "string", + "description": "The Location header contains the URL where the status of the long running operation can be checked." + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "204": { + "description": "Resource does not exist." + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "location" + }, + "x-ms-long-running-operation": true + } + }, + "/subscriptions/{subscriptionId}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}/move": { + "post": { + "operationId": "Subscriptions_Move", + "tags": [ + "Subscriptions" + ], + "description": "A synchronous resource action.", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "body", + "in": "body", + "description": "The content of the action request", + "required": true, + "schema": { + "$ref": "#/definitions/MoveRequest" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/MoveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{providerNamespace}/{parentType}/{parentName}/{resourceType}/{resourceName}/providers/Microsoft.ContosoProviderHub/employees": { + "get": { + "operationId": "GenericResources_List", + "tags": [ + "GenericResources" + ], + "description": "List a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "providerNamespace", + "in": "path", + "description": "the provider namespace", + "required": true, + "type": "string" + }, + { + "name": "parentType", + "in": "path", + "description": "the resource type of the parent", + "required": true, + "type": "string" + }, + { + "name": "parentName", + "in": "path", + "description": "the name of the parent resource", + "required": true, + "type": "string" + }, + { + "name": "resourceType", + "in": "path", + "description": "the resource type of the target resource", + "required": true, + "type": "string" + }, + { + "name": "resourceName", + "in": "path", + "description": "the name of the target resource", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/EmployeeListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{providerNamespace}/{parentType}/{parentName}/{resourceType}/{resourceName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}": { + "get": { + "operationId": "GenericResources_Get", + "tags": [ + "GenericResources" + ], + "description": "Get a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "providerNamespace", + "in": "path", + "description": "the provider namespace", + "required": true, + "type": "string" + }, + { + "name": "parentType", + "in": "path", + "description": "the resource type of the parent", + "required": true, + "type": "string" + }, + { + "name": "parentName", + "in": "path", + "description": "the name of the parent resource", + "required": true, + "type": "string" + }, + { + "name": "resourceType", + "in": "path", + "description": "the resource type of the target resource", + "required": true, + "type": "string" + }, + { + "name": "resourceName", + "in": "path", + "description": "the name of the target resource", + "required": true, + "type": "string" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "operationId": "GenericResources_Create", + "tags": [ + "GenericResources" + ], + "description": "Create a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "providerNamespace", + "in": "path", + "description": "the provider namespace", + "required": true, + "type": "string" + }, + { + "name": "parentType", + "in": "path", + "description": "the resource type of the parent", + "required": true, + "type": "string" + }, + { + "name": "parentName", + "in": "path", + "description": "the name of the parent resource", + "required": true, + "type": "string" + }, + { + "name": "resourceType", + "in": "path", + "description": "the resource type of the target resource", + "required": true, + "type": "string" + }, + { + "name": "resourceName", + "in": "path", + "description": "the name of the target resource", + "required": true, + "type": "string" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "resource", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/Employee" + } + } + ], + "responses": { + "200": { + "description": "Resource 'Employee' update operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "201": { + "description": "Resource 'Employee' create operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + }, + "headers": { + "Azure-AsyncOperation": { + "type": "string", + "description": "A link to the status monitor" + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "azure-async-operation" + }, + "x-ms-long-running-operation": true + }, + "patch": { + "operationId": "GenericResources_Update", + "tags": [ + "GenericResources" + ], + "description": "Update a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "providerNamespace", + "in": "path", + "description": "the provider namespace", + "required": true, + "type": "string" + }, + { + "name": "parentType", + "in": "path", + "description": "the resource type of the parent", + "required": true, + "type": "string" + }, + { + "name": "parentName", + "in": "path", + "description": "the name of the parent resource", + "required": true, + "type": "string" + }, + { + "name": "resourceType", + "in": "path", + "description": "the resource type of the target resource", + "required": true, + "type": "string" + }, + { + "name": "resourceName", + "in": "path", + "description": "the name of the target resource", + "required": true, + "type": "string" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "properties", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeUpdate" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "operationId": "GenericResources_Delete", + "tags": [ + "GenericResources" + ], + "description": "Delete a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "providerNamespace", + "in": "path", + "description": "the provider namespace", + "required": true, + "type": "string" + }, + { + "name": "parentType", + "in": "path", + "description": "the resource type of the parent", + "required": true, + "type": "string" + }, + { + "name": "parentName", + "in": "path", + "description": "the name of the parent resource", + "required": true, + "type": "string" + }, + { + "name": "resourceType", + "in": "path", + "description": "the resource type of the target resource", + "required": true, + "type": "string" + }, + { + "name": "resourceName", + "in": "path", + "description": "the name of the target resource", + "required": true, + "type": "string" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "202": { + "description": "Resource deletion accepted.", + "headers": { + "Location": { + "type": "string", + "description": "The Location header contains the URL where the status of the long running operation can be checked." + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "204": { + "description": "Resource does not exist." + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "location" + }, + "x-ms-long-running-operation": true + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{scaleSetName}/virtualMachineScaleSetVms/{scaleSetVmName}/providers/Microsoft.ContosoProviderHub/employees": { + "get": { + "operationId": "ScaleSetVms_List", + "tags": [ + "ScaleSetVms" + ], + "description": "List Employee resources by scope", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "scaleSetName", + "in": "path", + "description": "The name of the virtual machine scale set", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "scaleSetVmName", + "in": "path", + "description": "The name of the virtual machine scale set VM", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/EmployeeListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{scaleSetName}/virtualMachineScaleSetVms/{scaleSetVmName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}": { + "get": { + "operationId": "ScaleSetVms_Get", + "tags": [ + "ScaleSetVms" + ], + "description": "Get a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "scaleSetName", + "in": "path", + "description": "The name of the virtual machine scale set", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "scaleSetVmName", + "in": "path", + "description": "The name of the virtual machine scale set VM", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "operationId": "ScaleSetVms_Create", + "tags": [ + "ScaleSetVms" + ], + "description": "Create a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "scaleSetName", + "in": "path", + "description": "The name of the virtual machine scale set", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "scaleSetVmName", + "in": "path", + "description": "The name of the virtual machine scale set VM", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "resource", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/Employee" + } + } + ], + "responses": { + "200": { + "description": "Resource 'Employee' update operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "201": { + "description": "Resource 'Employee' create operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + }, + "headers": { + "Azure-AsyncOperation": { + "type": "string", + "description": "A link to the status monitor" + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "azure-async-operation" + }, + "x-ms-long-running-operation": true + }, + "patch": { + "operationId": "ScaleSetVms_Update", + "tags": [ + "ScaleSetVms" + ], + "description": "Update a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "scaleSetName", + "in": "path", + "description": "The name of the virtual machine scale set", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "scaleSetVmName", + "in": "path", + "description": "The name of the virtual machine scale set VM", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "properties", + "in": "body", + "description": "The resource properties to be updated.", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeUpdate" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "operationId": "ScaleSetVms_Delete", + "tags": [ + "ScaleSetVms" + ], + "description": "Delete a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "scaleSetName", + "in": "path", + "description": "The name of the virtual machine scale set", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "scaleSetVmName", + "in": "path", + "description": "The name of the virtual machine scale set VM", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "202": { + "description": "Resource deletion accepted.", + "headers": { + "Location": { + "type": "string", + "description": "The Location header contains the URL where the status of the long running operation can be checked." + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "204": { + "description": "Resource does not exist." + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "location" + }, + "x-ms-long-running-operation": true + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{scaleSetName}/virtualMachineScaleSetVms/{scaleSetVmName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}/move": { + "post": { + "operationId": "ScaleSetVms_Move", + "tags": [ + "ScaleSetVms" + ], + "description": "A synchronous resource action.", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "scaleSetName", + "in": "path", + "description": "The name of the virtual machine scale set", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "scaleSetVmName", + "in": "path", + "description": "The name of the virtual machine scale set VM", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "body", + "in": "body", + "description": "The content of the action request", + "required": true, + "schema": { + "$ref": "#/definitions/MoveRequest" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/MoveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}/providers/Microsoft.ContosoProviderHub/employees": { + "get": { + "operationId": "VirtualMachines_List", + "tags": [ + "VirtualMachines" + ], + "description": "List Employee resources by scope", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "vmName", + "in": "path", + "description": "The name of the virtual machine", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/EmployeeListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}": { + "get": { + "operationId": "VirtualMachines_Get", + "tags": [ + "VirtualMachines" + ], + "description": "Get a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "vmName", + "in": "path", + "description": "The name of the virtual machine", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "operationId": "VirtualMachines_Create", + "tags": [ + "VirtualMachines" + ], + "description": "Create a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "vmName", + "in": "path", + "description": "The name of the virtual machine", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "resource", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/Employee" + } + } + ], + "responses": { + "200": { + "description": "Resource 'Employee' update operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "201": { + "description": "Resource 'Employee' create operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + }, + "headers": { + "Azure-AsyncOperation": { + "type": "string", + "description": "A link to the status monitor" + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "azure-async-operation" + }, + "x-ms-long-running-operation": true + }, + "patch": { + "operationId": "VirtualMachines_Update", + "tags": [ + "VirtualMachines" + ], + "description": "Update a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "vmName", + "in": "path", + "description": "The name of the virtual machine", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "properties", + "in": "body", + "description": "The resource properties to be updated.", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeUpdate" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "operationId": "VirtualMachines_Delete", + "tags": [ + "VirtualMachines" + ], + "description": "Delete a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "vmName", + "in": "path", + "description": "The name of the virtual machine", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "202": { + "description": "Resource deletion accepted.", + "headers": { + "Location": { + "type": "string", + "description": "The Location header contains the URL where the status of the long running operation can be checked." + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "204": { + "description": "Resource does not exist." + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "location" + }, + "x-ms-long-running-operation": true + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}/move": { + "post": { + "operationId": "VirtualMachines_Move", + "tags": [ + "VirtualMachines" + ], + "description": "A synchronous resource action.", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "vmName", + "in": "path", + "description": "The name of the virtual machine", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "body", + "in": "body", + "description": "The content of the action request", + "required": true, + "schema": { + "$ref": "#/definitions/MoveRequest" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/MoveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContosoProviderHub/employees": { + "get": { + "operationId": "ResourceGroups_List", + "tags": [ + "ResourceGroups" + ], + "description": "List Employee resources by scope", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/EmployeeListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}": { + "get": { + "operationId": "ResourceGroups_Get", + "tags": [ + "ResourceGroups" + ], + "description": "Get a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "operationId": "ResourceGroups_Create", + "tags": [ + "ResourceGroups" + ], + "description": "Create a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "resource", + "in": "body", + "description": "Resource create parameters.", + "required": true, + "schema": { + "$ref": "#/definitions/Employee" + } + } + ], + "responses": { + "200": { + "description": "Resource 'Employee' update operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "201": { + "description": "Resource 'Employee' create operation succeeded", + "schema": { + "$ref": "#/definitions/Employee" + }, + "headers": { + "Azure-AsyncOperation": { + "type": "string", + "description": "A link to the status monitor" + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "azure-async-operation" + }, + "x-ms-long-running-operation": true + }, + "patch": { + "operationId": "ResourceGroups_Update", + "tags": [ + "ResourceGroups" + ], + "description": "Update a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "properties", + "in": "body", + "description": "The resource properties to be updated.", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeUpdate" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/Employee" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "operationId": "ResourceGroups_Delete", + "tags": [ + "ResourceGroups" + ], + "description": "Delete a Employee", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + } + ], + "responses": { + "202": { + "description": "Resource deletion accepted.", + "headers": { + "Location": { + "type": "string", + "description": "The Location header contains the URL where the status of the long running operation can be checked." + }, + "Retry-After": { + "type": "integer", + "format": "int32", + "description": "The Retry-After header can indicate how long the client should wait before polling the operation status." + } + } + }, + "204": { + "description": "Resource does not exist." + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-long-running-operation-options": { + "final-state-via": "location" + }, + "x-ms-long-running-operation": true + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}/move": { + "post": { + "operationId": "ResourceGroups_Move", + "tags": [ + "ResourceGroups" + ], + "description": "A synchronous resource action.", + "parameters": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "employeeName", + "in": "path", + "description": "The name of the Employee", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9-]{3,24}$" + }, + { + "name": "body", + "in": "body", + "description": "The content of the action request", + "required": true, + "schema": { + "$ref": "#/definitions/MoveRequest" + } + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/MoveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ErrorResponse" + } + } + } + } + } + }, + "definitions": { + "Employee": { + "type": "object", + "description": "A ContosoProviderHub resource", + "properties": { + "properties": { + "$ref": "#/definitions/EmployeeProperties", + "description": "The resource-specific properties for this resource.", + "x-ms-client-flatten": true + } + }, + "allOf": [ + { + "$ref": "../../../../../../../../../specs/resource-manager/common-types/v5/types.json#/definitions/ProxyResource" + } + ] + }, + "EmployeeListResult": { + "type": "object", + "description": "The response of a Employee list operation.", + "properties": { + "value": { + "type": "array", + "description": "The Employee items on this page", + "items": { + "$ref": "#/definitions/Employee" + } + }, + "nextLink": { + "type": "string", + "format": "uri", + "description": "The link to the next page of items" + } + }, + "required": [ + "value" + ] + }, + "EmployeeProperties": { + "type": "object", + "description": "Employee properties", + "properties": { + "age": { + "type": "integer", + "format": "int32", + "description": "Age of employee" + }, + "city": { + "type": "string", + "description": "City of employee" + }, + "profile": { + "type": "string", + "format": "base64url", + "description": "Profile of employee" + }, + "provisioningState": { + "$ref": "#/definitions/ProvisioningState", + "description": "The status of the last operation.", + "readOnly": true + } + } + }, + "EmployeeUpdate": { + "type": "object", + "description": "The type used for update operations of the Employee.", + "properties": { + "properties": { + "$ref": "#/definitions/EmployeeUpdateProperties", + "description": "The resource-specific properties for this resource.", + "x-ms-client-flatten": true + } + } + }, + "EmployeeUpdateProperties": { + "type": "object", + "description": "The updatable properties of the Employee.", + "properties": { + "age": { + "type": "integer", + "format": "int32", + "description": "Age of employee" + }, + "city": { + "type": "string", + "description": "City of employee" + }, + "profile": { + "type": "string", + "format": "base64url", + "description": "Profile of employee" + } + } + }, + "MoveRequest": { + "type": "object", + "description": "Employee move request", + "properties": { + "from": { + "type": "string", + "description": "The moving from location" + }, + "to": { + "type": "string", + "description": "The moving to location" + } + }, + "required": [ + "from", + "to" + ] + }, + "MoveResponse": { + "type": "object", + "description": "Employee move response", + "properties": { + "movingStatus": { + "type": "string", + "description": "The status of the move" + } + }, + "required": [ + "movingStatus" + ] + }, + "ProvisioningState": { + "type": "string", + "description": "The provisioning state of a resource.", + "enum": [ + "Succeeded", + "Failed", + "Canceled", + "Provisioning", + "Updating", + "Deleting", + "Accepted" + ], + "x-ms-enum": { + "name": "ProvisioningState", + "modelAsString": true, + "values": [ + { + "name": "Succeeded", + "value": "Succeeded", + "description": "Resource has been created." + }, + { + "name": "Failed", + "value": "Failed", + "description": "Resource creation failed." + }, + { + "name": "Canceled", + "value": "Canceled", + "description": "Resource creation was canceled." + }, + { + "name": "Provisioning", + "value": "Provisioning", + "description": "The resource is being provisioned" + }, + { + "name": "Updating", + "value": "Updating", + "description": "The resource is updating" + }, + { + "name": "Deleting", + "value": "Deleting", + "description": "The resource is being deleted" + }, + { + "name": "Accepted", + "value": "Accepted", + "description": "The resource create request has been accepted" + } + ] + }, + "readOnly": true + } + }, + "parameters": {} +} diff --git a/packages/typespec-azure-resource-manager/README.md b/packages/typespec-azure-resource-manager/README.md index 77b2b765e5..b4f68a3a7b 100644 --- a/packages/typespec-azure-resource-manager/README.md +++ b/packages/typespec-azure-resource-manager/README.md @@ -322,7 +322,7 @@ This decorator is used on Azure Resource Manager resources that are not based on Azure.ResourceManager common types. ```typespec -@Azure.ResourceManager.armVirtualResource +@Azure.ResourceManager.armVirtualResource(provider?: valueof string) ``` ##### Target @@ -331,7 +331,9 @@ Azure.ResourceManager common types. ##### Parameters -None +| Name | Type | Description | +| -------- | ---------------- | ----------- | +| provider | `valueof string` | | #### `@extensionResource` diff --git a/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.Extension.Private.ts b/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.Extension.Private.ts new file mode 100644 index 0000000000..d6113ba2c9 --- /dev/null +++ b/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.Extension.Private.ts @@ -0,0 +1,34 @@ +import type { DecoratorContext, Model } from "@typespec/compiler"; + +/** + * `@builtInResource` marks a model as built-in to Azure ResourceManager at the tenant level + * + * @param target The model that is marked as built-in. + */ +export type BuiltInResourceDecorator = (context: DecoratorContext, target: Model) => void; + +/** + * `@builtInSubscriptionResource` marks a model as built-in to Azure ResourceManager at the Subscription level + * + * @param target The model that is marked as built-in. + */ +export type BuiltInSubscriptionResourceDecorator = ( + context: DecoratorContext, + target: Model, +) => void; + +/** + * `@builtInResourceGroupResource` marks a model as built-in to Azure ResourceManager at the ResourceGroup level + * + * @param target The model that is marked as built-in. + */ +export type BuiltInResourceGroupResourceDecorator = ( + context: DecoratorContext, + target: Model, +) => void; + +export type AzureResourceManagerExtensionPrivateDecorators = { + builtInResource: BuiltInResourceDecorator; + builtInSubscriptionResource: BuiltInSubscriptionResourceDecorator; + builtInResourceGroupResource: BuiltInResourceGroupResourceDecorator; +}; diff --git a/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.Private.ts b/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.Private.ts index 5ae026d27d..90d7c36219 100644 --- a/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.Private.ts +++ b/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.Private.ts @@ -79,6 +79,18 @@ export type ArmUpdateProviderNamespaceDecorator = ( target: Operation, ) => void; +/** + * + * + * + * @param resource Resource model + */ +export type AssignUniqueProviderNameValueDecorator = ( + context: DecoratorContext, + target: ModelProperty, + resource: Model, +) => void; + /** * This decorator is used to identify Azure Resource Manager resource types and extract their * metadata. It is *not* meant to be used directly by a spec author, it instead @@ -170,6 +182,7 @@ export type AzureResourceManagerPrivateDecorators = { assignProviderNameValue: AssignProviderNameValueDecorator; azureResourceBase: AzureResourceBaseDecorator; armUpdateProviderNamespace: ArmUpdateProviderNamespaceDecorator; + assignUniqueProviderNameValue: AssignUniqueProviderNameValueDecorator; armResourceInternal: ArmResourceInternalDecorator; defaultResourceKeySegmentName: DefaultResourceKeySegmentNameDecorator; enforceConstraint: EnforceConstraintDecorator; diff --git a/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.ts b/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.ts index b00ea3befb..b1b2f5172d 100644 --- a/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.ts +++ b/packages/typespec-azure-resource-manager/generated-defs/Azure.ResourceManager.ts @@ -248,7 +248,11 @@ export type ArmCommonTypesVersionDecorator = ( * * @param propertiesType : The type of the resource properties. */ -export type ArmVirtualResourceDecorator = (context: DecoratorContext, target: Model) => void; +export type ArmVirtualResourceDecorator = ( + context: DecoratorContext, + target: Model, + provider?: string, +) => void; /** * This decorator sets the base type of the given resource. diff --git a/packages/typespec-azure-resource-manager/lib/Legacy/arm.legacy.tsp b/packages/typespec-azure-resource-manager/lib/Legacy/arm.legacy.tsp index d9a1926a53..8858580c10 100644 --- a/packages/typespec-azure-resource-manager/lib/Legacy/arm.legacy.tsp +++ b/packages/typespec-azure-resource-manager/lib/Legacy/arm.legacy.tsp @@ -2,3 +2,6 @@ import "./managed-identity.tsp"; import "./decorator.tsp"; import "./operations.tsp"; import "./interfaces.tsp"; +import "./extension.tsp"; + +namespace Azure.ResourceManager.Legacy; diff --git a/packages/typespec-azure-resource-manager/lib/Legacy/extension.tsp b/packages/typespec-azure-resource-manager/lib/Legacy/extension.tsp new file mode 100644 index 0000000000..262e32eb7a --- /dev/null +++ b/packages/typespec-azure-resource-manager/lib/Legacy/extension.tsp @@ -0,0 +1,321 @@ +import "@typespec/rest"; +import "@typespec/http"; + +namespace Azure.ResourceManager.Legacy; + +using Http; +using Azure.ResourceManager.Private; +using Rest; + +/** + * An operation template used to build extension resource operations using non-standard paths. + * @template TargetParameters The path parameters for the target resource + * @template ExtensionParentParameters Parent parameters of the extension resource + * @template ExtensionInstanceParameters The instance parameters of the extension resource + */ +@doc("") +interface ExtensionOperations< + TargetParameters extends {}, + ExtensionParentParameters extends {}, + ExtensionInstanceParameters extends {} +> { + /** + * A long-running resource CreateOrUpdate (PUT) + * @template Resource the resource being created or updated + * @template LroHeaders Optional. Allows overriding the lro headers returned on resource create + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the PUT operation + * @template OptionalRequestBody Optional. Indicates whether the request body is optional + * @template ErrorType Optional. The error response, if non-standard. + */ + @autoRoute + @doc("Create a {name}", Resource) + @armResourceCreateOrUpdate(Resource) + @Azure.Core.Foundations.Private.defaultFinalStateVia(#["location", "azure-async-operation"]) + @put + CreateOrUpdateAsync< + Resource extends Foundations.SimpleResource, + LroHeaders extends TypeSpec.Reflection.Model = ArmAsyncOperationHeader & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} = ArmResourceUpdatedResponse | ArmResourceCreatedResponse< + Resource, + LroHeaders + >, + OptionalRequestBody extends valueof boolean = false, + ErrorType extends {} = ErrorResponse + >( + ...TargetParameters, + ...ExtensionInstanceParameters, + ...Parameters, + @doc("Resource create parameters.") @armBodyRoot(OptionalRequestBody) resource: Resource, + ): Response | ErrorType; + + /** + * A synchronous resource CreateOrUpdate (PUT) + * @template Resource the resource being created or updated + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the PUT operation + * @template OptionalRequestBody Optional. Indicates whether the request body is optional + * @template ErrorType Optional. The error response, if non-standard. + */ + #suppress "@azure-tools/typespec-azure-core/no-private-usage" + @autoRoute + @doc("Create a {name}", Resource) + @armResourceCreateOrUpdate(Resource) + @put + CreateOrUpdateSync< + Resource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResourceUpdatedResponse | ArmResourceCreatedSyncResponse, + OptionalRequestBody extends valueof boolean = false, + ErrorType extends {} = ErrorResponse + >( + ...TargetParameters, + ...ExtensionInstanceParameters, + ...Parameters, + @doc("Resource create parameters.") @armBodyRoot(OptionalRequestBody) resource: Resource, + ): Response | ErrorType; + + /** + * A long-running resource Update (PATCH) + * @template Resource the resource being created or updated + * @template PatchModel the PATCH request model + * @template LroHeaders Optional. Allows overriding the lro headers returned on resource create + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the PATCH operation + * @template OptionalRequestBody Optional. Indicates whether the request body is optional + * @template ErrorType Optional. The error response, if non-standard. + */ + @autoRoute + @doc("Update a {name}", Resource) + @armResourceUpdate(Resource) + @patch(#{ implicitOptionality: false }) + CustomPatchAsync< + Resource extends Foundations.SimpleResource, + PatchModel extends {} = Azure.ResourceManager.Foundations.TagsUpdateModel, + LroHeaders extends TypeSpec.Reflection.Model = ArmLroLocationHeader< + Azure.Core.StatusMonitorPollingOptions, + Resource, + string + > & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} = ArmResponse | ArmAcceptedLroResponse< + "Resource update request accepted.", + LroHeaders + >, + OptionalRequestBody extends valueof boolean = false, + ErrorType extends {} = ErrorResponse + >( + ...TargetParameters, + ...ExtensionInstanceParameters, + ...Parameters, + @doc("Resource create parameters.") @armBodyRoot(OptionalRequestBody) properties: PatchModel, + ): Response | ErrorType; + + /** + * A synchronous resource Update (PATCH) + * @template Resource the resource being created or updated + * @template PatchModel the PATCH request model + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the PATCH operation + * @template OptionalRequestBody Optional. Indicates whether the request body is optional + * @template ErrorType Optional. The error response, if non-standard. + */ + @autoRoute + @doc("Update a {name}", Resource) + @armResourceUpdate(Resource) + @patch(#{ implicitOptionality: false }) + CustomPatchSync< + Resource extends Foundations.SimpleResource, + PatchModel extends {} = Azure.ResourceManager.Foundations.TagsUpdateModel, + Parameters extends {} = {}, + Response extends {} = ArmResponse, + OptionalRequestBody extends valueof boolean = false, + ErrorType extends {} = ErrorResponse + >( + ...TargetParameters, + ...ExtensionInstanceParameters, + ...Parameters, + @doc("Resource create parameters.") @armBodyRoot(OptionalRequestBody) properties: PatchModel, + ): Response | ErrorType; + + /** + * Delete a resource asynchronously + * @template Resource The resource being deleted + * @template LroHeaders The lro headers for the operation + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the delete operation + * @template ErrorType Optional. The error response, if non-standard. + */ + #suppress "@azure-tools/typespec-azure-core/no-response-body" "Valid" + @autoRoute + @doc("Delete a {name}", Resource) + @delete + @deletesResource(Resource) + @armResourceDelete(Resource) + DeleteWithoutOkAsync< + Resource extends Foundations.SimpleResource, + LroHeaders extends TypeSpec.Reflection.Model = ArmLroLocationHeader & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} = ArmDeleteAcceptedLroResponse | ArmDeletedNoContentResponse, + ErrorType extends {} = ErrorResponse + >(...TargetParameters, ...ExtensionInstanceParameters, ...Parameters): Response | ErrorType; + + /** + * Delete a resource synchronously + * @template Resource The resource being deleted + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the delete operation + * @template ErrorType Optional. The error response, if non-standard. + */ + #suppress "@azure-tools/typespec-azure-core/no-response-body" "Valid" + @autoRoute + @doc("Delete a {name}", Resource) + @delete + @deletesResource(Resource) + @armResourceDelete(Resource) + DeleteSync< + Resource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmDeletedResponse | ArmDeletedNoContentResponse, + ErrorType extends {} = ErrorResponse + >(...TargetParameters, ...ExtensionInstanceParameters, ...Parameters): Response | ErrorType; + + /** + * @dev Get a resource + * @template Resource The resource being read + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for a get operation. + * @template ErrorType Optional. The error response, if non-standard. + */ + @autoRoute + @doc("Get a {name}", Resource) + @get + @readsResource(Resource) + @armResourceRead(Resource) + Read< + Resource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResponse, + ErrorType extends {} = ErrorResponse + >(...TargetParameters, ...ExtensionInstanceParameters, ...Parameters): Response | ErrorType; + + /** + * Check a resource's existence via HEAD operation + * * @template Resource The resource being checked + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for a head operation (by default NoContent or NotFound response). + * @template ErrorType Optional. The error response, if non-standard. + */ + @autoRoute + @doc("Check for the existence of a {name}", Resource) + @head + CheckExistence< + Resource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResourceExistsResponse | ArmResourceNotFoundResponse, + ErrorType extends {} = ErrorResponse + > is Foundations.ArmReadOperation< + TargetParameters & ExtensionInstanceParameters & Parameters, + Response, + ErrorType + >; + /** + * List a resource + * @template Resource The resource being listed + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The response returned by the list + * @template ErrorType Optional. The error response, if non-standard. + */ + @autoRoute + @doc("List a {name}", Resource) + @get + @listsResource(Resource) + @armResourceList(Resource) + List< + Resource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResponse>, + ErrorType extends {} = ErrorResponse + >(...TargetParameters, ...ExtensionParentParameters, ...Parameters): Response | ErrorType; + + /** + * A synchronous resource action. + * @template Resource The resource being acted upon + * @template Request The request model for the action + * @template Response The response model for the action + * @template Parameters Optional. Additional parameters after the path parameters + * @template OptionalRequestBody Optional. Indicates whether the request body is optional + * @template ErrorType Optional. The error response, if non-standard. + */ + @doc("") + @autoRoute + @armResourceAction(Resource) + @Private.enforceConstraint(Resource, Foundations.Resource) + @post + @returnsDoc("Azure operation completed successfully.") + ActionSync< + Resource extends Foundations.SimpleResource, + Request extends TypeSpec.Reflection.Model | void, + Response extends TypeSpec.Reflection.Model | void, + Parameters extends {} = {}, + OptionalRequestBody extends valueof boolean = false, + ErrorType extends {} = ErrorResponse + >( + ...TargetParameters, + ...ExtensionInstanceParameters, + ...Parameters, + + @doc("The content of the action request") + @armBodyRoot(OptionalRequestBody) + body: Request, + ): Response | ErrorType; + + /** + * A long-running resource action. + * @template Resource The resource being acted upon + * @template Request The request model for the action + * @template Result The result model for the action + * @template LroHeaders Optional. Allows overriding the headers returned in the Accepted response + * @template Response The full response union of the action + * @template Parameters Optional. Additional parameters after the path parameters + * @template OptionalRequestBody Optional. Indicates whether the request body is optional + * @template ErrorType Optional. The error response, if non-standard. + */ + #suppress "@azure-tools/typespec-azure-core/no-response-body" "ARM" + @doc("") + @autoRoute + @armResourceAction(Resource) + @Private.enforceConstraint(Resource, Foundations.Resource) + @post + @returnsDoc("Azure operation completed successfully.") + ActionAsync< + Resource extends Foundations.SimpleResource, + Request extends TypeSpec.Reflection.Model | void, + Result extends TypeSpec.Reflection.Model | void, + LroHeaders extends TypeSpec.Reflection.Model = ArmLroLocationHeader< + Azure.Core.StatusMonitorPollingOptions, + Result, + string + > & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} | void = ArmAcceptedLroResponse< + "Resource operation accepted.", + LroHeaders + > | Result, + OptionalRequestBody extends valueof boolean = false, + ErrorType extends {} = ErrorResponse + >( + ...TargetParameters, + ...ExtensionInstanceParameters, + ...Parameters, + + @doc("The content of the action request") + @armBodyRoot(OptionalRequestBody) + body: Request, + ): Response | ErrorType; +} diff --git a/packages/typespec-azure-resource-manager/lib/Legacy/operations.tsp b/packages/typespec-azure-resource-manager/lib/Legacy/operations.tsp index eb31a8987f..525a1cb0e7 100644 --- a/packages/typespec-azure-resource-manager/lib/Legacy/operations.tsp +++ b/packages/typespec-azure-resource-manager/lib/Legacy/operations.tsp @@ -32,6 +32,7 @@ interface LegacyOperations< @autoRoute @doc("Create a {name}", Resource) @armResourceCreateOrUpdate(Resource) + @Private.armUpdateProviderNamespace @Azure.Core.Foundations.Private.defaultFinalStateVia(#["location", "azure-async-operation"]) @put CreateOrUpdateAsync< @@ -62,6 +63,7 @@ interface LegacyOperations< @autoRoute @doc("Create a {name}", Resource) @armResourceCreateOrUpdate(Resource) + @Private.armUpdateProviderNamespace @put CreateOrUpdateSync< Resource extends Foundations.SimpleResource, @@ -87,6 +89,7 @@ interface LegacyOperations< @autoRoute @doc("Update a {name}", Resource) @armResourceUpdate(Resource) + @Private.armUpdateProviderNamespace @patch(#{ implicitOptionality: false }) CustomPatchAsync< Resource extends Foundations.SimpleResource, @@ -121,6 +124,7 @@ interface LegacyOperations< @autoRoute @doc("Update a {name}", Resource) @armResourceUpdate(Resource) + @Private.armUpdateProviderNamespace @patch(#{ implicitOptionality: false }) CustomPatchSync< Resource extends Foundations.SimpleResource, @@ -147,6 +151,7 @@ interface LegacyOperations< @doc("Delete a {name}", Resource) @delete @deletesResource(Resource) + @Private.armUpdateProviderNamespace @armResourceDelete(Resource) DeleteWithoutOkAsync< Resource extends Foundations.SimpleResource, @@ -168,6 +173,7 @@ interface LegacyOperations< @delete @deletesResource(Resource) @armResourceDelete(Resource) + @Private.armUpdateProviderNamespace DeleteSync< Resource extends Foundations.SimpleResource, Parameters extends {} = {}, @@ -185,12 +191,33 @@ interface LegacyOperations< @get @readsResource(Resource) @armResourceRead(Resource) + @Private.armUpdateProviderNamespace Read< Resource extends Foundations.SimpleResource, Parameters extends {} = {}, Response extends {} = ArmResponse >(...ParentParameters, ...ResourceTypeParameter, ...Parameters): Response | ErrorType; + /** + * Check a resource's existence via HEAD operation + * @template Resource The resource being checked + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for a head operation (by default NoContent or NotFound response). + */ + @autoRoute + @doc("Check for the existence of a {name}", Resource) + @Private.armUpdateProviderNamespace + @head + CheckExistence< + Resource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResourceExistsResponse | ArmResourceNotFoundResponse + > is Foundations.ArmReadOperation< + ParentParameters & ResourceTypeParameter & Parameters, + Response, + ErrorType + >; + /** * List a resource * @template Resource The resource being listed @@ -203,6 +230,7 @@ interface LegacyOperations< @listsResource(Resource) @segmentOf(Resource) @armResourceList(Resource) + @Private.armUpdateProviderNamespace List< Resource extends Foundations.SimpleResource, Parameters extends {} = {}, @@ -222,6 +250,7 @@ interface LegacyOperations< @armResourceAction(Resource) @Private.enforceConstraint(Resource, Foundations.Resource) @post + @Private.armUpdateProviderNamespace @returnsDoc("Azure operation completed successfully.") ActionSync< Resource extends Foundations.SimpleResource, @@ -243,8 +272,9 @@ interface LegacyOperations< * A long-running resource action. * @template Resource The resource being acted upon * @template Request The request model for the action + * @template Result The result model for the action when the operation is successful * @template LroHeaders Optional. Allows overriding the headers returned in the Accepted response - * @template Response The response model for the action + * @template Response The union of successful responses for the action * @template Parameters Optional. Additional parameters after the path parameters * @template OptionalRequestBody Optional. Indicates whether the request body is optional */ @@ -253,6 +283,7 @@ interface LegacyOperations< @autoRoute @armResourceAction(Resource) @Private.enforceConstraint(Resource, Foundations.Resource) + @Private.armUpdateProviderNamespace @post @returnsDoc("Azure operation completed successfully.") ActionAsync< @@ -282,13 +313,21 @@ interface LegacyOperations< ): Response | ErrorType; } /** - * @dev Get the provider namespace key-value pair + * @dev DEPRECATED: Use ProviderParameter instead. Get the provider namespace key-value pair * @template Resource Optional. The resource to get the provider namespace for. */ model Provider { ...ProviderNamespace; } +/** + * @dev Get the provider namespace key-value pair + * @template Resource The resource to get the provider namespace for. + */ +model ProviderParameter { + ...ProviderNamespace; +} + /** * A long-running resource update using a custom PATCH payload (Asynchronous) * @template Resource the resource being patched diff --git a/packages/typespec-azure-resource-manager/lib/arm.tsp b/packages/typespec-azure-resource-manager/lib/arm.tsp index 89af7ed2dd..443205d238 100644 --- a/packages/typespec-azure-resource-manager/lib/arm.tsp +++ b/packages/typespec-azure-resource-manager/lib/arm.tsp @@ -8,6 +8,7 @@ import "@azure-tools/typespec-azure-core"; import "./foundations/arm.foundations.tsp"; import "./Legacy/arm.legacy.tsp"; import "./common-types/common-types.tsp"; +import "./extension/extension.tsp"; import "./backcompat.tsp"; import "./private.decorators.tsp"; import "./models.tsp"; diff --git a/packages/typespec-azure-resource-manager/lib/common-types/internal.tsp b/packages/typespec-azure-resource-manager/lib/common-types/internal.tsp index c1334a48a3..1e8179a375 100644 --- a/packages/typespec-azure-resource-manager/lib/common-types/internal.tsp +++ b/packages/typespec-azure-resource-manager/lib/common-types/internal.tsp @@ -18,6 +18,15 @@ enum ResourceHome { @doc("The resource is bound to an extension") Extension, + + @doc("The resource is a built in tenant resource") + BuiltIn, + + @doc("The resource is a built in subscription resource") + BuiltInSubscription, + + @doc("The resource is a built in resource group resource") + BuiltInResourceGroup, } /** Alias of keyEncryptionKeyIdentity for back compatibility. Please change to keyEncryptionKeyIdentity. */ diff --git a/packages/typespec-azure-resource-manager/lib/common-types/types-ref.tsp b/packages/typespec-azure-resource-manager/lib/common-types/types-ref.tsp index 455b00e80f..6498cccac2 100644 --- a/packages/typespec-azure-resource-manager/lib/common-types/types-ref.tsp +++ b/packages/typespec-azure-resource-manager/lib/common-types/types-ref.tsp @@ -376,7 +376,10 @@ namespace Azure.ResourceManager.CommonTypes; ResourceHome.Subscription, ResourceHome.Location, ResourceHome.Tenant, - ResourceHome.Extension + ResourceHome.Extension, + ResourceHome.BuiltIn, + ResourceHome.BuiltInSubscription, + ResourceHome.BuiltInResourceGroup ] ); @@ -398,7 +401,13 @@ namespace Azure.ResourceManager.CommonTypes; Azure.ResourceManager.CommonTypes.Versions.v6 ); @@resourceParameterBaseFor(SubscriptionIdParameter.subscriptionId, - [ResourceHome.ResourceGroup, ResourceHome.Subscription, ResourceHome.Location] + [ + ResourceHome.ResourceGroup, + ResourceHome.Subscription, + ResourceHome.Location, + ResourceHome.BuiltInSubscription, + ResourceHome.BuiltInResourceGroup + ] ); /** ResourceGroupNameParameter */ @@ -419,7 +428,7 @@ namespace Azure.ResourceManager.CommonTypes; Azure.ResourceManager.CommonTypes.Versions.v6 ); @@resourceParameterBaseFor(ResourceGroupNameParameter.resourceGroupName, - [ResourceHome.ResourceGroup] + [ResourceHome.ResourceGroup, ResourceHome.BuiltInResourceGroup] ); /** ManagementGroupNameParameter */ diff --git a/packages/typespec-azure-resource-manager/lib/decorators.tsp b/packages/typespec-azure-resource-manager/lib/decorators.tsp index 7e50611a59..f2ec50846a 100644 --- a/packages/typespec-azure-resource-manager/lib/decorators.tsp +++ b/packages/typespec-azure-resource-manager/lib/decorators.tsp @@ -180,7 +180,7 @@ extern dec armCommonTypesVersion( * * @param propertiesType: The type of the resource properties. */ -extern dec armVirtualResource(target: Model); +extern dec armVirtualResource(target: Model, provider?: valueof string); /** * This decorator sets the base type of the given resource. diff --git a/packages/typespec-azure-resource-manager/lib/extension/extension.tsp b/packages/typespec-azure-resource-manager/lib/extension/extension.tsp new file mode 100644 index 0000000000..03154858b5 --- /dev/null +++ b/packages/typespec-azure-resource-manager/lib/extension/extension.tsp @@ -0,0 +1,6 @@ +import "@azure-tools/typespec-azure-core"; +import "./operations.tsp"; +import "./parameters.tsp"; +import "./private.decorators.tsp"; + +namespace Azure.ResourceManager.Extension; diff --git a/packages/typespec-azure-resource-manager/lib/extension/operations.tsp b/packages/typespec-azure-resource-manager/lib/extension/operations.tsp new file mode 100644 index 0000000000..3110db2a2f --- /dev/null +++ b/packages/typespec-azure-resource-manager/lib/extension/operations.tsp @@ -0,0 +1,507 @@ +namespace Azure.ResourceManager.Extension; + +using Http; +using Rest; +using Azure.ResourceManager.Foundations; +using Azure.ResourceManager.Private; + +// OPERATION TEMPLATES + +/** + * List an extension resource at the given target scope + * @template TargetResource The target to list at, e.g. Extension.Subscription or Extension>ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource the resource being listed + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for the list operation + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("List {name} resources by scope", ExtensionResource) +@listsResource(ExtensionResource) +@segmentOf(ExtensionResource) +@armResourceList(ExtensionResource) +@get +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +op ListByTarget< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResponse>, + Error extends {} = ErrorResponse +> is ArmReadOperation< + ExtensionParentParameters & Parameters, + Response, + Error +>; + +/** + * A resource GET operation + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource the resource being rea + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for the read operation + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("Get a {name}", ExtensionResource) +@get +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@armResourceRead(ExtensionResource) +op Read< + TargetResource extends SimpleResource, + ExtensionResource extends SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResponse, + Error extends {} = ErrorResponse +> is ArmReadOperation< + ExtensionInstanceParameters & Parameters, + Response, + Error +>; + +/** + * Check a resource's existence via HEAD operation + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource the extension resource being checked + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for the read operation + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("Check for the existence of a {name}", ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@head +op CheckExistence< + TargetResource extends SimpleResource, + ExtensionResource extends SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResourceExistsResponse | ArmResourceNotFoundResponse, + Error extends {} = ErrorResponse +> is ArmReadOperation< + ExtensionInstanceParameters & Parameters, + Response, + Error +>; + +/** + * A long-running resource CreateOrUpdate (PUT) + * @template TargetResource the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource the resource being created or updated + * @template LroHeaders Optional. Allows overriding the lro headers returned on resource create + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for the createOrUpdate operation + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("Create a {name}", ExtensionResource) +@armResourceCreateOrUpdate(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@Azure.Core.Foundations.Private.defaultFinalStateVia(#["location", "azure-async-operation"]) +@put +op CreateOrUpdateAsync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + LroHeaders extends TypeSpec.Reflection.Model = ArmAsyncOperationHeader & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} = ArmResourceUpdatedResponse | ArmResourceCreatedResponse< + ExtensionResource, + LroHeaders + >, + Error extends {} = ErrorResponse +> is ArmCreateOperation< + ExtensionInstanceParameters & Parameters, + ExtensionResource, + Response, + Error +>; + +/** + * Synchronous PUT operation for Azure Resource Manager resources + * @template TargetResource the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource the resource being created or replaced + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for the createOrUpdate operation + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("Create a {name}", ExtensionResource) +@armResourceCreateOrUpdate(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@put +op CreateOrReplaceSync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmResourceUpdatedResponse | ArmResourceCreatedSyncResponse, + Error extends {} = ErrorResponse +> is ArmCreateOperation< + ExtensionInstanceParameters & Parameters, + ExtensionResource, + Response, + Error +>; + +/** + * @dev A long-running resource CreateOrUpdate (PUT) + * @template TargetResource the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource the resource being created or replaced + * @template LroHeaders Optional. Allows overriding the lro headers returned on resource create + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for the createOrReplace operation + * @template Error Optional. The error response, if non-standard. + */ +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +op CreateOrReplaceAsync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + LroHeaders extends TypeSpec.Reflection.Model = ArmAsyncOperationHeader & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} = ArmResourceUpdatedResponse | ArmResourceCreatedResponse< + ExtensionResource, + LroHeaders + >, + Error extends {} = ErrorResponse +> is CreateOrUpdateAsync< + TargetResource, + ExtensionResource, + LroHeaders, + Parameters, + Response, + Error +>; + +/** + * A long-running resource update using a custom PATCH payload (Asynchronous) + * @template TargetResource the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource the resource being patched + * @template PatchModel The input model for the PATCH request + * @template LroHeaders Optional. Allows overriding the lro headers returned in the Accepted response + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for the patch operation + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("Update a {name}", ExtensionResource) +@armResourceUpdate(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@patch(#{ implicitOptionality: true }) +op CustomPatchAsync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + PatchModel extends TypeSpec.Reflection.Model = TagsUpdateModel, + LroHeaders extends TypeSpec.Reflection.Model = ArmLroLocationHeader< + Azure.Core.StatusMonitorPollingOptions, + ExtensionResource, + string + > & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} = ArmResponse | ArmAcceptedLroResponse< + "Resource update request accepted.", + LroHeaders + >, + Error extends {} = ErrorResponse +> is ArmUpdateOperation< + ExtensionInstanceParameters & Parameters, + PatchModel, + Response, + Error +>; + +/** + * A resource update using a custom PATCH payload (synchronous) + * @template TargetResource the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource the resource being patched + * @template PatchModel The input model for the PATCH request + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response for the patch operation + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("Update a {name}", ExtensionResource) +@armResourceUpdate(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@patch(#{ implicitOptionality: true }) +op CustomPatchSync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + PatchModel extends TypeSpec.Reflection.Model = TagsUpdateModel, + Parameters extends {} = {}, + Response extends {} = ArmResponse, + Error extends {} = ErrorResponse +> is ArmUpdateOperation< + ExtensionInstanceParameters & Parameters, + PatchModel, + Response, + Error +>; + +/** + * @dev Delete a resource asynchronously + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being deleted + * @template Response The response type for the operation + * @template Parameters Optional. Additional parameters after the path parameters + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("Delete a {name}", ExtensionResource) +@armResourceDelete(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@delete +op DeleteAsyncBase< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Response, + Parameters extends {} = {}, + Error extends {} = ErrorResponse +>( + ...ExtensionInstanceParameters, + ...Parameters, +): Response | Error; + +/** + * @dev Delete a resource asynchronously. + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being deleted + * @template LroHeaders Optional. Allows overriding the headers in the Accepted response + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the delete operation + * @template Error Optional. The error response, if non-standard. + */ +#deprecated "Use 'DeleteWithoutOkAsync' instead" +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +op DeleteAsync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + LroHeaders extends TypeSpec.Reflection.Model = ArmLroLocationHeader & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} = ArmDeletedResponse | ArmDeleteAcceptedLroResponse | ArmDeletedNoContentResponse, + Error extends {} = ErrorResponse +> is DeleteAsyncBase; + +/** + * @dev Delete a resource asynchronously + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being deleted + * @template LroHeaders Optional. Allows overriding the headers returned in the Accepted response + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the delete operation + * @template Error Optional. The error response, if non-standard. + */ +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +op DeleteWithoutOkAsync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + LroHeaders extends TypeSpec.Reflection.Model = ArmLroLocationHeader & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Response extends {} = ArmDeleteAcceptedLroResponse | ArmDeletedNoContentResponse, + Error extends {} = ErrorResponse +> is DeleteAsyncBase; + +/** + * Delete a resource synchronously + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being deleted + * @template Parameters Optional. Additional parameters after the path parameters + * @template Response Optional. The success response(s) for the delete operation + * @template Error Optional. The error response, if non-standard. + */ +@autoRoute +@doc("Delete a {name}", ExtensionResource) +@armResourceDelete(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@delete +op DeleteSync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Parameters extends {} = {}, + Response extends {} = ArmDeletedResponse | ArmDeletedNoContentResponse, + Error = ErrorResponse +>( + ...ExtensionInstanceParameters, + ...Parameters, +): Response | Error; + +/** + * A long-running resource action. + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being acted upon + * @template Request The request model for the action + * @template Response The response type for the action + * @template Parameters Optional. Additional parameters after the path parameters + * @template Error Optional. The error response, if non-standard. + * @template OptionalRequestBody Optional. Indicates whether the request body is optional. + */ +@autoRoute +@armResourceAction(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@post +op ActionAsyncBase< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Request extends TypeSpec.Reflection.Model | void, + Response extends TypeSpec.Reflection.Model | void, + Parameters extends {} = {}, + Error extends {} = ErrorResponse, + OptionalRequestBody extends valueof boolean = false +>( + ...ExtensionInstanceParameters, + ...Parameters, + + @doc("The content of the action request") + @armBodyRoot(OptionalRequestBody) + body: Request, +): Response | Error; + +/** + * @dev A long-running resource action. + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being acted upon + * @template Request The request model for the action + * @template Response The response model for the action + * @template LroHeaders Optional. Allows overriding the headers returned in the Accepted response + * @template Parameters Optional. Additional parameters after the path parameters + * @template Error Optional. The error response, if non-standard. + * @template OptionalRequestBody Optional. Indicates whether the body parameter is optional. + */ +@returnsDoc("Azure operation completed successfully.") +@enforceConstraint(ExtensionResource, Foundations.Resource) +op ActionAsync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Request extends TypeSpec.Reflection.Model | void, + Response extends TypeSpec.Reflection.Model | void, + LroHeaders extends TypeSpec.Reflection.Model = ArmLroLocationHeader< + Azure.Core.StatusMonitorPollingOptions, + Response, + string + > & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Error extends {} = ErrorResponse, + OptionalRequestBody extends valueof boolean = false +> is ActionAsyncBase< + TargetResource, + ExtensionResource, + Request, + ArmAcceptedLroResponse<"Resource operation accepted.", LroHeaders> | Response, + Parameters, + Error, + OptionalRequestBody +>; + +/** + * A synchronous resource action. + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being acted upon + * @template Request The request model for the action + * @template Response The response model for the action + * @template Parameters Optional. Additional parameters after the path parameters + * @template Error Optional. The error response, if non-standard. + * @template OptionalRequestBody Optional. Indicates whether the body parameter is optional. + */ +@autoRoute +@armResourceAction(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@post +@returnsDoc("Azure operation completed successfully.") +op ActionSync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Request extends TypeSpec.Reflection.Model | void, + Response extends TypeSpec.Reflection.Model | void, + Parameters extends {} = {}, + Error extends {} = ErrorResponse, + OptionalRequestBody extends valueof boolean = false +>( + ...ExtensionInstanceParameters, + ...Parameters, + + @doc("The content of the action request") + @armBodyRoot(OptionalRequestBody) + body: Request, +): Response | Error; + +/** + * @dev A long-running resource action that returns no content. + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being acted upon + * @template Request The request model for the action + * @template LroHeaders Optional. Allows overriding the headers returned in the Accepted response + * @template Parameters Optional. Additional parameters after the path parameters + * @template Error Optional. The error response, if non-standard. + * @template OptionalRequestBody Optional. Indicates whether the body parameter is optional. + */ +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +op ActionNoResponseContentAsync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Request extends TypeSpec.Reflection.Model | void, + LroHeaders extends TypeSpec.Reflection.Model = ArmLroLocationHeader< + Azure.Core.StatusMonitorPollingOptions, + void, + string + > & + Azure.Core.Foundations.RetryAfterHeader, + Parameters extends {} = {}, + Error extends {} = ErrorResponse, + OptionalRequestBody extends valueof boolean = false +> is ActionAsyncBase< + TargetResource, + ExtensionResource, + Request, + ArmAcceptedLroResponse<"Resource operation accepted.", LroHeaders>, + Parameters, + Error, + OptionalRequestBody +>; + +/** + * A synchronous resource action that returns no content. + * @template TargetResource The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup + * @template ExtensionResource The resource being acted upon + * @template Request The request model for the action + * @template Parameters Optional. Additional parameters after the path parameters + * @template Error Optional. The error response, if non-standard. + * @template OptionalRequestBody Optional. Indicates whether the request body is optional. + */ +@autoRoute +@armResourceAction(ExtensionResource) +@enforceConstraint(TargetResource, Foundations.Resource) +@enforceConstraint(ExtensionResource, Foundations.Resource) +@post +op ActionNoContentSync< + TargetResource extends Foundations.SimpleResource, + ExtensionResource extends Foundations.SimpleResource, + Request extends TypeSpec.Reflection.Model | void, + Parameters extends {} = {}, + Error extends {} = ErrorResponse, + OptionalRequestBody extends valueof boolean = false +>( + ...ExtensionInstanceParameters, + ...Parameters, + + @doc("The content of the action request") + @armBodyRoot(OptionalRequestBody) + body: Request, +): ArmNoContentResponse<"Action completed successfully."> | Error; diff --git a/packages/typespec-azure-resource-manager/lib/extension/parameters.tsp b/packages/typespec-azure-resource-manager/lib/extension/parameters.tsp new file mode 100644 index 0000000000..22203df32a --- /dev/null +++ b/packages/typespec-azure-resource-manager/lib/extension/parameters.tsp @@ -0,0 +1,223 @@ +namespace Azure.ResourceManager.Extension; + +using Http; +using Rest; +using Azure.ResourceManager.Private; +using Azure.ResourceManager.Extension.Private; +using Azure.ResourceManager.CommonTypes; + +/** + * The default scope parameter for an extension resource. + * @template Type The type of the scope parameter (default is string). This can be used to specify `Azure.Core.armResourceIdentifier` type or other constrained type + * + * @example + * ```typespec + * model Employee { + * ...ResourceUriParameter; + * } + * ``` + */ +@builtInResource +model ScopeParameter { + @path(#{ allowReserved: true }) + @key + @doc("The fully qualified Azure Resource manager identifier of the resource.") + scope: Type; +} + +/** + * Base parameters for an extension target. + * @template Resource The resource model for an extension target (usually Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or an external resource). + * + */ +@resourceBaseParametersOf(Resource) +model TargetBaseParameters { + ...ApiVersionParameter; + + // unless built-in, tenant or extension + ...CommonTypes.SubscriptionIdParameter; + + // unless built-in tenant, subscription, location, or extension + ...CommonTypes.ResourceGroupNameParameter; + + // unless built-in + ...TargetProviderNamespace; +} + +/** The path parameters for a target resource for an extension + * @template Resource The resource model for an extension target (usually Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or an external resource). + */ +model TargetParameters { + ...TargetBaseParameters; + ...KeysOf; +} + +/** The provider namespace for an extension resource + * @template Resource The extension resource model + */ +model ExtensionProviderNamespace { + @path + @segment("providers") + @assignUniqueProviderNameValue(Resource) + @doc("The provider namespace for the resource.") + extensionProvider: "Microsoft.ExtensionProviderNamespace"; +} + +/** The provider namespace (if any) for a target resource for an extension + * @template Resource The resource model for an extension target (usually Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or an external resource) + */ +model TargetProviderNamespace { + @resourceParameterBaseFor( + [ + ResourceHome.Extension, + ResourceHome.Location, + ResourceHome.ResourceGroup, + ResourceHome.Subscription, + ResourceHome.Tenant + ] + ) + @path + @segment("providers") + @doc("The provider namespace for the resource.") + @assignUniqueProviderNameValue(Resource) + provider: "Microsoft.TargetProviderNamespace"; +} + +/** The path parameters for an extension resource at the given target + * @template TargetResource The target of the extension resource (Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or another resource). + * @template Resource The extension resource. + */ +model ExtensionInstanceParameters { + ...TargetParameters; + ...ExtensionProviderNamespace; + ...KeysOf; +} + +/** The path parameters for a collection of extension resources at the given target + * @template TargetResource The target of the extension resource (Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or another resource). + * @template ExtensionResource The extension resource. + */ +model ExtensionParentParameters { + ...TargetParameters; + ...ExtensionProviderNamespace; + ...ParentKeysOf; +} + +/** A tenant target for the extension resource */ +@builtInResource +model Tenant {} + +/** A management group + * @template ParameterName The name of the 'name' parameter of the management group (usually managementGroupName or managementGroupId). + */ +@tenantResource +@armVirtualResource("Microsoft.Management") +model ManagementGroup { + @path + @minLength(1) + @segment("managementGroups") + @key(ParameterName) + @doc("The management group ID.") + name: string; +} + +/** An external resource target, used when an extension targets a resource from another provider namespace + * @template TargetNamespace The provider namespace for the external resource. + * @template ResourceType The type of the external resource. + * @template ResourceParameterName The name of the 'name' parameter of the external resource. + * @template NamePattern The pattern restriction for the name of the external resource (default is none). + * @template NameType The type of the name parameter of the external resource (default is string). + * @template Description The description of the name parameter of the external resource (default is "The name of the resource"). + * + * @example + * ```typespec + * alias VirtualMachine = ExternalResource<"Microsoft.Compute", "virtualMachines", "vmName">; + * + * ``` + * + * @example + * ```typespec + * alias Scaleset = Extension.ExternalResource< + * "Microsoft.Compute", + * "virtualMachineScaleSets", + * "scaleSetName" + * >; + + * ``` + */ +@doc("") +@armVirtualResource(TargetNamespace) +@Http.Private.includeInapplicableMetadataInPayload(false) +model ExternalResource< + TargetNamespace extends valueof string, + ResourceType extends valueof string, + ResourceParameterName extends valueof string, + NamePattern extends valueof string = "", + NameType extends string = string, + Description extends valueof string = "The name of the resource" +> { + @doc(Description) + @visibility(Lifecycle.Read) + @path + @key(ResourceParameterName) + @segment(ResourceType) + @pattern(NamePattern) + name: NameType; +} + +/** An external child resource target, used when an extension targets a child resource from another provider namespace + * @template ParentModel The parent of this resource. + * @template ResourceType The type of this resource. + * @template ResourceParameterName The name of the 'name' parameter of this resource. + * @template NamePattern The pattern restriction for the name of this resource (default is none). + * @template NameType The type of the name parameter of this resource (default is string). + * @template Description The description of the name parameter of this resource (default is "The name of the resource"). + * + * @example + * ```typespec + * alias VirtualMachine = ExternalResource<"Microsoft.Compute", "virtualMachines", "vmName">; + * + * ``` + * + * @example + * ```typespec + * alias Scaleset = Extension.ExternalResource< + * "Microsoft.Compute", + * "virtualMachineScaleSets", + * "scaleSetName" + * >; + * + * alias VirtualMachineScaleSetVm = Extension.ExternalChildResource< + * Scaleset, + * "virtualMachineScaleSetVms", + * "scaleSetVmName" + * >; + * + * ``` + */ +@doc("") +@parentResource(ParentModel) +@Http.Private.includeInapplicableMetadataInPayload(false) +model ExternalChildResource< + ParentModel extends {}, + ResourceType extends valueof string, + ResourceParameterName extends valueof string, + NamePattern extends valueof string = "", + NameType extends string = string, + Description extends valueof string = "The name of the resource" +> { + @doc(Description) + @visibility(Lifecycle.Read) + @path + @key(ResourceParameterName) + @segment(ResourceType) + @pattern(NamePattern) + name: NameType; +} +/** A subscription target for an extension resource */ +@builtInSubscriptionResource +model Subscription {} + +/** A resource group target for an extension resource */ +@builtInResourceGroupResource +model ResourceGroup {} diff --git a/packages/typespec-azure-resource-manager/lib/extension/private.decorators.tsp b/packages/typespec-azure-resource-manager/lib/extension/private.decorators.tsp new file mode 100644 index 0000000000..0c5b6e8393 --- /dev/null +++ b/packages/typespec-azure-resource-manager/lib/extension/private.decorators.tsp @@ -0,0 +1,24 @@ +using Reflection; + +namespace Azure.ResourceManager.Extension.Private; + +/** + * `@builtInResource` marks a model as built-in to Azure ResourceManager at the tenant level + * + * @param target - The model that is marked as built-in. + */ +extern dec builtInResource(target: Model); + +/** + * `@builtInSubscriptionResource` marks a model as built-in to Azure ResourceManager at the Subscription level + * + * @param target - The model that is marked as built-in. + */ +extern dec builtInSubscriptionResource(target: Model); + +/** + * `@builtInResourceGroupResource` marks a model as built-in to Azure ResourceManager at the ResourceGroup level + * + * @param target - The model that is marked as built-in. + */ +extern dec builtInResourceGroupResource(target: Model); diff --git a/packages/typespec-azure-resource-manager/lib/private.decorators.tsp b/packages/typespec-azure-resource-manager/lib/private.decorators.tsp index b840c4df7b..c15f3297ff 100644 --- a/packages/typespec-azure-resource-manager/lib/private.decorators.tsp +++ b/packages/typespec-azure-resource-manager/lib/private.decorators.tsp @@ -14,6 +14,11 @@ extern dec armUpdateProviderNamespace(target: Reflection.Operation); */ extern dec assignProviderNameValue(target: ModelProperty, resource: Model); +/** + * @param resource Resource model + */ +extern dec assignUniqueProviderNameValue(target: ModelProperty, resource: Model); + /** * This decorator is used to identify Azure Resource Manager resource types and extract their * metadata. It is *not* meant to be used directly by a spec author, it instead diff --git a/packages/typespec-azure-resource-manager/src/lib.ts b/packages/typespec-azure-resource-manager/src/lib.ts index e823b7116c..ab0d8c5706 100644 --- a/packages/typespec-azure-resource-manager/src/lib.ts +++ b/packages/typespec-azure-resource-manager/src/lib.ts @@ -104,6 +104,12 @@ export const $lib = createTypeSpecLibrary({ default: "Resource types must have a property with '@path` and '@segment' decorators.", }, }, + "resource-without-provider-namespace": { + severity: "warning", + messages: { + default: paramMessage`The resource "${"resourceName"}" does not have a provider namespace. Please use a resource in a namespace marked with '@armProviderNamespace' or a virtual resource with a specific namespace`, + }, + }, "template-type-constraint-no-met": { severity: "error", messages: { diff --git a/packages/typespec-azure-resource-manager/src/namespace.ts b/packages/typespec-azure-resource-manager/src/namespace.ts index 9e40336e57..d787b716a7 100644 --- a/packages/typespec-azure-resource-manager/src/namespace.ts +++ b/packages/typespec-azure-resource-manager/src/namespace.ts @@ -23,7 +23,7 @@ import { } from "../generated-defs/Azure.ResourceManager.js"; import { $armCommonTypesVersion } from "./common-types.js"; import { reportDiagnostic } from "./lib.js"; -import { getSingletonResourceKey } from "./resource.js"; +import { getArmVirtualResourceDetails, getSingletonResourceKey } from "./resource.js"; import { ArmStateKeys } from "./state.js"; function getArmCommonTypesVersion( @@ -271,19 +271,30 @@ export function getArmProviderNamespace( program: Program, entity: Namespace | Model, ): string | undefined { - let currentNamespace: Namespace | undefined = + if (entity.kind === "Model") { + const details = getArmVirtualResourceDetails(program, entity); + if (details?.provider !== undefined) { + return details.provider; + } + } + + const currentNamespace: Namespace | undefined = entity.kind === "Namespace" ? entity : entity.namespace; + return getArmProviderFromNamespace(program, currentNamespace); +} +function getArmProviderFromNamespace( + program: Program, + ns: Namespace | undefined, +): string | undefined { let armProviderNamespace: string | undefined; - while (currentNamespace) { - armProviderNamespace = program - .stateMap(ArmStateKeys.armProviderNamespaces) - .get(currentNamespace); + while (ns) { + armProviderNamespace = program.stateMap(ArmStateKeys.armProviderNamespaces).get(ns); if (armProviderNamespace) { return armProviderNamespace; } - currentNamespace = currentNamespace.namespace; + ns = ns.namespace; } return undefined; diff --git a/packages/typespec-azure-resource-manager/src/private.decorators.ts b/packages/typespec-azure-resource-manager/src/private.decorators.ts index ca94406371..cbadd05bf4 100644 --- a/packages/typespec-azure-resource-manager/src/private.decorators.ts +++ b/packages/typespec-azure-resource-manager/src/private.decorators.ts @@ -6,7 +6,6 @@ import { ModelProperty, Operation, Program, - StringLiteral, Tuple, Type, addVisibilityModifiers, @@ -17,10 +16,17 @@ import { isKey, sealVisibilityModifiers, } from "@typespec/compiler"; +import { $ } from "@typespec/compiler/typekit"; import { $bodyRoot, getHttpOperation } from "@typespec/http"; import { $segment, getSegment } from "@typespec/rest"; import { camelCase } from "change-case"; import pluralize from "pluralize"; +import { + AzureResourceManagerExtensionPrivateDecorators, + BuiltInResourceDecorator, + BuiltInResourceGroupResourceDecorator, + BuiltInSubscriptionResourceDecorator, +} from "../generated-defs/Azure.ResourceManager.Extension.Private.js"; import { ArmBodyRootDecorator, ArmRenameListByOperationDecorator, @@ -28,6 +34,7 @@ import { ArmResourcePropertiesOptionalityDecorator, ArmUpdateProviderNamespaceDecorator, AssignProviderNameValueDecorator, + AssignUniqueProviderNameValueDecorator, AzureResourceBaseDecorator, AzureResourceManagerPrivateDecorators, ConditionalClientFlattenDecorator, @@ -44,16 +51,45 @@ import { ArmResourceDetails, ResourceBaseType, getArmResourceKind, + getArmVirtualResourceDetails, getResourceBaseType, isArmVirtualResource, isCustomAzureResource, resolveResourceBaseType, + setResourceBaseType, } from "./resource.js"; import { ArmStateKeys } from "./state.js"; export const namespace = "Azure.ResourceManager.Private"; /** @internal */ + +const $builtInResource: BuiltInResourceDecorator = ( + context: DecoratorContext, + resourceType: Model, +) => { + const { program } = context; + + setResourceBaseType(program, resourceType, ResourceBaseType.BuiltIn); +}; + +const $builtInSubscriptionResource: BuiltInSubscriptionResourceDecorator = ( + context: DecoratorContext, + resourceType: Model, +) => { + const { program } = context; + + setResourceBaseType(program, resourceType, ResourceBaseType.BuiltInSubscription); +}; + +const $builtInResourceGroupResource: BuiltInResourceGroupResourceDecorator = ( + context: DecoratorContext, + resourceType: Model, +) => { + const { program } = context; + + setResourceBaseType(program, resourceType, ResourceBaseType.BuiltInResourceGroup); +}; const $omitIfEmpty: OmitIfEmptyDecorator = ( context: DecoratorContext, entity: Model, @@ -85,10 +121,17 @@ function checkAllowedVirtualResource( case "delete": return true; default: - return false; + return true; } } +function isBuiltIn(baseType: ResourceBaseType): boolean { + return ( + baseType === ResourceBaseType.BuiltIn || + baseType === ResourceBaseType.BuiltInSubscription || + baseType === ResourceBaseType.BuiltInResourceGroup + ); +} const $enforceConstraint: EnforceConstraintDecorator = ( context: DecoratorContext, entity: Operation | Model, @@ -102,6 +145,7 @@ const $enforceConstraint: EnforceConstraintDecorator = ( if ( baseType === constraintType || isCustomAzureResource(context.program, baseType) || + isBuiltIn(getResourceBaseType(context.program, baseType)) || checkAllowedVirtualResource(context.program, entity, baseType) ) return; @@ -225,10 +269,44 @@ const $assignProviderNameValue: AssignProviderNameValueDecorator = ( resourceType: Model, ) => { const { program } = context; - const armProviderNamespace = getArmProviderNamespace(program, resourceType as Model); - if (armProviderNamespace) { - (target.type as StringLiteral).value = armProviderNamespace; + if ( + armProviderNamespace && + target.type.kind === "String" && + target.type.value === "Microsoft.ThisWillBeReplaced" + ) { + target.type.value = armProviderNamespace; + } +}; + +/** + * This decorator allows setting a unique provider name value, for scenarios in which + * multiple providers are allowed. + * @param {DecoratorContext} context DecoratorContext + * @param {Type} target Target of this decorator. Must be a string `ModelProperty`. + * @param {Type} resourceType Must be a `Model`. + */ +const $assignUniqueProviderNameValue: AssignUniqueProviderNameValueDecorator = ( + context: DecoratorContext, + target: ModelProperty, + resourceType: Model, +) => { + const { program } = context; + const armProviderNamespace = getArmProviderNamespace(program, resourceType); + if (!armProviderNamespace && !isBuiltIn(getResourceBaseType(program, resourceType))) { + reportDiagnostic(program, { + code: "resource-without-provider-namespace", + format: { resourceName: resourceType.name }, + target: resourceType, + }); + return; + } + if ( + armProviderNamespace && + target.type.kind === "String" && + target.type.value !== armProviderNamespace + ) { + target.type = $(program).literal.createString(armProviderNamespace); } }; @@ -260,8 +338,9 @@ const $armUpdateProviderNamespace: ArmUpdateProviderNamespaceDecorator = ( }); return; } - - providerParam.type.value = armProviderNamespace; + if (providerParam.type.value === "Microsoft.ThisWillBeReplaced") { + providerParam.type.value = armProviderNamespace; + } } } } @@ -330,9 +409,10 @@ export function registerArmResource(context: DecoratorContext, resourceType: Mod } // Locate the ARM namespace in the namespace hierarchy - const armProviderNamespace = getArmProviderNamespace(program, resourceType.namespace); + const armProviderNamespace = getArmProviderNamespace(program, resourceType); const armLibraryNamespace = isArmLibraryNamespace(program, resourceType.namespace); - if (!armProviderNamespace && !armLibraryNamespace) { + const armExternalNamespace = getArmVirtualResourceDetails(program, resourceType)?.provider; + if (!armProviderNamespace && !armLibraryNamespace && armExternalNamespace === undefined) { reportDiagnostic(program, { code: "arm-resource-missing-arm-namespace", target: resourceType }); return; } @@ -373,6 +453,7 @@ export function registerArmResource(context: DecoratorContext, resourceType: Mod let kind = getArmResourceKind(resourceType); if (isArmVirtualResource(program, resourceType)) kind = "Virtual"; if (isCustomAzureResource(program, resourceType)) kind = "Custom"; + if (!kind) { reportDiagnostic(program, { code: "arm-resource-invalid-base-type", @@ -388,7 +469,7 @@ export function registerArmResource(context: DecoratorContext, resourceType: Mod typespecType: resourceType, collectionName, keyName, - armProviderNamespace: armProviderNamespace ?? "", + armProviderNamespace: armProviderNamespace ?? armExternalNamespace ?? "", operations: { lifecycle: {}, lists: {}, @@ -500,6 +581,7 @@ export const $decorators = { azureResourceBase: $azureResourceBase, omitIfEmpty: $omitIfEmpty, conditionalClientFlatten: $conditionalClientFlatten, + assignUniqueProviderNameValue: $assignUniqueProviderNameValue, assignProviderNameValue: $assignProviderNameValue, armUpdateProviderNamespace: $armUpdateProviderNamespace, armResourceInternal: $armResourceInternal, @@ -509,4 +591,9 @@ export const $decorators = { armResourcePropertiesOptionality: $armResourcePropertiesOptionality, armBodyRoot: $armBodyRoot, } satisfies AzureResourceManagerPrivateDecorators, + "Azure.ResourceManager.Extension.Private": { + builtInResource: $builtInResource, + builtInSubscriptionResource: $builtInSubscriptionResource, + builtInResourceGroupResource: $builtInResourceGroupResource, + } satisfies AzureResourceManagerExtensionPrivateDecorators, }; diff --git a/packages/typespec-azure-resource-manager/src/resource.ts b/packages/typespec-azure-resource-manager/src/resource.ts index 6d702e0a5e..d053d407dd 100644 --- a/packages/typespec-azure-resource-manager/src/resource.ts +++ b/packages/typespec-azure-resource-manager/src/resource.ts @@ -60,6 +60,11 @@ export interface ArmResourceDetails extends ArmResourceDetailsBase { resourceTypePath?: string; } +export interface ArmVirtualResourceDetails { + kind: "Virtual"; + provider?: string; +} + /** * Marks the given resource as an external resource * @param context The decorator context @@ -69,10 +74,15 @@ export interface ArmResourceDetails extends ArmResourceDetailsBase { export const $armVirtualResource: ArmVirtualResourceDecorator = ( context: DecoratorContext, entity: Model, + provider: string | undefined = undefined, ) => { const { program } = context; if (isTemplateDeclaration(entity)) return; - program.stateMap(ArmStateKeys.armBuiltInResource).set(entity, "Virtual"); + const result: ArmVirtualResourceDetails = { + kind: "Virtual", + provider, + }; + program.stateMap(ArmStateKeys.armBuiltInResource).set(entity, result); const pathProperty = getProperty( entity, (p) => isPathParam(program, p) && getSegment(program, p) !== undefined, @@ -126,9 +136,37 @@ function getProperty( * @returns true if the model or any model it extends is marked as a resource, otherwise false. */ export function isArmVirtualResource(program: Program, target: Model): boolean { - if (program.stateMap(ArmStateKeys.armBuiltInResource).has(target) === true) return true; - if (target.baseModel) return isArmVirtualResource(program, target.baseModel); - return false; + return getArmVirtualResourceDetails(program, target) !== undefined; +} + +/** + * + * @param program The program to process. + * @param target The model to get details for + * @returns The resource details if the model is an external resource, otherwise undefined. + */ +export function getArmVirtualResourceDetails( + program: Program, + target: Model, + visited: Set = new Set(), +): ArmVirtualResourceDetails | undefined { + if (visited.has(target)) return undefined; + visited.add(target); + if (program.stateMap(ArmStateKeys.armBuiltInResource).has(target)) { + return program + .stateMap(ArmStateKeys.armBuiltInResource) + .get(target) as ArmVirtualResourceDetails; + } + + if (target.baseModel) { + const details = getArmVirtualResourceDetails(program, target.baseModel, visited); + if (details) return details; + } + const parent = getParentResource(program, target); + if (parent) { + return getArmVirtualResourceDetails(program, parent, visited); + } + return undefined; } /** @@ -333,6 +371,9 @@ export enum ResourceBaseType { Location = "Location", ResourceGroup = "ResourceGroup", Extension = "Extension", + BuiltIn = "BuiltIn", + BuiltInSubscription = "BuiltInSubscription", + BuiltInResourceGroup = "BuiltInResourceGroup", } export const $resourceBaseType: ResourceBaseTypeDecorator = ( @@ -508,7 +549,7 @@ function getServiceNamespace(program: Program, type: Type | undefined): string | } } -function setResourceBaseType(program: Program, resource: Model, type: string) { +export function setResourceBaseType(program: Program, resource: Model, type: string) { if (program.stateMap(ArmStateKeys.resourceBaseType).has(resource)) { reportDiagnostic(program, { code: "arm-resource-duplicate-base-parameter", @@ -554,6 +595,15 @@ export function resolveResourceBaseType(type?: string | undefined): ResourceBase case "Extension": resolvedType = ResourceBaseType.Extension; break; + case "BuiltIn": + resolvedType = ResourceBaseType.BuiltIn; + break; + case "BuiltInSubscription": + resolvedType = ResourceBaseType.BuiltInSubscription; + break; + case "BuiltInResourceGroup": + resolvedType = ResourceBaseType.BuiltInResourceGroup; + break; } } return resolvedType; diff --git a/packages/typespec-azure-resource-manager/src/rules/list-operation.ts b/packages/typespec-azure-resource-manager/src/rules/list-operation.ts index 0042f65174..c95dc2b1a4 100644 --- a/packages/typespec-azure-resource-manager/src/rules/list-operation.ts +++ b/packages/typespec-azure-resource-manager/src/rules/list-operation.ts @@ -19,7 +19,7 @@ export const listBySubscriptionRule = createRule({ for (const armResource of resources) { if (armResource && armResource.operations.lists) { const baseType = getResourceBaseType(context.program, armResource.typespecType); - if (baseType === ResourceBaseType.Extension || baseType === ResourceBaseType.Tenant) { + if (baseType === ResourceBaseType.Tenant) { for (const listOperationName of Object.keys(armResource.operations.lists)) { const listOperation = armResource.operations.lists[listOperationName]; if (listOperation.path.includes("{subscriptionId}")) { diff --git a/packages/typespec-azure-resource-manager/src/state.ts b/packages/typespec-azure-resource-manager/src/state.ts index 4ae43e9d64..4322b67e59 100644 --- a/packages/typespec-azure-resource-manager/src/state.ts +++ b/packages/typespec-azure-resource-manager/src/state.ts @@ -6,6 +6,7 @@ function azureResourceManagerCreateStateSymbol(name: string): symbol { } export const ArmStateKeys = { + armProviderCache: azureResourceManagerCreateStateSymbol("armProviderCache"), armProviderNamespaces: azureResourceManagerCreateStateSymbol("armProviderNamespaces"), armResourceOperations: azureResourceManagerCreateStateSymbol("armResourceOperations"), armResourceCollectionAction: azureResourceManagerCreateStateSymbol("armResourceCollectionAction"), diff --git a/packages/typespec-azure-resource-manager/test/resource.test.ts b/packages/typespec-azure-resource-manager/test/resource.test.ts index 642cfb3f10..2489cf8ce0 100644 --- a/packages/typespec-azure-resource-manager/test/resource.test.ts +++ b/packages/typespec-azure-resource-manager/test/resource.test.ts @@ -1,10 +1,11 @@ -import { Model } from "@typespec/compiler"; +import { Interface, Model, Operation } from "@typespec/compiler"; import { expectDiagnosticEmpty, expectDiagnostics } from "@typespec/compiler/testing"; +import { getHttpOperation } from "@typespec/http"; import { ok, strictEqual } from "assert"; import { describe, expect, it } from "vitest"; import { ArmLifecycleOperationKind } from "../src/operations.js"; import { ArmResourceDetails, getArmResources } from "../src/resource.js"; -import { checkFor } from "./test-host.js"; +import { checkFor, compileAndDiagnose } from "./test-host.js"; function assertLifecycleOperation( resource: ArmResourceDetails, @@ -850,6 +851,449 @@ interface RestorePointOperations { expect(diskRestorePoint).toBeDefined(); }); + it("allows extension of foreign resources", async () => { + const { program, types, diagnostics } = await compileAndDiagnose(` +using Azure.Core; + +/** Contoso Resource Provider management API. */ +@armProviderNamespace +@service(#{ title: "ContosoProviderHubClient" }) +@useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) +namespace Microsoft.ContosoProviderHub; + +/** A ContosoProviderHub extension resource */ +model Employee is ExtensionResource { + ...ResourceNameParameter; +} + +/** Employee properties */ +model EmployeeProperties { + /** Age of employee */ + age?: int32; + + /** City of employee */ + city?: string; + + /** Profile of employee */ + @encode("base64url") + profile?: bytes; + + /** The status of the last operation. */ + @visibility(Lifecycle.Read) + provisioningState?: ProvisioningState; +} + +/** The provisioning state of a resource. */ +@lroStatus +union ProvisioningState { + ResourceProvisioningState, + + /** The resource is being provisioned */ + Provisioning: "Provisioning", + + /** The resource is updating */ + Updating: "Updating", + + /** The resource is being deleted */ + Deleting: "Deleting", + + /** The resource create request has been accepted */ + Accepted: "Accepted", + + string, +} + +interface Operations extends Azure.ResourceManager.Operations {} + +interface EmplOps { + get is Extension.Read; + + create is Extension.CreateOrReplaceAsync; + update is Extension.CustomPatchSync< + Scope, + Employee, + Azure.ResourceManager.Foundations.ResourceUpdateModel + >; + delete is Extension.DeleteWithoutOkAsync; + list is Extension.ListByTarget; + move is Extension.ActionSync; +} + +/** Virtual resource for a virtual machine */ +alias VirtualMachine = Extension.ExternalResource< + "Microsoft.Compute", + "virtualMachines", + "vmName", + NamePattern = "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,80}$", + Description = "The name of the virtual machine" +>; + + +@test +@armResourceOperations +interface Employees extends EmplOps {} +@test +@armResourceOperations +interface ManagementGroups extends EmplOps {} +@test +@armResourceOperations +interface VirtualMachines extends EmplOps {} + + +/** Employee move request */ +model MoveRequest { + /** The moving from location */ + from: string; + + /** The moving to location */ + to: string; +} + +/** Employee move response */ +model MoveResponse { + /** The status of the move */ + movingStatus: string; +} + + `); + + expectDiagnosticEmpty(diagnostics); + const { Employees, ManagementGroups, VirtualMachines } = types as { + Employees: Interface; + ManagementGroups: Interface; + VirtualMachines: Interface; + }; + const employeesGet: Operation | undefined = Employees?.operations?.get("get"); + ok(employeesGet); + expect(employeesGet?.kind).toBe("Operation"); + const [employeeGetHttp, _e] = getHttpOperation(program, employeesGet); + expect(employeeGetHttp.path).toBe( + "/{scope}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}", + ); + const managementGet: Operation | undefined = ManagementGroups?.operations?.get("get"); + ok(managementGet); + expect(managementGet?.kind).toBe("Operation"); + const [managementGetHttp, _m] = getHttpOperation(program, managementGet); + expect(managementGetHttp.path).toBe( + "/providers/Microsoft.Management/managementGroups/{managementGroupName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}", + ); + const virtualMachinesGet: Operation | undefined = VirtualMachines?.operations?.get("get"); + ok(virtualMachinesGet); + expect(virtualMachinesGet?.kind).toBe("Operation"); + const [vmGetHttp, _v] = getHttpOperation(program, virtualMachinesGet); + expect(vmGetHttp.path).toBe( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}", + ); + }); + + it("overrides provider namespace in mixed legacy and resource operations", async () => { + const { program, types, diagnostics } = await compileAndDiagnose(` +using Azure.Core; + +#suppress "@azure-tools/typespec-azure-core/require-versioned" +#suppress "@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint" +/** Contoso Resource Provider management API. */ +@armProviderNamespace +@service(#{ title: "ContosoProviderHubClient" }) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) +@useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) +namespace Microsoft.ContosoProviderHub; + +/** A ContosoProviderHub resource */ +model Employee is TrackedResource { + ...ResourceNameParameter; +} + +/** Employee properties */ +model EmployeeProperties { + /** Age of employee */ + age?: int32; + + /** City of employee */ + city?: string; + + /** Profile of employee */ + @encode("base64url") + profile?: bytes; + + /** The status of the last operation. */ + @visibility(Lifecycle.Read) + provisioningState?: ProvisioningState; +} + +/** The provisioning state of a resource. */ +@lroStatus +union ProvisioningState { + string, + + /** The resource create request has been accepted */ + Accepted: "Accepted", + + /** The resource is being provisioned */ + Provisioning: "Provisioning", + + /** The resource is updating */ + Updating: "Updating", + + /** Resource has been created. */ + Succeeded: "Succeeded", + + /** Resource creation failed. */ + Failed: "Failed", + + /** Resource creation was canceled. */ + Canceled: "Canceled", + + /** The resource is being deleted */ + Deleting: "Deleting", +} + +#suppress "@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator" +interface EmplOps extends Azure.ResourceManager.Legacy.LegacyOperations< +BaseParams & {...ParentKeysOf}, +{...KeysOf}> {} + +alias BaseParams = { + ...ApiVersionParameter; + ...SubscriptionIdParameter; + ...Azure.ResourceManager.Legacy.Provider; + }; + + +@armResourceOperations +interface Employees { + @test + get is EmplOps.Read; + + /** A sample HEAD operation to check resource existence */ + @test + checkExistence is Azure.ResourceManager.ArmResourceCheckExistence; +} + `); + + expectDiagnosticEmpty(diagnostics); + const { get, checkExistence } = types as { + get: Operation; + checkExistence: Operation; + }; + ok(get); + expect(get?.kind).toBe("Operation"); + const [employeeGetHttp, _e] = getHttpOperation(program, get); + expect(employeeGetHttp.path).toBe( + "/subscriptions/{subscriptionId}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}", + ); + + ok(checkExistence); + expect(checkExistence?.kind).toBe("Operation"); + const [existenceHttp, _m] = getHttpOperation(program, checkExistence); + expect(existenceHttp.path).toBe( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}", + ); + }); + + it("overrides provider namespace in custom operations", async () => { + const { program, types, diagnostics } = await compileAndDiagnose(` +using Azure.Core; + +#suppress "@azure-tools/typespec-azure-core/require-versioned" +#suppress "@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint" +/** Contoso Resource Provider management API. */ +@armProviderNamespace +@service(#{ title: "ContosoProviderHubClient" }) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) +@useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) +namespace Microsoft.ContosoProviderHub; + +/** A ContosoProviderHub resource */ +model Employee is TrackedResource { + ...ResourceNameParameter; +} + +/** Employee properties */ +model EmployeeProperties { + /** Age of employee */ + age?: int32; + + /** City of employee */ + city?: string; + + /** Profile of employee */ + @encode("base64url") + profile?: bytes; + + /** The status of the last operation. */ + @visibility(Lifecycle.Read) + provisioningState?: ProvisioningState; +} + +/** The provisioning state of a resource. */ +@lroStatus +union ProvisioningState { + string, + + /** The resource create request has been accepted */ + Accepted: "Accepted", + + /** The resource is being provisioned */ + Provisioning: "Provisioning", + + /** The resource is updating */ + Updating: "Updating", + + /** Resource has been created. */ + Succeeded: "Succeeded", + + /** Resource creation failed. */ + Failed: "Failed", + + /** Resource creation was canceled. */ + Canceled: "Canceled", + + /** The resource is being deleted */ + Deleting: "Deleting", +} + +#suppress "@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator" +interface EmplOps extends Azure.ResourceManager.Legacy.LegacyOperations< +BaseParams & {...ParentKeysOf}, +{...KeysOf}> {} + +alias BaseParams = { + ...ApiVersionParameter; + ...SubscriptionIdParameter; + ...Azure.ResourceManager.Legacy.Provider; + }; + + +@armResourceOperations +interface Employees { + @test + /** a simple get */ + @armResourceRead(Employee) + @get op get(...BaseParams, ...KeysOf): Employee; + + /** A sample HEAD operation to check resource existence */ + @test + checkExistence is Azure.ResourceManager.ArmResourceCheckExistence; +} + `); + + expectDiagnosticEmpty(diagnostics); + const { get, checkExistence } = types as { + get: Operation; + checkExistence: Operation; + }; + ok(get); + expect(get?.kind).toBe("Operation"); + const [employeeGetHttp, _e] = getHttpOperation(program, get); + expect(employeeGetHttp.path).toBe( + "/subscriptions/{subscriptionId}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}", + ); + + ok(checkExistence); + expect(checkExistence?.kind).toBe("Operation"); + const [existenceHttp, _m] = getHttpOperation(program, checkExistence); + expect(existenceHttp.path).toBe( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}", + ); + }); + + it("overrides provider namespace in legacy operations", async () => { + const { program, types, diagnostics } = await compileAndDiagnose(` +using Azure.Core; + + +#suppress "@azure-tools/typespec-azure-core/require-versioned" +#suppress "@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint" +/** Contoso Resource Provider management API. */ +@armProviderNamespace +@service(#{ title: "ContosoProviderHubClient" }) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) +@useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) +namespace Microsoft.ContosoProviderHub; + +/** A ContosoProviderHub resource */ +model Employee is TrackedResource { + ...ResourceNameParameter; +} + +/** Employee properties */ +model EmployeeProperties { + /** Age of employee */ + age?: int32; + + /** City of employee */ + city?: string; + + /** Profile of employee */ + @encode("base64url") + profile?: bytes; + + /** The status of the last operation. */ + @visibility(Lifecycle.Read) + provisioningState?: ProvisioningState; +} + +/** The provisioning state of a resource. */ +@lroStatus +union ProvisioningState { + string, + + /** The resource create request has been accepted */ + Accepted: "Accepted", + + /** The resource is being provisioned */ + Provisioning: "Provisioning", + + /** The resource is updating */ + Updating: "Updating", + + /** Resource has been created. */ + Succeeded: "Succeeded", + + /** Resource creation failed. */ + Failed: "Failed", + + /** Resource creation was canceled. */ + Canceled: "Canceled", + + /** The resource is being deleted */ + Deleting: "Deleting", +} + +#suppress "@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator" +interface EmplOps extends Azure.ResourceManager.Legacy.LegacyOperations< +BaseParams & {...ParentKeysOf}, +{...KeysOf}> {} + +alias BaseParams = { + ...ApiVersionParameter; + ...SubscriptionIdParameter; + ...Azure.ResourceManager.Legacy.Provider; + }; + + +@armResourceOperations +interface Employees { + @test + get is EmplOps.Read; +} + `); + + expectDiagnosticEmpty(diagnostics); + const { get } = types as { + get: Operation; + checkExistence: Operation; + }; + ok(get); + expect(get?.kind).toBe("Operation"); + const [employeeGetHttp, _] = getHttpOperation(program, get); + expect(employeeGetHttp.path).toBe( + "/subscriptions/{subscriptionId}/providers/Microsoft.ContosoProviderHub/employees/{employeeName}", + ); + }); + it("emits diagnostics for non ARM resources", async () => { const { diagnostics } = await checkFor(` @armProviderNamespace @@ -1088,4 +1532,48 @@ describe("typespec-azure-resource-manager: identifiers decorator", () => { }, ]); }); + + it("emits diagnostics when a provider cannot be updated", async () => { + const { diagnostics } = await checkFor(` + using Azure.Core; +#suppress "@azure-tools/typespec-azure-core/require-versioned" +#suppress "@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint" +/** Contoso Resource Provider management API. */ +@armProviderNamespace +@service(#{ title: "ContosoProviderHubClient" }) +@useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) +namespace Microsoft.ContosoProviderHub { + + @armResourceOperations + interface VirtualMachines { + @armResourceRead(Azure.ResourceManager.Extension.VirtualMachine) + @get op read( + ...ApiVersionParameter; + ...Extension.TargetProviderNamespace; + ...KeysOf): void; + } + +} + +namespace Azure.ResourceManager.Extension { + model VirtualMachine { + /** The vm Name */ + @visibility(Lifecycle.Read) @path @key @segment("virtualMachines") vmName: string; + } +} + +`); + + expectDiagnostics(diagnostics, [ + { + code: "@azure-tools/typespec-azure-resource-manager/resource-without-provider-namespace", + message: `The resource "VirtualMachine" does not have a provider namespace. Please use a resource in a namespace marked with '@armProviderNamespace' or a virtual resource with a specific namespace`, + }, + { + code: "@azure-tools/typespec-azure-resource-manager/resource-without-provider-namespace", + message: `The resource "VirtualMachine" does not have a provider namespace. Please use a resource in a namespace marked with '@armProviderNamespace' or a virtual resource with a specific namespace`, + }, + ]); + }); }); diff --git a/website/src/content/docs/docs/libraries/azure-resource-manager/reference/data-types.md b/website/src/content/docs/docs/libraries/azure-resource-manager/reference/data-types.md index 999ce3744f..9f0c170ebe 100644 --- a/website/src/content/docs/docs/libraries/azure-resource-manager/reference/data-types.md +++ b/website/src/content/docs/docs/libraries/azure-resource-manager/reference/data-types.md @@ -2444,13 +2444,16 @@ An internal enum to indicate the resource support for various path types enum Azure.ResourceManager.CommonTypes.ResourceHome ``` -| Name | Value | Description | -| ------------- | ----- | ----------------------------------------- | -| Tenant | | The resource is bound to a tenant | -| Subscription | | The resource is bound to a subscription | -| Location | | The resource is bound to a location | -| ResourceGroup | | The resource is bound to a resource group | -| Extension | | The resource is bound to an extension | +| Name | Value | Description | +| -------------------- | ----- | -------------------------------------------------- | +| Tenant | | The resource is bound to a tenant | +| Subscription | | The resource is bound to a subscription | +| Location | | The resource is bound to a location | +| ResourceGroup | | The resource is bound to a resource group | +| Extension | | The resource is bound to an extension | +| BuiltIn | | The resource is a built in tenant resource | +| BuiltInSubscription | | The resource is a built in subscription resource | +| BuiltInResourceGroup | | The resource is a built in resource group resource | ### `Versions` {#Azure.ResourceManager.CommonTypes.Versions} @@ -2625,6 +2628,312 @@ Type of managed service identity (either system assigned, or none). union Azure.ResourceManager.CommonTypes.SystemAssignedServiceIdentityType ``` +## Azure.ResourceManager.Extension + +### `ExtensionInstanceParameters` {#Azure.ResourceManager.Extension.ExtensionInstanceParameters} + +The path parameters for an extension resource at the given target + +```typespec +model Azure.ResourceManager.Extension.ExtensionInstanceParameters +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| TargetResource | The target of the extension resource (Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or another resource). | +| Resource | The extension resource. | + +#### Properties + +| Name | Type | Description | +| ----------------- | ---------------------------------------- | ------------------------------------------------------------- | +| apiVersion | `string` | The API version to use for this operation. | +| subscriptionId | `Core.uuid` | The ID of the target subscription. The value must be an UUID. | +| resourceGroupName | `string` | The name of the resource group. The name is case insensitive. | +| provider | `"Microsoft.TargetProviderNamespace"` | | +| extensionProvider | `"Microsoft.ExtensionProviderNamespace"` | | + +### `ExtensionParentParameters` {#Azure.ResourceManager.Extension.ExtensionParentParameters} + +The path parameters for a collection of extension resources at the given target + +```typespec +model Azure.ResourceManager.Extension.ExtensionParentParameters +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| TargetResource | The target of the extension resource (Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or another resource). | +| ExtensionResource | The extension resource. | + +#### Properties + +| Name | Type | Description | +| ----------------- | ---------------------------------------- | ------------------------------------------------------------- | +| apiVersion | `string` | The API version to use for this operation. | +| subscriptionId | `Core.uuid` | The ID of the target subscription. The value must be an UUID. | +| resourceGroupName | `string` | The name of the resource group. The name is case insensitive. | +| provider | `"Microsoft.TargetProviderNamespace"` | | +| extensionProvider | `"Microsoft.ExtensionProviderNamespace"` | | + +### `ExtensionProviderNamespace` {#Azure.ResourceManager.Extension.ExtensionProviderNamespace} + +The provider namespace for an extension resource + +```typespec +model Azure.ResourceManager.Extension.ExtensionProviderNamespace +``` + +#### Template Parameters + +| Name | Description | +| -------- | ---------------------------- | +| Resource | The extension resource model | + +#### Properties + +| Name | Type | Description | +| ----------------- | ---------------------------------------- | ----------- | +| extensionProvider | `"Microsoft.ExtensionProviderNamespace"` | | + +### `ExternalChildResource` {#Azure.ResourceManager.Extension.ExternalChildResource} + +An external child resource target, used when an extension targets a child resource from another provider namespace + +```typespec +model Azure.ResourceManager.Extension.ExternalChildResource +``` + +#### Template Parameters + +| Name | Description | +| --------------------- | ----------------------------------------------------------------------------------------------- | +| ParentModel | The parent of this resource. | +| ResourceType | The type of this resource. | +| ResourceParameterName | The name of the 'name' parameter of this resource. | +| NamePattern | The pattern restriction for the name of this resource (default is none). | +| NameType | The type of the name parameter of this resource (default is string). | +| Description | The description of the name parameter of this resource (default is "The name of the resource"). | + +#### Examples + +```typespec +alias VirtualMachine = ExternalResource<"Microsoft.Compute", "virtualMachines", "vmName">; +``` + +```typespec +alias Scaleset = Extension.ExternalResource< + "Microsoft.Compute", + "virtualMachineScaleSets", + "scaleSetName" +>; + +alias VirtualMachineScaleSetVm = Extension.ExternalChildResource< + Scaleset, + "virtualMachineScaleSetVms", + "scaleSetVmName" +>; +``` + +#### Properties + +| Name | Type | Description | +| ---- | ---------- | ----------- | +| name | `NameType` | | + +### `ExternalResource` {#Azure.ResourceManager.Extension.ExternalResource} + +An external resource target, used when an extension targets a resource from another provider namespace + +```typespec +model Azure.ResourceManager.Extension.ExternalResource +``` + +#### Template Parameters + +| Name | Description | +| --------------------- | ------------------------------------------------------------------------------------------------------- | +| TargetNamespace | The provider namespace for the external resource. | +| ResourceType | The type of the external resource. | +| ResourceParameterName | The name of the 'name' parameter of the external resource. | +| NamePattern | The pattern restriction for the name of the external resource (default is none). | +| NameType | The type of the name parameter of the external resource (default is string). | +| Description | The description of the name parameter of the external resource (default is "The name of the resource"). | + +#### Examples + +```typespec +alias VirtualMachine = ExternalResource<"Microsoft.Compute", "virtualMachines", "vmName">; +``` + +```typespec +alias Scaleset = Extension.ExternalResource< + "Microsoft.Compute", + "virtualMachineScaleSets", + "scaleSetName" +>; +``` + +#### Properties + +| Name | Type | Description | +| ---- | ---------- | ----------- | +| name | `NameType` | | + +### `ManagementGroup` {#Azure.ResourceManager.Extension.ManagementGroup} + +A management group + +```typespec +model Azure.ResourceManager.Extension.ManagementGroup +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------ | +| ParameterName | The name of the 'name' parameter of the management group (usually managementGroupName or managementGroupId). | + +#### Properties + +| Name | Type | Description | +| ---- | -------- | ----------- | +| name | `string` | | + +### `ResourceGroup` {#Azure.ResourceManager.Extension.ResourceGroup} + +A resource group target for an extension resource + +```typespec +model Azure.ResourceManager.Extension.ResourceGroup +``` + +#### Properties + +None + +### `ScopeParameter` {#Azure.ResourceManager.Extension.ScopeParameter} + +The default scope parameter for an extension resource. + +```typespec +model Azure.ResourceManager.Extension.ScopeParameter +``` + +#### Template Parameters + +| Name | Description | +| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| Type | The type of the scope parameter (default is string). This can be used to specify `Azure.Core.armResourceIdentifier` type or other constrained type | + +#### Examples + +```typespec +model Employee { + ...ResourceUriParameter; +} +``` + +#### Properties + +| Name | Type | Description | +| ----- | ------ | ----------- | +| scope | `Type` | | + +### `Subscription` {#Azure.ResourceManager.Extension.Subscription} + +A subscription target for an extension resource + +```typespec +model Azure.ResourceManager.Extension.Subscription +``` + +#### Properties + +None + +### `TargetBaseParameters` {#Azure.ResourceManager.Extension.TargetBaseParameters} + +Base parameters for an extension target. + +```typespec +model Azure.ResourceManager.Extension.TargetBaseParameters +``` + +#### Template Parameters + +| Name | Description | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Resource | The resource model for an extension target (usually Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or an external resource). | + +#### Properties + +| Name | Type | Description | +| ----------------- | ------------------------------------- | ------------------------------------------------------------- | +| apiVersion | `string` | The API version to use for this operation. | +| subscriptionId | `Core.uuid` | The ID of the target subscription. The value must be an UUID. | +| resourceGroupName | `string` | The name of the resource group. The name is case insensitive. | +| provider | `"Microsoft.TargetProviderNamespace"` | | + +### `TargetParameters` {#Azure.ResourceManager.Extension.TargetParameters} + +The path parameters for a target resource for an extension + +```typespec +model Azure.ResourceManager.Extension.TargetParameters +``` + +#### Template Parameters + +| Name | Description | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Resource | The resource model for an extension target (usually Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or an external resource). | + +#### Properties + +| Name | Type | Description | +| ----------------- | ------------------------------------- | ------------------------------------------------------------- | +| apiVersion | `string` | The API version to use for this operation. | +| subscriptionId | `Core.uuid` | The ID of the target subscription. The value must be an UUID. | +| resourceGroupName | `string` | The name of the resource group. The name is case insensitive. | +| provider | `"Microsoft.TargetProviderNamespace"` | | + +### `TargetProviderNamespace` {#Azure.ResourceManager.Extension.TargetProviderNamespace} + +The provider namespace (if any) for a target resource for an extension + +```typespec +model Azure.ResourceManager.Extension.TargetProviderNamespace +``` + +#### Template Parameters + +| Name | Description | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Resource | The resource model for an extension target (usually Extension.Tenant, Extension.Subscription, Extension.ResourceGroup, Extension.Scope, Extension.ManagementGroup or an external resource) | + +#### Properties + +| Name | Type | Description | +| -------- | ------------------------------------- | ----------- | +| provider | `"Microsoft.TargetProviderNamespace"` | | + +### `Tenant` {#Azure.ResourceManager.Extension.Tenant} + +A tenant target for the extension resource + +```typespec +model Azure.ResourceManager.Extension.Tenant +``` + +#### Properties + +None + ## Azure.ResourceManager.Foundations ### `ArmTagsProperty` {#Azure.ResourceManager.Foundations.ArmTagsProperty} @@ -3023,6 +3332,24 @@ model Azure.ResourceManager.Legacy.Provider | -------- | -------------------------------- | ----------- | | provider | `"Microsoft.ThisWillBeReplaced"` | | +### `ProviderParameter` {#Azure.ResourceManager.Legacy.ProviderParameter} + +```typespec +model Azure.ResourceManager.Legacy.ProviderParameter +``` + +#### Template Parameters + +| Name | Description | +| -------- | ----------------------------------------------- | +| Resource | The resource to get the provider namespace for. | + +#### Properties + +| Name | Type | Description | +| -------- | -------------------------------- | ----------- | +| provider | `"Microsoft.ThisWillBeReplaced"` | | + ### `ManagedServiceIdentityType` {#Azure.ResourceManager.Legacy.ManagedServiceIdentityType} Type of managed service identity (where both SystemAssigned and UserAssigned types are allowed). diff --git a/website/src/content/docs/docs/libraries/azure-resource-manager/reference/decorators.md b/website/src/content/docs/docs/libraries/azure-resource-manager/reference/decorators.md index 94e8760657..bff0f8aa3c 100644 --- a/website/src/content/docs/docs/libraries/azure-resource-manager/reference/decorators.md +++ b/website/src/content/docs/docs/libraries/azure-resource-manager/reference/decorators.md @@ -239,7 +239,7 @@ This decorator is used on Azure Resource Manager resources that are not based on Azure.ResourceManager common types. ```typespec -@Azure.ResourceManager.armVirtualResource +@Azure.ResourceManager.armVirtualResource(provider?: valueof string) ``` #### Target @@ -248,7 +248,9 @@ Azure.ResourceManager common types. #### Parameters -None +| Name | Type | Description | +| -------- | ---------------- | ----------- | +| provider | `valueof string` | | ### `@extensionResource` {#@Azure.ResourceManager.extensionResource} diff --git a/website/src/content/docs/docs/libraries/azure-resource-manager/reference/index.mdx b/website/src/content/docs/docs/libraries/azure-resource-manager/reference/index.mdx index 7b59c2b2d9..9448fcd4c2 100644 --- a/website/src/content/docs/docs/libraries/azure-resource-manager/reference/index.mdx +++ b/website/src/content/docs/docs/libraries/azure-resource-manager/reference/index.mdx @@ -238,6 +238,44 @@ npm install --save-peer @azure-tools/typespec-azure-resource-manager - [`UserAssignedIdentities`](./data-types.md#Azure.ResourceManager.CommonTypes.UserAssignedIdentities) - [`UserAssignedIdentity`](./data-types.md#Azure.ResourceManager.CommonTypes.UserAssignedIdentity) +## Azure.ResourceManager.Extension + +### Operations + +- [`ActionAsync`](./interfaces.md#Azure.ResourceManager.Extension.ActionAsync) +- [`ActionAsyncBase`](./interfaces.md#Azure.ResourceManager.Extension.ActionAsyncBase) +- [`ActionNoContentSync`](./interfaces.md#Azure.ResourceManager.Extension.ActionNoContentSync) +- [`ActionNoResponseContentAsync`](./interfaces.md#Azure.ResourceManager.Extension.ActionNoResponseContentAsync) +- [`ActionSync`](./interfaces.md#Azure.ResourceManager.Extension.ActionSync) +- [`CheckExistence`](./interfaces.md#Azure.ResourceManager.Extension.CheckExistence) +- [`CreateOrReplaceAsync`](./interfaces.md#Azure.ResourceManager.Extension.CreateOrReplaceAsync) +- [`CreateOrReplaceSync`](./interfaces.md#Azure.ResourceManager.Extension.CreateOrReplaceSync) +- [`CreateOrUpdateAsync`](./interfaces.md#Azure.ResourceManager.Extension.CreateOrUpdateAsync) +- [`CustomPatchAsync`](./interfaces.md#Azure.ResourceManager.Extension.CustomPatchAsync) +- [`CustomPatchSync`](./interfaces.md#Azure.ResourceManager.Extension.CustomPatchSync) +- [`DeleteAsync`](./interfaces.md#Azure.ResourceManager.Extension.DeleteAsync) +- [`DeleteAsyncBase`](./interfaces.md#Azure.ResourceManager.Extension.DeleteAsyncBase) +- [`DeleteSync`](./interfaces.md#Azure.ResourceManager.Extension.DeleteSync) +- [`DeleteWithoutOkAsync`](./interfaces.md#Azure.ResourceManager.Extension.DeleteWithoutOkAsync) +- [`ListByTarget`](./interfaces.md#Azure.ResourceManager.Extension.ListByTarget) +- [`Read`](./interfaces.md#Azure.ResourceManager.Extension.Read) + +### Models + +- [`ExtensionInstanceParameters`](./data-types.md#Azure.ResourceManager.Extension.ExtensionInstanceParameters) +- [`ExtensionParentParameters`](./data-types.md#Azure.ResourceManager.Extension.ExtensionParentParameters) +- [`ExtensionProviderNamespace`](./data-types.md#Azure.ResourceManager.Extension.ExtensionProviderNamespace) +- [`ExternalChildResource`](./data-types.md#Azure.ResourceManager.Extension.ExternalChildResource) +- [`ExternalResource`](./data-types.md#Azure.ResourceManager.Extension.ExternalResource) +- [`ManagementGroup`](./data-types.md#Azure.ResourceManager.Extension.ManagementGroup) +- [`ResourceGroup`](./data-types.md#Azure.ResourceManager.Extension.ResourceGroup) +- [`ScopeParameter`](./data-types.md#Azure.ResourceManager.Extension.ScopeParameter) +- [`Subscription`](./data-types.md#Azure.ResourceManager.Extension.Subscription) +- [`TargetBaseParameters`](./data-types.md#Azure.ResourceManager.Extension.TargetBaseParameters) +- [`TargetParameters`](./data-types.md#Azure.ResourceManager.Extension.TargetParameters) +- [`TargetProviderNamespace`](./data-types.md#Azure.ResourceManager.Extension.TargetProviderNamespace) +- [`Tenant`](./data-types.md#Azure.ResourceManager.Extension.Tenant) + ## Azure.ResourceManager.Foundations ### Operations @@ -276,6 +314,7 @@ npm install --save-peer @azure-tools/typespec-azure-resource-manager ### Interfaces +- [`ExtensionOperations`](./interfaces.md#Azure.ResourceManager.Legacy.ExtensionOperations) - [`LegacyOperations`](./interfaces.md#Azure.ResourceManager.Legacy.LegacyOperations) - [`Operations`](./interfaces.md#Azure.ResourceManager.Legacy.Operations) @@ -290,3 +329,4 @@ npm install --save-peer @azure-tools/typespec-azure-resource-manager - [`ManagedServiceIdentityV4`](./data-types.md#Azure.ResourceManager.Legacy.ManagedServiceIdentityV4) - [`ManagedServiceIdentityV4Property`](./data-types.md#Azure.ResourceManager.Legacy.ManagedServiceIdentityV4Property) - [`Provider`](./data-types.md#Azure.ResourceManager.Legacy.Provider) +- [`ProviderParameter`](./data-types.md#Azure.ResourceManager.Legacy.ProviderParameter) diff --git a/website/src/content/docs/docs/libraries/azure-resource-manager/reference/interfaces.md b/website/src/content/docs/docs/libraries/azure-resource-manager/reference/interfaces.md index 654d8ea463..75f649ad19 100644 --- a/website/src/content/docs/docs/libraries/azure-resource-manager/reference/interfaces.md +++ b/website/src/content/docs/docs/libraries/azure-resource-manager/reference/interfaces.md @@ -1127,6 +1127,323 @@ op Azure.ResourceManager.checkLocalNameAvailability(apiVersion: string, subscrip | Response | the availability response, default to the standard response | | AdditionalParams | A model specifying additional non-path parameters to the availability request | +## Azure.ResourceManager.Extension + +### `ActionAsync` {#Azure.ResourceManager.Extension.ActionAsync} + +```typespec +op Azure.ResourceManager.Extension.ActionAsync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", body: Request): Azure.ResourceManager.ArmAcceptedLroResponse | Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being acted upon | +| Request | The request model for the action | +| Response | The response model for the action | +| LroHeaders | Optional. Allows overriding the headers returned in the Accepted response | +| Parameters | Optional. Additional parameters after the path parameters | +| Error | Optional. The error response, if non-standard. | +| OptionalRequestBody | Optional. Indicates whether the body parameter is optional. | + +### `ActionAsyncBase` {#Azure.ResourceManager.Extension.ActionAsyncBase} + +A long-running resource action. + +```typespec +op Azure.ResourceManager.Extension.ActionAsyncBase(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", body: Request): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being acted upon | +| Request | The request model for the action | +| Response | The response type for the action | +| Parameters | Optional. Additional parameters after the path parameters | +| Error | Optional. The error response, if non-standard. | +| OptionalRequestBody | Optional. Indicates whether the request body is optional. | + +### `ActionNoContentSync` {#Azure.ResourceManager.Extension.ActionNoContentSync} + +A synchronous resource action that returns no content. + +```typespec +op Azure.ResourceManager.Extension.ActionNoContentSync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", body: Request): Azure.ResourceManager.ArmNoContentResponse<"Action completed successfully."> | Error +``` + +#### Template Parameters + +| Name | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being acted upon | +| Request | The request model for the action | +| Parameters | Optional. Additional parameters after the path parameters | +| Error | Optional. The error response, if non-standard. | +| OptionalRequestBody | Optional. Indicates whether the request body is optional. | + +### `ActionNoResponseContentAsync` {#Azure.ResourceManager.Extension.ActionNoResponseContentAsync} + +```typespec +op Azure.ResourceManager.Extension.ActionNoResponseContentAsync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", body: Request): Azure.ResourceManager.ArmAcceptedLroResponse | Error +``` + +#### Template Parameters + +| Name | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being acted upon | +| Request | The request model for the action | +| LroHeaders | Optional. Allows overriding the headers returned in the Accepted response | +| Parameters | Optional. Additional parameters after the path parameters | +| Error | Optional. The error response, if non-standard. | +| OptionalRequestBody | Optional. Indicates whether the body parameter is optional. | + +### `ActionSync` {#Azure.ResourceManager.Extension.ActionSync} + +A synchronous resource action. + +```typespec +op Azure.ResourceManager.Extension.ActionSync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", body: Request): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being acted upon | +| Request | The request model for the action | +| Response | The response model for the action | +| Parameters | Optional. Additional parameters after the path parameters | +| Error | Optional. The error response, if non-standard. | +| OptionalRequestBody | Optional. Indicates whether the body parameter is optional. | + +### `CheckExistence` {#Azure.ResourceManager.Extension.CheckExistence} + +Check a resource's existence via HEAD operation + +```typespec +op Azure.ResourceManager.Extension.CheckExistence(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace"): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | the extension resource being checked | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for the read operation | +| Error | Optional. The error response, if non-standard. | + +### `CreateOrReplaceAsync` {#Azure.ResourceManager.Extension.CreateOrReplaceAsync} + +```typespec +op Azure.ResourceManager.Extension.CreateOrReplaceAsync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", resource: ExtensionResource): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | the resource being created or replaced | +| LroHeaders | Optional. Allows overriding the lro headers returned on resource create | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for the createOrReplace operation | +| Error | Optional. The error response, if non-standard. | + +### `CreateOrReplaceSync` {#Azure.ResourceManager.Extension.CreateOrReplaceSync} + +Synchronous PUT operation for Azure Resource Manager resources + +```typespec +op Azure.ResourceManager.Extension.CreateOrReplaceSync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", resource: ExtensionResource): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | the resource being created or replaced | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for the createOrUpdate operation | +| Error | Optional. The error response, if non-standard. | + +### `CreateOrUpdateAsync` {#Azure.ResourceManager.Extension.CreateOrUpdateAsync} + +A long-running resource CreateOrUpdate (PUT) + +```typespec +op Azure.ResourceManager.Extension.CreateOrUpdateAsync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", resource: ExtensionResource): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | the resource being created or updated | +| LroHeaders | Optional. Allows overriding the lro headers returned on resource create | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for the createOrUpdate operation | +| Error | Optional. The error response, if non-standard. | + +### `CustomPatchAsync` {#Azure.ResourceManager.Extension.CustomPatchAsync} + +A long-running resource update using a custom PATCH payload (Asynchronous) + +```typespec +op Azure.ResourceManager.Extension.CustomPatchAsync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", properties: PatchModel): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | the resource being patched | +| PatchModel | The input model for the PATCH request | +| LroHeaders | Optional. Allows overriding the lro headers returned in the Accepted response | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for the patch operation | +| Error | Optional. The error response, if non-standard. | + +### `CustomPatchSync` {#Azure.ResourceManager.Extension.CustomPatchSync} + +A resource update using a custom PATCH payload (synchronous) + +```typespec +op Azure.ResourceManager.Extension.CustomPatchSync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace", properties: PatchModel): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | the target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | the resource being patched | +| PatchModel | The input model for the PATCH request | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for the patch operation | +| Error | Optional. The error response, if non-standard. | + +### `DeleteAsync` {#Azure.ResourceManager.Extension.DeleteAsync} + +:::caution +**Deprecated**: Use 'DeleteWithoutOkAsync' instead +::: + +```typespec +op Azure.ResourceManager.Extension.DeleteAsync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace"): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being deleted | +| LroHeaders | Optional. Allows overriding the headers in the Accepted response | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the delete operation | +| Error | Optional. The error response, if non-standard. | + +### `DeleteAsyncBase` {#Azure.ResourceManager.Extension.DeleteAsyncBase} + +```typespec +op Azure.ResourceManager.Extension.DeleteAsyncBase(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace"): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being deleted | +| Response | The response type for the operation | +| Parameters | Optional. Additional parameters after the path parameters | +| Error | Optional. The error response, if non-standard. | + +### `DeleteSync` {#Azure.ResourceManager.Extension.DeleteSync} + +Delete a resource synchronously + +```typespec +op Azure.ResourceManager.Extension.DeleteSync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace"): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being deleted | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the delete operation | +| Error | Optional. The error response, if non-standard. | + +### `DeleteWithoutOkAsync` {#Azure.ResourceManager.Extension.DeleteWithoutOkAsync} + +```typespec +op Azure.ResourceManager.Extension.DeleteWithoutOkAsync(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace"): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | The resource being deleted | +| LroHeaders | Optional. Allows overriding the headers returned in the Accepted response | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the delete operation | +| Error | Optional. The error response, if non-standard. | + +### `ListByTarget` {#Azure.ResourceManager.Extension.ListByTarget} + +List an extension resource at the given target scope + +```typespec +op Azure.ResourceManager.Extension.ListByTarget(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace"): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | ---------------------------------------------------------------------------------------------------------- | +| TargetResource | The target to list at, e.g. Extension.Subscription or Extension>ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | the resource being listed | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for the list operation | +| Error | Optional. The error response, if non-standard. | + +### `Read` {#Azure.ResourceManager.Extension.Read} + +A resource GET operation + +```typespec +op Azure.ResourceManager.Extension.Read(apiVersion: string, subscriptionId: Azure.Core.uuid, resourceGroupName: string, provider: "Microsoft.TargetProviderNamespace", extensionProvider: "Microsoft.ExtensionProviderNamespace"): Response | Error +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| TargetResource | The target resource, e.g. Extension.Subscription or Extension.ManagementGroup or Extension.ResourceGroup | +| ExtensionResource | the resource being rea | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for the read operation | +| Error | Optional. The error response, if non-standard. | + ## Azure.ResourceManager.Foundations ### `ArmCreateOperation` {#Azure.ResourceManager.Foundations.ArmCreateOperation} @@ -1194,6 +1511,224 @@ op Azure.ResourceManager.Foundations.checkNameAvailability(apiVersion: string, b ## Azure.ResourceManager.Legacy +### `ExtensionOperations` {#Azure.ResourceManager.Legacy.ExtensionOperations} + +An operation template used to build extension resource operations using non-standard paths. + +```typespec +interface Azure.ResourceManager.Legacy.ExtensionOperations +``` + +#### Template Parameters + +| Name | Description | +| --------------------------- | ------------------------------------------------- | +| TargetParameters | The path parameters for the target resource | +| ExtensionParentParameters | Parent parameters of the extension resource | +| ExtensionInstanceParameters | The instance parameters of the extension resource | + +#### `ExtensionOperations.CreateOrUpdateAsync` {#Azure.ResourceManager.Legacy.ExtensionOperations.CreateOrUpdateAsync} + +A long-running resource CreateOrUpdate (PUT) + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.CreateOrUpdateAsync(resource: Resource): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ------------------- | ----------------------------------------------------------------------- | +| Resource | the resource being created or updated | +| LroHeaders | Optional. Allows overriding the lro headers returned on resource create | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the PUT operation | +| OptionalRequestBody | Optional. Indicates whether the request body is optional | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.CreateOrUpdateSync` {#Azure.ResourceManager.Legacy.ExtensionOperations.CreateOrUpdateSync} + +A synchronous resource CreateOrUpdate (PUT) + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.CreateOrUpdateSync(resource: Resource): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ------------------- | --------------------------------------------------------- | +| Resource | the resource being created or updated | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the PUT operation | +| OptionalRequestBody | Optional. Indicates whether the request body is optional | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.CustomPatchAsync` {#Azure.ResourceManager.Legacy.ExtensionOperations.CustomPatchAsync} + +A long-running resource Update (PATCH) + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.CustomPatchAsync(properties: PatchModel): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ------------------- | ----------------------------------------------------------------------- | +| Resource | the resource being created or updated | +| PatchModel | the PATCH request model | +| LroHeaders | Optional. Allows overriding the lro headers returned on resource create | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the PATCH operation | +| OptionalRequestBody | Optional. Indicates whether the request body is optional | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.CustomPatchSync` {#Azure.ResourceManager.Legacy.ExtensionOperations.CustomPatchSync} + +A synchronous resource Update (PATCH) + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.CustomPatchSync(properties: PatchModel): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ------------------- | --------------------------------------------------------- | +| Resource | the resource being created or updated | +| PatchModel | the PATCH request model | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the PATCH operation | +| OptionalRequestBody | Optional. Indicates whether the request body is optional | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.DeleteWithoutOkAsync` {#Azure.ResourceManager.Legacy.ExtensionOperations.DeleteWithoutOkAsync} + +Delete a resource asynchronously + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.DeleteWithoutOkAsync(): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ---------- | ---------------------------------------------------------- | +| Resource | The resource being deleted | +| LroHeaders | The lro headers for the operation | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the delete operation | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.DeleteSync` {#Azure.ResourceManager.Legacy.ExtensionOperations.DeleteSync} + +Delete a resource synchronously + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.DeleteSync(): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ---------- | ---------------------------------------------------------- | +| Resource | The resource being deleted | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response(s) for the delete operation | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.Read` {#Azure.ResourceManager.Legacy.ExtensionOperations.Read} + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.Read(): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ---------- | --------------------------------------------------------- | +| Resource | The resource being read | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for a get operation. | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.CheckExistence` {#Azure.ResourceManager.Legacy.ExtensionOperations.CheckExistence} + +Check a resource's existence via HEAD operation + +- + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.CheckExistence(): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ---------- | ------------------------------------------------------------------------------------------------ | +| Resource | The resource being checked | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for a head operation (by default NoContent or NotFound response). | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.List` {#Azure.ResourceManager.Legacy.ExtensionOperations.List} + +List a resource + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.List(): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ---------- | --------------------------------------------------------- | +| Resource | The resource being listed | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The response returned by the list | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.ActionSync` {#Azure.ResourceManager.Legacy.ExtensionOperations.ActionSync} + +A synchronous resource action. + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.ActionSync(body: Request): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ------------------- | --------------------------------------------------------- | +| Resource | The resource being acted upon | +| Request | The request model for the action | +| Response | The response model for the action | +| Parameters | Optional. Additional parameters after the path parameters | +| OptionalRequestBody | Optional. Indicates whether the request body is optional | +| ErrorType | Optional. The error response, if non-standard. | + +#### `ExtensionOperations.ActionAsync` {#Azure.ResourceManager.Legacy.ExtensionOperations.ActionAsync} + +A long-running resource action. + +```typespec +op Azure.ResourceManager.Legacy.ExtensionOperations.ActionAsync(body: Request): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ------------------- | ------------------------------------------------------------------------- | +| Resource | The resource being acted upon | +| Request | The request model for the action | +| Result | The result model for the action | +| LroHeaders | Optional. Allows overriding the headers returned in the Accepted response | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | The full response union of the action | +| OptionalRequestBody | Optional. Indicates whether the request body is optional | +| ErrorType | Optional. The error response, if non-standard. | + ### `LegacyOperations` {#Azure.ResourceManager.Legacy.LegacyOperations} An operation template used to build resource operations in which the same resource type @@ -1330,6 +1865,22 @@ op Azure.ResourceManager.Legacy.LegacyOperations.Read(): Response | ErrorType | Parameters | Optional. Additional parameters after the path parameters | | Response | Optional. The success response for a get operation. | +#### `LegacyOperations.CheckExistence` {#Azure.ResourceManager.Legacy.LegacyOperations.CheckExistence} + +Check a resource's existence via HEAD operation + +```typespec +op Azure.ResourceManager.Legacy.LegacyOperations.CheckExistence(): Response | ErrorType +``` + +##### Template Parameters + +| Name | Description | +| ---------- | ------------------------------------------------------------------------------------------------ | +| Resource | The resource being checked | +| Parameters | Optional. Additional parameters after the path parameters | +| Response | Optional. The success response for a head operation (by default NoContent or NotFound response). | + #### `LegacyOperations.List` {#Azure.ResourceManager.Legacy.LegacyOperations.List} List a resource @@ -1378,10 +1929,10 @@ op Azure.ResourceManager.Legacy.LegacyOperations.ActionAsync(body: Request): Res | ------------------- | ------------------------------------------------------------------------- | | Resource | The resource being acted upon | | Request | The request model for the action | -| Result | | +| Result | The result model for the action when the operation is successful | | LroHeaders | Optional. Allows overriding the headers returned in the Accepted response | | Parameters | Optional. Additional parameters after the path parameters | -| Response | The response model for the action | +| Response | The union of successful responses for the action | | OptionalRequestBody | Optional. Indicates whether the request body is optional | ### `Operations` {#Azure.ResourceManager.Legacy.Operations}