From 508f928b1f770960421fe7b008d946c879c1eb12 Mon Sep 17 00:00:00 2001 From: tytv2 Date: Sat, 11 Apr 2026 21:01:39 +0700 Subject: [PATCH] feat: add MkDocs documentation site with GitHub Pages deployment --- .github/workflows/deploy-docs.yml | 44 ++++++ docs/changelog.md | 3 + docs/commands/vks/create-cluster.md | 179 +++++++++++++++++++++++ docs/commands/vks/create-nodegroup.md | 119 +++++++++++++++ docs/commands/vks/delete-cluster.md | 53 +++++++ docs/commands/vks/delete-nodegroup.md | 75 ++++++++++ docs/commands/vks/get-cluster.md | 38 +++++ docs/commands/vks/get-nodegroup.md | 49 +++++++ docs/commands/vks/index.md | 35 +++++ docs/commands/vks/list-clusters.md | 57 ++++++++ docs/commands/vks/list-nodegroups.md | 61 ++++++++ docs/commands/vks/update-cluster.md | 78 ++++++++++ docs/commands/vks/update-nodegroup.md | 112 ++++++++++++++ docs/commands/vks/wait-cluster-active.md | 70 +++++++++ docs/configuration.md | 100 +++++++++++++ docs/development/contributing.md | 22 +++ docs/development/release.md | 52 +++++++ docs/index.md | 37 +++++ docs/installation.md | 78 ++++++++++ docs/usage/dry-run.md | 67 +++++++++ docs/usage/getting-started.md | 52 +++++++ docs/usage/global-options.md | 46 ++++++ docs/usage/output.md | 56 +++++++ docs/usage/pagination.md | 26 ++++ mkdocs.yml | 67 +++++++++ 25 files changed, 1576 insertions(+) create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 docs/changelog.md create mode 100644 docs/commands/vks/create-cluster.md create mode 100644 docs/commands/vks/create-nodegroup.md create mode 100644 docs/commands/vks/delete-cluster.md create mode 100644 docs/commands/vks/delete-nodegroup.md create mode 100644 docs/commands/vks/get-cluster.md create mode 100644 docs/commands/vks/get-nodegroup.md create mode 100644 docs/commands/vks/index.md create mode 100644 docs/commands/vks/list-clusters.md create mode 100644 docs/commands/vks/list-nodegroups.md create mode 100644 docs/commands/vks/update-cluster.md create mode 100644 docs/commands/vks/update-nodegroup.md create mode 100644 docs/commands/vks/wait-cluster-active.md create mode 100644 docs/configuration.md create mode 100644 docs/development/contributing.md create mode 100644 docs/development/release.md create mode 100644 docs/index.md create mode 100644 docs/installation.md create mode 100644 docs/usage/dry-run.md create mode 100644 docs/usage/getting-started.md create mode 100644 docs/usage/global-options.md create mode 100644 docs/usage/output.md create mode 100644 docs/usage/pagination.md create mode 100644 mkdocs.yml diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000..54ae128 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,44 @@ +name: Deploy Docs + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +on: + push: + branches: [main] + paths: + - 'docs/**' + - 'mkdocs.yml' + +permissions: + pages: write + id-token: write + +jobs: + deploy: + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + + - name: Install MkDocs + run: pip install mkdocs-material + + - name: Build docs + run: mkdocs build + + - name: Upload Pages artifact + uses: actions/upload-pages@v4 + with: + path: site/ + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000..1afd371 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,3 @@ +# Changelog + +See [CHANGELOG.md](https://github.com/vngcloud/greennode-cli/blob/main/CHANGELOG.md) for the full release history. diff --git a/docs/commands/vks/create-cluster.md b/docs/commands/vks/create-cluster.md new file mode 100644 index 0000000..4946aa4 --- /dev/null +++ b/docs/commands/vks/create-cluster.md @@ -0,0 +1,179 @@ +# create-cluster + +## Description + +Create a new VKS cluster with an initial default node group. The command provisions both the control plane and the first node group in a single call. + +Cluster names must be 5–20 characters, lowercase alphanumeric and hyphens, starting and ending with an alphanumeric character. Node group names follow the same pattern with a length of 5–15 characters. + +When `--network-type` is `CALICO` or `CILIUM_OVERLAY`, the `--cidr` option is required. By default, both the load balancer plugin and the block store CSI plugin are enabled; use the `--no-*` flags to disable them. + +Use `--dry-run` to validate all parameters without sending a create request. + +## Synopsis + +``` +grn vks create-cluster + --name + --k8s-version + --network-type + --vpc-id + --subnet-id + --node-group-name + --flavor-id + --image-id + --disk-type + --ssh-key-id + [--cidr ] + [--description ] + [--enable-private-cluster] + [--release-channel ] + [--enabled-load-balancer-plugin] + [--no-load-balancer-plugin] + [--enabled-block-store-csi-plugin] + [--no-block-store-csi-plugin] + [--disk-size ] + [--num-nodes ] + [--enable-private-nodes] + [--security-groups ] + [--labels ] + [--taints ] + [--dry-run] +``` + +## Options + +**Cluster settings** + +`--name` (required) +: Cluster name. Must be 5–20 characters, lowercase alphanumeric and hyphens, starting and ending with an alphanumeric character. + +`--k8s-version` (required) +: Kubernetes version for the cluster (e.g. `v1.29.1`). + +`--network-type` (required) +: Network type for the cluster. Accepted values: `CALICO`, `CILIUM_OVERLAY`, `CILIUM_NATIVE_ROUTING`. + +`--vpc-id` (required) +: VPC ID where the cluster will be provisioned. + +`--subnet-id` (required) +: Subnet ID for the cluster control plane and the default node group. + +`--cidr` (optional) +: Pod CIDR block. Required when `--network-type` is `CALICO` or `CILIUM_OVERLAY` (e.g. `10.96.0.0/12`). + +`--description` (optional) +: Human-readable description for the cluster. + +`--enable-private-cluster` (optional) +: Enable private cluster mode (control plane not accessible from the public internet). + +`--release-channel` (optional) +: Release channel for automatic upgrades. Accepted values: `RAPID`, `STABLE`. Default: `STABLE`. + +`--enabled-load-balancer-plugin` (optional) +: Explicitly enable the load balancer plugin (enabled by default). + +`--no-load-balancer-plugin` (optional) +: Disable the load balancer plugin. + +`--enabled-block-store-csi-plugin` (optional) +: Explicitly enable the block store CSI plugin (enabled by default). + +`--no-block-store-csi-plugin` (optional) +: Disable the block store CSI plugin. + +**Node group settings** + +`--node-group-name` (required) +: Name of the initial node group. Must be 5–15 characters, lowercase alphanumeric and hyphens, starting and ending with an alphanumeric character. + +`--flavor-id` (required) +: Flavor (instance type) ID for the nodes. + +`--image-id` (required) +: OS image ID for the nodes. + +`--disk-type` (required) +: Disk type ID for the node boot volumes. + +`--ssh-key-id` (required) +: SSH key pair ID to inject into each node. + +`--disk-size` (optional) +: Boot disk size in GiB. Accepted range: 20–5000. Default: `100`. + +`--num-nodes` (optional) +: Number of nodes to create in the default node group. Accepted range: 0–10. Default: `1`. + +`--enable-private-nodes` (optional) +: Enable private nodes (nodes will not have public IP addresses). + +`--security-groups` (optional) +: Comma-separated list of security group IDs to attach to the nodes (e.g. `sg-aaa111,sg-bbb222`). + +`--labels` (optional) +: Comma-separated `key=value` pairs to add as Kubernetes node labels (e.g. `env=prod,tier=app`). + +`--taints` (optional) +: Comma-separated node taints in `key=value:effect` format (e.g. `dedicated=gpu:NoSchedule`). + +`--dry-run` (optional) +: Validate all parameters and print a report without sending the create request. + +## Examples + +Create a minimal cluster with CILIUM_NATIVE_ROUTING: + +```bash +grn vks create-cluster \ + --name my-cluster \ + --k8s-version v1.29.1 \ + --network-type CILIUM_NATIVE_ROUTING \ + --vpc-id net-abc12345-0000-0000-0000-000000000001 \ + --subnet-id sub-abc12345-0000-0000-0000-000000000001 \ + --node-group-name default-ng \ + --flavor-id flv-2c4g \ + --image-id img-ubuntu-22-04-k8s \ + --disk-type SSD \ + --ssh-key-id key-abc12345-0000-0000-0000-000000000001 +``` + +Create a cluster with CALICO network type (CIDR required): + +```bash +grn vks create-cluster \ + --name prod-cluster \ + --k8s-version v1.29.1 \ + --network-type CALICO \ + --cidr 10.96.0.0/12 \ + --vpc-id net-abc12345-0000-0000-0000-000000000001 \ + --subnet-id sub-abc12345-0000-0000-0000-000000000001 \ + --node-group-name prod-ng \ + --flavor-id flv-4c8g \ + --image-id img-ubuntu-22-04-k8s \ + --disk-type SSD \ + --disk-size 200 \ + --num-nodes 3 \ + --ssh-key-id key-abc12345-0000-0000-0000-000000000001 \ + --labels env=prod,tier=app \ + --taints dedicated=gpu:NoSchedule +``` + +Validate parameters without creating (dry run): + +```bash +grn vks create-cluster \ + --name my-cluster \ + --k8s-version v1.29.1 \ + --network-type CILIUM_NATIVE_ROUTING \ + --vpc-id net-abc12345-0000-0000-0000-000000000001 \ + --subnet-id sub-abc12345-0000-0000-0000-000000000001 \ + --node-group-name default-ng \ + --flavor-id flv-2c4g \ + --image-id img-ubuntu-22-04-k8s \ + --disk-type SSD \ + --ssh-key-id key-abc12345-0000-0000-0000-000000000001 \ + --dry-run +``` diff --git a/docs/commands/vks/create-nodegroup.md b/docs/commands/vks/create-nodegroup.md new file mode 100644 index 0000000..0f176df --- /dev/null +++ b/docs/commands/vks/create-nodegroup.md @@ -0,0 +1,119 @@ +# create-nodegroup + +## Description + +Create a new node group within an existing VKS cluster. Node group names must be 5–15 characters, lowercase alphanumeric and hyphens, starting and ending with an alphanumeric character. + +Use `--dry-run` to validate parameters (name format, disk size range, node count range) without sending a create request. + +## Synopsis + +``` +grn vks create-nodegroup + --cluster-id + --name + --image-id + --flavor-id + --disk-type + --ssh-key-id + [--enable-private-nodes] + [--num-nodes ] + [--disk-size ] + [--security-groups ] + [--subnet-id ] + [--labels ] + [--taints ] + [--enable-encryption-volume] + [--dry-run] +``` + +## Options + +`--cluster-id` (required) +: ID of the cluster to add the node group to. + +`--name` (required) +: Node group name. Must be 5–15 characters, lowercase alphanumeric and hyphens, starting and ending with an alphanumeric character. + +`--image-id` (required) +: OS image ID for the nodes. + +`--flavor-id` (required) +: Flavor (instance type) ID for the nodes. + +`--disk-type` (required) +: Disk type ID for the node boot volumes. + +`--ssh-key-id` (required) +: SSH key pair ID to inject into each node. + +`--enable-private-nodes` (optional) +: Enable private nodes (nodes will not have public IP addresses). + +`--num-nodes` (optional) +: Number of nodes to create. Accepted range: 0–10. Default: `1`. + +`--disk-size` (optional) +: Boot disk size in GiB. Accepted range: 20–5000. Default: `100`. + +`--security-groups` (optional) +: Comma-separated list of security group IDs to attach to the nodes (e.g. `sg-aaa111,sg-bbb222`). + +`--subnet-id` (optional) +: Subnet ID for the node group. Uses the cluster subnet when not specified. + +`--labels` (optional) +: Comma-separated `key=value` pairs to add as Kubernetes node labels (e.g. `env=prod,tier=app`). + +`--taints` (optional) +: Comma-separated node taints in `key=value:effect` format (e.g. `dedicated=gpu:NoSchedule`). + +`--enable-encryption-volume` (optional) +: Enable encryption for the node boot volumes. + +`--dry-run` (optional) +: Validate parameters and print a report without sending the create request. + +## Examples + +Create a basic node group: + +```bash +grn vks create-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --name worker-ng \ + --image-id img-ubuntu-22-04-k8s \ + --flavor-id flv-4c8g \ + --disk-type SSD \ + --ssh-key-id key-abc12345-0000-0000-0000-000000000001 +``` + +Create a GPU node group with taints and labels: + +```bash +grn vks create-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --name gpu-ng \ + --image-id img-ubuntu-22-04-k8s-gpu \ + --flavor-id flv-8c32g-gpu \ + --disk-type SSD \ + --disk-size 200 \ + --num-nodes 2 \ + --ssh-key-id key-abc12345-0000-0000-0000-000000000001 \ + --labels accelerator=nvidia,tier=gpu \ + --taints dedicated=gpu:NoSchedule \ + --enable-encryption-volume +``` + +Validate parameters without creating: + +```bash +grn vks create-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --name worker-ng \ + --image-id img-ubuntu-22-04-k8s \ + --flavor-id flv-4c8g \ + --disk-type SSD \ + --ssh-key-id key-abc12345-0000-0000-0000-000000000001 \ + --dry-run +``` diff --git a/docs/commands/vks/delete-cluster.md b/docs/commands/vks/delete-cluster.md new file mode 100644 index 0000000..fb6d01f --- /dev/null +++ b/docs/commands/vks/delete-cluster.md @@ -0,0 +1,53 @@ +# delete-cluster + +## Description + +Delete a VKS cluster and all of its associated node groups. Before executing the delete, the command always fetches and displays a preview of the cluster and node groups that will be removed. + +Unless `--force` is provided, you will be prompted to type `yes` to confirm. Use `--dry-run` to see the preview without being prompted and without deleting anything. + +**This action is irreversible.** + +## Synopsis + +``` +grn vks delete-cluster + --cluster-id + [--dry-run] + [--force] +``` + +## Options + +`--cluster-id` (required) +: ID of the cluster to delete. + +`--dry-run` (optional) +: Display the resources that would be deleted without executing the delete request. + +`--force` (optional) +: Skip the interactive confirmation prompt and delete immediately. + +## Examples + +Delete a cluster interactively (prompts for confirmation): + +```bash +grn vks delete-cluster --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 +``` + +Preview what will be deleted without deleting: + +```bash +grn vks delete-cluster \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --dry-run +``` + +Delete without confirmation (for use in scripts): + +```bash +grn vks delete-cluster \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --force +``` diff --git a/docs/commands/vks/delete-nodegroup.md b/docs/commands/vks/delete-nodegroup.md new file mode 100644 index 0000000..0a64e7c --- /dev/null +++ b/docs/commands/vks/delete-nodegroup.md @@ -0,0 +1,75 @@ +# delete-nodegroup + +## Description + +Delete a specific node group from a VKS cluster. Before executing, the command always fetches and displays a preview of the node group that will be removed (name, status, node count). + +Unless `--force` is provided, you will be prompted to type `yes` to confirm. Use `--dry-run` to see the preview without being prompted and without deleting anything. Use `--force-delete` to instruct the API to perform a forced deletion. + +**This action is irreversible.** + +## Synopsis + +``` +grn vks delete-nodegroup + --cluster-id + --nodegroup-id + [--force-delete] + [--dry-run] + [--force] +``` + +## Options + +`--cluster-id` (required) +: ID of the cluster that owns the node group. + +`--nodegroup-id` (required) +: ID of the node group to delete. + +`--force-delete` (optional) +: Instruct the API to perform a forced deletion of the node group. + +`--dry-run` (optional) +: Display the node group that would be deleted without executing the delete request. + +`--force` (optional) +: Skip the interactive confirmation prompt and delete immediately. + +## Examples + +Delete a node group interactively (prompts for confirmation): + +```bash +grn vks delete-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 +``` + +Preview what will be deleted without deleting: + +```bash +grn vks delete-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --dry-run +``` + +Delete without confirmation (for use in scripts): + +```bash +grn vks delete-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --force +``` + +Force-delete a stuck node group without confirmation: + +```bash +grn vks delete-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --force-delete \ + --force +``` diff --git a/docs/commands/vks/get-cluster.md b/docs/commands/vks/get-cluster.md new file mode 100644 index 0000000..7d1aaca --- /dev/null +++ b/docs/commands/vks/get-cluster.md @@ -0,0 +1,38 @@ +# get-cluster + +## Description + +Get detailed information about a specific VKS cluster, including its status, Kubernetes version, network configuration, node group count, and plugin state. + +## Synopsis + +``` +grn vks get-cluster + --cluster-id +``` + +## Options + +`--cluster-id` (required) +: The ID of the cluster to retrieve. + +## Examples + +Get cluster details: + +```bash +grn vks get-cluster --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 +``` + +Get cluster details and output as JSON: + +```bash +grn vks get-cluster --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 --output json +``` + +Use with `jq` to extract just the cluster status: + +```bash +grn vks get-cluster --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 --output json \ + | jq '.status' +``` diff --git a/docs/commands/vks/get-nodegroup.md b/docs/commands/vks/get-nodegroup.md new file mode 100644 index 0000000..be82fcd --- /dev/null +++ b/docs/commands/vks/get-nodegroup.md @@ -0,0 +1,49 @@ +# get-nodegroup + +## Description + +Get detailed information about a specific node group within a cluster, including its status, flavor, image, disk configuration, node count, labels, and taints. + +## Synopsis + +``` +grn vks get-nodegroup + --cluster-id + --nodegroup-id +``` + +## Options + +`--cluster-id` (required) +: ID of the cluster that owns the node group. + +`--nodegroup-id` (required) +: ID of the node group to retrieve. + +## Examples + +Get node group details: + +```bash +grn vks get-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 +``` + +Get node group details as JSON: + +```bash +grn vks get-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --output json +``` + +Extract the node count from the response: + +```bash +grn vks get-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --output json | jq '.numNodes' +``` diff --git a/docs/commands/vks/index.md b/docs/commands/vks/index.md new file mode 100644 index 0000000..53cba95 --- /dev/null +++ b/docs/commands/vks/index.md @@ -0,0 +1,35 @@ +# VKS Commands + +VKS (VNG Kubernetes Service) commands for managing Kubernetes clusters and node groups. + +```bash +grn vks [options] +``` + +## Available commands + +### Cluster + +| Command | Description | +|---------|-------------| +| [list-clusters](list-clusters.md) | List all VKS clusters | +| [get-cluster](get-cluster.md) | Get cluster details | +| [create-cluster](create-cluster.md) | Create a new VKS cluster | +| [update-cluster](update-cluster.md) | Update a VKS cluster | +| [delete-cluster](delete-cluster.md) | Delete a VKS cluster | + +### Node Group + +| Command | Description | +|---------|-------------| +| [list-nodegroups](list-nodegroups.md) | List node groups for a cluster | +| [get-nodegroup](get-nodegroup.md) | Get node group details | +| [create-nodegroup](create-nodegroup.md) | Create a new node group | +| [update-nodegroup](update-nodegroup.md) | Update a node group | +| [delete-nodegroup](delete-nodegroup.md) | Delete a node group | + +### Waiter + +| Command | Description | +|---------|-------------| +| [wait-cluster-active](wait-cluster-active.md) | Wait until cluster reaches ACTIVE status | diff --git a/docs/commands/vks/list-clusters.md b/docs/commands/vks/list-clusters.md new file mode 100644 index 0000000..748d52e --- /dev/null +++ b/docs/commands/vks/list-clusters.md @@ -0,0 +1,57 @@ +# list-clusters + +## Description + +List all VKS clusters. By default, automatically paginates through all pages and returns the complete result set. Use `--page` to fetch a specific page, or `--no-paginate` to return only the first page. + +## Synopsis + +``` +grn vks list-clusters + [--page ] + [--page-size ] + [--no-paginate] +``` + +## Options + +`--page` (optional) +: Specific page number to fetch (0-based index). When provided, disables auto-pagination and returns only that page. + +`--page-size` (optional) +: Number of items per page. Default: `50`. + +`--no-paginate` (optional) +: Disable auto-pagination and return only the first page (page 0). Equivalent to `--page 0`. + +## Examples + +List all clusters (auto-paginated): + +```bash +grn vks list-clusters +``` + +List clusters with custom page size: + +```bash +grn vks list-clusters --page-size 20 +``` + +Fetch page 2 (0-based) only: + +```bash +grn vks list-clusters --page 2 --page-size 10 +``` + +Return only the first page without auto-pagination: + +```bash +grn vks list-clusters --no-paginate +``` + +Output as JSON: + +```bash +grn vks list-clusters --output json +``` diff --git a/docs/commands/vks/list-nodegroups.md b/docs/commands/vks/list-nodegroups.md new file mode 100644 index 0000000..970f90d --- /dev/null +++ b/docs/commands/vks/list-nodegroups.md @@ -0,0 +1,61 @@ +# list-nodegroups + +## Description + +List all node groups belonging to a cluster. By default, automatically paginates through all pages and returns the complete result set. Use `--page` to fetch a specific page, or `--no-paginate` to return only the first page. + +## Synopsis + +``` +grn vks list-nodegroups + --cluster-id + [--page ] + [--page-size ] + [--no-paginate] +``` + +## Options + +`--cluster-id` (required) +: ID of the cluster whose node groups to list. + +`--page` (optional) +: Specific page number to fetch (0-based index). When provided, disables auto-pagination and returns only that page. + +`--page-size` (optional) +: Number of items per page. Default: `50`. + +`--no-paginate` (optional) +: Disable auto-pagination and return only the first page (page 0). + +## Examples + +List all node groups for a cluster: + +```bash +grn vks list-nodegroups --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 +``` + +List node groups with a custom page size: + +```bash +grn vks list-nodegroups \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --page-size 20 +``` + +Fetch only the first page: + +```bash +grn vks list-nodegroups \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --no-paginate +``` + +Output as JSON and count node groups: + +```bash +grn vks list-nodegroups \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --output json | jq '.items | length' +``` diff --git a/docs/commands/vks/update-cluster.md b/docs/commands/vks/update-cluster.md new file mode 100644 index 0000000..caafe8c --- /dev/null +++ b/docs/commands/vks/update-cluster.md @@ -0,0 +1,78 @@ +# update-cluster + +## Description + +Update a VKS cluster's Kubernetes version, whitelist CIDRs, and plugin configuration. The Kubernetes version and at least one whitelist CIDR are always required by the API, even when only updating plugin settings. + +Use `--dry-run` to preview the update request without executing it. + +## Synopsis + +``` +grn vks update-cluster + --cluster-id + --k8s-version + --whitelist-node-cidrs + [--enabled-load-balancer-plugin] + [--no-load-balancer-plugin] + [--enabled-block-store-csi-plugin] + [--no-block-store-csi-plugin] + [--dry-run] +``` + +## Options + +`--cluster-id` (required) +: ID of the cluster to update. + +`--k8s-version` (required) +: Target Kubernetes version (e.g. `v1.29.1`). Must be the same or a higher patch/minor version than the current version. + +`--whitelist-node-cidrs` (required) +: Comma-separated list of CIDRs allowed to communicate with cluster nodes. At least one value is required (e.g. `10.0.0.0/8,192.168.0.0/16`). + +`--enabled-load-balancer-plugin` (optional) +: Enable the load balancer plugin. + +`--no-load-balancer-plugin` (optional) +: Disable the load balancer plugin. + +`--enabled-block-store-csi-plugin` (optional) +: Enable the block store CSI plugin. + +`--no-block-store-csi-plugin` (optional) +: Disable the block store CSI plugin. + +`--dry-run` (optional) +: Print the update payload without sending the request. + +## Examples + +Upgrade Kubernetes version and set whitelist CIDRs: + +```bash +grn vks update-cluster \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --k8s-version v1.30.0 \ + --whitelist-node-cidrs 10.0.0.0/8,192.168.0.0/16 +``` + +Update cluster and disable the load balancer plugin: + +```bash +grn vks update-cluster \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --k8s-version v1.29.1 \ + --whitelist-node-cidrs 10.0.0.0/8 \ + --no-load-balancer-plugin +``` + +Preview what would be sent (dry run): + +```bash +grn vks update-cluster \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --k8s-version v1.30.0 \ + --whitelist-node-cidrs 10.0.0.0/8 \ + --dry-run +``` diff --git a/docs/commands/vks/update-nodegroup.md b/docs/commands/vks/update-nodegroup.md new file mode 100644 index 0000000..643a3d4 --- /dev/null +++ b/docs/commands/vks/update-nodegroup.md @@ -0,0 +1,112 @@ +# update-nodegroup + +## Description + +Update a node group's image, node count, security groups, labels, taints, auto-scaling configuration, and upgrade strategy. The image ID is always required by the API, even when the intent is to update only other fields. + +Use `--dry-run` to preview the update payload without executing it. + +## Synopsis + +``` +grn vks update-nodegroup + --cluster-id + --nodegroup-id + --image-id + [--num-nodes ] + [--security-groups ] + [--labels ] + [--taints ] + [--auto-scale-min ] + [--auto-scale-max ] + [--upgrade-strategy ] + [--upgrade-max-surge ] + [--upgrade-max-unavailable ] + [--dry-run] +``` + +## Options + +`--cluster-id` (required) +: ID of the cluster that owns the node group. + +`--nodegroup-id` (required) +: ID of the node group to update. + +`--image-id` (required) +: OS image ID. Always required by the API — pass the current image ID to leave it unchanged. + +`--num-nodes` (optional) +: New desired number of nodes for the node group. + +`--security-groups` (optional) +: Comma-separated list of security group IDs to replace the current set. + +`--labels` (optional) +: Comma-separated `key=value` pairs to set as Kubernetes node labels (replaces existing labels). + +`--taints` (optional) +: Comma-separated node taints in `key=value:effect` format (replaces existing taints). + +`--auto-scale-min` (optional) +: Minimum number of nodes for the auto-scaler. + +`--auto-scale-max` (optional) +: Maximum number of nodes for the auto-scaler. + +`--upgrade-strategy` (optional) +: Node upgrade strategy. Accepted value: `SURGE`. + +`--upgrade-max-surge` (optional) +: Maximum number of extra nodes to create during a surge upgrade. + +`--upgrade-max-unavailable` (optional) +: Maximum number of nodes that may be unavailable during an upgrade. + +`--dry-run` (optional) +: Print the update payload without sending the request. + +## Examples + +Scale a node group to 5 nodes: + +```bash +grn vks update-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --image-id img-ubuntu-22-04-k8s \ + --num-nodes 5 +``` + +Update node image and set auto-scaling limits: + +```bash +grn vks update-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --image-id img-ubuntu-22-04-k8s-v2 \ + --auto-scale-min 2 \ + --auto-scale-max 10 +``` + +Update labels and taints: + +```bash +grn vks update-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --image-id img-ubuntu-22-04-k8s \ + --labels env=prod,tier=app \ + --taints dedicated=gpu:NoSchedule +``` + +Preview the update payload (dry run): + +```bash +grn vks update-nodegroup \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --nodegroup-id ng-abc12345-6789-def0-1234-abcdef012345 \ + --image-id img-ubuntu-22-04-k8s \ + --num-nodes 3 \ + --dry-run +``` diff --git a/docs/commands/vks/wait-cluster-active.md b/docs/commands/vks/wait-cluster-active.md new file mode 100644 index 0000000..d1e55fe --- /dev/null +++ b/docs/commands/vks/wait-cluster-active.md @@ -0,0 +1,70 @@ +# wait-cluster-active + +## Description + +Poll a VKS cluster until it reaches `ACTIVE` status. Progress is written to stderr so it does not interfere with stdout output or piping. The waiter exits with code `0` on success, and `255` if the cluster reaches `ERROR`/`FAILED` status or the maximum number of attempts is exceeded. + +Default timeout: 40 attempts × 15 seconds = **10 minutes**. + +## Synopsis + +``` +grn vks wait-cluster-active + --cluster-id + [--delay ] + [--max-attempts ] +``` + +## Options + +`--cluster-id` (required) +: ID of the cluster to wait for. + +`--delay` (optional) +: Seconds to wait between each poll. Default: `15`. + +`--max-attempts` (optional) +: Maximum number of polling attempts before the waiter times out. Default: `40`. + +## Examples + +Wait for a cluster to become active (default timeout of 10 minutes): + +```bash +grn vks wait-cluster-active \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 +``` + +Wait with shorter polling interval and more attempts (up to 20 minutes): + +```bash +grn vks wait-cluster-active \ + --cluster-id cls-abc12345-6789-def0-1234-abcdef012345 \ + --delay 10 \ + --max-attempts 120 +``` + +Create a cluster and wait for it to become active in one pipeline: + +```bash +grn vks create-cluster \ + --name my-cluster \ + --k8s-version v1.29.1 \ + --network-type CILIUM_NATIVE_ROUTING \ + --vpc-id net-abc12345-0000-0000-0000-000000000001 \ + --subnet-id sub-abc12345-0000-0000-0000-000000000001 \ + --node-group-name default-ng \ + --flavor-id flv-2c4g \ + --image-id img-ubuntu-22-04-k8s \ + --disk-type SSD \ + --ssh-key-id key-abc12345-0000-0000-0000-000000000001 \ + --output json | jq -r '.id' \ + | xargs -I{} grn vks wait-cluster-active --cluster-id {} +``` + +## Exit Codes + +| Code | Meaning | +|------|---------| +| `0` | Cluster reached `ACTIVE` status | +| `255` | Cluster reached `ERROR` or `FAILED` status, or waiter timed out | diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..ccb0d88 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,100 @@ +# Configuration + +## Initial setup + +```bash +grn configure +``` + +This will prompt for: + +``` +GRN Client ID [None]: +GRN Client Secret [None]: +Default region name [HCM-3]: +Default output format [json]: +``` + +Credentials are obtained from the [VNG Cloud IAM Portal](https://hcm-3.console.vngcloud.vn/iam/) under Service Accounts. + +## Config files + +Credentials and config are stored in separate files: + +```ini +# ~/.greenode/credentials +[default] +client_id = 5028b2cb-cb0f-4249-ae1e-1c51b2bcf6e6 +client_secret = abc123 + +[staging] +client_id = xxx +client_secret = yyy +``` + +```ini +# ~/.greenode/config +[default] +region = HCM-3 +output = json + +[profile staging] +region = HAN +output = table +``` + +Credentials file is created with `0600` permissions (owner read/write only). + +## Configuration commands + +```bash +grn configure # Interactive setup +grn configure list # Show all config values and sources +grn configure get region # Get a specific value +grn configure set region HAN # Set a specific value +``` + +### `grn configure list` output + +``` + Name Value Type Location + ---- ----- ---- -------- + profile None None + client_id ****************bc6e config-file ~/.greenode/credentials + client_secret ****************c123 config-file ~/.greenode/credentials + region HCM-3 config-file ~/.greenode/config + output json config-file ~/.greenode/config +``` + +## Profiles + +```bash +# Configure a named profile +grn configure --profile staging + +# Use a named profile +grn --profile staging vks list-clusters + +# Or via environment variable +export GRN_PROFILE=staging +grn vks list-clusters +``` + +## Environment variables + +| Variable | Description | +|----------|-------------| +| `GRN_CLIENT_ID` | Client ID (overrides config file) | +| `GRN_CLIENT_SECRET` | Client Secret (overrides config file) | +| `GRN_DEFAULT_REGION` | Default region | +| `GRN_PROFILE` | Profile name | +| `GRN_DEFAULT_OUTPUT` | Output format | + +Environment variables take priority over config file values. + +## Available regions + +| Region | VKS Endpoint | +|--------|-------------| +| `HCM-3` | `https://vks.api.vngcloud.vn` | +| `HAN` | `https://vks-han-1.api.vngcloud.vn` | diff --git a/docs/development/contributing.md b/docs/development/contributing.md new file mode 100644 index 0000000..2a443a5 --- /dev/null +++ b/docs/development/contributing.md @@ -0,0 +1,22 @@ +# Contributing + +See [CONTRIBUTING.md](https://github.com/vngcloud/greennode-cli/blob/main/CONTRIBUTING.md) for the full contributing guide. + +## Quick start + +```bash +git clone https://github.com/vngcloud/greennode-cli.git +cd greennode-cli +python -m venv .venv +source .venv/bin/activate +pip install -e ".[dev]" +python -m pytest tests/ -v +``` + +## Adding a new service + +1. Create `grncli/customizations//` +2. Write commands extending `BasicCommand` +3. Register in `grncli/handlers.py` + +See `grncli/customizations/vks/` for a complete reference implementation. diff --git a/docs/development/release.md b/docs/development/release.md new file mode 100644 index 0000000..fc83355 --- /dev/null +++ b/docs/development/release.md @@ -0,0 +1,52 @@ +# Release Process + +## Adding changelog entries + +Every PR should include a changelog fragment: + +```bash +./scripts/new-change # Interactive +./scripts/new-change -t feature -c vks -d "Add new command" # CLI args +``` + +Change types: `feature`, `bugfix`, `enhancement`, `api-change` + +## Creating a release + +```bash +./scripts/bump-version patch # 0.1.0 → 0.1.1 +./scripts/bump-version minor # 0.1.0 → 0.2.0 +./scripts/bump-version major # 0.1.0 → 1.0.0 +git push && git push --tags # Triggers GitHub Actions release +``` + +The `bump-version` script automatically: + +1. Updates version in `grncli/__init__.py` +2. Merges changelog fragments into versioned file +3. Regenerates `CHANGELOG.md` +4. Commits and tags + +## CI/CD workflows + +| Workflow | Trigger | Purpose | +|----------|---------|---------| +| `run-tests.yml` | PR, push to main/develop | Test matrix: Python 3.10-3.13 × Ubuntu/macOS/Windows | +| `release.yml` | Tag push `v*`, manual dispatch | Build + GitHub Release + PyPI publish | +| `bundle-test.yml` | PR, push to main/develop | Test offline bundle installation | +| `stale.yml` | Daily schedule | Auto-close stale issues | + +## Release flow + +``` +Developer workflow: +1. During development: ./scripts/new-change (add fragments per PR) +2. Ready to release: ./scripts/bump-version minor +3. Push: git push && git push --tags + +GitHub Actions (automatic): +4. run-tests → Tests pass +5. release → Build wheel + sdist + bundle +6. → Create GitHub Release with artifacts +7. → Publish to PyPI (requires approval) +``` diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..7bbd000 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,37 @@ +# Greenode CLI + +Universal Command Line Interface for Green Node. + +The Greenode CLI (`grn`) is a unified tool to manage your Green Node services from the command line. It is modeled after the AWS CLI architecture and supports hand-written commands, with VKS (VNG Kubernetes Service) as the first service. + +## Quick Start + +```bash +# Install +pip install grncli + +# Configure credentials +grn configure + +# List your VKS clusters +grn vks list-clusters + +# Get cluster details +grn vks get-cluster --cluster-id +``` + +## Features + +- **VKS Management** — Full cluster and node group lifecycle (create, get, update, delete) +- **Multiple Output Formats** — JSON, table, and text with JMESPath query filtering +- **Auto-pagination** — List commands fetch all pages by default +- **Dry-run** — Validate parameters before create/update/delete +- **Delete Confirmation** — Preview and confirm before destructive operations +- **Waiter Commands** — Wait for async operations to complete +- **Profile Support** — Multiple credential profiles for different environments +- **Retry with Backoff** — Automatic retry for transient errors (5xx, timeouts) +- **Security** — Credentials masked in output, input validation, SSL by default + +## Adding New Services + +Other product teams can add CLI commands for their service. See [Contributing](development/contributing.md) for details. diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..53d00de --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,78 @@ +# Installation + +## Prerequisites + +- Python 3.10 or later +- `pip` 21.0 or greater +- `setuptools` 68.0 or greater + +## Install from PyPI + +The recommended way to install the Greenode CLI is to use `pip` in a `virtualenv`: + +```bash +python -m pip install grncli +``` + +or, if you are not installing in a `virtualenv`, to install globally: + +```bash +sudo python -m pip install grncli +``` + +or for your user: + +```bash +python -m pip install --user grncli +``` + +If you have the grncli package installed and want to upgrade to the latest version: + +```bash +python -m pip install --upgrade grncli +``` + +## Install from source + +```bash +git clone https://github.com/vngcloud/greennode-cli.git +cd greennode-cli +python -m pip install . +``` + +To install with development dependencies: + +```bash +python -m pip install -e ".[dev]" +``` + +## Bundled installer + +On Linux and macOS, the Greenode CLI can be installed using a standalone installer that creates an isolated virtualenv: + +```bash +./scripts/install +``` + +This installs to `~/.local/lib/greenode` and symlinks `grn` to `~/.local/bin/`. Make sure `~/.local/bin` is in your `PATH`. + +## Offline install + +For environments without internet access, you can build a self-contained bundle: + +```bash +# On a machine with internet access +./scripts/make-bundle + +# Transfer dist/grncli-bundle.zip to target machine, then: +unzip grncli-bundle.zip +cd grncli-bundle +./install-offline +``` + +## Verify installation + +```bash +grn --version +# grn-cli/0.1.0 Python/3.13.5 Darwin/25.2.0 +``` diff --git a/docs/usage/dry-run.md b/docs/usage/dry-run.md new file mode 100644 index 0000000..97f66bb --- /dev/null +++ b/docs/usage/dry-run.md @@ -0,0 +1,67 @@ +# Dry-run & Confirmation + +## Dry-run + +All create, update, and delete commands support `--dry-run`: + +```bash +# Validate create parameters without calling API +grn vks create-cluster --dry-run --name my-cluster --k8s-version v1.30 ... +grn vks create-nodegroup --dry-run --cluster-id k8s-xxxxx --name workers ... + +# Preview update parameters +grn vks update-cluster --dry-run --cluster-id k8s-xxxxx --k8s-version v1.31 --whitelist-node-cidrs 0.0.0.0/0 +grn vks update-nodegroup --dry-run --cluster-id k8s-xxxxx --nodegroup-id ng-xxxxx --image-id img-xxxxx + +# Preview what will be deleted +grn vks delete-cluster --dry-run --cluster-id k8s-xxxxx +grn vks delete-nodegroup --dry-run --cluster-id k8s-xxxxx --nodegroup-id ng-xxxxx +``` + +### Create dry-run + +Validates parameters offline: + +- Cluster/nodegroup name format +- Disk size range (20-5000 GiB) +- Number of nodes range (0-10) +- CIDR requirement for CALICO/CILIUM_OVERLAY networks + +### Delete dry-run + +Fetches and displays resources that will be deleted: + +``` +=== DRY RUN: The following resources will be deleted === + +Cluster: + ID: k8s-xxxxx + Name: my-cluster + Status: ACTIVE + Version: v1.30.10 + Nodes: 3 + +Node groups (1): + - default (ID: ng-xxxxx, nodes: 3) + +Run without --dry-run to delete. +``` + +## Delete confirmation + +Delete commands show a preview and prompt for confirmation: + +```bash +grn vks delete-cluster --cluster-id k8s-xxxxx +# The following resources will be deleted: +# ... +# Are you sure you want to delete this cluster? (yes/no): yes +``` + +### Skip confirmation + +Use `--force` to skip the confirmation prompt (for scripting): + +```bash +grn vks delete-cluster --cluster-id k8s-xxxxx --force +``` diff --git a/docs/usage/getting-started.md b/docs/usage/getting-started.md new file mode 100644 index 0000000..6939777 --- /dev/null +++ b/docs/usage/getting-started.md @@ -0,0 +1,52 @@ +# Getting Started + +## Help + +```bash +grn # Show available commands +grn help # Same +grn vks # Show available VKS commands +grn vks create-cluster help # Show command help with required/optional args +``` + +## Command structure + +``` +grn [global-options] [command-options] +``` + +Example: + +```bash +grn --profile staging --output table vks list-clusters --page-size 20 +``` + +## Basic commands + +```bash +# List clusters +grn vks list-clusters + +# Get cluster details +grn vks get-cluster --cluster-id k8s-xxxxx + +# Create a cluster +grn vks create-cluster \ + --name my-cluster \ + --k8s-version v1.30.10-vks.1746550800 \ + --network-type CILIUM_OVERLAY \ + --vpc-id net-xxxxx \ + --subnet-id sub-xxxxx \ + --cidr 192.168.0.0/16 \ + --node-group-name default \ + --flavor-id flav-xxxxx \ + --image-id img-xxxxx \ + --disk-type vtype-xxxxx \ + --ssh-key-id ssh-xxxxx + +# Delete a cluster (prompts for confirmation) +grn vks delete-cluster --cluster-id k8s-xxxxx + +# Wait for cluster to be ready +grn vks wait-cluster-active --cluster-id k8s-xxxxx +``` diff --git a/docs/usage/global-options.md b/docs/usage/global-options.md new file mode 100644 index 0000000..6890db9 --- /dev/null +++ b/docs/usage/global-options.md @@ -0,0 +1,46 @@ +# Global Options + +Global options are placed before the service name: + +```bash +grn [global-options] [command-options] +``` + +## Options + +| Option | Description | +|--------|-------------| +| `--profile ` | Use a specific profile from credential file | +| `--region ` | Override region (overrides config/env settings) | +| `--output ` | Output format: `json`, `text`, `table` | +| `--query ` | JMESPath query to filter response data | +| `--endpoint-url ` | Override service URL | +| `--no-verify-ssl` | Disable SSL certificate verification | +| `--debug` | Enable debug logging | +| `--cli-read-timeout ` | Socket read timeout in seconds (default: 30) | +| `--cli-connect-timeout ` | Socket connect timeout in seconds (default: 30) | +| `--color ` | Color output control | +| `--version` | Display version info | + +## Examples + +```bash +# Use staging profile +grn --profile staging vks list-clusters + +# Override region +grn --region HAN vks list-clusters + +# Custom endpoint (for local testing) +grn --endpoint-url http://localhost:8080 vks list-clusters + +# Disable SSL (dev only) +grn --no-verify-ssl vks list-clusters +# Warning: SSL certificate verification is disabled. This is insecure and should only be used for testing. + +# Debug logging +grn --debug vks list-clusters + +# Custom timeout +grn --cli-read-timeout 60 vks list-clusters +``` diff --git a/docs/usage/output.md b/docs/usage/output.md new file mode 100644 index 0000000..aacd4a4 --- /dev/null +++ b/docs/usage/output.md @@ -0,0 +1,56 @@ +# Output Formatting + +## Output formats + +```bash +grn vks list-clusters --output json # JSON (default) +grn vks list-clusters --output table # Table +grn vks list-clusters --output text # Tab-separated text +``` + +### JSON (default) + +```json +{ + "items": [ + { + "id": "k8s-xxxxx", + "name": "my-cluster", + "status": "ACTIVE" + } + ], + "total": 1 +} +``` + +### Table + +``` +id | name | status +----------+------------+------- +k8s-xxxxx | my-cluster | ACTIVE +``` + +### Text + +``` +k8s-xxxxx my-cluster ACTIVE +``` + +## JMESPath query + +Use `--query` to filter response data with [JMESPath](https://jmespath.org/) expressions: + +```bash +# Get only cluster names +grn vks list-clusters --query "items[].name" +# ["my-cluster", "prod-cluster"] + +# Get cluster status +grn vks get-cluster --cluster-id k8s-xxxxx --query "status" +# "ACTIVE" + +# Filter clusters by status +grn vks list-clusters --query "items[?status=='ACTIVE'].name" +# ["my-cluster"] +``` diff --git a/docs/usage/pagination.md b/docs/usage/pagination.md new file mode 100644 index 0000000..964e56b --- /dev/null +++ b/docs/usage/pagination.md @@ -0,0 +1,26 @@ +# Pagination + +List commands auto-paginate by default, fetching all pages and merging results. + +## Default behavior + +```bash +# Returns all clusters (auto-pagination) +grn vks list-clusters +``` + +## Disable auto-pagination + +```bash +# First page only +grn vks list-clusters --no-paginate + +# Specific page (0-based) +grn vks list-clusters --page 2 + +# Custom page size (default: 50) +grn vks list-clusters --page-size 20 +``` + +!!! note + When `--page` is specified, auto-pagination is disabled and only that page is returned. diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..8518ca8 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,67 @@ +site_name: Greenode CLI +site_url: https://vngcloud.github.io/greennode-cli/ +site_description: Universal Command Line Interface for Green Node +repo_url: https://github.com/vngcloud/greennode-cli +repo_name: vngcloud/greennode-cli + +theme: + name: material + palette: + - scheme: default + primary: green + accent: light green + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - scheme: slate + primary: green + accent: light green + toggle: + icon: material/brightness-4 + name: Switch to light mode + features: + - navigation.sections + - navigation.expand + - navigation.top + - search.suggest + - content.code.copy + +nav: + - Home: index.md + - Installation: installation.md + - Configuration: configuration.md + - Usage: + - Getting Started: usage/getting-started.md + - Output Formatting: usage/output.md + - Pagination: usage/pagination.md + - Dry-run & Confirmation: usage/dry-run.md + - Global Options: usage/global-options.md + - VKS Commands: + - Overview: commands/vks/index.md + - Cluster: + - list-clusters: commands/vks/list-clusters.md + - get-cluster: commands/vks/get-cluster.md + - create-cluster: commands/vks/create-cluster.md + - update-cluster: commands/vks/update-cluster.md + - delete-cluster: commands/vks/delete-cluster.md + - Node Group: + - list-nodegroups: commands/vks/list-nodegroups.md + - get-nodegroup: commands/vks/get-nodegroup.md + - create-nodegroup: commands/vks/create-nodegroup.md + - update-nodegroup: commands/vks/update-nodegroup.md + - delete-nodegroup: commands/vks/delete-nodegroup.md + - Waiter: + - wait-cluster-active: commands/vks/wait-cluster-active.md + - Development: + - Contributing: development/contributing.md + - Release Process: development/release.md + - Changelog: changelog.md + +markdown_extensions: + - admonition + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - tables