github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/commands/use.go (about)

     1  package commands
     2  
     3  import (
     4  	"os"
     5  
     6  	"github.com/docker/buildx/store/storeutil"
     7  	"github.com/docker/buildx/util/cobrautil/completion"
     8  	"github.com/docker/buildx/util/dockerutil"
     9  	"github.com/docker/cli/cli"
    10  	"github.com/docker/cli/cli/command"
    11  	"github.com/pkg/errors"
    12  	"github.com/spf13/cobra"
    13  )
    14  
    15  type useOptions struct {
    16  	isGlobal  bool
    17  	isDefault bool
    18  	builder   string
    19  }
    20  
    21  func runUse(dockerCli command.Cli, in useOptions) error {
    22  	txn, release, err := storeutil.GetStore(dockerCli)
    23  	if err != nil {
    24  		return err
    25  	}
    26  	defer release()
    27  
    28  	if _, err := txn.NodeGroupByName(in.builder); err != nil {
    29  		if os.IsNotExist(errors.Cause(err)) {
    30  			if in.builder == "default" && in.builder != dockerCli.CurrentContext() {
    31  				return errors.Errorf("run `docker context use default` to switch to default context")
    32  			}
    33  			if in.builder == "default" || in.builder == dockerCli.CurrentContext() {
    34  				ep, err := dockerutil.GetCurrentEndpoint(dockerCli)
    35  				if err != nil {
    36  					return err
    37  				}
    38  				return txn.SetCurrent(ep, "", false, false)
    39  			}
    40  			list, err := dockerCli.ContextStore().List()
    41  			if err != nil {
    42  				return err
    43  			}
    44  			for _, l := range list {
    45  				if l.Name == in.builder {
    46  					return errors.Errorf("run `docker context use %s` to switch to context %s", in.builder, in.builder)
    47  				}
    48  			}
    49  
    50  		}
    51  		return errors.Wrapf(err, "failed to find instance %q", in.builder)
    52  	}
    53  
    54  	ep, err := dockerutil.GetCurrentEndpoint(dockerCli)
    55  	if err != nil {
    56  		return err
    57  	}
    58  	return txn.SetCurrent(ep, in.builder, in.isGlobal, in.isDefault)
    59  }
    60  
    61  func useCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
    62  	var options useOptions
    63  
    64  	cmd := &cobra.Command{
    65  		Use:   "use [OPTIONS] NAME",
    66  		Short: "Set the current builder instance",
    67  		Args:  cli.RequiresMaxArgs(1),
    68  		RunE: func(cmd *cobra.Command, args []string) error {
    69  			options.builder = rootOpts.builder
    70  			if len(args) > 0 {
    71  				options.builder = args[0]
    72  			}
    73  			return runUse(dockerCli, options)
    74  		},
    75  		ValidArgsFunction: completion.BuilderNames(dockerCli),
    76  	}
    77  
    78  	flags := cmd.Flags()
    79  	flags.BoolVar(&options.isGlobal, "global", false, "Builder persists context changes")
    80  	flags.BoolVar(&options.isDefault, "default", false, "Set builder as default for current context")
    81  
    82  	return cmd
    83  }