From fc3336c14017d3cd622a1ece354599893df659a1 Mon Sep 17 00:00:00 2001 From: Sam Park Date: Thu, 12 Aug 2021 05:26:34 +0000 Subject: [PATCH 1/5] Option to list all workspaces From an admin POV, this will be helpful for various reasons. --- internal/cmd/ceapi.go | 9 ++++++--- internal/cmd/workspaces.go | 17 +++++++++++++---- internal/cmd/workspaces_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/internal/cmd/ceapi.go b/internal/cmd/ceapi.go index c58b8161..e264b65c 100644 --- a/internal/cmd/ceapi.go +++ b/internal/cmd/ceapi.go @@ -215,10 +215,13 @@ func getWorkspacesByProvider(ctx context.Context, client coder.Client, wpName, u return nil, err } - workspaces, err = filterWorkspacesByUser(ctx, client, userEmail, workspaces) - if err != nil { - return nil, err + if userEmail != "" { + workspaces, err = filterWorkspacesByUser(ctx, client, userEmail, workspaces) + if err != nil { + return nil, err + } } + return workspaces, nil } diff --git a/internal/cmd/workspaces.go b/internal/cmd/workspaces.go index ff70b64d..0cfda0f9 100644 --- a/internal/cmd/workspaces.go +++ b/internal/cmd/workspaces.go @@ -70,6 +70,7 @@ const ( func lsWorkspacesCommand() *cobra.Command { var ( + all bool outputFmt string user string provider string @@ -85,11 +86,18 @@ func lsWorkspacesCommand() *cobra.Command { if err != nil { return err } - workspaces, err := getWorkspaces(ctx, client, user) - if err != nil { - return err + var workspaces []coder.Workspace + if !all { + var err error + workspaces, err = getWorkspaces(ctx, client, user) + if err != nil { + return err + } + } else { + // If the user gave the all flag, then filtering by user doesn't make sense. + user = "" } - if provider != "" { + if provider != "" || all { workspaces, err = getWorkspacesByProvider(ctx, client, provider, user) if err != nil { return err @@ -124,6 +132,7 @@ func lsWorkspacesCommand() *cobra.Command { }, } + cmd.Flags().BoolVar(&all, "all", false, "Get workspaces for all users") cmd.Flags().StringVar(&user, "user", coder.Me, "Specify the user whose resources to target") cmd.Flags().StringVarP(&outputFmt, "output", "o", humanOutput, "human | json") cmd.Flags().StringVarP(&provider, "provider", "p", "", "Filter workspaces by a particular workspace provider name.") diff --git a/internal/cmd/workspaces_test.go b/internal/cmd/workspaces_test.go index 5dd3d01b..89e5fd08 100644 --- a/internal/cmd/workspaces_test.go +++ b/internal/cmd/workspaces_test.go @@ -29,6 +29,34 @@ func Test_workspaces_ls(t *testing.T) { res.stdoutUnmarshals(t, &workspaces) } +func Test_workspaces_ls_all(t *testing.T) { + skipIfNoAuth(t) + for _, test := range []struct { + name string + command []string + assert func(r result) + }{ + { + name: "simple list", + command: []string{"workspaces", "ls", "--all"}, + assert: func(r result) { r.success(t) }, + }, + { + name: "list as json", + command: []string{"workspaces", "ls", "--all", "--output", "json"}, + assert: func(r result) { + var workspaces []coder.Workspace + r.stdoutUnmarshals(t, &workspaces) + }, + }, + } { + test := test + t.Run(test.name, func(t *testing.T) { + test.assert(execute(t, nil, test.command...)) + }) + } +} + func Test_workspaces_ls_by_provider(t *testing.T) { skipIfNoAuth(t) for _, test := range []struct { From 36ececbeb462a965830907f9dee888ec28debe46 Mon Sep 17 00:00:00 2001 From: goodspark Date: Thu, 12 Aug 2021 09:12:52 -0700 Subject: [PATCH 2/5] Update internal/cmd/workspaces.go Co-authored-by: Dean Sheather --- internal/cmd/workspaces.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cmd/workspaces.go b/internal/cmd/workspaces.go index 0cfda0f9..00db5c95 100644 --- a/internal/cmd/workspaces.go +++ b/internal/cmd/workspaces.go @@ -132,7 +132,7 @@ func lsWorkspacesCommand() *cobra.Command { }, } - cmd.Flags().BoolVar(&all, "all", false, "Get workspaces for all users") + cmd.Flags().BoolVar(&all, "all", false, "Get workspaces for all users (admin only)") cmd.Flags().StringVar(&user, "user", coder.Me, "Specify the user whose resources to target") cmd.Flags().StringVarP(&outputFmt, "output", "o", humanOutput, "human | json") cmd.Flags().StringVarP(&provider, "provider", "p", "", "Filter workspaces by a particular workspace provider name.") From e6709782b7cab433215696ac6ad52fe438f01cb4 Mon Sep 17 00:00:00 2001 From: Sam Park Date: Thu, 12 Aug 2021 16:19:56 +0000 Subject: [PATCH 3/5] Fixes --- internal/cmd/ceapi.go | 14 ++++++++------ internal/cmd/workspaces.go | 17 ++++++++++------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/internal/cmd/ceapi.go b/internal/cmd/ceapi.go index e264b65c..0c5ca004 100644 --- a/internal/cmd/ceapi.go +++ b/internal/cmd/ceapi.go @@ -32,6 +32,11 @@ func lookupUserOrgs(user *coder.User, orgs []coder.Organization) []coder.Organiz return userOrgs } +// getAllWorkspaces gets all workspaces for all users, on all providers. +func getAllWorkspaces(ctx context.Context, client coder.Client) ([]coder.Workspace, error) { + return client.Workspaces(ctx) +} + // getWorkspaces returns all workspaces for the user. func getWorkspaces(ctx context.Context, client coder.Client, email string) ([]coder.Workspace, error) { user, err := client.UserByEmail(ctx, email) @@ -215,13 +220,10 @@ func getWorkspacesByProvider(ctx context.Context, client coder.Client, wpName, u return nil, err } - if userEmail != "" { - workspaces, err = filterWorkspacesByUser(ctx, client, userEmail, workspaces) - if err != nil { - return nil, err - } + workspaces, err = filterWorkspacesByUser(ctx, client, userEmail, workspaces) + if err != nil { + return nil, err } - return workspaces, nil } diff --git a/internal/cmd/workspaces.go b/internal/cmd/workspaces.go index 00db5c95..6b1db957 100644 --- a/internal/cmd/workspaces.go +++ b/internal/cmd/workspaces.go @@ -87,21 +87,24 @@ func lsWorkspacesCommand() *cobra.Command { return err } var workspaces []coder.Workspace - if !all { + if all { var err error - workspaces, err = getWorkspaces(ctx, client, user) + workspaces, err = getAllWorkspaces(ctx, client) if err != nil { return err } - } else { - // If the user gave the all flag, then filtering by user doesn't make sense. - user = "" - } - if provider != "" || all { + } else if provider != "" { + var err error workspaces, err = getWorkspacesByProvider(ctx, client, provider, user) if err != nil { return err } + } else { + var err error + workspaces, err = getWorkspaces(ctx, client, user) + if err != nil { + return err + } } if len(workspaces) < 1 { clog.LogInfo("no workspaces found") From abc16840788941c0cbaf67b28630ea7fd047dbae Mon Sep 17 00:00:00 2001 From: goodspark Date: Thu, 12 Aug 2021 13:42:10 -0700 Subject: [PATCH 4/5] Update internal/cmd/workspaces.go Co-authored-by: Dean Sheather --- internal/cmd/workspaces.go | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/internal/cmd/workspaces.go b/internal/cmd/workspaces.go index 6b1db957..95c65e97 100644 --- a/internal/cmd/workspaces.go +++ b/internal/cmd/workspaces.go @@ -88,23 +88,14 @@ func lsWorkspacesCommand() *cobra.Command { } var workspaces []coder.Workspace if all { - var err error workspaces, err = getAllWorkspaces(ctx, client) - if err != nil { - return err - } } else if provider != "" { - var err error workspaces, err = getWorkspacesByProvider(ctx, client, provider, user) - if err != nil { - return err - } } else { - var err error workspaces, err = getWorkspaces(ctx, client, user) - if err != nil { - return err - } + } + if err != nil { + return err } if len(workspaces) < 1 { clog.LogInfo("no workspaces found") From 49ad4506cdf617a464b7342efa5b1c4dc6928947 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Thu, 12 Aug 2021 20:59:02 +0000 Subject: [PATCH 5/5] Fix lint --- internal/cmd/workspaces.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/cmd/workspaces.go b/internal/cmd/workspaces.go index 95c65e97..f4dd7e0f 100644 --- a/internal/cmd/workspaces.go +++ b/internal/cmd/workspaces.go @@ -86,12 +86,14 @@ func lsWorkspacesCommand() *cobra.Command { if err != nil { return err } + var workspaces []coder.Workspace - if all { + switch { + case all: workspaces, err = getAllWorkspaces(ctx, client) - } else if provider != "" { + case provider != "": workspaces, err = getWorkspacesByProvider(ctx, client, provider, user) - } else { + default: workspaces, err = getWorkspaces(ctx, client, user) } if err != nil { @@ -213,7 +215,7 @@ func (*wsPinger) logSuccess(timeStr, msg string) { fmt.Printf("%s: %s\n", color.New(color.Bold, color.FgGreen).Sprint(timeStr), msg) } -// Only return fatal errors +// Only return fatal errors. func (w *wsPinger) ping(ctx context.Context) error { ctx, cancelFunc := context.WithTimeout(ctx, time.Second*15) defer cancelFunc()