From 0e5da0cd0e0747206efe9537a8404a7989a7c60d Mon Sep 17 00:00:00 2001 From: mfordjody <11638005@qq.com> Date: Fri, 7 Feb 2025 22:23:01 +0800 Subject: [PATCH] [dubboctl] update docker image hub logic --- dubboctl/cmd/image.go | 104 ++++---------------- dubboctl/pkg/hub/credentials/credentials.go | 25 ++--- dubboctl/pkg/hub/pusher/pusher.go | 12 +-- dubboctl/pkg/sdk/client.go | 2 +- 4 files changed, 36 insertions(+), 107 deletions(-) diff --git a/dubboctl/cmd/image.go b/dubboctl/cmd/image.go index 4220c380..3a32802f 100644 --- a/dubboctl/cmd/image.go +++ b/dubboctl/cmd/image.go @@ -7,84 +7,57 @@ import ( "github.com/apache/dubbo-kubernetes/dubboctl/pkg/sdk" "github.com/apache/dubbo-kubernetes/dubboctl/pkg/sdk/dubbo" "github.com/apache/dubbo-kubernetes/dubboctl/pkg/util" - "github.com/ory/viper" "github.com/spf13/cobra" "os" "os/exec" "path/filepath" ) -type buildConfig struct { +type hubConfig struct { Image string BuilderImage string Path string } -type pushConfig struct { - Apply bool -} - func ImageCmd(ctx cli.Context, cmd *cobra.Command, clientFactory ClientFactory) *cobra.Command { - ibc := imageBuildCmd(cmd, clientFactory) - ipc := imagePushCmd(cmd, clientFactory) + ihc := imageHubCmd(cmd, clientFactory) ic := &cobra.Command{ Use: "image", Short: "Used to build and push images, apply to cluster", } - ic.AddCommand(ibc) - ic.AddCommand(ipc) + ic.AddCommand(ihc) return ic } -func newBuildConfig(cmd *cobra.Command) *buildConfig { - bc := &buildConfig{} - return bc +func newHubConfig(cmd *cobra.Command) *hubConfig { + hc := &hubConfig{} + return hc } -func newPushConfig(cmd *cobra.Command) *pushConfig { - pc := &pushConfig{ - Apply: viper.GetBool("apply"), - } - return pc -} - -func (c buildConfig) buildclientOptions() ([]sdk.Option, error) { +func (c hubConfig) imageClientOptions() ([]sdk.Option, error) { var do []sdk.Option do = append(do, sdk.WithBuilder(pack.NewBuilder())) return do, nil } -func imageBuildCmd(cmd *cobra.Command, clientFactory ClientFactory) *cobra.Command { +func imageHubCmd(cmd *cobra.Command, clientFactory ClientFactory) *cobra.Command { bc := &cobra.Command{ - Use: "build", - Short: "Build to images", - Long: "The build subcommand used to build images", + Use: "hub", + Short: "Build and Push to images", + Long: "The hub subcommand used to build and push images", Example: "", RunE: func(cmd *cobra.Command, args []string) error { - return runBuild(cmd, args, clientFactory) + return runHub(cmd, args, clientFactory) }, } return bc } -func imagePushCmd(cmd *cobra.Command, clientFactory ClientFactory) *cobra.Command { - pc := &cobra.Command{ - Use: "push", - Short: "Push to images", - Long: "The push subcommand used to push images", - Example: "", - RunE: func(cmd *cobra.Command, args []string) error { - return runPush(cmd, args, clientFactory) - }, - } - return pc -} - -func runPush(cmd *cobra.Command, args []string, clientFactory ClientFactory) error { +func runHub(cmd *cobra.Command, args []string, clientFactory ClientFactory) error { if err := util.GetCreatePath(); err != nil { return err } - config := newBuildConfig(cmd) + config := newHubConfig(cmd) fp, err := dubbo.NewDubboConfig(config.Path) if err != nil { @@ -102,54 +75,17 @@ func runPush(cmd *cobra.Command, args []string, clientFactory ClientFactory) err config.configure(fp) - clientOptions, err := config.buildclientOptions() + clientOptions, err := config.imageClientOptions() if err != nil { return err } + client, done := clientFactory(clientOptions...) defer done() - if fp, err = client.Push(cmd.Context(), fp); err != nil { - return err - } - - err = fp.WriteFile() - if err != nil { - return err - } - - return nil -} - -func runBuild(cmd *cobra.Command, args []string, clientFactory ClientFactory) error { - if err := util.GetCreatePath(); err != nil { - return err - } - config := newBuildConfig(cmd) - - fp, err := dubbo.NewDubboConfig(config.Path) - if err != nil { - return err + if fp.Built() { + return nil } - - config, err = config.prompt(fp) - if err != nil { - return err - } - - if !fp.Initialized() { - return util.NewErrNotInitialized(fp.Root) - } - - config.configure(fp) - - clientOptions, err := config.buildclientOptions() - if err != nil { - return err - } - - client, done := clientFactory(clientOptions...) - defer done() if fp, err = client.Build(cmd.Context(), fp); err != nil { return err } @@ -177,7 +113,7 @@ func runApply(cmd *cobra.Command, dc *dubbo.DubboConfig) error { return nil } -func (c *buildConfig) configure(dc *dubbo.DubboConfig) { +func (c *hubConfig) configure(dc *dubbo.DubboConfig) { if c.Path == "" { root, err := os.Getwd() if err != nil { @@ -195,7 +131,7 @@ func (c *buildConfig) configure(dc *dubbo.DubboConfig) { } } -func (c *buildConfig) prompt(dc *dubbo.DubboConfig) (*buildConfig, error) { +func (c *hubConfig) prompt(dc *dubbo.DubboConfig) (*hubConfig, error) { var err error if !util.InteractiveTerminal() { return c, nil diff --git a/dubboctl/pkg/hub/credentials/credentials.go b/dubboctl/pkg/hub/credentials/credentials.go index 73830104..35f65456 100644 --- a/dubboctl/pkg/hub/credentials/credentials.go +++ b/dubboctl/pkg/hub/credentials/credentials.go @@ -24,8 +24,8 @@ import ( ) var ( - ErrUnauthorized = errors.New("bad credentials") - ErrCredentialsNotFound = errors.New("credentials not found") + errUnauthorized = errors.New("bad credentials") + errCredentialsNotFound = errors.New("credentials not found") errNoCredentialHelperConfigured = errors.New("no credential helper configure") ) @@ -126,7 +126,7 @@ func (c *credentialsProvider) getCredentials(ctx context.Context, image string) result, err = load(registry) if err != nil { - if errors.Is(err, ErrCredentialsNotFound) { + if errors.Is(err, errCredentialsNotFound) { continue } return pusher.Credentials{}, err @@ -136,7 +136,7 @@ func (c *credentialsProvider) getCredentials(ctx context.Context, image string) if err == nil { return result, nil } else { - if !errors.Is(err, ErrUnauthorized) { + if !errors.Is(err, errUnauthorized) { return pusher.Credentials{}, err } } @@ -144,7 +144,7 @@ func (c *credentialsProvider) getCredentials(ctx context.Context, image string) } if c.promptForCredentials == nil { - return pusher.Credentials{}, ErrCredentialsNotFound + return pusher.Credentials{}, errCredentialsNotFound } for { @@ -158,7 +158,6 @@ func (c *credentialsProvider) getCredentials(ctx context.Context, image string) err = setCredentialsByCredentialHelper(c.authFilePath, registry, result.Username, result.Password) if err != nil { - // This shouldn't be fatal error. if strings.Contains(err.Error(), "not implemented") { fmt.Fprintf(os.Stderr, "the cred-helper does not support write operation (consider changing the cred-helper it in auth.json)\n") return pusher.Credentials{}, nil @@ -192,7 +191,7 @@ func (c *credentialsProvider) getCredentials(ctx context.Context, image string) } return result, nil } else { - if errors.Is(err, ErrUnauthorized) { + if errors.Is(err, errUnauthorized) { continue } return pusher.Credentials{}, err @@ -222,7 +221,7 @@ func checkAuth(ctx context.Context, image string, credentials pusher.Credentials if err != nil { var transportErr *transport.Error if errors.As(err, &transportErr) && transportErr.StatusCode == 401 { - return errors.New("bad credentials") + return errUnauthorized } return err } @@ -283,7 +282,7 @@ func getCredentialsByCredentialHelper(confFilePath, registry string) (pusher.Cre return result, fmt.Errorf("failed to get helper from config: %w", err) } if helper == "" { - return result, ErrCredentialsNotFound + return result, errCredentialsNotFound } helperName := fmt.Sprintf("docker-credential-%s", helper) @@ -306,7 +305,7 @@ func getCredentialsByCredentialHelper(confFilePath, registry string) (pusher.Cre } } - return result, fmt.Errorf("failed to get credentials from helper specified in ~/.docker/config.json: %w", ErrCredentialsNotFound) + return result, fmt.Errorf("failed to get credentials from helper specified in ~/.docker/config.json: %w", errCredentialsNotFound) } func setCredentialsByCredentialHelper(confFilePath, registry, username, secret string) error { @@ -408,12 +407,6 @@ func WithPromptForCredentials(cbk CredentialsCallback) Opt { } } -func WithVerifyCredentials(cbk VerifyCredentialsCallback) Opt { - return func(opts *credentialsProvider) { - opts.verifyCredentials = cbk - } -} - func WithPromptForCredentialStore(cbk ChooseCredentialHelperCallback) Opt { return func(opts *credentialsProvider) { opts.promptForCredentialStore = cbk diff --git a/dubboctl/pkg/hub/pusher/pusher.go b/dubboctl/pkg/hub/pusher/pusher.go index 60a36f13..6ce97a4f 100644 --- a/dubboctl/pkg/hub/pusher/pusher.go +++ b/dubboctl/pkg/hub/pusher/pusher.go @@ -14,7 +14,7 @@ import ( "github.com/docker/docker/pkg/jsonmessage" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" - "github.com/google/go-containerregistry/pkg/v1" + v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/daemon" "github.com/google/go-containerregistry/pkg/v1/remote" "golang.org/x/term" @@ -42,7 +42,7 @@ type Pusher struct { dockerClientFactory PusherDockerClientFactory } -type AuthConfig struct { +type authConfig struct { Username string `json:"username,omitempty"` Password string `json:"password,omitempty"` Auth string `json:"auth,omitempty"` @@ -89,7 +89,7 @@ func (p *Pusher) Push(ctx context.Context, dc *dubbo.DubboConfig) (digest string fmt.Fprintf(os.Stderr, "Pushing function image to the registry %q using the %q user credentials\n", registry, credentials.Username) if _, err = net.DefaultResolver.LookupHost(ctx, registry); err == nil { - return p.daemon(ctx, dc, credentials, output) + return p.daemonPush(ctx, dc, credentials, output) } return p.push(ctx, dc, credentials, output) @@ -104,19 +104,19 @@ func getRegistry(img string) (string, error) { return registry, nil } -func (p *Pusher) daemon(ctx context.Context, dc *dubbo.DubboConfig, credentials Credentials, output io.Writer) (digest string, err error) { +func (p *Pusher) daemonPush(ctx context.Context, dc *dubbo.DubboConfig, credentials Credentials, output io.Writer) (digest string, err error) { cli, err := p.dockerClientFactory() if err != nil { return "", fmt.Errorf("failed to create docker api client: %w", err) } defer cli.Close() - authConfig := AuthConfig{ + ac := authConfig{ Username: credentials.Username, Password: credentials.Password, } - b, err := json.Marshal(&authConfig) + b, err := json.Marshal(&ac) if err != nil { return "", err } diff --git a/dubboctl/pkg/sdk/client.go b/dubboctl/pkg/sdk/client.go index 8a6aed8f..5e0795f6 100644 --- a/dubboctl/pkg/sdk/client.go +++ b/dubboctl/pkg/sdk/client.go @@ -29,7 +29,7 @@ type Builder interface { } type Pusher interface { - Push(ctx context.Context, dcfg *dubbo.DubboConfig) (string, error) + Push(ctx context.Context, dc *dubbo.DubboConfig) (string, error) } type DeployOption func(f *DeployParams)