mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
This change will improve over CLI performance and "snappiness" as well as substantially reduce our test times. Preliminary benchmarks show `coder server --help` times cut from 300ms to 120ms on my dogfood instance. The inefficiency of lipgloss disproportionately impacts our system, as all help text for every command is generated whenever any command is invoked. The `pretty` API could clean up a lot of the code (e.g., by replacing complex string concatenations with Printf), but this commit is too expansive as is so that work will be done in a follow up.
87 lines
2.7 KiB
Go
87 lines
2.7 KiB
Go
package cli
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/coder/pretty"
|
|
|
|
"github.com/coder/coder/v2/cli/clibase"
|
|
"github.com/coder/coder/v2/cli/cliui"
|
|
"github.com/coder/coder/v2/codersdk"
|
|
)
|
|
|
|
func (r *RootCmd) templates() *clibase.Cmd {
|
|
cmd := &clibase.Cmd{
|
|
Use: "templates",
|
|
Short: "Manage templates",
|
|
Long: "Templates are written in standard Terraform and describe the infrastructure for workspaces\n" + formatExamples(
|
|
example{
|
|
Description: "Create a template for developers to create workspaces",
|
|
Command: "coder templates create",
|
|
},
|
|
example{
|
|
Description: "Make changes to your template, and plan the changes",
|
|
Command: "coder templates plan my-template",
|
|
},
|
|
example{
|
|
Description: "Push an update to the template. Your developers can update their workspaces",
|
|
Command: "coder templates push my-template",
|
|
},
|
|
),
|
|
Aliases: []string{"template"},
|
|
Handler: func(inv *clibase.Invocation) error {
|
|
return inv.Command.HelpHandler(inv)
|
|
},
|
|
Children: []*clibase.Cmd{
|
|
r.templateCreate(),
|
|
r.templateEdit(),
|
|
r.templateInit(),
|
|
r.templateList(),
|
|
r.templatePush(),
|
|
r.templateVersions(),
|
|
r.templateDelete(),
|
|
r.templatePull(),
|
|
},
|
|
}
|
|
|
|
return cmd
|
|
}
|
|
|
|
type templateTableRow struct {
|
|
// Used by json format:
|
|
Template codersdk.Template
|
|
|
|
// Used by table format:
|
|
Name string `json:"-" table:"name,default_sort"`
|
|
CreatedAt string `json:"-" table:"created at"`
|
|
LastUpdated string `json:"-" table:"last updated"`
|
|
OrganizationID uuid.UUID `json:"-" table:"organization id"`
|
|
Provisioner codersdk.ProvisionerType `json:"-" table:"provisioner"`
|
|
ActiveVersionID uuid.UUID `json:"-" table:"active version id"`
|
|
UsedBy string `json:"-" table:"used by"`
|
|
DefaultTTL time.Duration `json:"-" table:"default ttl"`
|
|
}
|
|
|
|
// templateToRows converts a list of templates to a list of templateTableRow for
|
|
// outputting.
|
|
func templatesToRows(templates ...codersdk.Template) []templateTableRow {
|
|
rows := make([]templateTableRow, len(templates))
|
|
for i, template := range templates {
|
|
rows[i] = templateTableRow{
|
|
Template: template,
|
|
Name: template.Name,
|
|
CreatedAt: template.CreatedAt.Format("January 2, 2006"),
|
|
LastUpdated: template.UpdatedAt.Format("January 2, 2006"),
|
|
OrganizationID: template.OrganizationID,
|
|
Provisioner: template.Provisioner,
|
|
ActiveVersionID: template.ActiveVersionID,
|
|
UsedBy: pretty.Sprint(cliui.DefaultStyles.Fuchsia, formatActiveDevelopers(template.ActiveUserCount)),
|
|
DefaultTTL: (time.Duration(template.DefaultTTLMillis) * time.Millisecond),
|
|
}
|
|
}
|
|
|
|
return rows
|
|
}
|