diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 58ba4410c456..10da91311898 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1638,6 +1638,9 @@ sdk/containerservice/arm-containerservicesafeguards/ @qiaozha @MaryGao # PRLabel: %Mgmt sdk/workloadorchestration/arm-workloadorchestration/ @qiaozha @MaryGao +# PRLabel: %Mgmt +sdk/compute/arm-computerecommender/ @qiaozha @MaryGao + ########### # Config ########### diff --git a/eng/ignore-links.txt b/eng/ignore-links.txt index 8b61481fb9eb..164b3fa4564b 100644 --- a/eng/ignore-links.txt +++ b/eng/ignore-links.txt @@ -49,3 +49,4 @@ https://learn.microsoft.com/javascript/api/@azure/arm-containerservicesafeguards https://learn.microsoft.com/javascript/api/@azure/arm-storagediscovery?view=azure-node-preview https://learn.microsoft.com/javascript/api/@azure/arm-azurestackhcivm?view=azure-node-preview https://learn.microsoft.com/javascript/api/@azure/arm-workloadorchestration?view=azure-node-preview +https://learn.microsoft.com/javascript/api/@azure/arm-computerecommender?view=azure-node-preview diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f2008ee2875..a564c55d8429 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5223,6 +5223,70 @@ importers: specifier: catalog:testing version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/browser@3.2.4)(jsdom@16.7.0)(msw@2.7.3(@types/node@20.19.17)(typescript@5.8.3))(terser@5.39.0)(tsx@4.20.5)(yaml@2.8.1) + sdk/compute/arm-computerecommender: + dependencies: + '@azure-rest/core-client': + specifier: ^2.3.1 + version: link:../../core/core-client-rest + '@azure/core-auth': + specifier: ^1.9.0 + version: link:../../core/core-auth + '@azure/core-rest-pipeline': + specifier: ^1.20.0 + version: link:../../core/core-rest-pipeline + '@azure/core-util': + specifier: ^1.12.0 + version: link:../../core/core-util + '@azure/logger': + specifier: ^1.2.0 + version: link:../../core/logger + tslib: + specifier: ^2.8.1 + version: 2.8.1 + devDependencies: + '@azure-tools/test-credential': + specifier: ^2.0.0 + version: link:../../test-utils/test-credential + '@azure-tools/test-recorder': + specifier: ^4.1.0 + version: link:../../test-utils/recorder + '@azure-tools/test-utils-vitest': + specifier: ^1.0.0 + version: 1.0.0(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/browser@3.2.4)(jsdom@16.7.0)(msw@2.7.3(@types/node@20.19.17)(typescript@5.8.3))(terser@5.39.0)(tsx@4.20.5)(yaml@2.8.1) + '@azure/dev-tool': + specifier: ^1.0.0 + version: link:../../../common/tools/dev-tool + '@azure/eslint-plugin-azure-sdk': + specifier: ^3.0.0 + version: link:../../../common/tools/eslint-plugin-azure-sdk + '@azure/identity': + specifier: ^4.9.0 + version: link:../../identity/identity + '@types/node': + specifier: ^20.0.0 + version: 20.19.17 + '@vitest/browser': + specifier: ^3.0.9 + version: 3.2.4(msw@2.7.3(@types/node@20.19.17)(typescript@5.8.3))(playwright@1.55.0)(vite@7.1.7(@types/node@20.19.17)(terser@5.39.0)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/coverage-istanbul': + specifier: ^3.0.9 + version: 3.2.4(vitest@3.2.4) + dotenv: + specifier: ^16.0.0 + version: 16.6.1 + eslint: + specifier: ^9.9.0 + version: 9.36.0 + playwright: + specifier: ^1.52.0 + version: 1.55.0 + typescript: + specifier: ~5.8.2 + version: 5.8.3 + vitest: + specifier: ^3.0.9 + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/browser@3.2.4)(jsdom@16.7.0)(msw@2.7.3(@types/node@20.19.17)(typescript@5.8.3))(terser@5.39.0)(tsx@4.20.5)(yaml@2.8.1) + sdk/computefleet/arm-computefleet: dependencies: '@azure-rest/core-client': @@ -29929,56 +29993,67 @@ packages: resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.52.0': resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.52.0': resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.52.0': resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.52.0': resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.52.0': resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.52.0': resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.52.0': resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.52.0': resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.52.0': resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.52.0': resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.52.0': resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==} diff --git a/sdk/compute/arm-computerecommender/CHANGELOG.md b/sdk/compute/arm-computerecommender/CHANGELOG.md new file mode 100644 index 000000000000..fe8deed4dc26 --- /dev/null +++ b/sdk/compute/arm-computerecommender/CHANGELOG.md @@ -0,0 +1,7 @@ +# Release History + +## 1.0.0 (2025-09-25) + +### Features Added + +This is the first stable version with the package of @azure/arm-computerecommender diff --git a/sdk/compute/arm-computerecommender/LICENSE b/sdk/compute/arm-computerecommender/LICENSE new file mode 100644 index 000000000000..63447fd8bbbf --- /dev/null +++ b/sdk/compute/arm-computerecommender/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) Microsoft Corporation. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/compute/arm-computerecommender/README.md b/sdk/compute/arm-computerecommender/README.md new file mode 100644 index 000000000000..4ac609bc8bc8 --- /dev/null +++ b/sdk/compute/arm-computerecommender/README.md @@ -0,0 +1,115 @@ +# Azure ComputeRecommenderResourceProvider client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure ComputeRecommenderResourceProvider client. + +The Compute Recommender Resource Provider Client + +Key links: + +- [Source code](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-computerecommender) +- [Package (NPM)](https://www.npmjs.com/package/@azure/arm-computerecommender) +- [API reference documentation](https://learn.microsoft.com/javascript/api/@azure/arm-computerecommender?view=azure-node-preview) +- [Samples](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-computerecommender/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://github.com/nodejs/release#release-schedule) +- Latest versions of Safari, Chrome, Edge and Firefox. + +See our [support policy](https://github.com/Azure/azure-sdk-for-js/blob/main/SUPPORT.md) for more details. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/arm-computerecommender` package + +Install the Azure ComputeRecommenderResourceProvider client library for JavaScript with `npm`: + +```bash +npm install @azure/arm-computerecommender +``` + +### Create and authenticate a `ComputeRecommenderManagementClient` + +To create a client object to access the Azure ComputeRecommenderResourceProvider API, you will need the `endpoint` of your Azure ComputeRecommenderResourceProvider resource and a `credential`. The Azure ComputeRecommenderResourceProvider client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure ComputeRecommenderResourceProvider resource in the [Azure Portal][azure_portal]. + +You can authenticate with Azure Active Directory using a credential from the [@azure/identity][azure_identity] library or [an existing AAD Token](https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/identity/identity/samples/AzureIdentityExamples.md#authenticating-with-a-pre-fetched-access-token). + +To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to **register a new AAD application and grant access to Azure ComputeRecommenderResourceProvider** by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). + +For more information about how to create an Azure AD Application check out [this guide](https://learn.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal). + +Using Node.js and Node-like environments, you can use the `DefaultAzureCredential` class to authenticate the client. + +```ts snippet:ReadmeSampleCreateClient_Node +import { ComputeRecommenderManagementClient } from "@azure/arm-computerecommender"; +import { DefaultAzureCredential } from "@azure/identity"; + +const subscriptionId = "00000000-0000-0000-0000-000000000000"; +const client = new ComputeRecommenderManagementClient(new DefaultAzureCredential(), subscriptionId); +``` + +For browser environments, use the `InteractiveBrowserCredential` from the `@azure/identity` package to authenticate. + +```ts snippet:ReadmeSampleCreateClient_Browser +import { InteractiveBrowserCredential } from "@azure/identity"; +import { ComputeRecommenderManagementClient } from "@azure/arm-computerecommender"; + +const credential = new InteractiveBrowserCredential({ + tenantId: "", + clientId: "", +}); +const subscriptionId = "00000000-0000-0000-0000-000000000000"; +const client = new ComputeRecommenderManagementClient(credential, subscriptionId); +``` + + +### JavaScript Bundle +To use this client library in the browser, first you need to use a bundler. For details on how to do this, please refer to our [bundling documentation](https://aka.ms/AzureSDKBundling). + +## Key concepts + +### ComputeRecommenderManagementClient + +`ComputeRecommenderManagementClient` is the primary interface for developers using the Azure ComputeRecommenderResourceProvider client library. Explore the methods on this client object to understand the different features of the Azure ComputeRecommenderResourceProvider service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```ts snippet:SetLogLevel +import { setLogLevel } from "@azure/logger"; + +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-computerecommender/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/main/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity#defaultazurecredential diff --git a/sdk/compute/arm-computerecommender/api-extractor.json b/sdk/compute/arm-computerecommender/api-extractor.json new file mode 100644 index 000000000000..870d6d399477 --- /dev/null +++ b/sdk/compute/arm-computerecommender/api-extractor.json @@ -0,0 +1 @@ +{ "extends": "../../../api-extractor-base.json" } diff --git a/sdk/compute/arm-computerecommender/eslint.config.mjs b/sdk/compute/arm-computerecommender/eslint.config.mjs new file mode 100644 index 000000000000..6d2f8a5914c3 --- /dev/null +++ b/sdk/compute/arm-computerecommender/eslint.config.mjs @@ -0,0 +1,14 @@ +import azsdkEslint from "@azure/eslint-plugin-azure-sdk"; + +export default azsdkEslint.config([ + { + rules: { + "@azure/azure-sdk/ts-modules-only-named": "warn", + "@azure/azure-sdk/ts-package-json-types": "warn", + "@azure/azure-sdk/ts-package-json-engine-is-present": "warn", + "@azure/azure-sdk/ts-package-json-files-required": "off", + "@azure/azure-sdk/ts-package-json-main-is-cjs": "off", + "tsdoc/syntax": "warn", + }, + }, +]); diff --git a/sdk/compute/arm-computerecommender/metadata.json b/sdk/compute/arm-computerecommender/metadata.json new file mode 100644 index 000000000000..587f70bcdcc3 --- /dev/null +++ b/sdk/compute/arm-computerecommender/metadata.json @@ -0,0 +1,4 @@ +{ + "apiVersion": "2025-06-05", + "emitterVersion": "0.44.0" +} diff --git a/sdk/compute/arm-computerecommender/package.json b/sdk/compute/arm-computerecommender/package.json new file mode 100644 index 000000000000..de89a1c295b3 --- /dev/null +++ b/sdk/compute/arm-computerecommender/package.json @@ -0,0 +1,210 @@ +{ + "name": "@azure/arm-computerecommender", + "version": "1.0.0", + "description": "A generated SDK for ComputeRecommenderManagementClient.", + "engines": { + "node": ">=20.0.0" + }, + "sideEffects": false, + "autoPublish": false, + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts", + "./api": "./src/api/index.ts", + "./api/spotPlacementScores": "./src/api/spotPlacementScores/index.ts", + "./api/operations": "./src/api/operations/index.ts", + "./models": "./src/models/index.ts" + }, + "dialects": [ + "esm", + "commonjs" + ], + "esmDialects": [ + "browser", + "react-native" + ], + "selfLink": false, + "project": "../../../tsconfig.src.build.json" + }, + "type": "module", + "browser": "./dist/browser/index.js", + "react-native": "./dist/react-native/index.js", + "keywords": [ + "node", + "azure", + "cloud", + "typescript", + "browser", + "isomorphic" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "files": [ + "dist/", + "!dist/**/*.d.*ts.map", + "README.md", + "LICENSE" + ], + "sdk-type": "mgmt", + "repository": "github:Azure/azure-sdk-for-js", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-computerecommender/README.md", + "prettier": "@azure/eslint-plugin-azure-sdk/prettier.json", + "//metadata": { + "constantPaths": [ + { + "path": "src/api/computeRecommenderManagementContext.ts", + "prefix": "userAgentInfo" + } + ] + }, + "dependencies": { + "@azure/core-util": "^1.12.0", + "@azure-rest/core-client": "^2.3.1", + "@azure/core-auth": "^1.9.0", + "@azure/core-rest-pipeline": "^1.20.0", + "@azure/logger": "^1.2.0", + "tslib": "^2.8.1" + }, + "devDependencies": { + "@azure-tools/test-credential": "^2.0.0", + "@azure-tools/test-recorder": "^4.1.0", + "@azure-tools/test-utils-vitest": "^1.0.0", + "@azure/dev-tool": "^1.0.0", + "@azure/eslint-plugin-azure-sdk": "^3.0.0", + "@azure/identity": "^4.9.0", + "@types/node": "^20.0.0", + "eslint": "^9.9.0", + "@vitest/browser": "^3.0.9", + "@vitest/coverage-istanbul": "^3.0.9", + "dotenv": "^16.0.0", + "playwright": "^1.52.0", + "typescript": "~5.8.2", + "vitest": "^3.0.9" + }, + "scripts": { + "clean": "rimraf --glob dist dist-browser dist-esm test-dist temp types *.tgz *.log", + "extract-api": "rimraf review && dev-tool run extract-api", + "pack": "npm pack 2>&1", + "lint": "echo skipped", + "lint:fix": "echo skipped", + "build:samples": "tsc -p tsconfig.samples.json && dev-tool samples publish -f", + "check-format": "prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.{ts,cts,mts}\" \"test/**/*.{ts,cts,mts}\" \"*.{js,cjs,mjs,json}\" \"samples-dev/*.ts\"", + "execute:samples": "dev-tool samples run samples-dev", + "format": "prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.{ts,cts,mts}\" \"test/**/*.{ts,cts,mts}\" \"*.{js,cjs,mjs,json}\" \"samples-dev/*.ts\"", + "generate:client": "echo skipped", + "test:browser": "dev-tool run build-test && dev-tool run test:vitest --browser", + "build": "npm run clean && dev-tool run build-package && dev-tool run extract-api", + "test:node": "dev-tool run test:vitest", + "test:node:esm": "dev-tool run test:vitest --esm", + "test": "npm run test:node && npm run test:browser", + "update-snippets": "dev-tool run update-snippets" + }, + "//sampleConfiguration": { + "productName": "@azure/arm-computerecommender", + "productSlugs": [ + "azure" + ], + "disableDocsMs": true, + "apiRefLink": "https://learn.microsoft.com/javascript/api/@azure/arm-computerecommender?view=azure-node-preview" + }, + "exports": { + "./package.json": "./package.json", + ".": { + "browser": { + "types": "./dist/browser/index.d.ts", + "default": "./dist/browser/index.js" + }, + "react-native": { + "types": "./dist/react-native/index.d.ts", + "default": "./dist/react-native/index.js" + }, + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + }, + "./api": { + "browser": { + "types": "./dist/browser/api/index.d.ts", + "default": "./dist/browser/api/index.js" + }, + "react-native": { + "types": "./dist/react-native/api/index.d.ts", + "default": "./dist/react-native/api/index.js" + }, + "import": { + "types": "./dist/esm/api/index.d.ts", + "default": "./dist/esm/api/index.js" + }, + "require": { + "types": "./dist/commonjs/api/index.d.ts", + "default": "./dist/commonjs/api/index.js" + } + }, + "./api/spotPlacementScores": { + "browser": { + "types": "./dist/browser/api/spotPlacementScores/index.d.ts", + "default": "./dist/browser/api/spotPlacementScores/index.js" + }, + "react-native": { + "types": "./dist/react-native/api/spotPlacementScores/index.d.ts", + "default": "./dist/react-native/api/spotPlacementScores/index.js" + }, + "import": { + "types": "./dist/esm/api/spotPlacementScores/index.d.ts", + "default": "./dist/esm/api/spotPlacementScores/index.js" + }, + "require": { + "types": "./dist/commonjs/api/spotPlacementScores/index.d.ts", + "default": "./dist/commonjs/api/spotPlacementScores/index.js" + } + }, + "./api/operations": { + "browser": { + "types": "./dist/browser/api/operations/index.d.ts", + "default": "./dist/browser/api/operations/index.js" + }, + "react-native": { + "types": "./dist/react-native/api/operations/index.d.ts", + "default": "./dist/react-native/api/operations/index.js" + }, + "import": { + "types": "./dist/esm/api/operations/index.d.ts", + "default": "./dist/esm/api/operations/index.js" + }, + "require": { + "types": "./dist/commonjs/api/operations/index.d.ts", + "default": "./dist/commonjs/api/operations/index.js" + } + }, + "./models": { + "browser": { + "types": "./dist/browser/models/index.d.ts", + "default": "./dist/browser/models/index.js" + }, + "react-native": { + "types": "./dist/react-native/models/index.d.ts", + "default": "./dist/react-native/models/index.js" + }, + "import": { + "types": "./dist/esm/models/index.d.ts", + "default": "./dist/esm/models/index.js" + }, + "require": { + "types": "./dist/commonjs/models/index.d.ts", + "default": "./dist/commonjs/models/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts", + "module": "./dist/esm/index.js" +} diff --git a/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-node.api.md b/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-node.api.md new file mode 100644 index 000000000000..3b2310705547 --- /dev/null +++ b/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-node.api.md @@ -0,0 +1,28 @@ +## API Report File for "@azure/arm-computerecommender" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import type { Client } from '@azure-rest/core-client'; +import type { ClientOptions } from '@azure-rest/core-client'; +import type { TokenCredential } from '@azure/core-auth'; + +// @public +export interface ComputeRecommenderManagementClientOptionalParams extends ClientOptions { + apiVersion?: string; + cloudSetting?: AzureSupportedClouds; +} + +// @public +export interface ComputeRecommenderManagementContext extends Client { + apiVersion: string; + subscriptionId: string; +} + +// @public +export function createComputeRecommenderManagement(credential: TokenCredential, subscriptionId: string, options?: ComputeRecommenderManagementClientOptionalParams): ComputeRecommenderManagementContext; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-operations-node.api.md b/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-operations-node.api.md new file mode 100644 index 000000000000..3c4a13ccad19 --- /dev/null +++ b/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-operations-node.api.md @@ -0,0 +1,19 @@ +## API Report File for "@azure/arm-computerecommender" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import type { Client } from '@azure-rest/core-client'; +import type { OperationOptions } from '@azure-rest/core-client'; + +// @public +export function list(context: ComputeRecommenderManagementContext, options?: OperationsListOptionalParams): PagedAsyncIterableIterator; + +// @public +export interface OperationsListOptionalParams extends OperationOptions { +} + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-spotPlacementScores-node.api.md b/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-spotPlacementScores-node.api.md new file mode 100644 index 000000000000..8ebfee031c02 --- /dev/null +++ b/sdk/compute/arm-computerecommender/review/arm-computerecommender-api-spotPlacementScores-node.api.md @@ -0,0 +1,26 @@ +## API Report File for "@azure/arm-computerecommender" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import type { Client } from '@azure-rest/core-client'; +import type { OperationOptions } from '@azure-rest/core-client'; + +// @public +export function get(context: ComputeRecommenderManagementContext, location: string, options?: SpotPlacementScoresGetOptionalParams): Promise; + +// @public +export function post(context: ComputeRecommenderManagementContext, location: string, spotPlacementScoresInput: SpotPlacementScoresInput, options?: SpotPlacementScoresPostOptionalParams): Promise; + +// @public +export interface SpotPlacementScoresGetOptionalParams extends OperationOptions { +} + +// @public +export interface SpotPlacementScoresPostOptionalParams extends OperationOptions { +} + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/compute/arm-computerecommender/review/arm-computerecommender-models-node.api.md b/sdk/compute/arm-computerecommender/review/arm-computerecommender-models-node.api.md new file mode 100644 index 000000000000..6c1512f1a29c --- /dev/null +++ b/sdk/compute/arm-computerecommender/review/arm-computerecommender-models-node.api.md @@ -0,0 +1,143 @@ +## API Report File for "@azure/arm-computerecommender" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +// @public +export type ActionType = string; + +// @public +export interface ComputeDiagnosticBase extends ProxyResource { + properties?: DiagnosticProperties; +} + +// @public +export type CreatedByType = string; + +// @public +export interface DiagnosticProperties { + supportedResourceTypes?: string[]; +} + +// @public +export interface ErrorAdditionalInfo { + readonly info?: any; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export enum KnownActionType { + Internal = "Internal" +} + +// @public +export enum KnownCreatedByType { + Application = "Application", + Key = "Key", + ManagedIdentity = "ManagedIdentity", + User = "User" +} + +// @public +export enum KnownOrigin { + System = "system", + User = "user", + UserSystem = "user,system" +} + +// @public +export enum KnownVersions { + V20250605 = "2025-06-05" +} + +// @public +export interface Operation { + readonly actionType?: ActionType; + display?: OperationDisplay; + readonly isDataAction?: boolean; + readonly name?: string; + readonly origin?: Origin; +} + +// @public +export interface OperationDisplay { + readonly description?: string; + readonly operation?: string; + readonly provider?: string; + readonly resource?: string; +} + +// @public +export type Origin = string; + +// @public +export interface PlacementScore { + availabilityZone?: string; + isQuotaAvailable?: boolean; + region?: string; + score?: string; + sku?: string; +} + +// @public +export interface ProxyResource extends Resource { +} + +// @public +export interface Resource { + readonly id?: string; + readonly name?: string; + readonly systemData?: SystemData; + readonly type?: string; +} + +// @public +export interface ResourceSize { + sku?: string; +} + +// @public +export interface SpotPlacementScoresInput { + availabilityZones?: boolean; + desiredCount?: number; + desiredLocations?: string[]; + desiredSizes?: ResourceSize[]; +} + +// @public +export interface SpotPlacementScoresResponse { + availabilityZones?: boolean; + desiredCount?: number; + desiredLocations?: string[]; + desiredSizes?: ResourceSize[]; + placementScores?: PlacementScore[]; +} + +// @public +export interface SystemData { + createdAt?: Date; + createdBy?: string; + createdByType?: CreatedByType; + lastModifiedAt?: Date; + lastModifiedBy?: string; + lastModifiedByType?: CreatedByType; +} + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/compute/arm-computerecommender/review/arm-computerecommender-node.api.md b/sdk/compute/arm-computerecommender/review/arm-computerecommender-node.api.md new file mode 100644 index 000000000000..c88c638a599d --- /dev/null +++ b/sdk/compute/arm-computerecommender/review/arm-computerecommender-node.api.md @@ -0,0 +1,212 @@ +## API Report File for "@azure/arm-computerecommender" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import type { ClientOptions } from '@azure-rest/core-client'; +import type { OperationOptions } from '@azure-rest/core-client'; +import type { Pipeline } from '@azure/core-rest-pipeline'; +import type { TokenCredential } from '@azure/core-auth'; + +// @public +export type ActionType = string; + +// @public +export enum AzureClouds { + AZURE_CHINA_CLOUD = "AZURE_CHINA_CLOUD", + AZURE_PUBLIC_CLOUD = "AZURE_PUBLIC_CLOUD", + AZURE_US_GOVERNMENT = "AZURE_US_GOVERNMENT" +} + +// @public +export type AzureSupportedClouds = `${AzureClouds}`; + +// @public +export interface ComputeDiagnosticBase extends ProxyResource { + properties?: DiagnosticProperties; +} + +// @public (undocumented) +export class ComputeRecommenderManagementClient { + constructor(credential: TokenCredential, subscriptionId: string, options?: ComputeRecommenderManagementClientOptionalParams); + readonly operations: OperationsOperations; + readonly pipeline: Pipeline; + readonly spotPlacementScores: SpotPlacementScoresOperations; +} + +// @public +export interface ComputeRecommenderManagementClientOptionalParams extends ClientOptions { + apiVersion?: string; + cloudSetting?: AzureSupportedClouds; +} + +// @public +export type ContinuablePage = TPage & { + continuationToken?: string; +}; + +// @public +export type CreatedByType = string; + +// @public +export interface DiagnosticProperties { + supportedResourceTypes?: string[]; +} + +// @public +export interface ErrorAdditionalInfo { + readonly info?: any; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export enum KnownActionType { + Internal = "Internal" +} + +// @public +export enum KnownCreatedByType { + Application = "Application", + Key = "Key", + ManagedIdentity = "ManagedIdentity", + User = "User" +} + +// @public +export enum KnownOrigin { + System = "system", + User = "user", + UserSystem = "user,system" +} + +// @public +export enum KnownVersions { + V20250605 = "2025-06-05" +} + +// @public +export interface Operation { + readonly actionType?: ActionType; + display?: OperationDisplay; + readonly isDataAction?: boolean; + readonly name?: string; + readonly origin?: Origin; +} + +// @public +export interface OperationDisplay { + readonly description?: string; + readonly operation?: string; + readonly provider?: string; + readonly resource?: string; +} + +// @public +export interface OperationsListOptionalParams extends OperationOptions { +} + +// @public +export interface OperationsOperations { + list: (options?: OperationsListOptionalParams) => PagedAsyncIterableIterator; +} + +// @public +export type Origin = string; + +// @public +export interface PagedAsyncIterableIterator { + [Symbol.asyncIterator](): PagedAsyncIterableIterator; + byPage: (settings?: TPageSettings) => AsyncIterableIterator>; + next(): Promise>; +} + +// @public +export interface PageSettings { + continuationToken?: string; +} + +// @public +export interface PlacementScore { + availabilityZone?: string; + isQuotaAvailable?: boolean; + region?: string; + score?: string; + sku?: string; +} + +// @public +export interface ProxyResource extends Resource { +} + +// @public +export interface Resource { + readonly id?: string; + readonly name?: string; + readonly systemData?: SystemData; + readonly type?: string; +} + +// @public +export interface ResourceSize { + sku?: string; +} + +// @public +export interface SpotPlacementScoresGetOptionalParams extends OperationOptions { +} + +// @public +export interface SpotPlacementScoresInput { + availabilityZones?: boolean; + desiredCount?: number; + desiredLocations?: string[]; + desiredSizes?: ResourceSize[]; +} + +// @public +export interface SpotPlacementScoresOperations { + get: (location: string, options?: SpotPlacementScoresGetOptionalParams) => Promise; + post: (location: string, spotPlacementScoresInput: SpotPlacementScoresInput, options?: SpotPlacementScoresPostOptionalParams) => Promise; +} + +// @public +export interface SpotPlacementScoresPostOptionalParams extends OperationOptions { +} + +// @public +export interface SpotPlacementScoresResponse { + availabilityZones?: boolean; + desiredCount?: number; + desiredLocations?: string[]; + desiredSizes?: ResourceSize[]; + placementScores?: PlacementScore[]; +} + +// @public +export interface SystemData { + createdAt?: Date; + createdBy?: string; + createdByType?: CreatedByType; + lastModifiedAt?: Date; + lastModifiedBy?: string; + lastModifiedByType?: CreatedByType; +} + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/compute/arm-computerecommender/sample.env b/sdk/compute/arm-computerecommender/sample.env new file mode 100644 index 000000000000..508439fc7d62 --- /dev/null +++ b/sdk/compute/arm-computerecommender/sample.env @@ -0,0 +1 @@ +# Feel free to add your own environment variables. \ No newline at end of file diff --git a/sdk/compute/arm-computerecommender/samples-dev/operationsListSample.ts b/sdk/compute/arm-computerecommender/samples-dev/operationsListSample.ts new file mode 100644 index 000000000000..54f7472027aa --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples-dev/operationsListSample.ts @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { ComputeRecommenderManagementClient } from "@azure/arm-computerecommender"; +import { DefaultAzureCredential } from "@azure/identity"; + +/** + * This sample demonstrates how to list the operations for the provider + * + * @summary list the operations for the provider + * x-ms-original-file: 2025-06-05/Operations_List_MaximumSet_Gen.json + */ +async function operationsListMaximumSetGen(): Promise { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-00000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const resArray = new Array(); + for await (const item of client.operations.list()) { + resArray.push(item); + } + + console.log(resArray); +} + +/** + * This sample demonstrates how to list the operations for the provider + * + * @summary list the operations for the provider + * x-ms-original-file: 2025-06-05/Operations_List_MinimumSet_Gen.json + */ +async function operationsListMinimumSetGen(): Promise { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-00000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const resArray = new Array(); + for await (const item of client.operations.list()) { + resArray.push(item); + } + + console.log(resArray); +} + +async function main(): Promise { + await operationsListMaximumSetGen(); + await operationsListMinimumSetGen(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples-dev/spotPlacementScoresGetSample.ts b/sdk/compute/arm-computerecommender/samples-dev/spotPlacementScoresGetSample.ts new file mode 100644 index 000000000000..06f5d0f77e59 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples-dev/spotPlacementScoresGetSample.ts @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { ComputeRecommenderManagementClient } from "@azure/arm-computerecommender"; +import { DefaultAzureCredential } from "@azure/identity"; + +/** + * This sample demonstrates how to gets Spot Placement Scores metadata. + * + * @summary gets Spot Placement Scores metadata. + * x-ms-original-file: 2025-06-05/GetSpotPlacementScores.json + */ +async function getsTheMetadataOfSpotPlacementScores(): Promise { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-000000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const result = await client.spotPlacementScores.get("eastus"); + console.log(result); +} + +async function main(): Promise { + await getsTheMetadataOfSpotPlacementScores(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples-dev/spotPlacementScoresPostSample.ts b/sdk/compute/arm-computerecommender/samples-dev/spotPlacementScoresPostSample.ts new file mode 100644 index 000000000000..76a8a534db81 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples-dev/spotPlacementScoresPostSample.ts @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { ComputeRecommenderManagementClient } from "@azure/arm-computerecommender"; +import { DefaultAzureCredential } from "@azure/identity"; + +/** + * This sample demonstrates how to generates placement scores for Spot VM skus. + * + * @summary generates placement scores for Spot VM skus. + * x-ms-original-file: 2025-06-05/GenerateSpotPlacementScores.json + */ +async function returnsSpotVMPlacementScoresForGivenConfigurations(): Promise { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-000000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const result = await client.spotPlacementScores.post("eastus", { + availabilityZones: true, + desiredCount: 1, + desiredLocations: ["eastus", "eastus2"], + desiredSizes: [{ sku: "Standard_D2_v2" }], + }); + console.log(result); +} + +async function main(): Promise { + await returnsSpotVMPlacementScoresForGivenConfigurations(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples/v1/javascript/README.md b/sdk/compute/arm-computerecommender/samples/v1/javascript/README.md new file mode 100644 index 000000000000..34ba362cdbbb --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +# @azure/arm-computerecommender client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for @azure/arm-computerecommender in some common scenarios. + +| **File Name** | **Description** | +| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| [operationsListSample.js][operationslistsample] | list the operations for the provider x-ms-original-file: 2025-06-05/Operations_List_MaximumSet_Gen.json | +| [spotPlacementScoresGetSample.js][spotplacementscoresgetsample] | gets Spot Placement Scores metadata. x-ms-original-file: 2025-06-05/GetSpotPlacementScores.json | +| [spotPlacementScoresPostSample.js][spotplacementscorespostsample] | generates placement scores for Spot VM skus. x-ms-original-file: 2025-06-05/GenerateSpotPlacementScores.json | + +## Prerequisites + +The sample programs are compatible with [LTS versions of Node.js](https://github.com/nodejs/release#release-schedule). + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node operationsListSample.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx dev-tool run vendored cross-env node operationsListSample.js +``` + +## Next Steps + +Take a look at our [API Documentation][apiref] for more information about the APIs that are available in the clients. + +[operationslistsample]: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/compute/arm-computerecommender/samples/v1/javascript/operationsListSample.js +[spotplacementscoresgetsample]: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/compute/arm-computerecommender/samples/v1/javascript/spotPlacementScoresGetSample.js +[spotplacementscorespostsample]: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/compute/arm-computerecommender/samples/v1/javascript/spotPlacementScoresPostSample.js +[apiref]: https://learn.microsoft.com/javascript/api/@azure/arm-computerecommender?view=azure-node-preview +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-computerecommender/README.md diff --git a/sdk/compute/arm-computerecommender/samples/v1/javascript/operationsListSample.js b/sdk/compute/arm-computerecommender/samples/v1/javascript/operationsListSample.js new file mode 100644 index 000000000000..5b3baf104a15 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/javascript/operationsListSample.js @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +const { ComputeRecommenderManagementClient } = require("@azure/arm-computerecommender"); +const { DefaultAzureCredential } = require("@azure/identity"); + +/** + * This sample demonstrates how to list the operations for the provider + * + * @summary list the operations for the provider + * x-ms-original-file: 2025-06-05/Operations_List_MaximumSet_Gen.json + */ +async function operationsListMaximumSetGen() { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-00000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const resArray = new Array(); + for await (const item of client.operations.list()) { + resArray.push(item); + } + + console.log(resArray); +} + +/** + * This sample demonstrates how to list the operations for the provider + * + * @summary list the operations for the provider + * x-ms-original-file: 2025-06-05/Operations_List_MinimumSet_Gen.json + */ +async function operationsListMinimumSetGen() { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-00000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const resArray = new Array(); + for await (const item of client.operations.list()) { + resArray.push(item); + } + + console.log(resArray); +} + +async function main() { + await operationsListMaximumSetGen(); + await operationsListMinimumSetGen(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples/v1/javascript/package.json b/sdk/compute/arm-computerecommender/samples/v1/javascript/package.json new file mode 100644 index 000000000000..47021c7ec24b --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/javascript/package.json @@ -0,0 +1,33 @@ +{ + "name": "@azure-samples/arm-computerecommender-js", + "private": true, + "version": "1.0.0", + "description": "@azure/arm-computerecommender client library samples for JavaScript", + "engines": { + "node": ">=20.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/compute/arm-computerecommender" + }, + "keywords": [ + "node", + "azure", + "cloud", + "typescript", + "browser", + "isomorphic" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-computerecommender", + "dependencies": { + "@azure/arm-computerecommender": "latest", + "dotenv": "latest", + "@azure/identity": "^4.9.0" + } +} diff --git a/sdk/compute/arm-computerecommender/samples/v1/javascript/sample.env b/sdk/compute/arm-computerecommender/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..508439fc7d62 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/javascript/sample.env @@ -0,0 +1 @@ +# Feel free to add your own environment variables. \ No newline at end of file diff --git a/sdk/compute/arm-computerecommender/samples/v1/javascript/spotPlacementScoresGetSample.js b/sdk/compute/arm-computerecommender/samples/v1/javascript/spotPlacementScoresGetSample.js new file mode 100644 index 000000000000..6e3eee6bd0db --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/javascript/spotPlacementScoresGetSample.js @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +const { ComputeRecommenderManagementClient } = require("@azure/arm-computerecommender"); +const { DefaultAzureCredential } = require("@azure/identity"); + +/** + * This sample demonstrates how to gets Spot Placement Scores metadata. + * + * @summary gets Spot Placement Scores metadata. + * x-ms-original-file: 2025-06-05/GetSpotPlacementScores.json + */ +async function getsTheMetadataOfSpotPlacementScores() { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-000000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const result = await client.spotPlacementScores.get("eastus"); + console.log(result); +} + +async function main() { + await getsTheMetadataOfSpotPlacementScores(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples/v1/javascript/spotPlacementScoresPostSample.js b/sdk/compute/arm-computerecommender/samples/v1/javascript/spotPlacementScoresPostSample.js new file mode 100644 index 000000000000..5e6c614ce6a2 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/javascript/spotPlacementScoresPostSample.js @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +const { ComputeRecommenderManagementClient } = require("@azure/arm-computerecommender"); +const { DefaultAzureCredential } = require("@azure/identity"); + +/** + * This sample demonstrates how to generates placement scores for Spot VM skus. + * + * @summary generates placement scores for Spot VM skus. + * x-ms-original-file: 2025-06-05/GenerateSpotPlacementScores.json + */ +async function returnsSpotVMPlacementScoresForGivenConfigurations() { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-000000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const result = await client.spotPlacementScores.post("eastus", { + availabilityZones: true, + desiredCount: 1, + desiredLocations: ["eastus", "eastus2"], + desiredSizes: [{ sku: "Standard_D2_v2" }], + }); + console.log(result); +} + +async function main() { + await returnsSpotVMPlacementScoresForGivenConfigurations(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples/v1/typescript/README.md b/sdk/compute/arm-computerecommender/samples/v1/typescript/README.md new file mode 100644 index 000000000000..f590a2ebf1c0 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +# @azure/arm-computerecommender client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for @azure/arm-computerecommender in some common scenarios. + +| **File Name** | **Description** | +| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| [operationsListSample.ts][operationslistsample] | list the operations for the provider x-ms-original-file: 2025-06-05/Operations_List_MaximumSet_Gen.json | +| [spotPlacementScoresGetSample.ts][spotplacementscoresgetsample] | gets Spot Placement Scores metadata. x-ms-original-file: 2025-06-05/GetSpotPlacementScores.json | +| [spotPlacementScoresPostSample.ts][spotplacementscorespostsample] | generates placement scores for Spot VM skus. x-ms-original-file: 2025-06-05/GenerateSpotPlacementScores.json | + +## Prerequisites + +The sample programs are compatible with [LTS versions of Node.js](https://github.com/nodejs/release#release-schedule). + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/operationsListSample.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx dev-tool run vendored cross-env node dist/operationsListSample.js +``` + +## Next Steps + +Take a look at our [API Documentation][apiref] for more information about the APIs that are available in the clients. + +[operationslistsample]: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/compute/arm-computerecommender/samples/v1/typescript/src/operationsListSample.ts +[spotplacementscoresgetsample]: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/compute/arm-computerecommender/samples/v1/typescript/src/spotPlacementScoresGetSample.ts +[spotplacementscorespostsample]: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/compute/arm-computerecommender/samples/v1/typescript/src/spotPlacementScoresPostSample.ts +[apiref]: https://learn.microsoft.com/javascript/api/@azure/arm-computerecommender?view=azure-node-preview +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-computerecommender/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/compute/arm-computerecommender/samples/v1/typescript/package.json b/sdk/compute/arm-computerecommender/samples/v1/typescript/package.json new file mode 100644 index 000000000000..e53b2058455b --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/typescript/package.json @@ -0,0 +1,42 @@ +{ + "name": "@azure-samples/arm-computerecommender-ts", + "private": true, + "version": "1.0.0", + "description": "@azure/arm-computerecommender client library samples for TypeScript", + "engines": { + "node": ">=20.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/compute/arm-computerecommender" + }, + "keywords": [ + "node", + "azure", + "cloud", + "typescript", + "browser", + "isomorphic" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-computerecommender", + "dependencies": { + "@azure/arm-computerecommender": "latest", + "dotenv": "latest", + "@azure/identity": "^4.9.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "typescript": "~5.8.2", + "rimraf": "latest" + } +} diff --git a/sdk/compute/arm-computerecommender/samples/v1/typescript/sample.env b/sdk/compute/arm-computerecommender/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..508439fc7d62 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/typescript/sample.env @@ -0,0 +1 @@ +# Feel free to add your own environment variables. \ No newline at end of file diff --git a/sdk/compute/arm-computerecommender/samples/v1/typescript/src/operationsListSample.ts b/sdk/compute/arm-computerecommender/samples/v1/typescript/src/operationsListSample.ts new file mode 100644 index 000000000000..54f7472027aa --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/typescript/src/operationsListSample.ts @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { ComputeRecommenderManagementClient } from "@azure/arm-computerecommender"; +import { DefaultAzureCredential } from "@azure/identity"; + +/** + * This sample demonstrates how to list the operations for the provider + * + * @summary list the operations for the provider + * x-ms-original-file: 2025-06-05/Operations_List_MaximumSet_Gen.json + */ +async function operationsListMaximumSetGen(): Promise { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-00000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const resArray = new Array(); + for await (const item of client.operations.list()) { + resArray.push(item); + } + + console.log(resArray); +} + +/** + * This sample demonstrates how to list the operations for the provider + * + * @summary list the operations for the provider + * x-ms-original-file: 2025-06-05/Operations_List_MinimumSet_Gen.json + */ +async function operationsListMinimumSetGen(): Promise { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-00000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const resArray = new Array(); + for await (const item of client.operations.list()) { + resArray.push(item); + } + + console.log(resArray); +} + +async function main(): Promise { + await operationsListMaximumSetGen(); + await operationsListMinimumSetGen(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples/v1/typescript/src/spotPlacementScoresGetSample.ts b/sdk/compute/arm-computerecommender/samples/v1/typescript/src/spotPlacementScoresGetSample.ts new file mode 100644 index 000000000000..06f5d0f77e59 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/typescript/src/spotPlacementScoresGetSample.ts @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { ComputeRecommenderManagementClient } from "@azure/arm-computerecommender"; +import { DefaultAzureCredential } from "@azure/identity"; + +/** + * This sample demonstrates how to gets Spot Placement Scores metadata. + * + * @summary gets Spot Placement Scores metadata. + * x-ms-original-file: 2025-06-05/GetSpotPlacementScores.json + */ +async function getsTheMetadataOfSpotPlacementScores(): Promise { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-000000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const result = await client.spotPlacementScores.get("eastus"); + console.log(result); +} + +async function main(): Promise { + await getsTheMetadataOfSpotPlacementScores(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples/v1/typescript/src/spotPlacementScoresPostSample.ts b/sdk/compute/arm-computerecommender/samples/v1/typescript/src/spotPlacementScoresPostSample.ts new file mode 100644 index 000000000000..76a8a534db81 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/typescript/src/spotPlacementScoresPostSample.ts @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { ComputeRecommenderManagementClient } from "@azure/arm-computerecommender"; +import { DefaultAzureCredential } from "@azure/identity"; + +/** + * This sample demonstrates how to generates placement scores for Spot VM skus. + * + * @summary generates placement scores for Spot VM skus. + * x-ms-original-file: 2025-06-05/GenerateSpotPlacementScores.json + */ +async function returnsSpotVMPlacementScoresForGivenConfigurations(): Promise { + const credential = new DefaultAzureCredential(); + const subscriptionId = "00000000-0000-0000-0000-000000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + const result = await client.spotPlacementScores.post("eastus", { + availabilityZones: true, + desiredCount: 1, + desiredLocations: ["eastus", "eastus2"], + desiredSizes: [{ sku: "Standard_D2_v2" }], + }); + console.log(result); +} + +async function main(): Promise { + await returnsSpotVMPlacementScoresForGivenConfigurations(); +} + +main().catch(console.error); diff --git a/sdk/compute/arm-computerecommender/samples/v1/typescript/tsconfig.json b/sdk/compute/arm-computerecommender/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..400db87cf648 --- /dev/null +++ b/sdk/compute/arm-computerecommender/samples/v1/typescript/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2023", + "module": "commonjs", + "lib": [], + "importHelpers": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node10", + "esModuleInterop": true, + "outDir": "./dist", + "resolveJsonModule": true + }, + "include": [ + "./src" + ] +} diff --git a/sdk/compute/arm-computerecommender/src/api/computeRecommenderManagementContext.ts b/sdk/compute/arm-computerecommender/src/api/computeRecommenderManagementContext.ts new file mode 100644 index 000000000000..39855e9192b7 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/api/computeRecommenderManagementContext.ts @@ -0,0 +1,74 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { logger } from "../logger.js"; +import { KnownVersions } from "../models/models.js"; +import type { AzureSupportedClouds } from "../static-helpers/cloudSettingHelpers.js"; +import { getArmEndpoint } from "../static-helpers/cloudSettingHelpers.js"; +import type { Client, ClientOptions } from "@azure-rest/core-client"; +import { getClient } from "@azure-rest/core-client"; +import type { TokenCredential } from "@azure/core-auth"; + +/** The Compute Recommender Resource Provider Client */ +export interface ComputeRecommenderManagementContext extends Client { + /** The API version to use for this operation. */ + /** Known values of {@link KnownVersions} that the service accepts. */ + apiVersion: string; + /** The ID of the target subscription. The value must be an UUID. */ + subscriptionId: string; +} + +/** Optional parameters for the client. */ +export interface ComputeRecommenderManagementClientOptionalParams extends ClientOptions { + /** The API version to use for this operation. */ + /** Known values of {@link KnownVersions} that the service accepts. */ + apiVersion?: string; + /** Specifies the Azure cloud environment for the client. */ + cloudSetting?: AzureSupportedClouds; +} + +/** The Compute Recommender Resource Provider Client */ +export function createComputeRecommenderManagement( + credential: TokenCredential, + subscriptionId: string, + options: ComputeRecommenderManagementClientOptionalParams = {}, +): ComputeRecommenderManagementContext { + const endpointUrl = + options.endpoint ?? getArmEndpoint(options.cloudSetting) ?? "https://management.azure.com"; + const prefixFromOptions = options?.userAgentOptions?.userAgentPrefix; + const userAgentInfo = `azsdk-js-arm-computerecommender/1.0.0-beta.1`; + const userAgentPrefix = prefixFromOptions + ? `${prefixFromOptions} azsdk-js-api ${userAgentInfo}` + : `azsdk-js-api ${userAgentInfo}`; + const { apiVersion: _, ...updatedOptions } = { + ...options, + userAgentOptions: { userAgentPrefix }, + loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + credentials: { + scopes: options.credentials?.scopes ?? [`${endpointUrl}/.default`], + }, + }; + const clientContext = getClient(endpointUrl, credential, updatedOptions); + clientContext.pipeline.removePolicy({ name: "ApiVersionPolicy" }); + const apiVersion = options.apiVersion ?? "2025-06-05"; + clientContext.pipeline.addPolicy({ + name: "ClientApiVersionPolicy", + sendRequest: (req, next) => { + // Use the apiVersion defined in request url directly + // Append one if there is no apiVersion and we have one at client options + const url = new URL(req.url); + if (!url.searchParams.get("api-version")) { + req.url = `${req.url}${ + Array.from(url.searchParams.keys()).length > 0 ? "&" : "?" + }api-version=${apiVersion}`; + } + + return next(req); + }, + }); + return { + ...clientContext, + apiVersion, + subscriptionId, + } as ComputeRecommenderManagementContext; +} diff --git a/sdk/compute/arm-computerecommender/src/api/index.ts b/sdk/compute/arm-computerecommender/src/api/index.ts new file mode 100644 index 000000000000..a1a1a859dcb9 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/api/index.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export { + createComputeRecommenderManagement, + ComputeRecommenderManagementContext, + ComputeRecommenderManagementClientOptionalParams, +} from "./computeRecommenderManagementContext.js"; diff --git a/sdk/compute/arm-computerecommender/src/api/operations/index.ts b/sdk/compute/arm-computerecommender/src/api/operations/index.ts new file mode 100644 index 000000000000..24a804d14fcf --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/api/operations/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export { list } from "./operations.js"; +export { OperationsListOptionalParams } from "./options.js"; diff --git a/sdk/compute/arm-computerecommender/src/api/operations/operations.ts b/sdk/compute/arm-computerecommender/src/api/operations/operations.ts new file mode 100644 index 000000000000..fe73f0b8c7a5 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/api/operations/operations.ts @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { ComputeRecommenderManagementContext as Client } from "../index.js"; +import type { _OperationListResult, Operation } from "../../models/models.js"; +import { + _operationListResultDeserializer, + errorResponseDeserializer, +} from "../../models/models.js"; +import type { PagedAsyncIterableIterator } from "../../static-helpers/pagingHelpers.js"; +import { buildPagedAsyncIterator } from "../../static-helpers/pagingHelpers.js"; +import { expandUrlTemplate } from "../../static-helpers/urlTemplate.js"; +import type { OperationsListOptionalParams } from "./options.js"; +import type { StreamableMethod, PathUncheckedResponse } from "@azure-rest/core-client"; +import { createRestError, operationOptionsToRequestParameters } from "@azure-rest/core-client"; + +export function _listSend( + context: Client, + options: OperationsListOptionalParams = { requestOptions: {} }, +): StreamableMethod { + const path = expandUrlTemplate( + "/providers/Microsoft.Compute/operations{?api%2Dversion}", + { + "api%2Dversion": context.apiVersion, + }, + { + allowReserved: options?.requestOptions?.skipUrlEncoding, + }, + ); + return context.path(path).get({ + ...operationOptionsToRequestParameters(options), + headers: { + accept: "application/json", + ...options.requestOptions?.headers, + }, + }); +} + +export async function _listDeserialize( + result: PathUncheckedResponse, +): Promise<_OperationListResult> { + const expectedStatuses = ["200"]; + if (!expectedStatuses.includes(result.status)) { + const error = createRestError(result); + error.details = errorResponseDeserializer(result.body); + throw error; + } + + return _operationListResultDeserializer(result.body); +} + +/** List the operations for the provider */ +export function list( + context: Client, + options: OperationsListOptionalParams = { requestOptions: {} }, +): PagedAsyncIterableIterator { + return buildPagedAsyncIterator( + context, + () => _listSend(context, options), + _listDeserialize, + ["200"], + { itemName: "value", nextLinkName: "nextLink" }, + ); +} diff --git a/sdk/compute/arm-computerecommender/src/api/operations/options.ts b/sdk/compute/arm-computerecommender/src/api/operations/options.ts new file mode 100644 index 000000000000..b9a3fd9758a3 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/api/operations/options.ts @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { OperationOptions } from "@azure-rest/core-client"; + +/** Optional parameters. */ +export interface OperationsListOptionalParams extends OperationOptions {} diff --git a/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/index.ts b/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/index.ts new file mode 100644 index 000000000000..3eb8525035a2 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/index.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export { post, get } from "./operations.js"; +export { + SpotPlacementScoresPostOptionalParams, + SpotPlacementScoresGetOptionalParams, +} from "./options.js"; diff --git a/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/operations.ts b/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/operations.ts new file mode 100644 index 000000000000..e6e508a392fc --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/operations.ts @@ -0,0 +1,122 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { ComputeRecommenderManagementContext as Client } from "../index.js"; +import type { + ComputeDiagnosticBase, + SpotPlacementScoresInput, + SpotPlacementScoresResponse, +} from "../../models/models.js"; +import { + errorResponseDeserializer, + computeDiagnosticBaseDeserializer, + spotPlacementScoresInputSerializer, + spotPlacementScoresResponseDeserializer, +} from "../../models/models.js"; +import { expandUrlTemplate } from "../../static-helpers/urlTemplate.js"; +import type { + SpotPlacementScoresPostOptionalParams, + SpotPlacementScoresGetOptionalParams, +} from "./options.js"; +import type { StreamableMethod, PathUncheckedResponse } from "@azure-rest/core-client"; +import { createRestError, operationOptionsToRequestParameters } from "@azure-rest/core-client"; + +export function _postSend( + context: Client, + location: string, + spotPlacementScoresInput: SpotPlacementScoresInput, + options: SpotPlacementScoresPostOptionalParams = { requestOptions: {} }, +): StreamableMethod { + const path = expandUrlTemplate( + "/subscriptions/{subscriptionId}/providers/Microsoft.Compute/locations/{location}/placementScores/spot/generate{?api%2Dversion}", + { + subscriptionId: context.subscriptionId, + location: location, + "api%2Dversion": context.apiVersion, + }, + { + allowReserved: options?.requestOptions?.skipUrlEncoding, + }, + ); + return context.path(path).post({ + ...operationOptionsToRequestParameters(options), + contentType: "application/json", + headers: { + accept: "application/json", + ...options.requestOptions?.headers, + }, + body: spotPlacementScoresInputSerializer(spotPlacementScoresInput), + }); +} + +export async function _postDeserialize( + result: PathUncheckedResponse, +): Promise { + const expectedStatuses = ["200"]; + if (!expectedStatuses.includes(result.status)) { + const error = createRestError(result); + error.details = errorResponseDeserializer(result.body); + throw error; + } + + return spotPlacementScoresResponseDeserializer(result.body); +} + +/** Generates placement scores for Spot VM skus. */ +export async function post( + context: Client, + location: string, + spotPlacementScoresInput: SpotPlacementScoresInput, + options: SpotPlacementScoresPostOptionalParams = { requestOptions: {} }, +): Promise { + const result = await _postSend(context, location, spotPlacementScoresInput, options); + return _postDeserialize(result); +} + +export function _getSend( + context: Client, + location: string, + options: SpotPlacementScoresGetOptionalParams = { requestOptions: {} }, +): StreamableMethod { + const path = expandUrlTemplate( + "/subscriptions/{subscriptionId}/providers/Microsoft.Compute/locations/{location}/placementScores/spot{?api%2Dversion}", + { + subscriptionId: context.subscriptionId, + location: location, + "api%2Dversion": context.apiVersion, + }, + { + allowReserved: options?.requestOptions?.skipUrlEncoding, + }, + ); + return context.path(path).get({ + ...operationOptionsToRequestParameters(options), + headers: { + accept: "application/json", + ...options.requestOptions?.headers, + }, + }); +} + +export async function _getDeserialize( + result: PathUncheckedResponse, +): Promise { + const expectedStatuses = ["200"]; + if (!expectedStatuses.includes(result.status)) { + const error = createRestError(result); + error.details = errorResponseDeserializer(result.body); + throw error; + } + + return computeDiagnosticBaseDeserializer(result.body); +} + +/** Gets Spot Placement Scores metadata. */ +export async function get( + context: Client, + location: string, + options: SpotPlacementScoresGetOptionalParams = { requestOptions: {} }, +): Promise { + const result = await _getSend(context, location, options); + return _getDeserialize(result); +} diff --git a/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/options.ts b/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/options.ts new file mode 100644 index 000000000000..55cb8a908488 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/api/spotPlacementScores/options.ts @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { OperationOptions } from "@azure-rest/core-client"; + +/** Optional parameters. */ +export interface SpotPlacementScoresPostOptionalParams extends OperationOptions {} + +/** Optional parameters. */ +export interface SpotPlacementScoresGetOptionalParams extends OperationOptions {} diff --git a/sdk/compute/arm-computerecommender/src/classic/index.ts b/sdk/compute/arm-computerecommender/src/classic/index.ts new file mode 100644 index 000000000000..a2747914bc7b --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/classic/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export { OperationsOperations } from "./operations/index.js"; +export { SpotPlacementScoresOperations } from "./spotPlacementScores/index.js"; diff --git a/sdk/compute/arm-computerecommender/src/classic/operations/index.ts b/sdk/compute/arm-computerecommender/src/classic/operations/index.ts new file mode 100644 index 000000000000..007733b2179d --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/classic/operations/index.ts @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { ComputeRecommenderManagementContext } from "../../api/computeRecommenderManagementContext.js"; +import { list } from "../../api/operations/operations.js"; +import type { OperationsListOptionalParams } from "../../api/operations/options.js"; +import type { Operation } from "../../models/models.js"; +import type { PagedAsyncIterableIterator } from "../../static-helpers/pagingHelpers.js"; + +/** Interface representing a Operations operations. */ +export interface OperationsOperations { + /** List the operations for the provider */ + list: (options?: OperationsListOptionalParams) => PagedAsyncIterableIterator; +} + +function _getOperations(context: ComputeRecommenderManagementContext) { + return { + list: (options?: OperationsListOptionalParams) => list(context, options), + }; +} + +export function _getOperationsOperations( + context: ComputeRecommenderManagementContext, +): OperationsOperations { + return { + ..._getOperations(context), + }; +} diff --git a/sdk/compute/arm-computerecommender/src/classic/spotPlacementScores/index.ts b/sdk/compute/arm-computerecommender/src/classic/spotPlacementScores/index.ts new file mode 100644 index 000000000000..2a50a59efa96 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/classic/spotPlacementScores/index.ts @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { ComputeRecommenderManagementContext } from "../../api/computeRecommenderManagementContext.js"; +import { post, get } from "../../api/spotPlacementScores/operations.js"; +import type { + SpotPlacementScoresPostOptionalParams, + SpotPlacementScoresGetOptionalParams, +} from "../../api/spotPlacementScores/options.js"; +import type { + ComputeDiagnosticBase, + SpotPlacementScoresInput, + SpotPlacementScoresResponse, +} from "../../models/models.js"; + +/** Interface representing a SpotPlacementScores operations. */ +export interface SpotPlacementScoresOperations { + /** Generates placement scores for Spot VM skus. */ + post: ( + location: string, + spotPlacementScoresInput: SpotPlacementScoresInput, + options?: SpotPlacementScoresPostOptionalParams, + ) => Promise; + /** Gets Spot Placement Scores metadata. */ + get: ( + location: string, + options?: SpotPlacementScoresGetOptionalParams, + ) => Promise; +} + +function _getSpotPlacementScores(context: ComputeRecommenderManagementContext) { + return { + post: ( + location: string, + spotPlacementScoresInput: SpotPlacementScoresInput, + options?: SpotPlacementScoresPostOptionalParams, + ) => post(context, location, spotPlacementScoresInput, options), + get: (location: string, options?: SpotPlacementScoresGetOptionalParams) => + get(context, location, options), + }; +} + +export function _getSpotPlacementScoresOperations( + context: ComputeRecommenderManagementContext, +): SpotPlacementScoresOperations { + return { + ..._getSpotPlacementScores(context), + }; +} diff --git a/sdk/compute/arm-computerecommender/src/computeRecommenderManagementClient.ts b/sdk/compute/arm-computerecommender/src/computeRecommenderManagementClient.ts new file mode 100644 index 000000000000..27a2e950be7c --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/computeRecommenderManagementClient.ts @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { + ComputeRecommenderManagementContext, + ComputeRecommenderManagementClientOptionalParams, +} from "./api/index.js"; +import { createComputeRecommenderManagement } from "./api/index.js"; +import type { OperationsOperations } from "./classic/operations/index.js"; +import { _getOperationsOperations } from "./classic/operations/index.js"; +import type { SpotPlacementScoresOperations } from "./classic/spotPlacementScores/index.js"; +import { _getSpotPlacementScoresOperations } from "./classic/spotPlacementScores/index.js"; +import type { TokenCredential } from "@azure/core-auth"; +import type { Pipeline } from "@azure/core-rest-pipeline"; + +export { ComputeRecommenderManagementClientOptionalParams } from "./api/computeRecommenderManagementContext.js"; + +export class ComputeRecommenderManagementClient { + private _client: ComputeRecommenderManagementContext; + /** The pipeline used by this client to make requests */ + public readonly pipeline: Pipeline; + + /** The Compute Recommender Resource Provider Client */ + constructor( + credential: TokenCredential, + subscriptionId: string, + options: ComputeRecommenderManagementClientOptionalParams = {}, + ) { + const prefixFromOptions = options?.userAgentOptions?.userAgentPrefix; + const userAgentPrefix = prefixFromOptions + ? `${prefixFromOptions} azsdk-js-client` + : `azsdk-js-client`; + this._client = createComputeRecommenderManagement(credential, subscriptionId, { + ...options, + userAgentOptions: { userAgentPrefix }, + }); + this.pipeline = this._client.pipeline; + this.spotPlacementScores = _getSpotPlacementScoresOperations(this._client); + this.operations = _getOperationsOperations(this._client); + } + + /** The operation groups for spotPlacementScores */ + public readonly spotPlacementScores: SpotPlacementScoresOperations; + /** The operation groups for operations */ + public readonly operations: OperationsOperations; +} diff --git a/sdk/compute/arm-computerecommender/src/index.ts b/sdk/compute/arm-computerecommender/src/index.ts new file mode 100644 index 000000000000..0e31b2b5f747 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/index.ts @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { AzureClouds, AzureSupportedClouds } from "./static-helpers/cloudSettingHelpers.js"; +import { + PageSettings, + ContinuablePage, + PagedAsyncIterableIterator, +} from "./static-helpers/pagingHelpers.js"; + +export { ComputeRecommenderManagementClient } from "./computeRecommenderManagementClient.js"; +export { + Operation, + OperationDisplay, + KnownOrigin, + Origin, + KnownActionType, + ActionType, + ErrorResponse, + ErrorDetail, + ErrorAdditionalInfo, + ComputeDiagnosticBase, + DiagnosticProperties, + ProxyResource, + Resource, + SystemData, + KnownCreatedByType, + CreatedByType, + SpotPlacementScoresInput, + ResourceSize, + SpotPlacementScoresResponse, + PlacementScore, + KnownVersions, +} from "./models/index.js"; +export { ComputeRecommenderManagementClientOptionalParams } from "./api/index.js"; +export { OperationsListOptionalParams } from "./api/operations/index.js"; +export { + SpotPlacementScoresPostOptionalParams, + SpotPlacementScoresGetOptionalParams, +} from "./api/spotPlacementScores/index.js"; +export { OperationsOperations, SpotPlacementScoresOperations } from "./classic/index.js"; +export { PageSettings, ContinuablePage, PagedAsyncIterableIterator }; +export { AzureClouds, AzureSupportedClouds }; diff --git a/sdk/compute/arm-computerecommender/src/logger.ts b/sdk/compute/arm-computerecommender/src/logger.ts new file mode 100644 index 000000000000..250d4cb6e1b6 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/logger.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { createClientLogger } from "@azure/logger"; +export const logger = createClientLogger("arm-computerecommender"); diff --git a/sdk/compute/arm-computerecommender/src/models/index.ts b/sdk/compute/arm-computerecommender/src/models/index.ts new file mode 100644 index 000000000000..9115501acb99 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/models/index.ts @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export { + Operation, + OperationDisplay, + KnownOrigin, + Origin, + KnownActionType, + ActionType, + ErrorResponse, + ErrorDetail, + ErrorAdditionalInfo, + ComputeDiagnosticBase, + DiagnosticProperties, + ProxyResource, + Resource, + SystemData, + KnownCreatedByType, + CreatedByType, + SpotPlacementScoresInput, + ResourceSize, + SpotPlacementScoresResponse, + PlacementScore, + KnownVersions, +} from "./models.js"; diff --git a/sdk/compute/arm-computerecommender/src/models/models.ts b/sdk/compute/arm-computerecommender/src/models/models.ts new file mode 100644 index 000000000000..96e4538826d6 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/models/models.ts @@ -0,0 +1,418 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** A list of REST API operations supported by an Azure Resource Provider. It contains an URL link to get the next set of results. */ +export interface _OperationListResult { + /** The Operation items on this page */ + value: Operation[]; + /** The link to the next page of items */ + nextLink?: string; +} + +export function _operationListResultDeserializer(item: any): _OperationListResult { + return { + value: operationArrayDeserializer(item["value"]), + nextLink: item["nextLink"], + }; +} + +export function operationArrayDeserializer(result: Array): any[] { + return result.map((item) => { + return operationDeserializer(item); + }); +} + +/** Details of a REST API operation, returned from the Resource Provider Operations API */ +export interface Operation { + /** The name of the operation, as per Resource-Based Access Control (RBAC). Examples: "Microsoft.Compute/virtualMachines/write", "Microsoft.Compute/virtualMachines/capture/action" */ + readonly name?: string; + /** Whether the operation applies to data-plane. This is "true" for data-plane operations and "false" for Azure Resource Manager/control-plane operations. */ + readonly isDataAction?: boolean; + /** Localized display information for this particular operation. */ + display?: OperationDisplay; + /** The intended executor of the operation; as in Resource Based Access Control (RBAC) and audit logs UX. Default value is "user,system" */ + readonly origin?: Origin; + /** Extensible enum. Indicates the action type. "Internal" refers to actions that are for internal only APIs. */ + readonly actionType?: ActionType; +} + +export function operationDeserializer(item: any): Operation { + return { + name: item["name"], + isDataAction: item["isDataAction"], + display: !item["display"] ? item["display"] : operationDisplayDeserializer(item["display"]), + origin: item["origin"], + actionType: item["actionType"], + }; +} + +/** Localized display information for and operation. */ +export interface OperationDisplay { + /** The localized friendly form of the resource provider name, e.g. "Microsoft Monitoring Insights" or "Microsoft Compute". */ + readonly provider?: string; + /** The localized friendly name of the resource type related to this operation. E.g. "Virtual Machines" or "Job Schedule Collections". */ + readonly resource?: string; + /** The concise, localized friendly name for the operation; suitable for dropdowns. E.g. "Create or Update Virtual Machine", "Restart Virtual Machine". */ + readonly operation?: string; + /** The short, localized friendly description of the operation; suitable for tool tips and detailed views. */ + readonly description?: string; +} + +export function operationDisplayDeserializer(item: any): OperationDisplay { + return { + provider: item["provider"], + resource: item["resource"], + operation: item["operation"], + description: item["description"], + }; +} + +/** The intended executor of the operation; as in Resource Based Access Control (RBAC) and audit logs UX. Default value is "user,system" */ +export enum KnownOrigin { + /** Indicates the operation is initiated by a user. */ + User = "user", + /** Indicates the operation is initiated by a system. */ + System = "system", + /** Indicates the operation is initiated by a user or system. */ + UserSystem = "user,system", +} + +/** + * The intended executor of the operation; as in Resource Based Access Control (RBAC) and audit logs UX. Default value is "user,system" \ + * {@link KnownOrigin} can be used interchangeably with Origin, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **user**: Indicates the operation is initiated by a user. \ + * **system**: Indicates the operation is initiated by a system. \ + * **user,system**: Indicates the operation is initiated by a user or system. + */ +export type Origin = string; + +/** Extensible enum. Indicates the action type. "Internal" refers to actions that are for internal only APIs. */ +export enum KnownActionType { + /** Actions are for internal-only APIs. */ + Internal = "Internal", +} + +/** + * Extensible enum. Indicates the action type. "Internal" refers to actions that are for internal only APIs. \ + * {@link KnownActionType} can be used interchangeably with ActionType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **Internal**: Actions are for internal-only APIs. + */ +export type ActionType = string; + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +export function errorResponseDeserializer(item: any): ErrorResponse { + return { + error: !item["error"] ? item["error"] : errorDetailDeserializer(item["error"]), + }; +} + +/** The error detail. */ +export interface ErrorDetail { + /** The error code. */ + readonly code?: string; + /** The error message. */ + readonly message?: string; + /** The error target. */ + readonly target?: string; + /** The error details. */ + readonly details?: ErrorDetail[]; + /** The error additional info. */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +export function errorDetailDeserializer(item: any): ErrorDetail { + return { + code: item["code"], + message: item["message"], + target: item["target"], + details: !item["details"] ? item["details"] : errorDetailArrayDeserializer(item["details"]), + additionalInfo: !item["additionalInfo"] + ? item["additionalInfo"] + : errorAdditionalInfoArrayDeserializer(item["additionalInfo"]), + }; +} + +export function errorDetailArrayDeserializer(result: Array): any[] { + return result.map((item) => { + return errorDetailDeserializer(item); + }); +} + +export function errorAdditionalInfoArrayDeserializer(result: Array): any[] { + return result.map((item) => { + return errorAdditionalInfoDeserializer(item); + }); +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** The additional info type. */ + readonly type?: string; + /** The additional info. */ + readonly info?: any; +} + +export function errorAdditionalInfoDeserializer(item: any): ErrorAdditionalInfo { + return { + type: item["type"], + info: item["info"], + }; +} + +/** Contains metadata of a diagnostic type */ +export interface ComputeDiagnosticBase extends ProxyResource { + /** Contains additional properties of a diagnostic */ + properties?: DiagnosticProperties; +} + +export function computeDiagnosticBaseDeserializer(item: any): ComputeDiagnosticBase { + return { + id: item["id"], + name: item["name"], + type: item["type"], + systemData: !item["systemData"] + ? item["systemData"] + : systemDataDeserializer(item["systemData"]), + properties: !item["properties"] + ? item["properties"] + : diagnosticPropertiesDeserializer(item["properties"]), + }; +} + +/** Contains additional properties of a diagnostic */ +export interface DiagnosticProperties { + /** Describes what are the supported resource types for a diagnostic. */ + supportedResourceTypes?: string[]; +} + +export function diagnosticPropertiesDeserializer(item: any): DiagnosticProperties { + return { + supportedResourceTypes: !item["supportedResourceTypes"] + ? item["supportedResourceTypes"] + : item["supportedResourceTypes"].map((p: any) => { + return p; + }), + }; +} + +/** The resource model definition for a Azure Resource Manager proxy resource. It will not have tags and a location */ +export interface ProxyResource extends Resource {} + +export function proxyResourceDeserializer(item: any): ProxyResource { + return { + id: item["id"], + name: item["name"], + type: item["type"], + systemData: !item["systemData"] + ? item["systemData"] + : systemDataDeserializer(item["systemData"]), + }; +} + +/** Common fields that are returned in the response for all Azure Resource Manager resources */ +export interface Resource { + /** Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName} */ + readonly id?: string; + /** The name of the resource */ + readonly name?: string; + /** The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts" */ + readonly type?: string; + /** Azure Resource Manager metadata containing createdBy and modifiedBy information. */ + readonly systemData?: SystemData; +} + +export function resourceDeserializer(item: any): Resource { + return { + id: item["id"], + name: item["name"], + type: item["type"], + systemData: !item["systemData"] + ? item["systemData"] + : systemDataDeserializer(item["systemData"]), + }; +} + +/** Metadata pertaining to creation and last modification of the resource. */ +export interface SystemData { + /** The identity that created the resource. */ + createdBy?: string; + /** The type of identity that created the resource. */ + createdByType?: CreatedByType; + /** The timestamp of resource creation (UTC). */ + createdAt?: Date; + /** The identity that last modified the resource. */ + lastModifiedBy?: string; + /** The type of identity that last modified the resource. */ + lastModifiedByType?: CreatedByType; + /** The timestamp of resource last modification (UTC) */ + lastModifiedAt?: Date; +} + +export function systemDataDeserializer(item: any): SystemData { + return { + createdBy: item["createdBy"], + createdByType: item["createdByType"], + createdAt: !item["createdAt"] ? item["createdAt"] : new Date(item["createdAt"]), + lastModifiedBy: item["lastModifiedBy"], + lastModifiedByType: item["lastModifiedByType"], + lastModifiedAt: !item["lastModifiedAt"] + ? item["lastModifiedAt"] + : new Date(item["lastModifiedAt"]), + }; +} + +/** The kind of entity that created the resource. */ +export enum KnownCreatedByType { + /** The entity was created by a user. */ + User = "User", + /** The entity was created by an application. */ + Application = "Application", + /** The entity was created by a managed identity. */ + ManagedIdentity = "ManagedIdentity", + /** The entity was created by a key. */ + Key = "Key", +} + +/** + * The kind of entity that created the resource. \ + * {@link KnownCreatedByType} can be used interchangeably with CreatedByType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **User**: The entity was created by a user. \ + * **Application**: The entity was created by an application. \ + * **ManagedIdentity**: The entity was created by a managed identity. \ + * **Key**: The entity was created by a key. + */ +export type CreatedByType = string; + +/** SpotPlacementScores API Input. */ +export interface SpotPlacementScoresInput { + /** The desired regions */ + desiredLocations?: string[]; + /** The desired virtual machine SKU sizes. */ + desiredSizes?: ResourceSize[]; + /** Desired instance count per region/zone based on the scope. */ + desiredCount?: number; + /** Defines if the scope is zonal or regional. */ + availabilityZones?: boolean; +} + +export function spotPlacementScoresInputSerializer(item: SpotPlacementScoresInput): any { + return { + desiredLocations: !item["desiredLocations"] + ? item["desiredLocations"] + : item["desiredLocations"].map((p: any) => { + return p; + }), + desiredSizes: !item["desiredSizes"] + ? item["desiredSizes"] + : resourceSizeArraySerializer(item["desiredSizes"]), + desiredCount: item["desiredCount"], + availabilityZones: item["availabilityZones"], + }; +} + +export function resourceSizeArraySerializer(result: Array): any[] { + return result.map((item) => { + return resourceSizeSerializer(item); + }); +} + +export function resourceSizeArrayDeserializer(result: Array): any[] { + return result.map((item) => { + return resourceSizeDeserializer(item); + }); +} + +/** SpotPlacementRecommender API response. */ +export interface ResourceSize { + /** The resource's CRP virtual machine SKU size. */ + sku?: string; +} + +export function resourceSizeSerializer(item: ResourceSize): any { + return { sku: item["sku"] }; +} + +export function resourceSizeDeserializer(item: any): ResourceSize { + return { + sku: item["sku"], + }; +} + +/** SpotPlacementScores API response. */ +export interface SpotPlacementScoresResponse { + /** The desired regions */ + desiredLocations?: string[]; + /** The desired virtual machine SKU sizes. */ + desiredSizes?: ResourceSize[]; + /** Desired instance count per region/zone based on the scope. */ + desiredCount?: number; + /** Defines if the scope is zonal or regional. */ + availabilityZones?: boolean; + /** A placement score indicating the likelihood of successfully allocating the specified Spot VM(s), as well as the expected lifetimes of the Spot VM(s) after allocation. */ + placementScores?: PlacementScore[]; +} + +export function spotPlacementScoresResponseDeserializer(item: any): SpotPlacementScoresResponse { + return { + desiredLocations: !item["desiredLocations"] + ? item["desiredLocations"] + : item["desiredLocations"].map((p: any) => { + return p; + }), + desiredSizes: !item["desiredSizes"] + ? item["desiredSizes"] + : resourceSizeArrayDeserializer(item["desiredSizes"]), + desiredCount: item["desiredCount"], + availabilityZones: item["availabilityZones"], + placementScores: !item["placementScores"] + ? item["placementScores"] + : placementScoreArrayDeserializer(item["placementScores"]), + }; +} + +export function placementScoreArrayDeserializer(result: Array): any[] { + return result.map((item) => { + return placementScoreDeserializer(item); + }); +} + +/** The spot placement score for sku/region/zone combination. */ +export interface PlacementScore { + /** The resource's CRP virtual machine SKU size. */ + sku?: string; + /** The region. */ + region?: string; + /** The availability zone. */ + availabilityZone?: string; + /** A placement score indicating the likelihood of successfully allocating the specified Spot VM(s), as well as the expected lifetimes of the Spot VM(s) after allocation. */ + score?: string; + /** Whether the desired quota is available. */ + isQuotaAvailable?: boolean; +} + +export function placementScoreDeserializer(item: any): PlacementScore { + return { + sku: item["sku"], + region: item["region"], + availabilityZone: item["availabilityZone"], + score: item["score"], + isQuotaAvailable: item["isQuotaAvailable"], + }; +} + +/** The available API versions. */ +export enum KnownVersions { + /** The 2025-06-05 API version. */ + V20250605 = "2025-06-05", +} diff --git a/sdk/compute/arm-computerecommender/src/static-helpers/cloudSettingHelpers.ts b/sdk/compute/arm-computerecommender/src/static-helpers/cloudSettingHelpers.ts new file mode 100644 index 000000000000..613112c6e397 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/static-helpers/cloudSettingHelpers.ts @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * An enum to describe Azure Cloud environments. + * @enum {string} + */ +export enum AzureClouds { + /** Azure public cloud, which is the default cloud for Azure SDKs. */ + AZURE_PUBLIC_CLOUD = "AZURE_PUBLIC_CLOUD", + /** Azure China cloud */ + AZURE_CHINA_CLOUD = "AZURE_CHINA_CLOUD", + /** Azure US government cloud */ + AZURE_US_GOVERNMENT = "AZURE_US_GOVERNMENT", +} + +/** The supported values for cloud setting as a string literal type */ +export type AzureSupportedClouds = `${AzureClouds}`; + +/** + * Gets the Azure Resource Manager endpoint URL for the specified cloud setting. + * @param cloudSetting - The Azure cloud environment setting. Use one of the AzureClouds enum values. + * @returns The ARM endpoint URL for the specified cloud, or undefined if cloudSetting is undefined. + * @throws {Error} Throws an error if an unknown cloud setting is provided. + */ +export function getArmEndpoint(cloudSetting?: AzureSupportedClouds): string | undefined { + if (cloudSetting === undefined) { + return undefined; + } + const cloudEndpoints: Record = { + AZURE_CHINA_CLOUD: "https://management.chinacloudapi.cn/", + AZURE_US_GOVERNMENT: "https://management.usgovcloudapi.net/", + AZURE_PUBLIC_CLOUD: "https://management.azure.com/", + }; + if (cloudSetting in cloudEndpoints) { + return cloudEndpoints[cloudSetting]; + } else { + throw new Error( + `Unknown cloud setting: ${cloudSetting}. Please refer to the enum AzureClouds for possible values.`, + ); + } +} diff --git a/sdk/compute/arm-computerecommender/src/static-helpers/pagingHelpers.ts b/sdk/compute/arm-computerecommender/src/static-helpers/pagingHelpers.ts new file mode 100644 index 000000000000..11248b3804e4 --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/static-helpers/pagingHelpers.ts @@ -0,0 +1,242 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { Client, PathUncheckedResponse } from "@azure-rest/core-client"; +import { createRestError } from "@azure-rest/core-client"; +import { RestError } from "@azure/core-rest-pipeline"; + +/** + * Options for the byPage method + */ +export interface PageSettings { + /** + * A reference to a specific page to start iterating from. + */ + continuationToken?: string; +} + +/** + * An interface that describes a page of results. + */ +export type ContinuablePage = TPage & { + /** + * The token that keeps track of where to continue the iterator + */ + continuationToken?: string; +}; + +/** + * An interface that allows async iterable iteration both to completion and by page. + */ +export interface PagedAsyncIterableIterator< + TElement, + TPage = TElement[], + TPageSettings extends PageSettings = PageSettings, +> { + /** + * The next method, part of the iteration protocol + */ + next(): Promise>; + /** + * The connection to the async iterator, part of the iteration protocol + */ + [Symbol.asyncIterator](): PagedAsyncIterableIterator; + /** + * Return an AsyncIterableIterator that works a page at a time + */ + byPage: (settings?: TPageSettings) => AsyncIterableIterator>; +} + +/** + * An interface that describes how to communicate with the service. + */ +export interface PagedResult< + TElement, + TPage = TElement[], + TPageSettings extends PageSettings = PageSettings, +> { + /** + * Link to the first page of results. + */ + firstPageLink?: string; + /** + * A method that returns a page of results. + */ + getPage: (pageLink?: string) => Promise<{ page: TPage; nextPageLink?: string } | undefined>; + /** + * a function to implement the `byPage` method on the paged async iterator. + */ + byPage?: (settings?: TPageSettings) => AsyncIterableIterator>; + + /** + * A function to extract elements from a page. + */ + toElements?: (page: TPage) => TElement[]; +} + +/** + * Options for the paging helper + */ +export interface BuildPagedAsyncIteratorOptions { + itemName?: string; + nextLinkName?: string; +} + +/** + * Helper to paginate results in a generic way and return a PagedAsyncIterableIterator + */ +export function buildPagedAsyncIterator< + TElement, + TPage = TElement[], + TPageSettings extends PageSettings = PageSettings, + TResponse extends PathUncheckedResponse = PathUncheckedResponse, +>( + client: Client, + getInitialResponse: () => PromiseLike, + processResponseBody: (result: TResponse) => PromiseLike, + expectedStatuses: string[], + options: BuildPagedAsyncIteratorOptions = {}, +): PagedAsyncIterableIterator { + const itemName = options.itemName ?? "value"; + const nextLinkName = options.nextLinkName ?? "nextLink"; + const pagedResult: PagedResult = { + getPage: async (pageLink?: string) => { + const result = + pageLink === undefined + ? await getInitialResponse() + : await client.pathUnchecked(pageLink).get(); + checkPagingRequest(result, expectedStatuses); + const results = await processResponseBody(result as TResponse); + const nextLink = getNextLink(results, nextLinkName); + const values = getElements(results, itemName) as TPage; + return { + page: values, + nextPageLink: nextLink, + }; + }, + byPage: (settings?: TPageSettings) => { + const { continuationToken } = settings ?? {}; + return getPageAsyncIterator(pagedResult, { + pageLink: continuationToken, + }); + }, + }; + return getPagedAsyncIterator(pagedResult); +} + +/** + * returns an async iterator that iterates over results. It also has a `byPage` + * method that returns pages of items at once. + * + * @param pagedResult - an object that specifies how to get pages. + * @returns a paged async iterator that iterates over results. + */ + +function getPagedAsyncIterator< + TElement, + TPage = TElement[], + TPageSettings extends PageSettings = PageSettings, +>( + pagedResult: PagedResult, +): PagedAsyncIterableIterator { + const iter = getItemAsyncIterator(pagedResult); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: + pagedResult?.byPage ?? + ((settings?: TPageSettings) => { + const { continuationToken } = settings ?? {}; + return getPageAsyncIterator(pagedResult, { + pageLink: continuationToken, + }); + }), + }; +} + +async function* getItemAsyncIterator( + pagedResult: PagedResult, +): AsyncIterableIterator { + const pages = getPageAsyncIterator(pagedResult); + for await (const page of pages) { + yield* page as unknown as TElement[]; + } +} + +async function* getPageAsyncIterator( + pagedResult: PagedResult, + options: { + pageLink?: string; + } = {}, +): AsyncIterableIterator> { + const { pageLink } = options; + let response = await pagedResult.getPage(pageLink ?? pagedResult.firstPageLink); + if (!response) { + return; + } + let result = response.page as ContinuablePage; + result.continuationToken = response.nextPageLink; + yield result; + while (response.nextPageLink) { + response = await pagedResult.getPage(response.nextPageLink); + if (!response) { + return; + } + result = response.page as ContinuablePage; + result.continuationToken = response.nextPageLink; + yield result; + } +} + +/** + * Gets for the value of nextLink in the body + */ +function getNextLink(body: unknown, nextLinkName?: string): string | undefined { + if (!nextLinkName) { + return undefined; + } + + const nextLink = (body as Record)[nextLinkName]; + + if (typeof nextLink !== "string" && typeof nextLink !== "undefined" && nextLink !== null) { + throw new RestError( + `Body Property ${nextLinkName} should be a string or undefined or null but got ${typeof nextLink}`, + ); + } + + if (nextLink === null) { + return undefined; + } + + return nextLink; +} + +/** + * Gets the elements of the current request in the body. + */ +function getElements(body: unknown, itemName: string): T[] { + const value = (body as Record)[itemName] as T[]; + if (!Array.isArray(value)) { + throw new RestError( + `Couldn't paginate response\n Body doesn't contain an array property with name: ${itemName}`, + ); + } + + return value ?? []; +} + +/** + * Checks if a request failed + */ +function checkPagingRequest(response: PathUncheckedResponse, expectedStatuses: string[]): void { + if (!expectedStatuses.includes(response.status)) { + throw createRestError( + `Pagination failed with unexpected statusCode ${response.status}`, + response, + ); + } +} diff --git a/sdk/compute/arm-computerecommender/src/static-helpers/urlTemplate.ts b/sdk/compute/arm-computerecommender/src/static-helpers/urlTemplate.ts new file mode 100644 index 000000000000..657898dd38ff --- /dev/null +++ b/sdk/compute/arm-computerecommender/src/static-helpers/urlTemplate.ts @@ -0,0 +1,210 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// --------------------- +// interfaces +// --------------------- +interface ValueOptions { + isFirst: boolean; // is first value in the expression + op?: string; // operator + varValue?: any; // variable value + varName?: string; // variable name + modifier?: string; // modifier e.g * + reserved?: boolean; // if true we'll keep reserved words with not encoding +} + +export interface UrlTemplateOptions { + // if set to true, reserved characters will not be encoded + allowReserved?: boolean; +} + +// --------------------- +// helpers +// --------------------- +function encodeComponent(val: string, reserved?: boolean, op?: string): string { + return (reserved ?? op === "+") || op === "#" + ? encodeReservedComponent(val) + : encodeRFC3986URIComponent(val); +} + +function encodeReservedComponent(str: string): string { + return str + .split(/(%[0-9A-Fa-f]{2})/g) + .map((part) => (!/%[0-9A-Fa-f]/.test(part) ? encodeURI(part) : part)) + .join(""); +} + +function encodeRFC3986URIComponent(str: string): string { + return encodeURIComponent(str).replace( + /[!'()*]/g, + (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`, + ); +} + +function isDefined(val: any): boolean { + return val !== undefined && val !== null; +} + +function getNamedAndIfEmpty(op?: string): [boolean, string] { + return [!!op && [";", "?", "&"].includes(op), !!op && ["?", "&"].includes(op) ? "=" : ""]; +} + +function getFirstOrSep(op?: string, isFirst = false): string { + if (isFirst) { + return !op || op === "+" ? "" : op; + } else if (!op || op === "+" || op === "#") { + return ","; + } else if (op === "?") { + return "&"; + } else { + return op; + } +} + +function getExpandedValue(option: ValueOptions): string { + let isFirst = option.isFirst; + const { op, varName, varValue: value, reserved } = option; + const vals: string[] = []; + const [named, ifEmpty] = getNamedAndIfEmpty(op); + + if (Array.isArray(value)) { + for (const val of value.filter(isDefined)) { + // prepare the following parts: separator, varName, value + vals.push(`${getFirstOrSep(op, isFirst)}`); + if (named && varName) { + vals.push(`${encodeURIComponent(varName)}`); + if (val === "") { + vals.push(ifEmpty); + } else { + vals.push("="); + } + } + vals.push(encodeComponent(val, reserved, op)); + isFirst = false; + } + } else if (typeof value === "object") { + for (const key of Object.keys(value)) { + const val = value[key]; + if (!isDefined(val)) { + continue; + } + // prepare the following parts: separator, key, value + vals.push(`${getFirstOrSep(op, isFirst)}`); + if (key) { + vals.push(`${encodeURIComponent(key)}`); + if (named && val === "") { + vals.push(ifEmpty); + } else { + vals.push("="); + } + } + vals.push(encodeComponent(val, reserved, op)); + isFirst = false; + } + } + return vals.join(""); +} + +function getNonExpandedValue(option: ValueOptions): string | undefined { + const { op, varName, varValue: value, isFirst, reserved } = option; + const vals: string[] = []; + const first = getFirstOrSep(op, isFirst); + const [named, ifEmpty] = getNamedAndIfEmpty(op); + if (named && varName) { + vals.push(encodeComponent(varName, reserved, op)); + if (value === "") { + if (!ifEmpty) { + vals.push(ifEmpty); + } + return !vals.join("") ? undefined : `${first}${vals.join("")}`; + } + vals.push("="); + } + + const items = []; + if (Array.isArray(value)) { + for (const val of value.filter(isDefined)) { + items.push(encodeComponent(val, reserved, op)); + } + } else if (typeof value === "object") { + for (const key of Object.keys(value)) { + if (!isDefined(value[key])) { + continue; + } + items.push(encodeRFC3986URIComponent(key)); + items.push(encodeComponent(value[key], reserved, op)); + } + } + vals.push(items.join(",")); + return !vals.join(",") ? undefined : `${first}${vals.join("")}`; +} + +function getVarValue(option: ValueOptions): string | undefined { + const { op, varName, modifier, isFirst, reserved, varValue: value } = option; + + if (!isDefined(value)) { + return undefined; + } else if (["string", "number", "boolean"].includes(typeof value)) { + let val = value.toString(); + const [named, ifEmpty] = getNamedAndIfEmpty(op); + const vals: string[] = [getFirstOrSep(op, isFirst)]; + if (named && varName) { + // No need to encode varName considering it is already encoded + vals.push(varName); + if (val === "") { + vals.push(ifEmpty); + } else { + vals.push("="); + } + } + if (modifier && modifier !== "*") { + val = val.substring(0, parseInt(modifier, 10)); + } + vals.push(encodeComponent(val, reserved, op)); + return vals.join(""); + } else if (modifier === "*") { + return getExpandedValue(option); + } else { + return getNonExpandedValue(option); + } +} + +// --------------------------------------------------------------------------------------------------- +// This is an implementation of RFC 6570 URI Template: https://datatracker.ietf.org/doc/html/rfc6570. +// --------------------------------------------------------------------------------------------------- +export function expandUrlTemplate( + template: string, + context: Record, + option?: UrlTemplateOptions, +): string { + return template.replace(/\{([^{}]+)\}|([^{}]+)/g, (_, expr, text) => { + if (!expr) { + return encodeReservedComponent(text); + } + let op; + if (["+", "#", ".", "/", ";", "?", "&"].includes(expr[0])) { + op = expr[0]; + expr = expr.slice(1); + } + const varList = expr.split(/,/g); + const result = []; + for (const varSpec of varList) { + const varMatch = /([^:*]*)(?::(\d+)|(\*))?/.exec(varSpec); + if (!varMatch || !varMatch[1]) { + continue; + } + const varValue = getVarValue({ + isFirst: result.length === 0, + op, + varValue: context[varMatch[1]], + varName: varMatch[1], + modifier: varMatch[2] || varMatch[3], + reserved: option?.allowReserved, + }); + if (varValue) { + result.push(varValue); + } + } + return result.join(""); + }); +} diff --git a/sdk/compute/arm-computerecommender/test/public/sampleTest.spec.ts b/sdk/compute/arm-computerecommender/test/public/sampleTest.spec.ts new file mode 100644 index 000000000000..fa213c1146b7 --- /dev/null +++ b/sdk/compute/arm-computerecommender/test/public/sampleTest.spec.ts @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// import type { Recorder } from "@azure-tools/test-recorder"; +// import { createRecorder } from "./utils/recordedClient.js"; +import { assert, beforeEach, afterEach, it, describe } from "vitest"; + +describe("My test", () => { + // let recorder: Recorder; + + beforeEach(async function (ctx) { + // uncomment if recorded tests are added + // recorder = await createRecorder(ctx); + }); + + afterEach(async function () { + // uncomment if recorded tests are added + // await recorder.stop(); + }); + + it("sample test", async function () { + assert.equal(1, 1); + }); +}); diff --git a/sdk/compute/arm-computerecommender/test/public/utils/recordedClient.ts b/sdk/compute/arm-computerecommender/test/public/utils/recordedClient.ts new file mode 100644 index 000000000000..285e4643c45e --- /dev/null +++ b/sdk/compute/arm-computerecommender/test/public/utils/recordedClient.ts @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import type { RecorderStartOptions, VitestTestContext } from "@azure-tools/test-recorder"; +import { Recorder } from "@azure-tools/test-recorder"; + +const replaceableVariables: Record = { + SUBSCRIPTION_ID: "azure_subscription_id", +}; + +const recorderEnvSetup: RecorderStartOptions = { + envSetupForPlayback: replaceableVariables, +}; + +/** + * creates the recorder and reads the environment variables from the `.env` file. + * Should be called first in the test suite to make sure environment variables are + * read before they are being used. + */ +export async function createRecorder(context: VitestTestContext): Promise { + const recorder = new Recorder(context); + await recorder.start(recorderEnvSetup); + return recorder; +} diff --git a/sdk/compute/arm-computerecommender/test/snippets.spec.ts b/sdk/compute/arm-computerecommender/test/snippets.spec.ts new file mode 100644 index 000000000000..81ecd64db649 --- /dev/null +++ b/sdk/compute/arm-computerecommender/test/snippets.spec.ts @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { ComputeRecommenderManagementClient } from "../src/index.js"; +import { DefaultAzureCredential, InteractiveBrowserCredential } from "@azure/identity"; +import { setLogLevel } from "@azure/logger"; +import { describe, it } from "vitest"; + +describe("snippets", () => { + it("ReadmeSampleCreateClient_Node", async () => { + const subscriptionId = "00000000-0000-0000-0000-000000000000"; + const client = new ComputeRecommenderManagementClient( + new DefaultAzureCredential(), + subscriptionId, + ); + }); + + it("ReadmeSampleCreateClient_Browser", async () => { + const credential = new InteractiveBrowserCredential({ + tenantId: "", + clientId: "", + }); + const subscriptionId = "00000000-0000-0000-0000-000000000000"; + const client = new ComputeRecommenderManagementClient(credential, subscriptionId); + }); + + it("SetLogLevel", async () => { + setLogLevel("info"); + }); +}); diff --git a/sdk/compute/arm-computerecommender/tsconfig.browser.config.json b/sdk/compute/arm-computerecommender/tsconfig.browser.config.json new file mode 100644 index 000000000000..75871518e3a0 --- /dev/null +++ b/sdk/compute/arm-computerecommender/tsconfig.browser.config.json @@ -0,0 +1,3 @@ +{ + "extends": ["./tsconfig.test.json", "../../../tsconfig.browser.base.json"] +} diff --git a/sdk/compute/arm-computerecommender/tsconfig.json b/sdk/compute/arm-computerecommender/tsconfig.json new file mode 100644 index 000000000000..0e57dbd186e5 --- /dev/null +++ b/sdk/compute/arm-computerecommender/tsconfig.json @@ -0,0 +1,16 @@ +{ + "references": [ + { + "path": "./tsconfig.src.json" + }, + { + "path": "./tsconfig.samples.json" + }, + { + "path": "./tsconfig.test.json" + }, + { + "path": "./tsconfig.snippets.json" + } + ] +} diff --git a/sdk/compute/arm-computerecommender/tsconfig.samples.json b/sdk/compute/arm-computerecommender/tsconfig.samples.json new file mode 100644 index 000000000000..b4a96b4c31de --- /dev/null +++ b/sdk/compute/arm-computerecommender/tsconfig.samples.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.samples.base.json", + "compilerOptions": { + "paths": { + "@azure/arm-computerecommender": ["./dist/esm"] + } + } +} diff --git a/sdk/compute/arm-computerecommender/tsconfig.snippets.json b/sdk/compute/arm-computerecommender/tsconfig.snippets.json new file mode 100644 index 000000000000..6f3148b5ed97 --- /dev/null +++ b/sdk/compute/arm-computerecommender/tsconfig.snippets.json @@ -0,0 +1,3 @@ +{ + "extends": ["../../../tsconfig.snippets.base.json"] +} diff --git a/sdk/compute/arm-computerecommender/tsconfig.src.json b/sdk/compute/arm-computerecommender/tsconfig.src.json new file mode 100644 index 000000000000..bae70752dd38 --- /dev/null +++ b/sdk/compute/arm-computerecommender/tsconfig.src.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.lib.json" +} diff --git a/sdk/compute/arm-computerecommender/tsconfig.test.json b/sdk/compute/arm-computerecommender/tsconfig.test.json new file mode 100644 index 000000000000..290ca214aebc --- /dev/null +++ b/sdk/compute/arm-computerecommender/tsconfig.test.json @@ -0,0 +1,3 @@ +{ + "extends": ["./tsconfig.src.json", "../../../tsconfig.test.base.json"] +} diff --git a/sdk/compute/arm-computerecommender/tsp-location.yaml b/sdk/compute/arm-computerecommender/tsp-location.yaml new file mode 100644 index 000000000000..79fa3afd55fd --- /dev/null +++ b/sdk/compute/arm-computerecommender/tsp-location.yaml @@ -0,0 +1,4 @@ +directory: specification/compute/resource-manager/Microsoft.Compute/RecommenderRP +commit: 3e7d0579d2e5e088b0adef0cda26a32f6cfbf695 +repo: Azure/azure-rest-api-specs +additionalDirectories: diff --git a/sdk/compute/arm-computerecommender/vitest.browser.config.ts b/sdk/compute/arm-computerecommender/vitest.browser.config.ts new file mode 100644 index 000000000000..72964f281efe --- /dev/null +++ b/sdk/compute/arm-computerecommender/vitest.browser.config.ts @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import viteConfig from "../../../vitest.browser.shared.config.ts"; + +export default viteConfig; diff --git a/sdk/compute/arm-computerecommender/vitest.config.ts b/sdk/compute/arm-computerecommender/vitest.config.ts new file mode 100644 index 000000000000..0dfa15cc4498 --- /dev/null +++ b/sdk/compute/arm-computerecommender/vitest.config.ts @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import viteConfig from "../../../vitest.shared.config.ts"; + +export default viteConfig; diff --git a/sdk/compute/arm-computerecommender/vitest.esm.config.ts b/sdk/compute/arm-computerecommender/vitest.esm.config.ts new file mode 100644 index 000000000000..5e9735e9b144 --- /dev/null +++ b/sdk/compute/arm-computerecommender/vitest.esm.config.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { mergeConfig } from "vitest/config"; +import vitestConfig from "./vitest.config.ts"; +import vitestEsmConfig from "../../../vitest.esm.shared.config.ts"; + +export default mergeConfig(vitestConfig, vitestEsmConfig); diff --git a/sdk/compute/ci.mgmt.yml b/sdk/compute/ci.mgmt.yml index 7a02b433e18a..663861db5c36 100644 --- a/sdk/compute/ci.mgmt.yml +++ b/sdk/compute/ci.mgmt.yml @@ -1,17 +1,20 @@ # NOTE: Please refer to https://aka.ms/azsdk/engsys/ci-yaml before editing this file. - + trigger: branches: include: - main - release/* - hotfix/* + exclude: + - feature/v4 paths: include: - sdk/compute/ci.mgmt.yml - sdk/compute/arm-compute - sdk/compute/arm-compute-profile-2020-09-01-hybrid - sdk/compute/arm-compute-rest + - sdk/compute/arm-computerecommender pr: branches: include: @@ -27,6 +30,7 @@ pr: - sdk/compute/arm-compute - sdk/compute/arm-compute-profile-2020-09-01-hybrid - sdk/compute/arm-compute-rest + - sdk/compute/arm-computerecommender extends: template: /eng/pipelines/templates/stages/archetype-sdk-client.yml parameters: @@ -38,3 +42,5 @@ extends: safeName: azurearmcomputeprofile20200901hybrid - name: azure-rest-arm-compute safeName: azurerestarmcompute + - name: azure-arm-computerecommender + safeName: azurearmcomputerecommender