From fef81456961720aa348e0a9c77060ecbefe73972 Mon Sep 17 00:00:00 2001 From: Abhineet Jain Date: Thu, 21 Jul 2022 17:00:56 +0000 Subject: [PATCH 1/4] implement templates version cli --- cli/templatelist.go | 1 + cli/templatelist_test.go | 65 ++++++++++++++++++++++++++++++++++++ cli/templateversions.go | 55 +++++++++++++++++++++++++++--- cli/templateversions_test.go | 40 ++++++++++++++++++++++ 4 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 cli/templatelist_test.go create mode 100644 cli/templateversions_test.go diff --git a/cli/templatelist.go b/cli/templatelist.go index a8a1315a1f0c9..4691b8a94ebfc 100644 --- a/cli/templatelist.go +++ b/cli/templatelist.go @@ -13,6 +13,7 @@ func templateList() *cobra.Command { ) cmd := &cobra.Command{ Use: "list", + Short: "List all the templates available for the organization", Aliases: []string{"ls"}, RunE: func(cmd *cobra.Command, args []string) error { client, err := createClient(cmd) diff --git a/cli/templatelist_test.go b/cli/templatelist_test.go new file mode 100644 index 0000000000000..0f660e4bd4d79 --- /dev/null +++ b/cli/templatelist_test.go @@ -0,0 +1,65 @@ +package cli_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/coder/coder/cli/clitest" + "github.com/coder/coder/coderd/coderdtest" + "github.com/coder/coder/pty/ptytest" +) + +func TestTemplateList(t *testing.T) { + t.Parallel() + t.Run("ListTemplates", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) + user := coderdtest.CreateFirstUser(t, client) + firstVersion := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + _ = coderdtest.AwaitTemplateVersionJob(t, client, firstVersion.ID) + firstTemplate := coderdtest.CreateTemplate(t, client, user.OrganizationID, firstVersion.ID) + + secondVersion := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + _ = coderdtest.AwaitTemplateVersionJob(t, client, secondVersion.ID) + secondTemplate := coderdtest.CreateTemplate(t, client, user.OrganizationID, secondVersion.ID) + + cmd, root := clitest.New(t, "templates", "list") + clitest.SetupConfig(t, client, root) + + pty := ptytest.New(t) + cmd.SetIn(pty.Input()) + cmd.SetOut(pty.Output()) + + errC := make(chan error) + go func() { + errC <- cmd.Execute() + }() + + require.NoError(t, <-errC) + + pty.ExpectMatch(firstTemplate.Name) + pty.ExpectMatch(secondTemplate.Name) + }) + t.Run("NoTemplates", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) + coderdtest.CreateFirstUser(t, client) + + cmd, root := clitest.New(t, "templates", "list") + clitest.SetupConfig(t, client, root) + + pty := ptytest.New(t) + cmd.SetIn(pty.Input()) + cmd.SetOut(pty.Output()) + + errC := make(chan error) + go func() { + errC <- cmd.Execute() + }() + + require.NoError(t, <-errC) + + pty.ExpectMatch("No templates found in testuser! Create one:") + }) +} diff --git a/cli/templateversions.go b/cli/templateversions.go index 668b7dbf4ca63..d62cc76103e06 100644 --- a/cli/templateversions.go +++ b/cli/templateversions.go @@ -1,15 +1,62 @@ package cli -import "github.com/spf13/cobra" +import ( + "fmt" + + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/xerrors" + + "github.com/coder/coder/cli/cliui" + "github.com/coder/coder/codersdk" +) func templateVersions() *cobra.Command { return &cobra.Command{ - Use: "versions", + Use: "versions [template]", + Args: cobra.ExactArgs(1), + Short: "List all the versions of the specified template", Aliases: []string{"version"}, RunE: func(cmd *cobra.Command, args []string) error { - return nil + client, err := createClient(cmd) + if err != nil { + return xerrors.Errorf("create client: %w", err) + } + organization, err := currentOrganization(cmd, client) + if err != nil { + return xerrors.Errorf("get current organization: %w", err) + } + template, err := client.TemplateByName(cmd.Context(), organization.ID, args[0]) + if err != nil { + return xerrors.Errorf("get template by name: %w", err) + } + req := codersdk.TemplateVersionsByTemplateRequest{ + TemplateID: template.ID, + } + + versions, err := client.TemplateVersionsByTemplate(cmd.Context(), req) + if err != nil { + return xerrors.Errorf("get template versions by template: %w", err) + } + _, err = fmt.Fprintln(cmd.OutOrStdout(), displayTemplateVersions(versions...)) + return err }, } } -// coder template versions +// displayTemplateVersions will return a table displaying existing +// template versions for the specified template. +func displayTemplateVersions(templateVersions ...codersdk.TemplateVersion) string { + tableWriter := cliui.Table() + header := table.Row{ + "Name", "Created At", "Created By"} + tableWriter.AppendHeader(header) + for _, templateVersion := range templateVersions { + tableWriter.AppendRow(table.Row{ + templateVersion.Name, + templateVersion.CreatedAt.Format("03:04:05PM MST on Jan 2, 2006"), + templateVersion.CreatedByName, + }) + } + return tableWriter.Render() +} diff --git a/cli/templateversions_test.go b/cli/templateversions_test.go new file mode 100644 index 0000000000000..490766e91eb6b --- /dev/null +++ b/cli/templateversions_test.go @@ -0,0 +1,40 @@ +package cli_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/coder/coder/cli/clitest" + "github.com/coder/coder/coderd/coderdtest" + "github.com/coder/coder/pty/ptytest" +) + +func TestTemplateVersions(t *testing.T) { + t.Parallel() + t.Run("ListVersions", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) + user := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + _ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + + cmd, root := clitest.New(t, "templates", "versions", template.Name) + clitest.SetupConfig(t, client, root) + + pty := ptytest.New(t) + cmd.SetIn(pty.Input()) + cmd.SetOut(pty.Output()) + + errC := make(chan error) + go func() { + errC <- cmd.Execute() + }() + + require.NoError(t, <-errC) + + pty.ExpectMatch(version.Name) + pty.ExpectMatch(version.CreatedByName) + }) +} From 047766f89d1860da015d81e197225926c4db23d8 Mon Sep 17 00:00:00 2001 From: Abhineet Jain Date: Thu, 21 Jul 2022 19:56:14 +0000 Subject: [PATCH 2/4] update command to versions show --- cli/templateversions.go | 28 +++++++++++++++++++++++----- cli/templateversions_test.go | 2 +- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/cli/templateversions.go b/cli/templateversions.go index d62cc76103e06..74254da7eb0d8 100644 --- a/cli/templateversions.go +++ b/cli/templateversions.go @@ -12,11 +12,29 @@ import ( ) func templateVersions() *cobra.Command { - return &cobra.Command{ - Use: "versions [template]", - Args: cobra.ExactArgs(1), - Short: "List all the versions of the specified template", + cmd := &cobra.Command{ + Use: "versions", + Short: "Manage different versions of the specified template", Aliases: []string{"version"}, + Example: formatExamples( + example{ + Description: "Show versions of a specific template", + Command: "coder templates versions show my-template", + }, + ), + } + cmd.AddCommand( + templateVersionsShow(), + ) + + return cmd +} + +func templateVersionsShow() *cobra.Command { + return &cobra.Command{ + Use: "show