feat: add harbor checker

This commit is contained in:
franklin 2023-05-26 14:21:50 +02:00
parent 0f461077d1
commit c0bad3a392
4 changed files with 121 additions and 19 deletions

View File

@ -0,0 +1,19 @@
package harbor
import (
"context"
"github.com/foomo/posh/pkg/log"
"github.com/foomo/posh/pkg/prompt/check"
)
func AuthChecker(h *Harbor) check.Checker {
return func(ctx context.Context, l log.Logger) check.Info {
name := "Harbor"
if h.IsAuthenticated(ctx) {
return check.NewSuccessInfo(name, "Authenticated")
} else {
return check.NewFailureInfo(name, "Run `harbor auth` to sign into docker")
}
}
}

View File

@ -13,16 +13,14 @@ import (
"github.com/foomo/posh/pkg/util/browser"
"github.com/google/go-github/v47/github"
"github.com/pterm/pterm"
"github.com/spf13/viper"
"golang.org/x/oauth2"
)
type (
Command struct {
l log.Logger
cfg Config
name string
configKey string
harbor *Harbor
commandTree tree.Root
}
CommandOption func(*Command)
@ -38,30 +36,21 @@ func CommandWithName(v string) CommandOption {
}
}
func WithConfigKey(v string) CommandOption {
return func(o *Command) {
o.configKey = v
}
}
// ------------------------------------------------------------------------------------------------
// ~ Constructor
// ------------------------------------------------------------------------------------------------
func NewCommand(l log.Logger, opts ...CommandOption) *Command {
func NewCommand(l log.Logger, harbor *Harbor, opts ...CommandOption) *Command {
inst := &Command{
l: l.Named("harbor"),
name: "harbor",
configKey: "harbor",
l: l.Named("harbor"),
name: "harbor",
harbor: harbor,
}
for _, opt := range opts {
if opt != nil {
opt(inst)
}
}
if err := viper.UnmarshalKey(inst.configKey, &inst.cfg); err != nil {
return nil
}
inst.commandTree = tree.New(&tree.Node{
Name: inst.name,
@ -115,7 +104,7 @@ func (c *Command) Help(ctx context.Context, r *readline.Readline) string {
// ------------------------------------------------------------------------------------------------
func (c *Command) auth(ctx context.Context, r *readline.Readline) error {
return browser.OpenRawURL(c.cfg.AuthURL)
return browser.OpenRawURL(c.harbor.Config().AuthURL)
}
func (c *Command) docker(ctx context.Context, r *readline.Readline) error {
@ -136,11 +125,11 @@ func (c *Command) docker(ctx context.Context, r *readline.Readline) error {
return err
}
pterm.Info.Println("registry: " + c.cfg.URL)
pterm.Info.Println("registry: " + c.harbor.Config().DockerRegistry())
pterm.Info.Println("username: " + username)
pterm.Info.Println("please enter your CLI secret as password...")
return shell.New(ctx, c.l, "docker", "login", c.cfg.URL, "-u", username).
return shell.New(ctx, c.l, "docker", "login", c.harbor.Config().URL, "-u", username).
Args(r.AdditionalArgs()...).
Args(r.AdditionalFlags()...).
Run()

View File

@ -1,6 +1,15 @@
package harbor
import (
"strings"
)
type Config struct {
URL string `json:"url" yaml:"url"`
AuthURL string `json:"authUrl" yaml:"authUrl"`
Project string `json:"project" yaml:"project"`
}
func (c Config) DockerRegistry() string {
return strings.TrimPrefix(c.URL, "https://")
}

85
goharbor/harbor/harbor.go Normal file
View File

@ -0,0 +1,85 @@
package harbor
import (
"context"
"fmt"
"strings"
"time"
"github.com/foomo/posh/pkg/log"
"github.com/foomo/posh/pkg/shell"
"github.com/spf13/viper"
)
// Harbor command
type (
Harbor struct {
l log.Logger
cfg Config
configKey string
signedIn bool
signedInTime time.Time
}
Option func(*Harbor) error
)
// ------------------------------------------------------------------------------------------------
// ~ Options
// ------------------------------------------------------------------------------------------------
func CommandWithConfigKey(v string) Option {
return func(o *Harbor) error {
o.configKey = v
return nil
}
}
// ------------------------------------------------------------------------------------------------
// ~ Constructor
// ------------------------------------------------------------------------------------------------
// New command
func New(l log.Logger, opts ...Option) (*Harbor, error) {
inst := &Harbor{
l: l,
configKey: "harbor",
}
for _, opt := range opts {
if opt != nil {
if err := opt(inst); err != nil {
return nil, err
}
}
}
if err := viper.UnmarshalKey(inst.configKey, &inst.cfg); err != nil {
return nil, err
}
return inst, nil
}
// ------------------------------------------------------------------------------------------------
// ~ Public methods
// ------------------------------------------------------------------------------------------------
func (t *Harbor) Config() Config {
return t.cfg
}
func (t *Harbor) IsAuthenticated(ctx context.Context) bool {
if t.signedIn && time.Since(t.signedInTime) < time.Hour {
return true
}
out, _ := shell.New(ctx, t.l,
"docker",
"pull",
fmt.Sprintf("%s/%s/null:null", t.cfg.DockerRegistry(), t.cfg.Project),
).Quiet().CombinedOutput()
if strings.HasPrefix(string(out), "Error response from daemon: unknown") {
t.signedIn = true
t.signedInTime = time.Now()
return true
}
t.signedIn = false
return false
}