Private Links
Private Link resources allow users to discover which connection types are available for a resource.
Resource providers that support private link resources must declare a private link resource type in
their provider namespace and use the standard PrivateLinks interface to expose operations.
Defining a Private Link Resource
Section titled “Defining a Private Link Resource”To define a private link resource, create a model in your provider namespace that extends
PrivateLink:
model MyPrivateLinkResource is PrivateLink;Defining Private Link Operations
Section titled “Defining Private Link Operations”Create an alias for your private link operations using the PrivateLinks interface template:
alias PrivateLinkOps = PrivateLinks<MyPrivateLinkResource>;Adding Private Link Operations to Your Resource Interface
Section titled “Adding Private Link Operations to Your Resource Interface”Add private link operations to your resource interface using the operations alias:
@armResourceOperationsinterface Employees { // ... other resource operations ... getPrivateLink is PrivateLinkOps.Read<Employee>; listPrivateLinks is PrivateLinkOps.ListByParent<Employee>;}Available Operations
Section titled “Available Operations”The PrivateLinks interface provides the following operations:
| Operation | Description | TypeSpec Representation |
|---|---|---|
| Read | Get a single private link resource | getPrivateLink is Ops.Read<ParentResource>; |
| ListByParent | List private link resources for a parent | listLinks is Ops.ListByParent<ParentResource>; |
Complete Example
Section titled “Complete Example”The following example shows a complete service with private link support:
Sample specification adding private links to a resource.
import "@typespec/rest";import "@typespec/versioning";import "@azure-tools/typespec-azure-core";import "@azure-tools/typespec-azure-resource-manager";
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 */ @armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) @previewVersion `2021-10-01-preview`,}
// For more information about the proxy vs tracked,// see https://armwiki.azurewebsites.net/rp_onboarding/tracked_vs_proxy_resources.html?q=proxy%20resource/** A ContosoProviderHub resource */model Employee is TrackedResource<EmployeeProperties> { ...ResourceNameParameter<Employee>;}
/** 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. */@lroStatusunion 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 {}model MyPrivateLinkResource is PrivateLink;alias PrivateLinkOperations = PrivateLinks<MyPrivateLinkResource>;
@armResourceOperationsinterface Employees { get is ArmResourceRead<Employee>; createOrUpdate is ArmResourceCreateOrReplaceAsync<Employee>; update is ArmCustomPatchSync< Employee, Azure.ResourceManager.Foundations.ResourceUpdateModel<Employee, EmployeeProperties> >; delete is ArmResourceDeleteSync<Employee>; listByResourceGroup is ArmResourceListByParent<Employee>; listBySubscription is ArmListBySubscription<Employee>; /** A sample resource action that move employee to different location */ move is ArmResourceActionSync<Employee, MoveRequest, MoveResponse>;
/** A sample HEAD operation to check resource existence */ checkExistence is ArmResourceCheckExistence<Employee>;
getPrivateLink is PrivateLinkOperations.Read<Employee>; listPrivateLinks is PrivateLinkOperations.ListByParent<Employee>;}
/** 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;}
@armResourceOperationsinterface Dependents { get is ArmResourceRead<Dependent>; createOrUpdate is ArmResourceCreateOrReplaceAsync<Dependent>; update is ArmCustomPatchSync< Dependent, Azure.ResourceManager.Foundations.ResourceUpdateModel<Dependent, DependentProperties> >; delete is ArmResourceDeleteSync<Dependent>; list is ArmResourceListByParent<Dependent>; getPrivateLink is PrivateLinkOperations.Read<Dependent>; listPrivateLinks is PrivateLinkOperations.ListByParent<Dependent>;}
/** An employee dependent */@parentResource(Employee)model Dependent is ProxyResource<DependentProperties> { ...ResourceNameParameter<Dependent>;}
/** Dependent properties */model DependentProperties { /** Age of dependent */ age: int32;
/** Gender of dependent */ gender: string;
/** The status of the last operation. */ @visibility(Lifecycle.Read) provisioningState?: ProvisioningState;}Using Private Links with Child Resources
Section titled “Using Private Links with Child Resources”Private link operations can also be used with child resources. You can reuse the same operations alias across multiple resource interfaces:
@parentResource(Employee)model Dependent is ProxyResource<DependentProperties> { ...ResourceNameParameter<Dependent>;}
@armResourceOperationsinterface Dependents { get is ArmResourceRead<Dependent>; createOrUpdate is ArmResourceCreateOrReplaceAsync<Dependent>; delete is ArmResourceDeleteSync<Dependent>; list is ArmResourceListByParent<Dependent>;
// Reuse the same private link operations alias getPrivateLink is PrivateLinkOps.Read<Dependent>; listPrivateLinks is PrivateLinkOps.ListByParent<Dependent>;}