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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions custom-words.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1239,6 +1239,7 @@ maxpagesize
maxresults
MAXSIZE
maxzoom
Mayastor
mbaldwin
Mbps
MCAS
Expand Down Expand Up @@ -1410,6 +1411,7 @@ noartifactsource
nodeagentskus
nodeconfiguration
nodecounts
nodename
Nodeploy
nodetool
nodrm
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
import "@cadl-lang/rest";
import "@cadl-lang/openapi3";

import "@cadl-lang/rest";
import "@cadl-lang/versioning";
import "@azure-tools/cadl-providerhub";
import "@azure-tools/cadl-azure-resource-manager";

using Cadl.Http;
using Cadl.Rest;
using OpenAPI;
using Autorest;
using Azure.ResourceManager;
using Azure.ResourceManager.Foundations;

/**
* Custom types modified from the Azure Resource Manager Cadl library to add
* asynchronous update to operations, and location header on asynchronous create/update
* to be in line with the ARM async API guidelines.
*
* Reference: https://github.com/Azure/azure-resource-manager-rpc/blob/master/v1.0/async-api-reference.md
* Cadl ARM Library: https://github.com/Azure/cadl-azure/tree/main/packages/cadl-azure-resource-manager/lib
*/

namespace Microsoft.ContainerStorage.Custom;

// Custom operations (modified)
interface ResourceOperationsCustom<
TResource extends ArmResource,
TProperties extends object,
TBaseParameters = BaseParameters<TResource>
>
extends ResourceInstanceOperationsCustom<TResource, TProperties, TBaseParameters>,
ResourceCollectionOperations<TResource, TBaseParameters> {}


// Add custom create and update async operations (modified)
interface ResourceInstanceOperationsCustom<
TResource extends ArmResource,
TProperties extends object,
TBaseParameters = BaseParameters<TResource>,
TPatchModel = ResourceUpdateModel<TResource, TProperties>
>
extends Azure.ResourceManager.ResourceRead<TResource, TBaseParameters>,
ResourceCreateAsyncCustom<TResource, TBaseParameters>,
ResourceDeleteAsyncCustom<TResource, TBaseParameters>,
ResourceUpdateAsyncCustom<TResource, TProperties, TBaseParameters> {}


// Create custom create and update async operations (modified)
@doc("Asynchronous resource create")
interface ResourceCreateAsyncCustom<
TResource extends ArmResource,
TBaseParameters = BaseParameters<TResource>
> {
createOrUpdate is ArmResourceCreateOrUpdateAsyncLocation<TResource, TBaseParameters>;
}

@doc("Asynchronous resource update")
interface ResourceUpdateAsyncCustom<
TResource extends ArmResource,
TProperties extends object,
TBaseParameters = BaseParameters<TResource>
> {
update is ArmCustomPatchAsyncLocation<
TResource,
ResourceUpdateModel<TResource, TProperties>,
TBaseParameters
>;
}

@doc("Delete a resource using the asynchronous call pattern")
interface ResourceDeleteAsyncCustom<
TResource extends ArmResource,
TBaseParameters = BaseParameters<TResource>
> {
delete is ArmCustomDeleteAsyncLocation<TResource, TBaseParameters>;
}

// Aliases for potential external reference (modified)
alias ArmResourceCreateAsync<
TResource extends ArmResource,
TProperties extends object,
TBaseParameters = BaseParameters<TResource>
> = ArmResourceCreateOrUpdateAsyncLocation<TResource, TBaseParameters>;

alias ArmResourcePatchAsync<
TResource extends ArmResource,
TProperties extends object,
TBaseParameters = BaseParameters<TResource>
> = ArmCustomPatchAsyncLocation<TResource, ResourceUpdateModel<TResource, TProperties>, TBaseParameters>;

alias ArmResourceDeleteAsync<
TResource extends ArmResource,
TProperties extends object,
TBaseParameters = BaseParameters<TResource>
> = ArmCustomDeleteAsyncLocation<TResource, TBaseParameters>;


// Add async response with locations to response type (modified)
@autoRoute
@doc("Create a {name}", TResource)
@extension("x-ms-long-running-operation", true)
@extension(
"x-ms-long-running-operation-options",
{
"final-state-via": "azure-async-operation",
}
)
@armResourceCreateOrUpdate(TResource)
@put
op ArmResourceCreateOrUpdateAsyncLocation<
TResource extends ArmResource,
TBaseParameters = BaseParameters<TResource>
>(
...ResourceInstanceParameters<TResource, TBaseParameters>,

@doc("Resource create parameters.")
@body
resource: TResource
): ArmResponse<TResource> | ArmCreatedResponseLocation<TResource> | ErrorResponse;

@autoRoute
@doc("Update a {name}", TResource)
@extension("x-ms-long-running-operation", true)
@extension(
"x-ms-long-running-operation-options",
{
"final-state-via": "azure-async-operation",
}
)
@armResourceUpdate(TResource)
@patch
op ArmCustomPatchAsyncLocation<
TResource extends ArmResource,
TPatchModel extends object = TagsUpdateModel<TResource>,
TBaseParameters = BaseParameters<TResource>
>(
...ResourceInstanceParameters<TResource, TBaseParameters>,

@doc("The resource properties to be updated.")
@body
properties: TPatchModel
): ArmResponse<TResource> | ArmAcceptedResponseLocation<"Resource update request accepted."> | ErrorResponse;

@autoRoute
@doc("Delete a {name}", TResource)
@extension("x-ms-long-running-operation", true)
@extension(
"x-ms-long-running-operation-options",
{
"final-state-via": "location",
}
)
@armResourceDelete(TResource)
@delete
op ArmCustomDeleteAsyncLocation<
TResource extends ArmResource,
TBaseParameters = BaseParameters<TResource>
>(
...ResourceInstanceParameters<TResource, TBaseParameters>
): ArmDeletedResponse | ArmAcceptedResponseLocation<"Resource deletion accepted."> | ArmDeletedNoContentResponse | ErrorResponse;



// Add location header to response type (modified)
@doc("ARM create operation completed successfully.")
model ArmCreatedResponseLocation<T> {
...CreatedResponse;
...Azure.Core.Foundations.RetryAfterHeader;
...LocationHeader;
...Body<T>;
}

@doc(TMessage)
model ArmAcceptedResponseLocation<TMessage extends string = "Resource operation accepted."> {
...AcceptedResponse;
...RetryAfterHeaderCustom;
...LocationHeader;
}


// Create location header
@doc("The location uri of the operation.")
model LocationHeader {
@doc("The Location header has the uri for monitoring the operation state.")
@header("Location")
location: string;
}

@doc("The retry-after envelope.")
model RetryAfterHeaderCustom {
@doc("The Retry-After header can indicate how long the client should wait before polling the operation status.")
@header("Retry-After")
retryAfter: int32;
}

Loading