Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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