gitpod/components/local-app/cmd/workspace-list.go
Filip Troníček e51d974c52
Local App v2 :) (#18971)
* Local App v2 :)

* bind variables correctly

* Play around with units

* Port more commands over

* Separate commands (1 per file)

* `gitpod workspace delete`

* Extract login

* Show help text when run without a command

* Fix login

* `gitpod logout`

* Simple logging

* Remove unused import

* Make host use consistent

* Fix GetToken

* Split distribution

* 🤷‍♂️

* Fix paths 🤷🤦

* Change URL of binaries

* Fix proxy binary handling

Co-authored-by: Pudong <tianshi8650@gmail.com>

* Improve logging

* Change workspace list to be up-to-spec

* `gitpod organizations list`

* Simplify table code

* `gitpod workspace get`

* Created at

* `gitpod organization get <id>`

* Hide open for now

* `workspace start --ssh`

* `ws start --open`

* server: OAuth client

* Use OAuth app

* logs

* `gitpod workspace create`

* Rename to follow singular noun semantics

* Fix nil pointers in list and go cmds

* `--field` for `gitpod organizations list`

* `gitpod ws list --field`

* Simplify some of the ws code

* Unify WS data structure

* Allow opening browser-based WSs

* `gitpod workspace open`

* Constants package to get rid of circular dependency issues

* No config file by default

* Guidance when missing in path

* Fix local companion maybe 🤷‍♂️

* Create wait for start by default

* Align scopes

* KeychainName constant

* Provide token via flag instead

* Host in scope error lookup message

* 🤷‍♂️

* Name for consistency

* Editors in go client of papi

* `gitpod workspace list-classes`

* `gitpod config`

* Infer orgs if applicable

* Remove redundant error log

* Retry mechanism for streaming

* More useful error message for unauthed

* README update

* Allow `function:getTeam`

* return org inference errors properly

* Replace config with context

* Fix config file path

* Wrap up pretty printer

* Name changes

* Remove unused vars

* 🇺🇸

* Update README

* Fix login

* [local-app] Add whoami command

* [local-app] Add context management

* Refactor common package

* Harmonise output and formatting

* Add error resolution support

* Improve resolution printing

* Add apology for system exceptions

* Add class resolutions

* Apologise more

* Add unknown field resolution

* Add better login context name

* Make it build

* `gitpod workspace list-editors`

* Fix multiple ws IDs for `ws get`

* Simplify open code

* Update local-app README with usage instructions

* Help for editor options

* Remove unused config code

* Call workspace ID field ID instead of workspace

* Improve long format output

* Fix whoami output

* Streamline workspace listing

* Introduce fancy intro

* Improve set-context feedback

* Remove common package

* Add first unit test

* Harmonise field order

* Consistency across get commands

* Consistency among list command aliases

* Fix column name in whoami

* Fix nil refs for empty hosts

* Make prettyprint writer typesafe

* Add resolutions for no token or no host found

* Fix typo

* Fix CI build

* Properly record org ID on login

* Print orgs in wide format

* Added "workspace up" functionality back in

but hidden

* Make "Git" casing consistent

https://english.stackexchange.com/questions/611711/tech-related-should-i-capitalize-the-word-git-in-this-context-or-not

* Introduce workspace up intermediary

* Fix proxied binary name

---------

Co-authored-by: Pudong <tianshi8650@gmail.com>
Co-authored-by: Christian Weichel (Chris) <chris@gitpod.io>
2023-11-06 16:32:44 +02:00

113 lines
3.1 KiB
Go

// Copyright (c) 2023 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package cmd
import (
"context"
"fmt"
"time"
"github.com/bufbuild/connect-go"
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
"github.com/gitpod-io/local-app/pkg/config"
"github.com/gitpod-io/local-app/pkg/helper"
"github.com/gitpod-io/local-app/pkg/prettyprint"
"github.com/sagikazarmark/slog-shim"
"github.com/spf13/cobra"
)
// workspaceListCmd lists all available workspaces
var workspaceListCmd = &cobra.Command{
Use: "list",
Short: "Lists workspaces",
Aliases: []string{"ls"},
RunE: func(cmd *cobra.Command, args []string) error {
cmd.SilenceUsage = true
ctx, cancel := context.WithTimeout(cmd.Context(), 5*time.Second)
defer cancel()
gitpod, err := getGitpodClient(ctx)
if err != nil {
return err
}
cfg := config.FromContext(ctx)
gpctx, err := cfg.GetActiveContext()
if err != nil {
return err
}
orgId := gpctx.OrganizationID
workspaces, err := gitpod.Workspaces.ListWorkspaces(ctx, connect.NewRequest(&v1.ListWorkspacesRequest{
OrganizationId: orgId,
}))
if err != nil {
return err
}
result := make([]tabularWorkspace, 0, len(workspaces.Msg.GetResult()))
for _, ws := range workspaces.Msg.GetResult() {
r := newTabularWorkspace(ws)
if r == nil {
continue
}
if workspaceListOpts.RunningOnly && ws.Status.Instance.Status.Phase != v1.WorkspaceInstanceStatus_PHASE_RUNNING {
continue
}
result = append(result, *r)
}
return WriteTabular(result, workspaceListOpts.Format, prettyprint.WriterFormatWide)
},
}
func newTabularWorkspace(ws *v1.Workspace) *tabularWorkspace {
if !helper.HasInstanceStatus(ws) {
slog.Debug("workspace has no instance status - removing from output", "workspace", ws.WorkspaceId)
return nil
}
var repo string
wsDetails := ws.Context.GetDetails()
switch d := wsDetails.(type) {
case *v1.WorkspaceContext_Git_:
repo = fmt.Sprintf("%s/%s", d.Git.Repository.Owner, d.Git.Repository.Name)
case *v1.WorkspaceContext_Prebuild_:
repo = fmt.Sprintf("%s/%s", d.Prebuild.OriginalContext.Repository.Owner, d.Prebuild.OriginalContext.Repository.Name)
}
var branch string
if ws.Status.Instance.Status.GitStatus != nil {
branch = ws.Status.Instance.Status.GitStatus.Branch
if branch == "" || branch == "(detached)" {
branch = ""
}
}
return &tabularWorkspace{
ID: ws.WorkspaceId,
Repository: repo,
Branch: branch,
Status: prettyprint.FormatWorkspacePhase(ws.Status.Instance.Status.Phase),
}
}
type tabularWorkspace struct {
ID string `print:"id"`
Repository string `print:"repository"`
Branch string `print:"branch"`
Status string `print:"status"`
}
var workspaceListOpts struct {
Format formatOpts
RunningOnly bool
}
func init() {
workspaceCmd.AddCommand(workspaceListCmd)
addFormatFlags(workspaceListCmd, &workspaceListOpts.Format)
workspaceListCmd.Flags().BoolVarP(&workspaceListOpts.RunningOnly, "running-only", "r", false, "Only list running workspaces")
}