Skip to content

Commit

Permalink
[ContainerRegistry] Migrate samples to v2 workflow (#14750)
Browse files Browse the repository at this point in the history
* [ContainerRegistry] Migrate samples to v2 workflow

* Add comments about endpoint format

* Address CR feedback

- move listing by pages to separate methods as they are more advanced
scenarios.

- also update apidocs link for beta.1 as docs haven't been published

* Use javascript tag in JS samples' package.json

* Update sdk/containerregistry/container-registry/sample.env

Co-authored-by: Will Temple <witemple@microsoft.com>

Co-authored-by: Will Temple <witemple@microsoft.com>
  • Loading branch information
jeremymeng and witemple-msft authored Apr 9, 2021
1 parent b06dceb commit 9eaccd3
Show file tree
Hide file tree
Showing 20 changed files with 481 additions and 223 deletions.
18 changes: 13 additions & 5 deletions sdk/containerregistry/container-registry/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@
"audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit",
"build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1",
"build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1",
"build:samples": "dev-tool samples prep && cd dist-samples && tsc -p .",
"build:samples": "echo Obsolete.",
"build:test": "tsc -p . && rollup -c 2>&1",
"build": "tsc -p . && rollup -c 2>&1 && api-extractor run --local",
"check-format": "prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"",
"check-format": "prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"samples-dev/**/*.ts\" \"*.{js,json}\"",
"clean": "rimraf dist dist-* temp types *.tgz *.log",
"docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src",
"execute:samples": "npm run build:samples && dev-tool samples run dist-samples/javascript dist-samples/typescript/dist/dist-samples/typescript/src/",
"execute:samples": "dev-tool samples run samples-dev",
"extract-api": "tsc -p . && api-extractor run --local",
"format": "prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"",
"format": "prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"samples-dev/**/*.ts\" \"*.{js,json}\"",
"generate:client": "autorest --typescript --v3 swagger",
"integration-test:browser": "echo skipped",
"integration-test:node": "nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 5000000 --full-trace \"dist-esm/test/{,!(browser)/**/}/*.spec.js\"",
Expand Down Expand Up @@ -125,6 +125,14 @@
"util": "^0.12.1"
},
"//sampleConfiguration": {
"skipFolder": true
"skipFolder": true,
"productName": "Azure Container Registry",
"productSlugs": [
"azure",
"azure-container-registry"
],
"requiredResources": {
"Azure Container Registry": "https://docs.microsoft.com/azure/container-registry/container-registry-get-started-portal"
}
}
}
3 changes: 2 additions & 1 deletion sdk/containerregistry/container-registry/sample.env
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Used in most samples. Retrieve these values from an instance in the Azure
# Portal.

# Retrieve this value from a Container Registry instance in the Azure Portal.
CONTAINER_REGISTRY_ENDPOINT: "<container registry REST API endpoint>",
REPOSITORY_NAME="<repository name>"

# Used to authenticate using Azure AD as a service principal for role-based
# authentication in the tokenAuth sample.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

/**
* @summary Demonstrates the use of a ContainerRegistryClient.
* @azsdk-weight 10
*/

import { ContainerRegistryClient } from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
import * as dotenv from "dotenv";
dotenv.config();

export async function main() {
// endpoint should be in the form of "https://myregistryname.azurecr.io"
// where "myregistryname" is the actual name of your registry
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT || "<endpoint>";
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential());
await listRepositories(client);

// Advanced: listing by pages
const pageSize = 2;
await listRepositoriesByPages(client, pageSize);

const repositoryName = "repository-name-to-delete";
await deleteRepository(client, repositoryName);
}

async function listRepositories(client: ContainerRegistryClient) {
console.log("Listing repositories");
const iterator = client.listRepositories();
for await (const repository of iterator) {
console.log(` repository: ${repository}`);
}
}

async function listRepositoriesByPages(client: any, pageSize: number) {
console.log("Listing repositories by pages");
const pages = client.listRepositories().byPage({ maxPageSize: pageSize });
let result = await pages.next();
while (!result.done) {
console.log(" -- page -- ");
for (const repository of result.value) {
console.log(` repository: ${repository}`);
}
result = await pages.next();
}
}

async function deleteRepository(client: ContainerRegistryClient, repositoryName: string) {
console.log("Deleting a repository");
const response = await client.deleteRepository(repositoryName);
console.log(
`Artifacts deleted: ${(response &&
response.deletedRegistryArtifactDigests &&
response.deletedRegistryArtifactDigests.length) ||
0}`
);
console.log(
`Tags deleted: ${(response &&
response.deletedRegistryArtifactDigests &&
response.deletedRegistryArtifactDigests.length) ||
0}`
);
}

main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

/**
* @summary Demonstrates the use of a ContainerRepositoryClient.
* @azsdk-weight 5
*/

import { ContainerRepositoryClient, RegistryArtifactProperties } from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
import * as dotenv from "dotenv";
dotenv.config();

export async function main() {
// endpoint should be in the form of "https://myregistryname.azurecr.io"
// where "myregistryname" is the actual name of your registry
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT || "<endpoint>";
const repository = process.env.REPOSITORY_NAME || "<repository name>";

const client = new ContainerRepositoryClient(endpoint, repository, new DefaultAzureCredential());
await getProperties(client);
await listTags(client);

const artifacts = await listArtifacts(client);

if (artifacts && artifacts.length) {
const digest = artifacts[0].digest;
if (digest) {
await getArtifactProperties(client, digest);

await deleteArtifact(client, digest);
}
}

// Advanced: listing by pages
const pageSize = 2;
await listTagsByPages(client, pageSize);
await listArtifactsByPages(client, pageSize);
}

async function listTags(client: ContainerRepositoryClient) {
console.log("Listing tags");
const iterator = client.listTags({ orderBy: "timeasc" });
for await (const tag of iterator) {
console.log(` tag: ${tag.name}`);
console.log(` digest: ${tag.digest}`);
console.log(` created on: ${tag.createdOn}`);
console.log(` last updated on: ${tag.lastUpdatedOn}`);
}
}

async function listTagsByPages(client: ContainerRepositoryClient, pagesSize: number) {
console.log("Listing tags by pages");
const pages = client.listTags().byPage({ maxPageSize: pagesSize });
let result = await pages.next();
while (!result.done) {
console.log(" -- page -- ");
for (const tag of result.value) {
console.log(` tag: ${tag.name}`);
console.log(` digest: ${tag.digest}`);
console.log(` created on: ${tag.createdOn}`);
console.log(` last updated on: ${tag.lastUpdatedOn}`);
console.log("");
}
result = await pages.next();
}
}

async function listArtifacts(
client: ContainerRepositoryClient
): Promise<RegistryArtifactProperties[]> {
console.log("Listing artifacts");
const artifacts: RegistryArtifactProperties[] = [];
const iterator = client.listRegistryArtifacts();
for await (const artifact of iterator) {
artifacts.push(artifact);
console.log(` digest: ${artifact.digest}`);
console.log(` created on: ${artifact.createdOn}`);
console.log(` last updated on: ${artifact.lastUpdatedOn}`);
}

return artifacts;
}

async function listArtifactsByPages(client: any, pageSize: number) {
console.log("Listing artifacts by pages");
const pages = client.listRegistryArtifacts().byPage({ maxPageSize: pageSize });
let result = await pages.next();
while (!result.done) {
console.log(" -- page -- ");
for (const artifact of result.value) {
console.log(` digest: ${artifact.digest}`);
console.log(` created on: ${artifact.createdOn}`);
console.log(` last updated on: ${artifact.lastUpdatedOn}`);
console.log("");
}
result = await pages.next();
}
}

async function getProperties(client: ContainerRepositoryClient) {
console.log("Retrieving repository properties...");
const properties = await client.getProperties();
console.log(` name: ${properties.name}`);
console.log(` created on: ${properties.createdOn}`);
console.log(` last updated on: ${properties.lastUpdatedOn}`);
console.log(` artifact count: ${properties.registryArtifactCount}`);
console.log(` tag count: ${properties.tagCount}`);
const writableProps = properties.writeableProperties;
if (writableProps) {
console.log(" writable properties:");
console.log(
` { canDelete: ${writableProps.canDelete}, canList: ${writableProps.canList}, canRead: ${writableProps.canRead}, canWrite: ${writableProps.canWrite}}`
);
}
}

async function getArtifactProperties(client: ContainerRepositoryClient, digest: string) {
console.log(`Retrieving registry artifact properties for ${digest}`);
const properties = await client.getRegistryArtifactProperties(digest);
console.log(` created on: ${properties.createdOn}`);
console.log(` last updated on: ${properties.lastUpdatedOn}`);
console.log(` arch : ${properties.cpuArchitecture}`);
console.log(` os : ${properties.operatingSystem}`);
console.log(` size : ${properties.size} bytes`);
}

async function deleteArtifact(client: ContainerRepositoryClient, digest: string) {
console.log(`Deleting registry artifact for ${digest}`);
await client.deleteRegistryArtifact(digest);
}

main().catch((err) => {
console.error("The sample encountered an error:", err);
});

This file was deleted.

This file was deleted.

10 changes: 0 additions & 10 deletions sdk/containerregistry/container-registry/samples/tsconfig.json

This file was deleted.

This file was deleted.

Loading

0 comments on commit 9eaccd3

Please sign in to comment.