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

104 lines
3.0 KiB
Go

// Copyright (c) 2022 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 client
import (
"errors"
"fmt"
"net/http"
"github.com/bufbuild/connect-go"
gitpod_experimental_v1connect "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
)
type Gitpod struct {
cfg *options
Workspaces gitpod_experimental_v1connect.WorkspacesServiceClient
Editors gitpod_experimental_v1connect.EditorServiceClient
Teams gitpod_experimental_v1connect.TeamsServiceClient
Projects gitpod_experimental_v1connect.ProjectsServiceClient
PersonalAccessTokens gitpod_experimental_v1connect.TokensServiceClient
IdentityProvider gitpod_experimental_v1connect.IdentityProviderServiceClient
User gitpod_experimental_v1connect.UserServiceClient
}
func New(options ...Option) (*Gitpod, error) {
opts, err := evaluateOptions(defaultOptions(), options...)
if err != nil {
return nil, fmt.Errorf("failed to evaluate client options: %w", err)
}
if opts.credentials == "" {
return nil, errors.New("no authentication credentials specified")
}
client := opts.client
url := opts.url
serviceOpts := []connect.ClientOption{
connect.WithInterceptors(
AuthorizationInterceptor(opts.credentials),
),
}
return &Gitpod{
cfg: opts,
Teams: gitpod_experimental_v1connect.NewTeamsServiceClient(client, url, serviceOpts...),
Projects: gitpod_experimental_v1connect.NewProjectsServiceClient(client, url, serviceOpts...),
PersonalAccessTokens: gitpod_experimental_v1connect.NewTokensServiceClient(client, url, serviceOpts...),
Workspaces: gitpod_experimental_v1connect.NewWorkspacesServiceClient(client, url, serviceOpts...),
Editors: gitpod_experimental_v1connect.NewEditorServiceClient(client, url, serviceOpts...),
IdentityProvider: gitpod_experimental_v1connect.NewIdentityProviderServiceClient(client, url, serviceOpts...),
User: gitpod_experimental_v1connect.NewUserServiceClient(client, url, serviceOpts...),
}, nil
}
type Option func(opts *options) error
func WithURL(url string) Option {
return func(opts *options) error {
opts.url = url
return nil
}
}
func WithCredentials(token string) Option {
return func(opts *options) error {
opts.credentials = token
return nil
}
}
func WithHTTPClient(client *http.Client) Option {
return func(opts *options) error {
opts.client = client
return nil
}
}
type options struct {
url string
client *http.Client
credentials string
}
func defaultOptions() *options {
return &options{
url: "https://api.gitpod.io",
client: http.DefaultClient,
}
}
func evaluateOptions(base *options, opts ...Option) (*options, error) {
for _, opt := range opts {
if err := opt(base); err != nil {
return nil, fmt.Errorf("failed to evaluate options: %w", err)
}
}
return base, nil
}