From 277f5e0c7c43f7ef415d327614f879d8140f6683 Mon Sep 17 00:00:00 2001 From: SDKAuto Date: Mon, 17 Oct 2022 07:17:44 +0000 Subject: [PATCH] CodeGen from PR 21038 in Azure/azure-rest-api-specs Review request for Microsoft.ContainerService to add version 2022-09-02-preview (#21038) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adds base for updating Microsoft.ContainerService from version preview/2022-08-03-preview to version 2022-09-02-preview * Updates readme * Updates API version in new specs and examples * Custom CA Trust updates for 20220902 preview version (#20995) * add create managed cluster example with certs * add description of custom ca certs in managed cluster security profile json * better phrasing * Use dummy base64 encoded values for examples, set format: byte for cert array * Update specification/containerservice/resource-manager/Microsoft.ContainerService/preview/2022-09-02-preview/managedClusters.json Co-authored-by: Matthew Christopher * update description * add exception for linter camel case Co-authored-by: Mikolaj Umanski Co-authored-by: Matthew Christopher * Containerservice 2022 09 02 preview fleet (#20939) * Fleet swagger 09-02 api * Add to README * Wrong ref * Add options per lint diff err * Add headers per lint feedbacks * Add min and max length * Add networkProfile.ebpfDataplane field to 20220902preview API (#20955) * Add HostNetwork NSG Control fields (#20949) * Update readmes for the 2022-09-02-preview dev branch of container service (#20951) * update readmes * undo go readme * fix tag for python sdk (#21057) * [containerservice-dev] Revert "Containerservice 2022 09 02 preview fleet (#20939)" (#21073) * Revert "Containerservice 2022 09 02 preview fleet (#20939)" This reverts commit 7f9780381fb7d1140cd2a3ff6d3d2dc13d59f900. * add fleet previous version to readme to pass CI * Add fleet 0702 base for change comparison (#21093) * add 07-02-fleet-base * bump apiversion reference Co-authored-by: Stephane Erbrech * Fleet swagger 09-02 api (#21104) Co-authored-by: nguyenmin Co-authored-by: Mikołaj Umański Co-authored-by: Mikolaj Umanski Co-authored-by: Matthew Christopher Co-authored-by: Minh Nguyen Co-authored-by: Will Daly Co-authored-by: ccc Co-authored-by: Stéphane Erbrech --- common/config/rush/pnpm-lock.yaml | 40 +++--- .../arm-containerservice/CHANGELOG.md | 28 ++--- .../arm-containerservice/_meta.json | 8 +- .../arm-containerservice/package.json | 20 +-- .../review/arm-containerservice.api.md | 43 +++++++ .../src/containerServiceClient.ts | 75 ++++++++---- .../arm-containerservice/src/models/index.ts | 67 +++++++++- .../src/models/mappers.ts | 115 ++++++++++++++++++ .../src/models/parameters.ts | 14 +-- .../src/operations/fleetMembers.ts | 13 +- .../src/operations/fleets.ts | 21 ++-- .../arm-containerservice/test/sampleTest.ts | 43 +++++++ .../arm-containerservice/tsconfig.json | 10 +- 13 files changed, 380 insertions(+), 117 deletions(-) create mode 100644 sdk/containerservice/arm-containerservice/test/sampleTest.ts diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index c3c1204e8896..7259f9aca4db 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2988,7 +2988,7 @@ packages: dev: false /array-flatten/1.1.1: - resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false /array-includes/3.1.5: @@ -3249,7 +3249,7 @@ packages: dev: false /buffer-equal-constant-time/1.0.1: - resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} dev: false /buffer-from/1.1.2: @@ -3399,7 +3399,7 @@ packages: dev: false /charenc/0.0.2: - resolution: {integrity: sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=} + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} dev: false /check-error/1.0.2: @@ -3542,7 +3542,7 @@ packages: dev: false /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: false /concurrently/6.5.1: @@ -3605,7 +3605,7 @@ packages: dev: false /cookie-signature/1.0.6: - resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false /cookie/0.4.2: @@ -3707,7 +3707,7 @@ packages: dev: false /crypt/0.0.2: - resolution: {integrity: sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=} + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} dev: false /csv-parse/5.3.0: @@ -3961,7 +3961,7 @@ packages: dependencies: semver: 7.3.7 shelljs: 0.8.5 - typescript: 4.9.0-dev.20221014 + typescript: 4.9.0-dev.20221016 dev: false /downlevel-dts/0.8.0: @@ -3980,11 +3980,11 @@ packages: dev: false /edge-launcher/1.2.2: - resolution: {integrity: sha1-60Cq+9Bnpup27/+rBke81VCbN7I=} + resolution: {integrity: sha512-JcD5WBi3BHZXXVSSeEhl6sYO8g5cuynk/hifBzds2Bp4JdzCGLNMHgMCKu5DvrO1yatMgF0goFsxXRGus0yh1g==} dev: false /ee-first/1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false /electron-to-chromium/1.4.270: @@ -4869,7 +4869,7 @@ packages: dev: false /fresh/0.5.2: - resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: false @@ -5009,7 +5009,7 @@ packages: dev: false /github-from-package/0.0.0: - resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=} + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: false /glob-parent/5.1.2: @@ -6439,7 +6439,7 @@ packages: dev: false /media-typer/0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: false @@ -6449,7 +6449,7 @@ packages: dev: false /merge-descriptors/1.0.1: - resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false /merge-source-map/1.1.0: @@ -6874,7 +6874,7 @@ packages: dev: false /noms/0.0.0: - resolution: {integrity: sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=} + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} dependencies: inherits: 2.0.4 readable-stream: 1.0.34 @@ -8958,8 +8958,8 @@ packages: hasBin: true dev: false - /typescript/4.9.0-dev.20221014: - resolution: {integrity: sha512-ebA2VEN581QQgXuSKufDTHjNmafCqBIoWOLxUlhRu27+5iQLR4ExhVoIRQFn03KnHzTzIbbJ3OOy407F3kzc6A==} + /typescript/4.9.0-dev.20221016: + resolution: {integrity: sha512-5ewJzFqYCUKUku9SdWIURLJW3PlkthY8C+HDu7kfWggpUJj3Ei7XrvMa32tMdl4a4H7k90m0xHRyoiCAH7wO2A==} engines: {node: '>=4.2.0'} hasBin: true dev: false @@ -9086,7 +9086,7 @@ packages: dev: false /utils-merge/1.0.1: - resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: false @@ -11301,12 +11301,12 @@ packages: dev: false file:projects/arm-containerservice-1.tgz: - resolution: {integrity: sha512-7fYeKt2889vI53Zu2G6zkdujfeh4GBPMKEtQk+TIoV5tFEPRhhMujL6+ToJ+AJUKDTwO1jfDmc2QblcvOGAfnQ==, tarball: file:projects/arm-containerservice-1.tgz} + resolution: {integrity: sha512-bcLRZG3rMY4v/pB1SJf+zmJnYONUusj0KIoHG97zYcu3icnX4f6saT1lnZJMOwioPSef0NRck4mtwK+RhgdzHg==, tarball: file:projects/arm-containerservice-1.tgz} name: '@rush-temp/arm-containerservice-1' version: 0.0.0 dependencies: '@azure/identity': 2.1.0 - '@microsoft/api-extractor': 7.32.0 + '@microsoft/api-extractor': 7.18.11 '@rollup/plugin-commonjs': 21.1.0_rollup@2.79.1 '@rollup/plugin-json': 4.1.0_rollup@2.79.1 '@rollup/plugin-multi-entry': 4.1.0_rollup@2.79.1 @@ -11320,7 +11320,7 @@ packages: rollup: 2.79.1 rollup-plugin-sourcemaps: 0.6.3_rollup@2.79.1 tslib: 2.4.0 - typescript: 4.6.4 + typescript: 4.2.4 uglify-js: 3.17.2 transitivePeerDependencies: - '@types/node' diff --git a/sdk/containerservice/arm-containerservice/CHANGELOG.md b/sdk/containerservice/arm-containerservice/CHANGELOG.md index ecedb7e11f51..f4cef8612d32 100644 --- a/sdk/containerservice/arm-containerservice/CHANGELOG.md +++ b/sdk/containerservice/arm-containerservice/CHANGELOG.md @@ -1,16 +1,6 @@ # Release History - -## 18.0.0-beta.3 (Unreleased) - -### Features Added - -### Breaking Changes - -### Bugs Fixed - -### Other Changes - -## 18.0.0-beta.2 (2022-09-29) + +## 17.2.0-beta.1 (2022-10-17) **Features** @@ -39,6 +29,7 @@ - Added Interface FleetListResult - Added Interface FleetMember - Added Interface FleetMembersCreateOrUpdateOptionalParams + - Added Interface FleetMembersDeleteHeaders - Added Interface FleetMembersDeleteOptionalParams - Added Interface FleetMembersGetOptionalParams - Added Interface FleetMembersListByFleetNextOptionalParams @@ -46,6 +37,7 @@ - Added Interface FleetMembersListResult - Added Interface FleetPatch - Added Interface FleetsCreateOrUpdateOptionalParams + - Added Interface FleetsDeleteHeaders - Added Interface FleetsDeleteOptionalParams - Added Interface FleetsGetOptionalParams - Added Interface FleetsListByResourceGroupNextOptionalParams @@ -83,6 +75,7 @@ - Added Interface ManagedClusterWorkloadAutoScalerProfileKeda - Added Interface ManagedClusterWorkloadAutoScalerProfileVerticalPodAutoscaler - Added Interface NetworkProfileForSnapshot + - Added Interface PortRange - Added Interface TrustedAccessRole - Added Interface TrustedAccessRoleBinding - Added Interface TrustedAccessRoleBindingListResult @@ -97,6 +90,7 @@ - Added Interface TrustedAccessRolesListOptionalParams - Added Type Alias BackendPoolType - Added Type Alias ControlledValues + - Added Type Alias EbpfDataplane - Added Type Alias FleetMemberProvisioningState - Added Type Alias FleetMembersCreateOrUpdateResponse - Added Type Alias FleetMembersGetResponse @@ -122,6 +116,7 @@ - Added Type Alias ManagedClusterSnapshotsUpdateTagsResponse - Added Type Alias Mode - Added Type Alias NetworkPluginMode + - Added Type Alias Protocol - Added Type Alias TrustedAccessRoleBindingProvisioningState - Added Type Alias TrustedAccessRoleBindingsCreateOrUpdateResponse - Added Type Alias TrustedAccessRoleBindingsGetResponse @@ -136,6 +131,7 @@ - Interface AgentPool has a new optional parameter networkProfile - Interface AgentPool has a new optional parameter windowsProfile - Interface AgentPoolsDeleteOptionalParams has a new optional parameter ignorePodDisruptionBudget + - Interface ContainerServiceNetworkProfile has a new optional parameter ebpfDataplane - Interface ContainerServiceNetworkProfile has a new optional parameter kubeProxyConfig - Interface ContainerServiceNetworkProfile has a new optional parameter networkPluginMode - Interface ManagedCluster has a new optional parameter azureMonitorProfile @@ -155,6 +151,7 @@ - Interface ManagedClusterHttpProxyConfig has a new optional parameter effectiveNoProxy - Interface ManagedClusterLoadBalancerProfile has a new optional parameter backendPoolType - Interface ManagedClustersDeleteOptionalParams has a new optional parameter ignorePodDisruptionBudget + - Interface ManagedClusterSecurityProfile has a new optional parameter customCATrustCertificates - Interface ManagedClusterSecurityProfile has a new optional parameter imageCleaner - Interface ManagedClusterSecurityProfile has a new optional parameter nodeRestriction - Interface ManagedClusterSecurityProfile has a new optional parameter workloadIdentity @@ -167,22 +164,19 @@ - Class ContainerServiceClient has a new parameter trustedAccessRoles - Added Enum KnownBackendPoolType - Added Enum KnownControlledValues + - Added Enum KnownEbpfDataplane - Added Enum KnownFleetMemberProvisioningState - Added Enum KnownFleetProvisioningState - Added Enum KnownIpvsScheduler - Added Enum KnownLevel - Added Enum KnownMode - Added Enum KnownNetworkPluginMode + - Added Enum KnownProtocol - Added Enum KnownTrustedAccessRoleBindingProvisioningState - Added Enum KnownUpdateMode - Enum KnownOssku has a new value Mariner - Enum KnownPublicNetworkAccess has a new value SecuredByPerimeter - Enum KnownSnapshotType has a new value ManagedCluster - -**Breaking Changes** - - - Interface ContainerServiceClientOptionalParams no longer has parameter apiVersion - - Class ContainerServiceClient no longer has parameter apiVersion ## 17.1.0 (2022-08-25) diff --git a/sdk/containerservice/arm-containerservice/_meta.json b/sdk/containerservice/arm-containerservice/_meta.json index 63405195d2ac..0fad216fef4a 100644 --- a/sdk/containerservice/arm-containerservice/_meta.json +++ b/sdk/containerservice/arm-containerservice/_meta.json @@ -1,8 +1,8 @@ { - "commit": "065b070773ed6fa98ede768ad602f4c4d2edf739", + "commit": "4150a475755272b5063158eb8e219d772affb73d", "readme": "specification/containerservice/resource-manager/readme.md", - "autorest_command": "autorest --version=3.8.4 --typescript --modelerfour.lenient-model-deduplication --azure-arm --head-as-boolean=true --license-header=MICROSOFT_MIT_NO_VERSION --generate-test --typescript-sdks-folder=D:\\Git\\azure-sdk-for-js ..\\azure-rest-api-specs\\specification\\containerservice\\resource-manager\\readme.md --use=@autorest/typescript@6.0.0-rc.1.20220727.1 --generate-sample=true", + "autorest_command": "autorest --version=3.8.4 --typescript --modelerfour.lenient-model-deduplication --azure-arm --head-as-boolean=true --license-header=MICROSOFT_MIT_NO_VERSION --generate-test --typescript-sdks-folder=/mnt/vss/_work/1/s/azure-sdk-for-js ../azure-rest-api-specs/specification/containerservice/resource-manager/readme.md --use=@autorest/typescript@6.0.0-rc.1", "repository_url": "https://github.com/Azure/azure-rest-api-specs.git", - "release_tool": "@azure-tools/js-sdk-release-tools@2.4.2", - "use": "@autorest/typescript@6.0.0-rc.1.20220727.1" + "release_tool": "@azure-tools/js-sdk-release-tools@2.4.4", + "use": "@autorest/typescript@6.0.0-rc.1" } \ No newline at end of file diff --git a/sdk/containerservice/arm-containerservice/package.json b/sdk/containerservice/arm-containerservice/package.json index 5e2953f9137c..1b130981f91e 100644 --- a/sdk/containerservice/arm-containerservice/package.json +++ b/sdk/containerservice/arm-containerservice/package.json @@ -3,9 +3,9 @@ "sdk-type": "mgmt", "author": "Microsoft Corporation", "description": "A generated SDK for ContainerServiceClient.", - "version": "18.0.0-beta.3", + "version": "17.2.0-beta.1", "engines": { - "node": ">=14.0.0" + "node": ">=12.0.0" }, "dependencies": { "@azure/core-lro": "^2.2.0", @@ -28,7 +28,7 @@ "module": "./dist-esm/src/index.js", "types": "./types/arm-containerservice.d.ts", "devDependencies": { - "@microsoft/api-extractor": "^7.31.1", + "@microsoft/api-extractor": "7.18.11", "@rollup/plugin-commonjs": "^21.0.1", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-multi-entry": "^4.1.0", @@ -36,7 +36,7 @@ "mkdirp": "^1.0.4", "rollup": "^2.66.1", "rollup-plugin-sourcemaps": "^0.6.3", - "typescript": "~4.6.0", + "typescript": "~4.2.0", "uglify-js": "^3.4.9", "rimraf": "^3.0.0", "@azure/identity": "^2.0.1", @@ -109,13 +109,5 @@ } ] }, - "autoPublish": true, - "//sampleConfiguration": { - "productName": "", - "productSlugs": [ - "azure" - ], - "disableDocsMs": true, - "apiRefLink": "https://docs.microsoft.com/javascript/api/@azure/arm-containerservice?view=azure-node-preview" - } -} + "autoPublish": true +} \ No newline at end of file diff --git a/sdk/containerservice/arm-containerservice/review/arm-containerservice.api.md b/sdk/containerservice/arm-containerservice/review/arm-containerservice.api.md index 8b067a928b4e..10b7c6c3382c 100644 --- a/sdk/containerservice/arm-containerservice/review/arm-containerservice.api.md +++ b/sdk/containerservice/arm-containerservice/review/arm-containerservice.api.md @@ -90,6 +90,8 @@ export type AgentPoolMode = string; // @public export interface AgentPoolNetworkProfile { + allowedHostPorts?: PortRange[]; + applicationSecurityGroups?: string[]; nodePublicIPTags?: IPTag[]; } @@ -247,6 +249,8 @@ export class ContainerServiceClient extends coreClient.ServiceClient { // (undocumented) agentPools: AgentPools; // (undocumented) + apiVersion: string; + // (undocumented) fleetMembers: FleetMembers; // (undocumented) fleets: Fleets; @@ -277,6 +281,7 @@ export class ContainerServiceClient extends coreClient.ServiceClient { // @public export interface ContainerServiceClientOptionalParams extends coreClient.ServiceClientOptions { $host?: string; + apiVersion?: string; endpoint?: string; } @@ -307,6 +312,7 @@ export interface ContainerServiceMasterProfile { export interface ContainerServiceNetworkProfile { dnsServiceIP?: string; dockerBridgeCidr?: string; + ebpfDataplane?: EbpfDataplane; ipFamilies?: IpFamily[]; kubeProxyConfig?: ContainerServiceNetworkProfileKubeProxyConfig; loadBalancerProfile?: ManagedClusterLoadBalancerProfile; @@ -385,6 +391,9 @@ export interface CredentialResults { readonly kubeconfigs?: CredentialResult[]; } +// @public +export type EbpfDataplane = string; + // @public export interface EndpointDependency { domainName?: string; @@ -492,6 +501,12 @@ export interface FleetMembersCreateOrUpdateOptionalParams extends coreClient.Ope // @public export type FleetMembersCreateOrUpdateResponse = FleetMember; +// @public +export interface FleetMembersDeleteHeaders { + // (undocumented) + location?: string; +} + // @public export interface FleetMembersDeleteOptionalParams extends coreClient.OperationOptions { ifMatch?: string; @@ -560,6 +575,12 @@ export interface FleetsCreateOrUpdateOptionalParams extends coreClient.Operation // @public export type FleetsCreateOrUpdateResponse = Fleet; +// @public +export interface FleetsDeleteHeaders { + // (undocumented) + location?: string; +} + // @public export interface FleetsDeleteOptionalParams extends coreClient.OperationOptions { ifMatch?: string; @@ -877,6 +898,11 @@ export enum KnownCreatedByType { User = "User" } +// @public +export enum KnownEbpfDataplane { + Cilium = "cilium" +} + // @public export enum KnownExpander { LeastWaste = "least-waste", @@ -1054,6 +1080,12 @@ export enum KnownPrivateEndpointConnectionProvisioningState { Succeeded = "Succeeded" } +// @public +export enum KnownProtocol { + TCP = "TCP", + UDP = "UDP" +} + // @public export enum KnownPublicNetworkAccess { Disabled = "Disabled", @@ -1618,6 +1650,7 @@ export interface ManagedClustersDeleteOptionalParams extends coreClient.Operatio // @public export interface ManagedClusterSecurityProfile { azureKeyVaultKms?: AzureKeyVaultKms; + customCATrustCertificates?: Uint8Array[]; defender?: ManagedClusterSecurityProfileDefender; imageCleaner?: ManagedClusterSecurityProfileImageCleaner; nodeRestriction?: ManagedClusterSecurityProfileNodeRestriction; @@ -2063,6 +2096,13 @@ export interface OutboundEnvironmentEndpointCollection { // @public export type OutboundType = string; +// @public +export interface PortRange { + portEnd?: number; + portStart?: number; + protocol?: Protocol; +} + // @public export interface PowerState { code?: Code; @@ -2160,6 +2200,9 @@ export interface PrivateLinkServiceConnectionState { status?: ConnectionStatus; } +// @public +export type Protocol = string; + // @public export type PublicNetworkAccess = string; diff --git a/sdk/containerservice/arm-containerservice/src/containerServiceClient.ts b/sdk/containerservice/arm-containerservice/src/containerServiceClient.ts index ee4fa9032730..05dac5c73234 100644 --- a/sdk/containerservice/arm-containerservice/src/containerServiceClient.ts +++ b/sdk/containerservice/arm-containerservice/src/containerServiceClient.ts @@ -8,6 +8,11 @@ import * as coreClient from "@azure/core-client"; import * as coreRestPipeline from "@azure/core-rest-pipeline"; +import { + PipelineRequest, + PipelineResponse, + SendRequest +} from "@azure/core-rest-pipeline"; import * as coreAuth from "@azure/core-auth"; import { OperationsImpl, @@ -43,6 +48,7 @@ import { ContainerServiceClientOptionalParams } from "./models"; export class ContainerServiceClient extends coreClient.ServiceClient { $host: string; + apiVersion: string; subscriptionId: string; /** @@ -72,7 +78,7 @@ export class ContainerServiceClient extends coreClient.ServiceClient { credential: credentials }; - const packageDetails = `azsdk-js-arm-containerservice/18.0.0-beta.3`; + const packageDetails = `azsdk-js-arm-containerservice/17.2.0-beta.1`; const userAgentPrefix = options.userAgentOptions && options.userAgentOptions.userAgentPrefix ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` @@ -92,40 +98,34 @@ export class ContainerServiceClient extends coreClient.ServiceClient { }; super(optionsWithDefaults); - let bearerTokenAuthenticationPolicyFound: boolean = false; if (options?.pipeline && options.pipeline.getOrderedPolicies().length > 0) { const pipelinePolicies: coreRestPipeline.PipelinePolicy[] = options.pipeline.getOrderedPolicies(); - bearerTokenAuthenticationPolicyFound = pipelinePolicies.some( + const bearerTokenAuthenticationPolicyFound = pipelinePolicies.some( (pipelinePolicy) => pipelinePolicy.name === coreRestPipeline.bearerTokenAuthenticationPolicyName ); - } - if ( - !options || - !options.pipeline || - options.pipeline.getOrderedPolicies().length == 0 || - !bearerTokenAuthenticationPolicyFound - ) { - this.pipeline.removePolicy({ - name: coreRestPipeline.bearerTokenAuthenticationPolicyName - }); - this.pipeline.addPolicy( - coreRestPipeline.bearerTokenAuthenticationPolicy({ - credential: credentials, - scopes: `${optionsWithDefaults.credentialScopes}`, - challengeCallbacks: { - authorizeRequestOnChallenge: - coreClient.authorizeRequestOnClaimChallenge - } - }) - ); + if (!bearerTokenAuthenticationPolicyFound) { + this.pipeline.removePolicy({ + name: coreRestPipeline.bearerTokenAuthenticationPolicyName + }); + this.pipeline.addPolicy( + coreRestPipeline.bearerTokenAuthenticationPolicy({ + scopes: `${optionsWithDefaults.baseUri}/.default`, + challengeCallbacks: { + authorizeRequestOnChallenge: + coreClient.authorizeRequestOnClaimChallenge + } + }) + ); + } } // Parameter assignments this.subscriptionId = subscriptionId; // Assigning values to Constant parameters this.$host = options.$host || "https://management.azure.com"; + this.apiVersion = options.apiVersion || "2022-09-02-preview"; this.operations = new OperationsImpl(this); this.managedClusters = new ManagedClustersImpl(this); this.maintenanceConfigurations = new MaintenanceConfigurationsImpl(this); @@ -141,6 +141,35 @@ export class ContainerServiceClient extends coreClient.ServiceClient { this.trustedAccessRoleBindings = new TrustedAccessRoleBindingsImpl(this); this.fleets = new FleetsImpl(this); this.fleetMembers = new FleetMembersImpl(this); + this.addCustomApiVersionPolicy(options.apiVersion); + } + + /** A function that adds a policy that sets the api-version (or equivalent) to reflect the library version. */ + private addCustomApiVersionPolicy(apiVersion?: string) { + if (!apiVersion) { + return; + } + const apiVersionPolicy = { + name: "CustomApiVersionPolicy", + async sendRequest( + request: PipelineRequest, + next: SendRequest + ): Promise { + const param = request.url.split("?"); + if (param.length > 1) { + const newParams = param[1].split("&").map((item) => { + if (item.indexOf("api-version") > -1) { + return "api-version=" + apiVersion; + } else { + return item; + } + }); + request.url = param[0] + "?" + newParams.join("&"); + } + return next(request); + } + }; + this.pipeline.addPolicy(apiVersionPolicy); } operations: Operations; diff --git a/sdk/containerservice/arm-containerservice/src/models/index.ts b/sdk/containerservice/arm-containerservice/src/models/index.ts index 4511c8fd2828..488c339fc3af 100644 --- a/sdk/containerservice/arm-containerservice/src/models/index.ts +++ b/sdk/containerservice/arm-containerservice/src/models/index.ts @@ -233,7 +233,7 @@ export interface ManagedClusterAgentPoolProfileProperties { availabilityZones?: string[]; /** Some scenarios may require nodes in a node pool to receive their own dedicated public IP addresses. A common scenario is for gaming workloads, where a console needs to make a direct connection to a cloud virtual machine to minimize hops. For more information see [assigning a public IP per node](https://docs.microsoft.com/azure/aks/use-multiple-node-pools#assign-a-public-ip-per-node-for-your-node-pools). The default is false. */ enableNodePublicIP?: boolean; - /** When set to true, AKS deploys a daemonset and host services to sync custom certificate authorities from a user-provided config map into node trust stores. Defaults to false. */ + /** When set to true, AKS adds a label to the node indicating that the feature is enabled and deploys a daemonset along with host services to sync custom certificate authorities from user-provided list of base64 encoded certificates into node trust stores. Defaults to false. */ enableCustomCATrust?: boolean; /** This is of the form: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/publicIPPrefixes/{publicIPPrefixName} */ nodePublicIPPrefixID?: string; @@ -389,6 +389,10 @@ export interface AgentPoolWindowsProfile { export interface AgentPoolNetworkProfile { /** IPTags of instance-level public IPs. */ nodePublicIPTags?: IPTag[]; + /** The port ranges that are allowed to access. The specified ranges are allowed to overlap. */ + allowedHostPorts?: PortRange[]; + /** The IDs of the application security groups which agent pool will associate when created. */ + applicationSecurityGroups?: string[]; } /** Contains the IPTag associated with the object. */ @@ -399,6 +403,16 @@ export interface IPTag { tag?: string; } +/** The port range. */ +export interface PortRange { + /** The minimum port that is included in the range. It should be ranged from 1 to 65535, and be less than or equal to portEnd. */ + portStart?: number; + /** The maximum port that is included in the range. It should be ranged from 1 to 65535, and be greater than or equal to portStart. */ + portEnd?: number; + /** The network protocol of the port. */ + protocol?: Protocol; +} + /** Profile for Linux VMs in the container service cluster. */ export interface ContainerServiceLinuxProfile { /** The administrator username to use for Linux VMs. */ @@ -559,6 +573,8 @@ export interface ContainerServiceNetworkProfile { networkPolicy?: NetworkPolicy; /** This cannot be specified if networkPlugin is anything other than 'azure'. */ networkMode?: NetworkMode; + /** The eBPF dataplane used for building the Kubernetes network. */ + ebpfDataplane?: EbpfDataplane; /** A CIDR notation IP range from which to assign pod IPs when kubenet is used. */ podCidr?: string; /** A CIDR notation IP range from which to assign service cluster IPs. It must not overlap with any Subnet IP ranges. */ @@ -797,6 +813,8 @@ export interface ManagedClusterSecurityProfile { imageCleaner?: ManagedClusterSecurityProfileImageCleaner; /** [Node Restriction](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#noderestriction) settings for the security profile. */ nodeRestriction?: ManagedClusterSecurityProfileNodeRestriction; + /** A list of up to 10 base64 encoded CAs that will be added to the trust store on nodes with the Custom CA Trust feature enabled. For more information see [Custom CA Trust Certificates](https://learn.microsoft.com/en-us/azure/aks/custom-certificate-authority) */ + customCATrustCertificates?: Uint8Array[]; } /** Microsoft Defender settings for the security profile. */ @@ -1727,7 +1745,7 @@ export interface AgentPool extends SubResource { availabilityZones?: string[]; /** Some scenarios may require nodes in a node pool to receive their own dedicated public IP addresses. A common scenario is for gaming workloads, where a console needs to make a direct connection to a cloud virtual machine to minimize hops. For more information see [assigning a public IP per node](https://docs.microsoft.com/azure/aks/use-multiple-node-pools#assign-a-public-ip-per-node-for-your-node-pools). The default is false. */ enableNodePublicIP?: boolean; - /** When set to true, AKS deploys a daemonset and host services to sync custom certificate authorities from a user-provided config map into node trust stores. Defaults to false. */ + /** When set to true, AKS adds a label to the node indicating that the feature is enabled and deploys a daemonset along with host services to sync custom certificate authorities from user-provided list of base64 encoded certificates into node trust stores. Defaults to false. */ enableCustomCATrust?: boolean; /** This is of the form: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/publicIPPrefixes/{publicIPPrefixName} */ nodePublicIPPrefixID?: string; @@ -1968,6 +1986,16 @@ export interface AgentPoolsUpgradeNodeImageVersionHeaders { azureAsyncOperation?: string; } +/** Defines headers for Fleets_delete operation. */ +export interface FleetsDeleteHeaders { + location?: string; +} + +/** Defines headers for FleetMembers_delete operation. */ +export interface FleetMembersDeleteHeaders { + location?: string; +} + /** Known values of {@link ManagedClusterSKUName} that the service accepts. */ export enum KnownManagedClusterSKUName { /** Basic */ @@ -2250,6 +2278,24 @@ export enum KnownGPUInstanceProfile { */ export type GPUInstanceProfile = string; +/** Known values of {@link Protocol} that the service accepts. */ +export enum KnownProtocol { + /** TCP protocol. */ + TCP = "TCP", + /** UDP protocol. */ + UDP = "UDP" +} + +/** + * Defines values for Protocol. \ + * {@link KnownProtocol} can be used interchangeably with Protocol, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **TCP**: TCP protocol. \ + * **UDP**: UDP protocol. + */ +export type Protocol = string; + /** Known values of {@link LicenseType} that the service accepts. */ export enum KnownLicenseType { /** No additional licensing is applied. */ @@ -2364,6 +2410,21 @@ export enum KnownNetworkMode { */ export type NetworkMode = string; +/** Known values of {@link EbpfDataplane} that the service accepts. */ +export enum KnownEbpfDataplane { + /** Use Cilium for networking in the Kubernetes cluster. */ + Cilium = "cilium" +} + +/** + * Defines values for EbpfDataplane. \ + * {@link KnownEbpfDataplane} can be used interchangeably with EbpfDataplane, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **cilium**: Use Cilium for networking in the Kubernetes cluster. + */ +export type EbpfDataplane = string; + /** Known values of {@link OutboundType} that the service accepts. */ export enum KnownOutboundType { /** The load balancer is used for egress through an AKS assigned public IP. This supports Kubernetes services of type 'loadBalancer'. For more information see [outbound type loadbalancer](https://docs.microsoft.com/azure/aks/egress-outboundtype#outbound-type-of-loadbalancer). */ @@ -4067,6 +4128,8 @@ export interface ContainerServiceClientOptionalParams extends coreClient.ServiceClientOptions { /** server parameter */ $host?: string; + /** Api Version */ + apiVersion?: string; /** Overrides client endpoint. */ endpoint?: string; } diff --git a/sdk/containerservice/arm-containerservice/src/models/mappers.ts b/sdk/containerservice/arm-containerservice/src/models/mappers.ts index 3282581dd5aa..e3d9fa948738 100644 --- a/sdk/containerservice/arm-containerservice/src/models/mappers.ts +++ b/sdk/containerservice/arm-containerservice/src/models/mappers.ts @@ -1022,6 +1022,29 @@ export const AgentPoolNetworkProfile: coreClient.CompositeMapper = { } } } + }, + allowedHostPorts: { + serializedName: "allowedHostPorts", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "PortRange" + } + } + } + }, + applicationSecurityGroups: { + serializedName: "applicationSecurityGroups", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } } } } @@ -1048,6 +1071,41 @@ export const IPTag: coreClient.CompositeMapper = { } }; +export const PortRange: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PortRange", + modelProperties: { + portStart: { + constraints: { + InclusiveMaximum: 65535, + InclusiveMinimum: 1 + }, + serializedName: "portStart", + type: { + name: "Number" + } + }, + portEnd: { + constraints: { + InclusiveMaximum: 65535, + InclusiveMinimum: 1 + }, + serializedName: "portEnd", + type: { + name: "Number" + } + }, + protocol: { + serializedName: "protocol", + type: { + name: "String" + } + } + } + } +}; + export const ContainerServiceLinuxProfile: coreClient.CompositeMapper = { type: { name: "Composite", @@ -1508,6 +1566,12 @@ export const ContainerServiceNetworkProfile: coreClient.CompositeMapper = { name: "String" } }, + ebpfDataplane: { + serializedName: "ebpfDataplane", + type: { + name: "String" + } + }, podCidr: { defaultValue: "10.244.0.0/16", constraints: { @@ -2290,6 +2354,20 @@ export const ManagedClusterSecurityProfile: coreClient.CompositeMapper = { name: "Composite", className: "ManagedClusterSecurityProfileNodeRestriction" } + }, + customCATrustCertificates: { + constraints: { + MaxItems: 10 + }, + serializedName: "customCATrustCertificates", + type: { + name: "Sequence", + element: { + type: { + name: "ByteArray" + } + } + } } } } @@ -3913,6 +3991,13 @@ export const FleetHubProfile: coreClient.CompositeMapper = { className: "FleetHubProfile", modelProperties: { dnsPrefix: { + constraints: { + Pattern: new RegExp( + "^[a-zA-Z0-9]$|^[a-zA-Z0-9][a-zA-Z0-9-]{0,52}[a-zA-Z0-9]$" + ), + MaxLength: 54, + MinLength: 1 + }, serializedName: "dnsPrefix", type: { name: "String" @@ -5209,3 +5294,33 @@ export const AgentPoolsUpgradeNodeImageVersionHeaders: coreClient.CompositeMappe } } }; + +export const FleetsDeleteHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "FleetsDeleteHeaders", + modelProperties: { + location: { + serializedName: "location", + type: { + name: "String" + } + } + } + } +}; + +export const FleetMembersDeleteHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "FleetMembersDeleteHeaders", + modelProperties: { + location: { + serializedName: "location", + type: { + name: "String" + } + } + } + } +}; diff --git a/sdk/containerservice/arm-containerservice/src/models/parameters.ts b/sdk/containerservice/arm-containerservice/src/models/parameters.ts index 16c0bc5a17bc..182341fc2715 100644 --- a/sdk/containerservice/arm-containerservice/src/models/parameters.ts +++ b/sdk/containerservice/arm-containerservice/src/models/parameters.ts @@ -56,7 +56,7 @@ export const $host: OperationURLParameter = { export const apiVersion: OperationQueryParameter = { parameterPath: "apiVersion", mapper: { - defaultValue: "2022-08-03-preview", + defaultValue: "2022-09-02-preview", isConstant: true, serializedName: "api-version", type: { @@ -325,18 +325,6 @@ export const parameters10: OperationParameter = { mapper: FleetMapper }; -export const apiVersion1: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "2022-07-02-preview", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - export const fleetName: OperationURLParameter = { parameterPath: "fleetName", mapper: { diff --git a/sdk/containerservice/arm-containerservice/src/operations/fleetMembers.ts b/sdk/containerservice/arm-containerservice/src/operations/fleetMembers.ts index 4e3db5bd5583..4dbcdfb16ae2 100644 --- a/sdk/containerservice/arm-containerservice/src/operations/fleetMembers.ts +++ b/sdk/containerservice/arm-containerservice/src/operations/fleetMembers.ts @@ -174,7 +174,8 @@ export class FleetMembersImpl implements FleetMembers { ); const poller = new LroEngine(lro, { resumeFrom: options?.resumeFrom, - intervalInMs: options?.updateIntervalInMs + intervalInMs: options?.updateIntervalInMs, + lroResourceLocationConfig: "azure-async-operation" }); await poller.poll(); return poller; @@ -376,7 +377,7 @@ const createOrUpdateOperationSpec: coreClient.OperationSpec = { } }, requestBody: Parameters.parameters12, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -405,7 +406,7 @@ const getOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -429,7 +430,7 @@ const deleteOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -452,7 +453,7 @@ const listByFleetOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -473,7 +474,7 @@ const listByFleetNextOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, diff --git a/sdk/containerservice/arm-containerservice/src/operations/fleets.ts b/sdk/containerservice/arm-containerservice/src/operations/fleets.ts index cc47018f4110..2ef6e5400e0c 100644 --- a/sdk/containerservice/arm-containerservice/src/operations/fleets.ts +++ b/sdk/containerservice/arm-containerservice/src/operations/fleets.ts @@ -207,7 +207,8 @@ export class FleetsImpl implements Fleets { ); const poller = new LroEngine(lro, { resumeFrom: options?.resumeFrom, - intervalInMs: options?.updateIntervalInMs + intervalInMs: options?.updateIntervalInMs, + lroResourceLocationConfig: "azure-async-operation" }); await poller.poll(); return poller; @@ -451,7 +452,7 @@ const createOrUpdateOperationSpec: coreClient.OperationSpec = { } }, requestBody: Parameters.parameters10, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -480,7 +481,7 @@ const updateOperationSpec: coreClient.OperationSpec = { } }, requestBody: Parameters.parameters11, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -507,7 +508,7 @@ const getOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -530,7 +531,7 @@ const deleteOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -552,7 +553,7 @@ const listByResourceGroupOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -573,7 +574,7 @@ const listOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [Parameters.$host, Parameters.subscriptionId], headerParameters: [Parameters.accept], serializer @@ -590,7 +591,7 @@ const listCredentialsOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -611,7 +612,7 @@ const listByResourceGroupNextOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, @@ -632,7 +633,7 @@ const listNextOperationSpec: coreClient.OperationSpec = { bodyMapper: Mappers.ErrorResponse } }, - queryParameters: [Parameters.apiVersion1], + queryParameters: [Parameters.apiVersion], urlParameters: [ Parameters.$host, Parameters.subscriptionId, diff --git a/sdk/containerservice/arm-containerservice/test/sampleTest.ts b/sdk/containerservice/arm-containerservice/test/sampleTest.ts new file mode 100644 index 000000000000..25aeb3ebcc36 --- /dev/null +++ b/sdk/containerservice/arm-containerservice/test/sampleTest.ts @@ -0,0 +1,43 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + Recorder, + RecorderStartOptions, + env +} from "@azure-tools/test-recorder"; +import { assert } from "chai"; +import { Context } from "mocha"; + +const replaceableVariables: Record = { + AZURE_CLIENT_ID: "azure_client_id", + AZURE_CLIENT_SECRET: "azure_client_secret", + AZURE_TENANT_ID: "88888888-8888-8888-8888-888888888888", + SUBSCRIPTION_ID: "azure_subscription_id" +}; + +const recorderOptions: RecorderStartOptions = { + envSetupForPlayback: replaceableVariables +}; + +describe("My test", () => { + let recorder: Recorder; + + beforeEach(async function(this: Context) { + recorder = new Recorder(this.currentTest); + await recorder.start(recorderOptions); + }); + + afterEach(async function() { + await recorder.stop(); + }); + + it("sample test", async function() { + console.log("Hi, I'm a test!"); + }); +}); diff --git a/sdk/containerservice/arm-containerservice/tsconfig.json b/sdk/containerservice/arm-containerservice/tsconfig.json index 5bad5556bbfd..3e6ae96443f3 100644 --- a/sdk/containerservice/arm-containerservice/tsconfig.json +++ b/sdk/containerservice/arm-containerservice/tsconfig.json @@ -15,17 +15,11 @@ ], "declaration": true, "outDir": "./dist-esm", - "importHelpers": true, - "paths": { - "@azure/arm-containerservice": [ - "./src/index" - ] - } + "importHelpers": true }, "include": [ "./src/**/*.ts", - "./test/**/*.ts", - "samples-dev/**/*.ts" + "./test/**/*.ts" ], "exclude": [ "node_modules"