feat(cli): add CLI support for listing presets (#18910)

## Description 

This PR introduces a new `list presets` command to display the presets
associated with a given template.
By default, it displays the presets for the template's active version,
unless a `--template-version` flag is provided.

## Changes

* Added a new `list presets` command under `coder templates presets` to
display presets associated with a template.
* By default, the command lists presets from the template’s active
version.
* Users can override the default behavior by providing the
`--template-version` flag to target a specific version.

```
> coder templates versions presets list --help

USAGE:
  coder templates presets list [flags] <template>

  List all presets of the specified template. Defaults to the active template version.

OPTIONS:
  -O, --org string, $CODER_ORGANIZATION
          Select which organization (uuid or name) to use.

  -c, --column [name|parameters|default|desired prebuild instances] (default: name,parameters,default,desired prebuild instances)
          Columns to display in table output.

  -o, --output table|json (default: table)
          Output format.

      --template-version string
          Specify a template version to list presets for. Defaults to the active version.
```

Related PR: https://github.com/coder/coder/pull/18912 - please consider
both PRs together as they’re part of the same workflow
Relates to issue: https://github.com/coder/coder/issues/16594

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added CLI commands to manage and list presets for specific template
versions, supporting tabular and JSON output.
* Introduced a new CLI subcommand group for template version presets,
including detailed help and documentation.
* Added support for displaying and managing the desired number of
prebuild instances for presets in CLI, API, and UI.

* **Documentation**
* Updated and expanded CLI and API documentation to describe new
commands, options, and the desired prebuild instances field in presets.
* Added new help output and reference files for template version presets
commands.

* **Bug Fixes**
* Ensured correct handling and display of the desired prebuild instances
property for presets across CLI, API, and UI.

* **Tests**
* Introduced end-to-end tests for listing template version presets,
covering scenarios with and without presets.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Susana Ferreira
2025-07-24 16:44:36 +01:00
committed by GitHub
parent 070178c454
commit 931b97caab
18 changed files with 584 additions and 22 deletions
+3
View File
@@ -14880,6 +14880,9 @@ const docTemplate = `{
"default": {
"type": "boolean"
},
"desiredPrebuildInstances": {
"type": "integer"
},
"id": {
"type": "string"
},
+3
View File
@@ -13487,6 +13487,9 @@
"default": {
"type": "boolean"
},
"desiredPrebuildInstances": {
"type": "integer"
},
"id": {
"type": "string"
},
+13 -3
View File
@@ -1,6 +1,7 @@
package coderd
import (
"database/sql"
"net/http"
"github.com/coder/coder/v2/coderd/httpapi"
@@ -38,12 +39,21 @@ func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request)
return
}
convertPrebuildInstances := func(desiredInstances sql.NullInt32) *int {
if desiredInstances.Valid {
value := int(desiredInstances.Int32)
return &value
}
return nil
}
var res []codersdk.Preset
for _, preset := range presets {
sdkPreset := codersdk.Preset{
ID: preset.ID,
Name: preset.Name,
Default: preset.IsDefault,
ID: preset.ID,
Name: preset.Name,
Default: preset.IsDefault,
DesiredPrebuildInstances: convertPrebuildInstances(preset.DesiredInstances),
}
for _, presetParam := range presetParams {
if presetParam.TemplateVersionPresetID != preset.ID {