cmd: don't alias context package, and use cliContext for cli.Context
Unfortunately, this is a rather large diff, but perhaps worth a one-time "rip off the bandaid" for v2. This patch removes the use of "gocontext" as alias for stdLib's "context", and uses "cliContext" for uses of cli.context. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
		| @@ -187,13 +187,13 @@ func main() { | ||||
| 			Value: "overlayfs", | ||||
| 		}, | ||||
| 	} | ||||
| 	app.Before = func(context *cli.Context) error { | ||||
| 		if context.Bool("json") { | ||||
| 	app.Before = func(cliContext *cli.Context) error { | ||||
| 		if cliContext.Bool("json") { | ||||
| 			if err := log.SetLevel("warn"); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		if context.Bool("debug") { | ||||
| 		if cliContext.Bool("debug") { | ||||
| 			if err := log.SetLevel("debug"); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -203,18 +203,18 @@ func main() { | ||||
| 	app.Commands = []*cli.Command{ | ||||
| 		densityCommand, | ||||
| 	} | ||||
| 	app.Action = func(context *cli.Context) error { | ||||
| 	app.Action = func(cliContext *cli.Context) error { | ||||
| 		config := config{ | ||||
| 			Address:     context.String("address"), | ||||
| 			Duration:    context.Duration("duration"), | ||||
| 			Concurrency: context.Int("concurrent"), | ||||
| 			CRI:         context.Bool("cri"), | ||||
| 			Exec:        context.Bool("exec"), | ||||
| 			Image:       context.String("image"), | ||||
| 			JSON:        context.Bool("json"), | ||||
| 			Metrics:     context.String("metrics"), | ||||
| 			Runtime:     context.String("runtime"), | ||||
| 			Snapshotter: context.String("snapshotter"), | ||||
| 			Address:     cliContext.String("address"), | ||||
| 			Duration:    cliContext.Duration("duration"), | ||||
| 			Concurrency: cliContext.Int("concurrent"), | ||||
| 			CRI:         cliContext.Bool("cri"), | ||||
| 			Exec:        cliContext.Bool("exec"), | ||||
| 			Image:       cliContext.String("image"), | ||||
| 			JSON:        cliContext.Bool("json"), | ||||
| 			Metrics:     cliContext.String("metrics"), | ||||
| 			Runtime:     cliContext.String("runtime"), | ||||
| 			Snapshotter: cliContext.String("snapshotter"), | ||||
| 		} | ||||
| 		if config.Metrics != "" { | ||||
| 			return serve(config) | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package command | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
|  | ||||
| @@ -33,7 +33,7 @@ import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| ) | ||||
|  | ||||
| func outputConfig(ctx gocontext.Context, config *srvconfig.Config) error { | ||||
| func outputConfig(ctx context.Context, config *srvconfig.Config) error { | ||||
| 	plugins, err := server.LoadPlugins(ctx, config) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @@ -86,17 +86,17 @@ var configCommand = &cli.Command{ | ||||
| 		{ | ||||
| 			Name:  "default", | ||||
| 			Usage: "See the output of the default config", | ||||
| 			Action: func(context *cli.Context) error { | ||||
| 				return outputConfig(gocontext.Background(), defaultConfig()) | ||||
| 			Action: func(cliContext *cli.Context) error { | ||||
| 				return outputConfig(context.Background(), defaultConfig()) | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Name:  "dump", | ||||
| 			Usage: "See the output of the final main config with imported in subconfig files", | ||||
| 			Action: func(context *cli.Context) error { | ||||
| 			Action: func(cliContext *cli.Context) error { | ||||
| 				config := defaultConfig() | ||||
| 				ctx := gocontext.Background() | ||||
| 				if err := srvconfig.LoadConfig(ctx, context.String("config"), config); err != nil && !os.IsNotExist(err) { | ||||
| 				ctx := context.Background() | ||||
| 				if err := srvconfig.LoadConfig(ctx, cliContext.String("config"), config); err != nil && !os.IsNotExist(err) { | ||||
| 					return err | ||||
| 				} | ||||
|  | ||||
| @@ -106,10 +106,10 @@ var configCommand = &cli.Command{ | ||||
| 		{ | ||||
| 			Name:  "migrate", | ||||
| 			Usage: "Migrate the current configuration file to the latest version (does not migrate subconfig files)", | ||||
| 			Action: func(context *cli.Context) error { | ||||
| 			Action: func(cliContext *cli.Context) error { | ||||
| 				config := defaultConfig() | ||||
| 				ctx := gocontext.Background() | ||||
| 				if err := srvconfig.LoadConfig(ctx, context.String("config"), config); err != nil && !os.IsNotExist(err) { | ||||
| 				ctx := context.Background() | ||||
| 				if err := srvconfig.LoadConfig(ctx, cliContext.String("config"), config); err != nil && !os.IsNotExist(err) { | ||||
| 					return err | ||||
| 				} | ||||
|  | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package command | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net" | ||||
| @@ -54,8 +54,8 @@ func init() { | ||||
| 	// Discard grpc logs so that they don't mess with our stdio | ||||
| 	grpclog.SetLoggerV2(grpclog.NewLoggerV2(io.Discard, io.Discard, io.Discard)) | ||||
|  | ||||
| 	cli.VersionPrinter = func(c *cli.Context) { | ||||
| 		fmt.Println(c.App.Name, version.Package, c.App.Version, version.Revision) | ||||
| 	cli.VersionPrinter = func(cliContext *cli.Context) { | ||||
| 		fmt.Println(cliContext.App.Name, version.Package, cliContext.App.Version, version.Revision) | ||||
| 	} | ||||
| 	cli.VersionFlag = &cli.BoolFlag{ | ||||
| 		Name:    "version", | ||||
| @@ -118,12 +118,12 @@ can be used and modified as necessary as a custom configuration.` | ||||
| 		publishCommand, | ||||
| 		ociHook, | ||||
| 	} | ||||
| 	app.Action = func(context *cli.Context) error { | ||||
| 	app.Action = func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			start       = time.Now() | ||||
| 			signals     = make(chan os.Signal, 2048) | ||||
| 			serverC     = make(chan *server.Server, 1) | ||||
| 			ctx, cancel = gocontext.WithCancel(gocontext.Background()) | ||||
| 			ctx, cancel = context.WithCancel(context.Background()) | ||||
| 			config      = defaultConfig() | ||||
| 		) | ||||
|  | ||||
| @@ -131,16 +131,16 @@ can be used and modified as necessary as a custom configuration.` | ||||
|  | ||||
| 		// Only try to load the config if it either exists, or the user explicitly | ||||
| 		// told us to load this path. | ||||
| 		configPath := context.String("config") | ||||
| 		configPath := cliContext.String("config") | ||||
| 		_, err := os.Stat(configPath) | ||||
| 		if !os.IsNotExist(err) || context.IsSet("config") { | ||||
| 		if !os.IsNotExist(err) || cliContext.IsSet("config") { | ||||
| 			if err := srvconfig.LoadConfig(ctx, configPath, config); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Apply flags to the config | ||||
| 		if err := applyFlags(context, config); err != nil { | ||||
| 		if err := applyFlags(cliContext, config); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| @@ -303,7 +303,7 @@ can be used and modified as necessary as a custom configuration.` | ||||
| 	return app | ||||
| } | ||||
|  | ||||
| func serve(ctx gocontext.Context, l net.Listener, serveFunc func(net.Listener) error) { | ||||
| func serve(ctx context.Context, l net.Listener, serveFunc func(net.Listener) error) { | ||||
| 	path := l.Addr().String() | ||||
| 	log.G(ctx).WithField("address", path).Info("serving...") | ||||
| 	go func() { | ||||
| @@ -314,10 +314,10 @@ func serve(ctx gocontext.Context, l net.Listener, serveFunc func(net.Listener) e | ||||
| 	}() | ||||
| } | ||||
|  | ||||
| func applyFlags(context *cli.Context, config *srvconfig.Config) error { | ||||
| func applyFlags(cliContext *cli.Context, config *srvconfig.Config) error { | ||||
| 	// the order for config vs flag values is that flags will always override | ||||
| 	// the config values if they are set | ||||
| 	if err := setLogLevel(context, config); err != nil { | ||||
| 	if err := setLogLevel(cliContext, config); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := setLogFormat(config); err != nil { | ||||
| @@ -341,7 +341,7 @@ func applyFlags(context *cli.Context, config *srvconfig.Config) error { | ||||
| 			d:    &config.GRPC.Address, | ||||
| 		}, | ||||
| 	} { | ||||
| 		if s := context.String(v.name); s != "" { | ||||
| 		if s := cliContext.String(v.name); s != "" { | ||||
| 			*v.d = s | ||||
| 			if v.name == "root" || v.name == "state" { | ||||
| 				absPath, err := filepath.Abs(s) | ||||
| @@ -353,13 +353,13 @@ func applyFlags(context *cli.Context, config *srvconfig.Config) error { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	applyPlatformFlags(context) | ||||
| 	applyPlatformFlags(cliContext) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func setLogLevel(context *cli.Context, config *srvconfig.Config) error { | ||||
| 	l := context.String("log-level") | ||||
| func setLogLevel(cliContext *cli.Context, config *srvconfig.Config) error { | ||||
| 	l := cliContext.String("log-level") | ||||
| 	if l == "" { | ||||
| 		l = config.Debug.Level | ||||
| 	} | ||||
|   | ||||
| @@ -33,7 +33,7 @@ import ( | ||||
| var ociHook = &cli.Command{ | ||||
| 	Name:  "oci-hook", | ||||
| 	Usage: "Provides a base for OCI runtime hooks to allow arguments to be injected.", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		state, err := loadHookState(os.Stdin) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -45,7 +45,7 @@ var ociHook = &cli.Command{ | ||||
| 		} | ||||
| 		var ( | ||||
| 			ctx  = newTemplateContext(state, spec) | ||||
| 			args = context.Args().Slice() | ||||
| 			args = cliContext.Args().Slice() | ||||
| 			env  = os.Environ() | ||||
| 		) | ||||
| 		if err := newList(&args).render(ctx); err != nil { | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package command | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net" | ||||
| @@ -49,9 +49,9 @@ var publishCommand = &cli.Command{ | ||||
| 			Usage: "Topic of the event", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		ctx := namespaces.WithNamespace(gocontext.Background(), context.String("namespace")) | ||||
| 		topic := context.String("topic") | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		ctx := namespaces.WithNamespace(context.Background(), cliContext.String("namespace")) | ||||
| 		topic := cliContext.String("topic") | ||||
| 		if topic == "" { | ||||
| 			return fmt.Errorf("topic required to publish event: %w", errdefs.ErrInvalidArgument) | ||||
| 		} | ||||
| @@ -59,7 +59,7 @@ var publishCommand = &cli.Command{ | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		client, err := connectEvents(context.String("address")) | ||||
| 		client, err := connectEvents(cliContext.String("address")) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -93,7 +93,7 @@ func connectEvents(address string) (eventsapi.EventsClient, error) { | ||||
| 	return eventsapi.NewEventsClient(conn), nil | ||||
| } | ||||
|  | ||||
| func connect(address string, d func(gocontext.Context, string) (net.Conn, error)) (*grpc.ClientConn, error) { | ||||
| func connect(address string, d func(context.Context, string) (net.Conn, error)) (*grpc.ClientConn, error) { | ||||
| 	backoffConfig := backoff.DefaultConfig | ||||
| 	backoffConfig.MaxDelay = 3 * time.Second | ||||
| 	connParams := grpc.ConnectParams{ | ||||
| @@ -106,7 +106,7 @@ func connect(address string, d func(gocontext.Context, string) (net.Conn, error) | ||||
| 		grpc.FailOnNonTempDialError(true), | ||||
| 		grpc.WithConnectParams(connParams), | ||||
| 	} | ||||
| 	ctx, cancel := gocontext.WithTimeout(gocontext.Background(), 2*time.Second) | ||||
| 	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) | ||||
| 	defer cancel() | ||||
| 	conn, err := grpc.DialContext(ctx, dialer.DialAddress(address), gopts...) | ||||
| 	if err != nil { | ||||
|   | ||||
| @@ -30,7 +30,7 @@ func serviceFlags() []cli.Flag { | ||||
| } | ||||
|  | ||||
| // applyPlatformFlags applies platform-specific flags. | ||||
| func applyPlatformFlags(context *cli.Context) { | ||||
| func applyPlatformFlags(cliContext *cli.Context) { | ||||
| } | ||||
|  | ||||
| // registerUnregisterService is only relevant on Windows. | ||||
|   | ||||
| @@ -79,8 +79,8 @@ func serviceFlags() []cli.Flag { | ||||
| } | ||||
|  | ||||
| // applyPlatformFlags applies platform-specific flags. | ||||
| func applyPlatformFlags(context *cli.Context) { | ||||
| 	serviceNameFlag = context.String("service-name") | ||||
| func applyPlatformFlags(cliContext *cli.Context) { | ||||
| 	serviceNameFlag = cliContext.String("service-name") | ||||
| 	if serviceNameFlag == "" { | ||||
| 		serviceNameFlag = defaultServiceName | ||||
| 	} | ||||
| @@ -101,9 +101,9 @@ func applyPlatformFlags(context *cli.Context) { | ||||
| 			d:    &runServiceFlag, | ||||
| 		}, | ||||
| 	} { | ||||
| 		*v.d = context.Bool(v.name) | ||||
| 		*v.d = cliContext.Bool(v.name) | ||||
| 	} | ||||
| 	logFileFlag = context.String("log-file") | ||||
| 	logFileFlag = cliContext.String("log-file") | ||||
| } | ||||
|  | ||||
| type handler struct { | ||||
|   | ||||
| @@ -52,8 +52,8 @@ func init() { | ||||
| 	// Discard grpc logs so that they don't mess with our stdio | ||||
| 	grpclog.SetLoggerV2(grpclog.NewLoggerV2(io.Discard, io.Discard, io.Discard)) | ||||
|  | ||||
| 	cli.VersionPrinter = func(c *cli.Context) { | ||||
| 		fmt.Println(c.App.Name, version.Package, c.App.Version) | ||||
| 	cli.VersionPrinter = func(cliContext *cli.Context) { | ||||
| 		fmt.Println(cliContext.App.Name, version.Package, cliContext.App.Version) | ||||
| 	} | ||||
| 	cli.VersionFlag = &cli.BoolFlag{ | ||||
| 		Name:    "version", | ||||
| @@ -135,8 +135,8 @@ containerd CLI | ||||
| 		info.Command, | ||||
| 		deprecations.Command, | ||||
| 	}, extraCmds...) | ||||
| 	app.Before = func(context *cli.Context) error { | ||||
| 		if context.Bool("debug") { | ||||
| 	app.Before = func(cliContext *cli.Context) error { | ||||
| 		if cliContext.Bool("debug") { | ||||
| 			return log.SetLevel("debug") | ||||
| 		} | ||||
| 		return nil | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package commands | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
|  | ||||
| @@ -33,18 +33,18 @@ import ( | ||||
| // | ||||
| // This will ensure the namespace is picked up and set the timeout, if one is | ||||
| // defined. | ||||
| func AppContext(context *cli.Context) (gocontext.Context, gocontext.CancelFunc) { | ||||
| func AppContext(cliContext *cli.Context) (context.Context, context.CancelFunc) { | ||||
| 	var ( | ||||
| 		ctx       = gocontext.Background() | ||||
| 		timeout   = context.Duration("timeout") | ||||
| 		namespace = context.String("namespace") | ||||
| 		cancel    gocontext.CancelFunc | ||||
| 		ctx       = context.Background() | ||||
| 		timeout   = cliContext.Duration("timeout") | ||||
| 		namespace = cliContext.String("namespace") | ||||
| 		cancel    context.CancelFunc | ||||
| 	) | ||||
| 	ctx = namespaces.WithNamespace(ctx, namespace) | ||||
| 	if timeout > 0 { | ||||
| 		ctx, cancel = gocontext.WithTimeout(ctx, timeout) | ||||
| 		ctx, cancel = context.WithTimeout(ctx, timeout) | ||||
| 	} else { | ||||
| 		ctx, cancel = gocontext.WithCancel(ctx) | ||||
| 		ctx, cancel = context.WithCancel(ctx) | ||||
| 	} | ||||
| 	if tm, err := epoch.SourceDateEpoch(); err != nil { | ||||
| 		log.L.WithError(err).Warn("Failed to read SOURCE_DATE_EPOCH") | ||||
| @@ -56,14 +56,14 @@ func AppContext(context *cli.Context) (gocontext.Context, gocontext.CancelFunc) | ||||
| } | ||||
|  | ||||
| // NewClient returns a new containerd client | ||||
| func NewClient(context *cli.Context, opts ...containerd.Opt) (*containerd.Client, gocontext.Context, gocontext.CancelFunc, error) { | ||||
| 	timeoutOpt := containerd.WithTimeout(context.Duration("connect-timeout")) | ||||
| func NewClient(cliContext *cli.Context, opts ...containerd.Opt) (*containerd.Client, context.Context, context.CancelFunc, error) { | ||||
| 	timeoutOpt := containerd.WithTimeout(cliContext.Duration("connect-timeout")) | ||||
| 	opts = append(opts, timeoutOpt) | ||||
| 	client, err := containerd.New(context.String("address"), opts...) | ||||
| 	client, err := containerd.New(cliContext.String("address"), opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, nil, err | ||||
| 	} | ||||
| 	ctx, cancel := AppContext(context) | ||||
| 	ctx, cancel := AppContext(cliContext) | ||||
| 	var suppressDeprecationWarnings bool | ||||
| 	if s := os.Getenv("CONTAINERD_SUPPRESS_DEPRECATION_WARNINGS"); s != "" { | ||||
| 		suppressDeprecationWarnings, err = strconv.ParseBool(s) | ||||
|   | ||||
| @@ -232,10 +232,10 @@ var ( | ||||
| ) | ||||
|  | ||||
| // ObjectWithLabelArgs returns the first arg and a LabelArgs object | ||||
| func ObjectWithLabelArgs(clicontext *cli.Context) (string, map[string]string) { | ||||
| func ObjectWithLabelArgs(cliContext *cli.Context) (string, map[string]string) { | ||||
| 	var ( | ||||
| 		first        = clicontext.Args().First() | ||||
| 		labelStrings = clicontext.Args().Tail() | ||||
| 		first        = cliContext.Args().First() | ||||
| 		labelStrings = cliContext.Args().Tail() | ||||
| 	) | ||||
|  | ||||
| 	return first, LabelArgs(labelStrings) | ||||
|   | ||||
| @@ -59,37 +59,37 @@ func init() { | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func getRuncOptions(context *cli.Context) (*options.Options, error) { | ||||
| func getRuncOptions(cliContext *cli.Context) (*options.Options, error) { | ||||
| 	runtimeOpts := &options.Options{} | ||||
| 	if runcBinary := context.String("runc-binary"); runcBinary != "" { | ||||
| 	if runcBinary := cliContext.String("runc-binary"); runcBinary != "" { | ||||
| 		runtimeOpts.BinaryName = runcBinary | ||||
| 	} | ||||
| 	if context.Bool("runc-systemd-cgroup") { | ||||
| 		if context.String("cgroup") == "" { | ||||
| 	if cliContext.Bool("runc-systemd-cgroup") { | ||||
| 		if cliContext.String("cgroup") == "" { | ||||
| 			// runc maps "machine.slice:foo:deadbeef" to "/machine.slice/foo-deadbeef.scope" | ||||
| 			return nil, errors.New("option --runc-systemd-cgroup requires --cgroup to be set, e.g. \"machine.slice:foo:deadbeef\"") | ||||
| 		} | ||||
| 		runtimeOpts.SystemdCgroup = true | ||||
| 	} | ||||
| 	if root := context.String("runc-root"); root != "" { | ||||
| 	if root := cliContext.String("runc-root"); root != "" { | ||||
| 		runtimeOpts.Root = root | ||||
| 	} | ||||
|  | ||||
| 	return runtimeOpts, nil | ||||
| } | ||||
|  | ||||
| func RuntimeOptions(context *cli.Context) (interface{}, error) { | ||||
| func RuntimeOptions(cliContext *cli.Context) (interface{}, error) { | ||||
| 	// validate first | ||||
| 	if (context.String("runc-binary") != "" || context.Bool("runc-systemd-cgroup")) && | ||||
| 		context.String("runtime") != "io.containerd.runc.v2" { | ||||
| 	if (cliContext.String("runc-binary") != "" || cliContext.Bool("runc-systemd-cgroup")) && | ||||
| 		cliContext.String("runtime") != "io.containerd.runc.v2" { | ||||
| 		return nil, errors.New("specifying runc-binary and runc-systemd-cgroup is only supported for \"io.containerd.runc.v2\" runtime") | ||||
| 	} | ||||
|  | ||||
| 	if context.String("runtime") == "io.containerd.runc.v2" { | ||||
| 		return getRuncOptions(context) | ||||
| 	if cliContext.String("runtime") == "io.containerd.runc.v2" { | ||||
| 		return getRuncOptions(cliContext) | ||||
| 	} | ||||
|  | ||||
| 	if configPath := context.String("runtime-config-path"); configPath != "" { | ||||
| 	if configPath := cliContext.String("runtime-config-path"); configPath != "" { | ||||
| 		return &runtimeoptions.Options{ | ||||
| 			ConfigPath: configPath, | ||||
| 		}, nil | ||||
|   | ||||
| @@ -37,6 +37,6 @@ func init() { | ||||
| 		}) | ||||
| } | ||||
|  | ||||
| func RuntimeOptions(context *cli.Context) (interface{}, error) { | ||||
| func RuntimeOptions(cliContext *cli.Context) (interface{}, error) { | ||||
| 	return nil, nil | ||||
| } | ||||
|   | ||||
| @@ -44,16 +44,16 @@ var checkpointCommand = &cli.Command{ | ||||
| 			Usage: "Checkpoint container task", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		id := context.Args().First() | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		id := cliContext.Args().First() | ||||
| 		if id == "" { | ||||
| 			return errors.New("container id must be provided") | ||||
| 		} | ||||
| 		ref := context.Args().Get(1) | ||||
| 		ref := cliContext.Args().Get(1) | ||||
| 		if ref == "" { | ||||
| 			return errors.New("ref must be provided") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -62,13 +62,13 @@ var checkpointCommand = &cli.Command{ | ||||
| 			containerd.WithCheckpointRuntime, | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("image") { | ||||
| 		if cliContext.Bool("image") { | ||||
| 			opts = append(opts, containerd.WithCheckpointImage) | ||||
| 		} | ||||
| 		if context.Bool("rw") { | ||||
| 		if cliContext.Bool("rw") { | ||||
| 			opts = append(opts, containerd.WithCheckpointRW) | ||||
| 		} | ||||
| 		if context.Bool("task") { | ||||
| 		if cliContext.Bool("task") { | ||||
| 			opts = append(opts, containerd.WithCheckpointTask) | ||||
| 		} | ||||
| 		container, err := client.LoadContainer(ctx, id) | ||||
|   | ||||
| @@ -55,21 +55,21 @@ var createCommand = &cli.Command{ | ||||
| 	Usage:     "Create container", | ||||
| 	ArgsUsage: "[flags] Image|RootFS CONTAINER [COMMAND] [ARG...]", | ||||
| 	Flags:     append(commands.RuntimeFlags, append(append(commands.SnapshotterFlags, []cli.Flag{commands.SnapshotterLabels}...), commands.ContainerFlags...)...), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			id     string | ||||
| 			ref    string | ||||
| 			config = context.IsSet("config") | ||||
| 			config = cliContext.IsSet("config") | ||||
| 		) | ||||
|  | ||||
| 		if config { | ||||
| 			id = context.Args().First() | ||||
| 			if context.NArg() > 1 { | ||||
| 			id = cliContext.Args().First() | ||||
| 			if cliContext.NArg() > 1 { | ||||
| 				return fmt.Errorf("with spec config file, only container id should be provided: %w", errdefs.ErrInvalidArgument) | ||||
| 			} | ||||
| 		} else { | ||||
| 			id = context.Args().Get(1) | ||||
| 			ref = context.Args().First() | ||||
| 			id = cliContext.Args().Get(1) | ||||
| 			ref = cliContext.Args().First() | ||||
| 			if ref == "" { | ||||
| 				return fmt.Errorf("image ref must be provided: %w", errdefs.ErrInvalidArgument) | ||||
| 			} | ||||
| @@ -77,12 +77,12 @@ var createCommand = &cli.Command{ | ||||
| 		if id == "" { | ||||
| 			return fmt.Errorf("container id must be provided: %w", errdefs.ErrInvalidArgument) | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		_, err = run.NewContainer(ctx, client, context) | ||||
| 		_, err = run.NewContainer(ctx, client, cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -102,12 +102,12 @@ var listCommand = &cli.Command{ | ||||
| 			Usage:   "Print only the container id", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			filters = context.Args().Slice() | ||||
| 			quiet   = context.Bool("quiet") | ||||
| 			filters = cliContext.Args().Slice() | ||||
| 			quiet   = cliContext.Bool("quiet") | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -156,22 +156,22 @@ var deleteCommand = &cli.Command{ | ||||
| 			Usage: "Do not clean up snapshot with container", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var exitErr error | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		deleteOpts := []containerd.DeleteOpts{} | ||||
| 		if !context.Bool("keep-snapshot") { | ||||
| 		if !cliContext.Bool("keep-snapshot") { | ||||
| 			deleteOpts = append(deleteOpts, containerd.WithSnapshotCleanup) | ||||
| 		} | ||||
|  | ||||
| 		if context.NArg() == 0 { | ||||
| 		if cliContext.NArg() == 0 { | ||||
| 			return fmt.Errorf("must specify at least one container to delete: %w", errdefs.ErrInvalidArgument) | ||||
| 		} | ||||
| 		for _, arg := range context.Args().Slice() { | ||||
| 		for _, arg := range cliContext.Args().Slice() { | ||||
| 			if err := deleteContainer(ctx, client, arg, deleteOpts...); err != nil { | ||||
| 				if exitErr == nil { | ||||
| 					exitErr = err | ||||
| @@ -212,12 +212,12 @@ var setLabelsCommand = &cli.Command{ | ||||
| 	ArgsUsage:   "[flags] CONTAINER [<key>=<value>, ...]", | ||||
| 	Description: "set and clear labels for a container", | ||||
| 	Flags:       []cli.Flag{}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		containerID, labels := commands.ObjectWithLabelArgs(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		containerID, labels := commands.ObjectWithLabelArgs(cliContext) | ||||
| 		if containerID == "" { | ||||
| 			return fmt.Errorf("container id must be provided: %w", errdefs.ErrInvalidArgument) | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -254,12 +254,12 @@ var infoCommand = &cli.Command{ | ||||
| 			Usage: "Only display the spec", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		id := context.Args().First() | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		id := cliContext.Args().First() | ||||
| 		if id == "" { | ||||
| 			return fmt.Errorf("container id must be provided: %w", errdefs.ErrInvalidArgument) | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -272,7 +272,7 @@ var infoCommand = &cli.Command{ | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if context.Bool("spec") { | ||||
| 		if cliContext.Bool("spec") { | ||||
| 			v, err := typeurl.UnmarshalAny(info.Spec) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
|   | ||||
| @@ -43,16 +43,16 @@ var restoreCommand = &cli.Command{ | ||||
| 			Usage: "Restore the runtime and memory data from the checkpoint", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		id := context.Args().First() | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		id := cliContext.Args().First() | ||||
| 		if id == "" { | ||||
| 			return errors.New("container id must be provided") | ||||
| 		} | ||||
| 		ref := context.Args().Get(1) | ||||
| 		ref := cliContext.Args().Get(1) | ||||
| 		if ref == "" { | ||||
| 			return errors.New("ref must be provided") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -76,7 +76,7 @@ var restoreCommand = &cli.Command{ | ||||
| 			containerd.WithRestoreSpec, | ||||
| 			containerd.WithRestoreRuntime, | ||||
| 		} | ||||
| 		if context.Bool("rw") { | ||||
| 		if cliContext.Bool("rw") { | ||||
| 			opts = append(opts, containerd.WithRestoreRW) | ||||
| 		} | ||||
|  | ||||
| @@ -85,7 +85,7 @@ var restoreCommand = &cli.Command{ | ||||
| 			return err | ||||
| 		} | ||||
| 		topts := []containerd.NewTaskOpts{} | ||||
| 		if context.Bool("live") { | ||||
| 		if cliContext.Bool("live") { | ||||
| 			topts = append(topts, containerd.WithTaskCheckpoint(checkpoint)) | ||||
| 		} | ||||
| 		spec, err := ctr.Spec(ctx) | ||||
|   | ||||
| @@ -64,12 +64,12 @@ var ( | ||||
| 		Usage:       "Get the data for an object", | ||||
| 		ArgsUsage:   "[<digest>, ...]", | ||||
| 		Description: "display the image object", | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 			dgst, err := digest.Parse(context.Args().First()) | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			dgst, err := digest.Parse(cliContext.Args().First()) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			client, ctx, cancel, err := commands.NewClient(context) | ||||
| 			client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -103,11 +103,11 @@ var ( | ||||
| 				Usage: "Verify content against expected digest", | ||||
| 			}, | ||||
| 		}, | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			var ( | ||||
| 				ref            = context.Args().First() | ||||
| 				expectedSize   = context.Int64("expected-size") | ||||
| 				expectedDigest = digest.Digest(context.String("expected-digest")) | ||||
| 				ref            = cliContext.Args().First() | ||||
| 				expectedSize   = cliContext.Int64("expected-size") | ||||
| 				expectedDigest = digest.Digest(cliContext.String("expected-digest")) | ||||
| 			) | ||||
| 			if err := expectedDigest.Validate(); expectedDigest != "" && err != nil { | ||||
| 				return err | ||||
| @@ -115,7 +115,7 @@ var ( | ||||
| 			if ref == "" { | ||||
| 				return errors.New("must specify a transaction reference") | ||||
| 			} | ||||
| 			client, ctx, cancel, err := commands.NewClient(context) | ||||
| 			client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -148,9 +148,9 @@ var ( | ||||
| 				Value: "/tmp/content", // TODO(stevvooe): for now, just use the PWD/.content | ||||
| 			}, | ||||
| 		}, | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 			match := context.Args().First() | ||||
| 			client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			match := cliContext.Args().First() | ||||
| 			client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -186,12 +186,12 @@ var ( | ||||
| 				Usage:   "Print only the blob digest", | ||||
| 			}, | ||||
| 		}, | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			var ( | ||||
| 				quiet = context.Bool("quiet") | ||||
| 				args  = context.Args().Slice() | ||||
| 				quiet = cliContext.Bool("quiet") | ||||
| 				args  = cliContext.Args().Slice() | ||||
| 			) | ||||
| 			client, ctx, cancel, err := commands.NewClient(context) | ||||
| 			client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -239,9 +239,9 @@ var ( | ||||
| 		Usage:       "Add labels to content", | ||||
| 		ArgsUsage:   "<digest> [<label>=<value> ...]", | ||||
| 		Description: "labels blobs in the content store", | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 			object, labels := commands.ObjectWithLabelArgs(context) | ||||
| 			client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			object, labels := commands.ObjectWithLabelArgs(cliContext) | ||||
| 			client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -304,10 +304,10 @@ var ( | ||||
| 				EnvVars: []string{"EDITOR"}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			var ( | ||||
| 				validate = context.String("validate") | ||||
| 				object   = context.Args().First() | ||||
| 				validate = cliContext.String("validate") | ||||
| 				object   = cliContext.Args().First() | ||||
| 			) | ||||
|  | ||||
| 			if validate != "" { | ||||
| @@ -321,7 +321,7 @@ var ( | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			client, ctx, cancel, err := commands.NewClient(context) | ||||
| 			client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -333,7 +333,7 @@ var ( | ||||
| 			} | ||||
| 			defer ra.Close() | ||||
|  | ||||
| 			nrc, err := edit(context, content.NewReader(ra)) | ||||
| 			nrc, err := edit(cliContext, content.NewReader(ra)) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -364,12 +364,12 @@ var ( | ||||
| 		ArgsUsage: "[<digest>, ...]", | ||||
| 		Description: `Delete one or more blobs permanently. Successfully deleted | ||||
| 	blobs are printed to stdout.`, | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			var ( | ||||
| 				args      = context.Args().Slice() | ||||
| 				args      = cliContext.Args().Slice() | ||||
| 				exitError error | ||||
| 			) | ||||
| 			client, ctx, cancel, err := commands.NewClient(context) | ||||
| 			client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -412,14 +412,14 @@ var ( | ||||
| 		ArgsUsage:   "[flags] <remote> <object> [<hint>, ...]", | ||||
| 		Description: `Fetch objects by identifier from a remote.`, | ||||
| 		Flags:       commands.RegistryFlags, | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			var ( | ||||
| 				ref = context.Args().First() | ||||
| 				ref = cliContext.Args().First() | ||||
| 			) | ||||
| 			ctx, cancel := commands.AppContext(context) | ||||
| 			ctx, cancel := commands.AppContext(cliContext) | ||||
| 			defer cancel() | ||||
|  | ||||
| 			resolver, err := commands.GetResolver(ctx, context) | ||||
| 			resolver, err := commands.GetResolver(ctx, cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -459,18 +459,18 @@ var ( | ||||
| 				Usage: "Specify target mediatype for request header", | ||||
| 			}, | ||||
| 		}...), | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			var ( | ||||
| 				ref     = context.Args().First() | ||||
| 				digests = context.Args().Tail() | ||||
| 				ref     = cliContext.Args().First() | ||||
| 				digests = cliContext.Args().Tail() | ||||
| 			) | ||||
| 			if len(digests) == 0 { | ||||
| 				return errors.New("must specify digests") | ||||
| 			} | ||||
| 			ctx, cancel := commands.AppContext(context) | ||||
| 			ctx, cancel := commands.AppContext(cliContext) | ||||
| 			defer cancel() | ||||
|  | ||||
| 			resolver, err := commands.GetResolver(ctx, context) | ||||
| 			resolver, err := commands.GetResolver(ctx, cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -493,7 +493,7 @@ var ( | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				rc, desc, err := fetcherByDigest.FetchByDigest(ctx, dgst, remotes.WithMediaType(context.String("media-type"))) | ||||
| 				rc, desc, err := fetcherByDigest.FetchByDigest(ctx, dgst, remotes.WithMediaType(cliContext.String("media-type"))) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| @@ -514,23 +514,23 @@ var ( | ||||
| 		ArgsUsage:   "[flags] <remote> <object> <type>", | ||||
| 		Description: `Push objects by identifier to a remote.`, | ||||
| 		Flags:       commands.RegistryFlags, | ||||
| 		Action: func(context *cli.Context) error { | ||||
| 		Action: func(cliContext *cli.Context) error { | ||||
| 			var ( | ||||
| 				ref    = context.Args().Get(0) | ||||
| 				object = context.Args().Get(1) | ||||
| 				media  = context.Args().Get(2) | ||||
| 				ref    = cliContext.Args().Get(0) | ||||
| 				object = cliContext.Args().Get(1) | ||||
| 				media  = cliContext.Args().Get(2) | ||||
| 			) | ||||
| 			dgst, err := digest.Parse(object) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			client, ctx, cancel, err := commands.NewClient(context) | ||||
| 			client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			defer cancel() | ||||
|  | ||||
| 			resolver, err := commands.GetResolver(ctx, context) | ||||
| 			resolver, err := commands.GetResolver(ctx, cliContext) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -578,8 +578,8 @@ var ( | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func edit(context *cli.Context, rd io.Reader) (_ io.ReadCloser, retErr error) { | ||||
| 	editor := context.String("editor") | ||||
| func edit(cliContext *cli.Context, rd io.Reader) (_ io.ReadCloser, retErr error) { | ||||
| 	editor := cliContext.String("editor") | ||||
| 	if editor == "" { | ||||
| 		return nil, errors.New("editor is required") | ||||
| 	} | ||||
|   | ||||
| @@ -81,16 +81,16 @@ Most of this is experimental and there are few leaps to make this work.`, | ||||
| 			Usage: "Pull all metadata including manifests and configs", | ||||
| 		}, | ||||
| 	), | ||||
| 	Action: func(clicontext *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			ref = clicontext.Args().First() | ||||
| 			ref = cliContext.Args().First() | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(clicontext) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		config, err := NewFetchConfig(ctx, clicontext) | ||||
| 		config, err := NewFetchConfig(ctx, cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -121,42 +121,42 @@ type FetchConfig struct { | ||||
| } | ||||
|  | ||||
| // NewFetchConfig returns the default FetchConfig from cli flags | ||||
| func NewFetchConfig(ctx context.Context, clicontext *cli.Context) (*FetchConfig, error) { | ||||
| 	resolver, err := commands.GetResolver(ctx, clicontext) | ||||
| func NewFetchConfig(ctx context.Context, cliContext *cli.Context) (*FetchConfig, error) { | ||||
| 	resolver, err := commands.GetResolver(ctx, cliContext) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	config := &FetchConfig{ | ||||
| 		Resolver:  resolver, | ||||
| 		Labels:    clicontext.StringSlice("label"), | ||||
| 		TraceHTTP: clicontext.Bool("http-trace"), | ||||
| 		Labels:    cliContext.StringSlice("label"), | ||||
| 		TraceHTTP: cliContext.Bool("http-trace"), | ||||
| 	} | ||||
| 	if !clicontext.Bool("debug") { | ||||
| 	if !cliContext.Bool("debug") { | ||||
| 		config.ProgressOutput = os.Stdout | ||||
| 	} | ||||
| 	if !clicontext.Bool("all-platforms") { | ||||
| 		p := clicontext.StringSlice("platform") | ||||
| 	if !cliContext.Bool("all-platforms") { | ||||
| 		p := cliContext.StringSlice("platform") | ||||
| 		if len(p) == 0 { | ||||
| 			p = append(p, platforms.DefaultString()) | ||||
| 		} | ||||
| 		config.Platforms = p | ||||
| 	} | ||||
|  | ||||
| 	if clicontext.Bool("metadata-only") { | ||||
| 	if cliContext.Bool("metadata-only") { | ||||
| 		config.AllMetadata = true | ||||
| 		// Any with an empty set is None | ||||
| 		config.PlatformMatcher = platforms.Any() | ||||
| 	} else if !clicontext.Bool("skip-metadata") { | ||||
| 	} else if !cliContext.Bool("skip-metadata") { | ||||
| 		config.AllMetadata = true | ||||
| 	} | ||||
|  | ||||
| 	if clicontext.IsSet("max-concurrent-downloads") { | ||||
| 		mcd := clicontext.Int("max-concurrent-downloads") | ||||
| 	if cliContext.IsSet("max-concurrent-downloads") { | ||||
| 		mcd := cliContext.Int("max-concurrent-downloads") | ||||
| 		config.RemoteOpts = append(config.RemoteOpts, containerd.WithMaxConcurrentDownloads(mcd)) | ||||
| 	} | ||||
|  | ||||
| 	if clicontext.IsSet("max-concurrent-uploaded-layers") { | ||||
| 		mcu := clicontext.Int("max-concurrent-uploaded-layers") | ||||
| 	if cliContext.IsSet("max-concurrent-uploaded-layers") { | ||||
| 		mcu := cliContext.Int("max-concurrent-uploaded-layers") | ||||
| 		config.RemoteOpts = append(config.RemoteOpts, containerd.WithMaxConcurrentUploadedLayers(mcu)) | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -56,21 +56,21 @@ var pruneReferencesCommand = &cli.Command{ | ||||
| 	Name:  "references", | ||||
| 	Usage: "Prunes preference labels from the content store (layers only by default)", | ||||
| 	Flags: pruneFlags, | ||||
| 	Action: func(clicontext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(clicontext) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		dryRun := clicontext.Bool("dry") | ||||
| 		dryRun := cliContext.Bool("dry") | ||||
| 		if dryRun { | ||||
| 			log.G(ctx).Logger.SetLevel(log.DebugLevel) | ||||
| 			log.G(ctx).Debug("dry run, no changes will be applied") | ||||
| 		} | ||||
|  | ||||
| 		var deleteOpts []leases.DeleteOpt | ||||
| 		if !clicontext.Bool("async") { | ||||
| 		if !cliContext.Bool("async") { | ||||
| 			deleteOpts = append(deleteOpts, leases.SynchronousDelete) | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -45,11 +45,11 @@ var listCommand = &cli.Command{ | ||||
| 			Usage: "output format to use (Examples: 'default', 'json')", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		// Suppress automatic warnings, since we print the warnings by ourselves. | ||||
| 		os.Setenv("CONTAINERD_SUPPRESS_DEPRECATION_WARNINGS", "1") | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -61,7 +61,7 @@ var listCommand = &cli.Command{ | ||||
| 		} | ||||
| 		wrn := warnings(resp) | ||||
| 		if len(wrn) > 0 { | ||||
| 			switch context.String("format") { | ||||
| 			switch cliContext.String("format") { | ||||
| 			case "json": | ||||
| 				commands.PrintAsJSON(warnings(resp)) | ||||
| 				return nil | ||||
|   | ||||
| @@ -35,14 +35,14 @@ var Command = &cli.Command{ | ||||
| 	Name:    "events", | ||||
| 	Aliases: []string{"event"}, | ||||
| 	Usage:   "Display containerd events", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		eventsClient := client.EventService() | ||||
| 		eventsCh, errCh := eventsClient.Subscribe(ctx, context.Args().Slice()...) | ||||
| 		eventsCh, errCh := eventsClient.Subscribe(ctx, cliContext.Args().Slice()...) | ||||
| 		for { | ||||
| 			var e *events.Envelope | ||||
| 			select { | ||||
|   | ||||
| @@ -59,16 +59,16 @@ When '--all-platforms' is given all images in a manifest list must be available. | ||||
| 			Usage: "Exports content from all platforms", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var convertOpts []converter.Opt | ||||
| 		srcRef := context.Args().Get(0) | ||||
| 		targetRef := context.Args().Get(1) | ||||
| 		srcRef := cliContext.Args().Get(0) | ||||
| 		targetRef := cliContext.Args().Get(1) | ||||
| 		if srcRef == "" || targetRef == "" { | ||||
| 			return errors.New("src and target image need to be specified") | ||||
| 		} | ||||
|  | ||||
| 		if !context.Bool("all-platforms") { | ||||
| 			if pss := context.StringSlice("platform"); len(pss) > 0 { | ||||
| 		if !cliContext.Bool("all-platforms") { | ||||
| 			if pss := cliContext.StringSlice("platform"); len(pss) > 0 { | ||||
| 				all, err := platforms.ParseAll(pss) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| @@ -79,15 +79,15 @@ When '--all-platforms' is given all images in a manifest list must be available. | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("uncompress") { | ||||
| 		if cliContext.Bool("uncompress") { | ||||
| 			convertOpts = append(convertOpts, converter.WithLayerConvertFunc(uncompress.LayerConvertFunc)) | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("oci") { | ||||
| 		if cliContext.Bool("oci") { | ||||
| 			convertOpts = append(convertOpts, converter.WithDockerToOCI(true)) | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -97,7 +97,7 @@ When '--all-platforms' is given all images in a manifest list must be available. | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		fmt.Fprintln(context.App.Writer, newImg.Target.Digest.String()) | ||||
| 		fmt.Fprintln(cliContext.App.Writer, newImg.Target.Digest.String()) | ||||
| 		return nil | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -66,17 +66,17 @@ When '--all-platforms' is given all images in a manifest list must be available. | ||||
| 			Usage: "Run export locally rather than through transfer API", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			out        = context.Args().First() | ||||
| 			images     = context.Args().Tail() | ||||
| 			out        = cliContext.Args().First() | ||||
| 			images     = cliContext.Args().Tail() | ||||
| 			exportOpts = []archive.ExportOpt{} | ||||
| 		) | ||||
| 		if out == "" || len(images) == 0 { | ||||
| 			return errors.New("please provide both an output filename and an image reference to export") | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -93,12 +93,12 @@ When '--all-platforms' is given all images in a manifest list must be available. | ||||
| 		} | ||||
| 		defer w.Close() | ||||
|  | ||||
| 		if !context.Bool("local") { | ||||
| 		if !cliContext.Bool("local") { | ||||
| 			pf, done := ProgressHandler(ctx, os.Stdout) | ||||
| 			defer done() | ||||
|  | ||||
| 			exportOpts := []tarchive.ExportOpt{} | ||||
| 			if pss := context.StringSlice("platform"); len(pss) > 0 { | ||||
| 			if pss := cliContext.StringSlice("platform"); len(pss) > 0 { | ||||
| 				for _, ps := range pss { | ||||
| 					p, err := platforms.Parse(ps) | ||||
| 					if err != nil { | ||||
| @@ -107,15 +107,15 @@ When '--all-platforms' is given all images in a manifest list must be available. | ||||
| 					exportOpts = append(exportOpts, tarchive.WithPlatform(p)) | ||||
| 				} | ||||
| 			} | ||||
| 			if context.Bool("all-platforms") { | ||||
| 			if cliContext.Bool("all-platforms") { | ||||
| 				exportOpts = append(exportOpts, tarchive.WithAllPlatforms) | ||||
| 			} | ||||
|  | ||||
| 			if context.Bool("skip-manifest-json") { | ||||
| 			if cliContext.Bool("skip-manifest-json") { | ||||
| 				exportOpts = append(exportOpts, tarchive.WithSkipCompatibilityManifest) | ||||
| 			} | ||||
|  | ||||
| 			if context.Bool("skip-non-distributable") { | ||||
| 			if cliContext.Bool("skip-non-distributable") { | ||||
| 				exportOpts = append(exportOpts, tarchive.WithSkipNonDistributableBlobs) | ||||
| 			} | ||||
|  | ||||
| @@ -131,7 +131,7 @@ When '--all-platforms' is given all images in a manifest list must be available. | ||||
| 			) | ||||
| 		} | ||||
|  | ||||
| 		if pss := context.StringSlice("platform"); len(pss) > 0 { | ||||
| 		if pss := cliContext.StringSlice("platform"); len(pss) > 0 { | ||||
| 			all, err := platforms.ParseAll(pss) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| @@ -141,15 +141,15 @@ When '--all-platforms' is given all images in a manifest list must be available. | ||||
| 			exportOpts = append(exportOpts, archive.WithPlatform(platforms.DefaultStrict())) | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("all-platforms") { | ||||
| 		if cliContext.Bool("all-platforms") { | ||||
| 			exportOpts = append(exportOpts, archive.WithAllPlatforms()) | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("skip-manifest-json") { | ||||
| 		if cliContext.Bool("skip-manifest-json") { | ||||
| 			exportOpts = append(exportOpts, archive.WithSkipDockerManifest()) | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("skip-non-distributable") { | ||||
| 		if cliContext.Bool("skip-non-distributable") { | ||||
| 			exportOpts = append(exportOpts, archive.WithSkipNonDistributableBlobs()) | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -70,12 +70,12 @@ var listCommand = &cli.Command{ | ||||
| 			Usage:   "Print only the image refs", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			filters = context.Args().Slice() | ||||
| 			quiet   = context.Bool("quiet") | ||||
| 			filters = cliContext.Args().Slice() | ||||
| 			quiet   = cliContext.Bool("quiet") | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -154,12 +154,12 @@ var setLabelsCommand = &cli.Command{ | ||||
| 			Usage:   "Replace all labels", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			replaceAll   = context.Bool("replace-all") | ||||
| 			name, labels = commands.ObjectWithLabelArgs(context) | ||||
| 			replaceAll   = cliContext.Bool("replace-all") | ||||
| 			name, labels = commands.ObjectWithLabelArgs(cliContext) | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -214,12 +214,12 @@ var checkCommand = &cli.Command{ | ||||
| 			Usage:   "Print only the ready image refs (fully downloaded and unpacked)", | ||||
| 		}, | ||||
| 	}, commands.SnapshotterFlags...), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			exitErr error | ||||
| 			quiet   = context.Bool("quiet") | ||||
| 			quiet   = cliContext.Bool("quiet") | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -227,7 +227,7 @@ var checkCommand = &cli.Command{ | ||||
|  | ||||
| 		var contentStore = client.ContentStore() | ||||
|  | ||||
| 		args := context.Args().Slice() | ||||
| 		args := cliContext.Args().Slice() | ||||
| 		imageList, err := client.ListImages(ctx, args...) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("failed listing images: %w", err) | ||||
| @@ -287,7 +287,7 @@ var checkCommand = &cli.Command{ | ||||
| 				size = "-" | ||||
| 			} | ||||
|  | ||||
| 			unpacked, err := image.IsUnpacked(ctx, context.String("snapshotter")) | ||||
| 			unpacked, err := image.IsUnpacked(ctx, cliContext.String("snapshotter")) | ||||
| 			if err != nil { | ||||
| 				if exitErr == nil { | ||||
| 					exitErr = fmt.Errorf("unable to check unpack for %v: %w", image.Name(), err) | ||||
| @@ -328,8 +328,8 @@ var removeCommand = &cli.Command{ | ||||
| 			Usage: "Synchronously remove image and all associated resources", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -338,9 +338,9 @@ var removeCommand = &cli.Command{ | ||||
| 			exitErr    error | ||||
| 			imageStore = client.ImageService() | ||||
| 		) | ||||
| 		for i, target := range context.Args().Slice() { | ||||
| 		for i, target := range cliContext.Args().Slice() { | ||||
| 			var opts []images.DeleteOpt | ||||
| 			if context.Bool("sync") && i == context.NArg()-1 { | ||||
| 			if cliContext.Bool("sync") && i == cliContext.NArg()-1 { | ||||
| 				opts = append(opts, images.SynchronousDelete()) | ||||
| 			} | ||||
| 			if err := imageStore.Delete(ctx, target, opts...); err != nil { | ||||
| @@ -373,14 +373,14 @@ var pruneCommand = &cli.Command{ | ||||
| 	}, | ||||
| 	// adapted from `nerdctl`: | ||||
| 	// https://github.com/containerd/nerdctl/blob/272dc9c29fc1434839d3ec63194d7efa24d7c0ef/cmd/nerdctl/image_prune.go#L86 | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		all := context.Bool("all") | ||||
| 		all := cliContext.Bool("all") | ||||
| 		if !all { | ||||
| 			log.G(ctx).Warn("No images pruned. `image prune` requires --all to be specified.") | ||||
| 			// NOP | ||||
|   | ||||
| @@ -101,28 +101,28 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
| 		}, | ||||
| 	}, append(commands.SnapshotterFlags, commands.LabelFlag)...), | ||||
|  | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			in              = context.Args().First() | ||||
| 			in              = cliContext.Args().First() | ||||
| 			opts            []containerd.ImportOpt | ||||
| 			platformMatcher platforms.MatchComparer | ||||
| 		) | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		if !context.Bool("local") { | ||||
| 		if !cliContext.Bool("local") { | ||||
| 			unsupportedFlags := []string{"discard-unpacked-layers"} | ||||
| 			for _, s := range unsupportedFlags { | ||||
| 				if context.IsSet(s) { | ||||
| 				if cliContext.IsSet(s) { | ||||
| 					return fmt.Errorf("\"--%s\" requires \"--local\" flag", s) | ||||
| 				} | ||||
| 			} | ||||
| 			var opts []image.StoreOpt | ||||
| 			prefix := context.String("base-name") | ||||
| 			prefix := cliContext.String("base-name") | ||||
| 			var overwrite bool | ||||
| 			if prefix == "" { | ||||
| 				prefix = fmt.Sprintf("import-%s", time.Now().Format("2006-01-02")) | ||||
| @@ -130,13 +130,13 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
| 				overwrite = true | ||||
| 			} | ||||
|  | ||||
| 			labels := context.StringSlice("label") | ||||
| 			labels := cliContext.StringSlice("label") | ||||
| 			if len(labels) > 0 { | ||||
| 				opts = append(opts, image.WithImageLabels(commands.LabelArgs(labels))) | ||||
| 			} | ||||
|  | ||||
| 			if context.Bool("digests") { | ||||
| 				opts = append(opts, image.WithDigestRef(prefix, overwrite, !context.Bool("skip-digest-for-named"))) | ||||
| 			if cliContext.Bool("digests") { | ||||
| 				opts = append(opts, image.WithDigestRef(prefix, overwrite, !cliContext.Bool("skip-digest-for-named"))) | ||||
| 			} else { | ||||
| 				opts = append(opts, image.WithNamedPrefix(prefix, overwrite)) | ||||
| 			} | ||||
| @@ -144,9 +144,9 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
| 			var platSpec ocispec.Platform | ||||
| 			// Only when all-platforms not specified, we will check platform value | ||||
| 			// Implicitly if the platforms is empty, it means all-platforms | ||||
| 			if !context.Bool("all-platforms") { | ||||
| 			if !cliContext.Bool("all-platforms") { | ||||
| 				// If platform specified, use that one, if not use default | ||||
| 				if platform := context.String("platform"); platform != "" { | ||||
| 				if platform := cliContext.String("platform"); platform != "" { | ||||
| 					platSpec, err = platforms.Parse(platform) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| @@ -157,8 +157,8 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
| 				opts = append(opts, image.WithPlatforms(platSpec)) | ||||
| 			} | ||||
|  | ||||
| 			if !context.Bool("no-unpack") { | ||||
| 				snapshotter := context.String("snapshotter") | ||||
| 			if !cliContext.Bool("no-unpack") { | ||||
| 				snapshotter := cliContext.String("snapshotter") | ||||
| 				// If OS field is not empty, it means platSpec was updated in the above block | ||||
| 				// i.e all-platforms was not specified | ||||
| 				if platSpec.OS != "" { | ||||
| @@ -170,11 +170,11 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			is := image.NewStore(context.String("index-name"), opts...) | ||||
| 			is := image.NewStore(cliContext.String("index-name"), opts...) | ||||
|  | ||||
| 			var iopts []tarchive.ImportOpt | ||||
|  | ||||
| 			if context.Bool("compress-blobs") { | ||||
| 			if cliContext.Bool("compress-blobs") { | ||||
| 				iopts = append(iopts, tarchive.WithForceCompression) | ||||
| 			} | ||||
|  | ||||
| @@ -204,7 +204,7 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
|  | ||||
| 		// Local logic | ||||
|  | ||||
| 		prefix := context.String("base-name") | ||||
| 		prefix := cliContext.String("base-name") | ||||
| 		if prefix == "" { | ||||
| 			prefix = fmt.Sprintf("import-%s", time.Now().Format("2006-01-02")) | ||||
| 			opts = append(opts, containerd.WithImageRefTranslator(archive.AddRefPrefix(prefix))) | ||||
| @@ -213,25 +213,25 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
| 			opts = append(opts, containerd.WithImageRefTranslator(archive.FilterRefPrefix(prefix))) | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("digests") { | ||||
| 		if cliContext.Bool("digests") { | ||||
| 			opts = append(opts, containerd.WithDigestRef(archive.DigestTranslator(prefix))) | ||||
| 		} | ||||
| 		if context.Bool("skip-digest-for-named") { | ||||
| 			if !context.Bool("digests") { | ||||
| 		if cliContext.Bool("skip-digest-for-named") { | ||||
| 			if !cliContext.Bool("digests") { | ||||
| 				return errors.New("--skip-digest-for-named must be specified with --digests option") | ||||
| 			} | ||||
| 			opts = append(opts, containerd.WithSkipDigestRef(func(name string) bool { return name != "" })) | ||||
| 		} | ||||
|  | ||||
| 		if idxName := context.String("index-name"); idxName != "" { | ||||
| 		if idxName := cliContext.String("index-name"); idxName != "" { | ||||
| 			opts = append(opts, containerd.WithIndexName(idxName)) | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("compress-blobs") { | ||||
| 		if cliContext.Bool("compress-blobs") { | ||||
| 			opts = append(opts, containerd.WithImportCompression()) | ||||
| 		} | ||||
|  | ||||
| 		if platform := context.String("platform"); platform != "" { | ||||
| 		if platform := cliContext.String("platform"); platform != "" { | ||||
| 			platSpec, err := platforms.Parse(platform) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| @@ -240,16 +240,16 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
| 			opts = append(opts, containerd.WithImportPlatform(platformMatcher)) | ||||
| 		} | ||||
|  | ||||
| 		opts = append(opts, containerd.WithAllPlatforms(context.Bool("all-platforms"))) | ||||
| 		opts = append(opts, containerd.WithAllPlatforms(cliContext.Bool("all-platforms"))) | ||||
|  | ||||
| 		if context.Bool("discard-unpacked-layers") { | ||||
| 			if context.Bool("no-unpack") { | ||||
| 		if cliContext.Bool("discard-unpacked-layers") { | ||||
| 			if cliContext.Bool("no-unpack") { | ||||
| 				return errors.New("--discard-unpacked-layers and --no-unpack are incompatible options") | ||||
| 			} | ||||
| 			opts = append(opts, containerd.WithDiscardUnpackedLayers()) | ||||
| 		} | ||||
|  | ||||
| 		labels := context.StringSlice("label") | ||||
| 		labels := cliContext.StringSlice("label") | ||||
| 		if len(labels) > 0 { | ||||
| 			opts = append(opts, containerd.WithImageLabels(commands.LabelArgs(labels))) | ||||
| 		} | ||||
| @@ -279,7 +279,7 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
| 			return closeErr | ||||
| 		} | ||||
|  | ||||
| 		if !context.Bool("no-unpack") { | ||||
| 		if !cliContext.Bool("no-unpack") { | ||||
| 			log.G(ctx).Debugf("unpacking %d images", len(imgs)) | ||||
|  | ||||
| 			for _, img := range imgs { | ||||
| @@ -290,7 +290,7 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | ||||
|  | ||||
| 				// TODO: Show unpack status | ||||
| 				fmt.Printf("unpacking %s (%s)...", img.Name, img.Target.Digest) | ||||
| 				err = image.Unpack(ctx, context.String("snapshotter")) | ||||
| 				err = image.Unpack(ctx, cliContext.String("snapshotter")) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
|   | ||||
| @@ -36,14 +36,14 @@ var inspectCommand = &cli.Command{ | ||||
| 			Usage: "Show JSON content", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(clicontext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(clicontext) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		var ( | ||||
| 			ref        = clicontext.Args().First() | ||||
| 			ref        = cliContext.Args().First() | ||||
| 			imageStore = client.ImageService() | ||||
| 			cs         = client.ContentStore() | ||||
| 		) | ||||
| @@ -56,7 +56,7 @@ var inspectCommand = &cli.Command{ | ||||
| 		opts := []display.PrintOpt{ | ||||
| 			display.WithWriter(os.Stdout), | ||||
| 		} | ||||
| 		if clicontext.Bool("content") { | ||||
| 		if cliContext.Bool("content") { | ||||
| 			opts = append(opts, display.Verbose) | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -51,10 +51,10 @@ When you are done, use the unmount command. | ||||
| 			Value: platforms.DefaultString(), | ||||
| 		}, | ||||
| 	), | ||||
| 	Action: func(context *cli.Context) (retErr error) { | ||||
| 	Action: func(cliContext *cli.Context) (retErr error) { | ||||
| 		var ( | ||||
| 			ref    = context.Args().First() | ||||
| 			target = context.Args().Get(1) | ||||
| 			ref    = cliContext.Args().First() | ||||
| 			target = cliContext.Args().Get(1) | ||||
| 		) | ||||
| 		if ref == "" { | ||||
| 			return errors.New("please provide an image reference to mount") | ||||
| @@ -63,13 +63,13 @@ When you are done, use the unmount command. | ||||
| 			return errors.New("please provide a target path to mount to") | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		snapshotter := context.String("snapshotter") | ||||
| 		snapshotter := cliContext.String("snapshotter") | ||||
| 		if snapshotter == "" { | ||||
| 			snapshotter = defaults.DefaultSnapshotter | ||||
| 		} | ||||
| @@ -89,7 +89,7 @@ When you are done, use the unmount command. | ||||
| 			} | ||||
| 		}() | ||||
|  | ||||
| 		ps := context.String("platform") | ||||
| 		ps := cliContext.String("platform") | ||||
| 		p, err := platforms.Parse(ps) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("unable to parse platform %s: %w", ps, err) | ||||
| @@ -115,7 +115,7 @@ When you are done, use the unmount command. | ||||
| 		s := client.SnapshotService(snapshotter) | ||||
|  | ||||
| 		var mounts []mount.Mount | ||||
| 		if context.Bool("rw") { | ||||
| 		if cliContext.Bool("rw") { | ||||
| 			mounts, err = s.Prepare(ctx, target, chainID) | ||||
| 		} else { | ||||
| 			mounts, err = s.View(ctx, target, chainID) | ||||
| @@ -131,12 +131,12 @@ When you are done, use the unmount command. | ||||
|  | ||||
| 		if err := mount.All(mounts, target); err != nil { | ||||
| 			if err := s.Remove(ctx, target); err != nil && !errdefs.IsNotFound(err) { | ||||
| 				fmt.Fprintln(context.App.ErrWriter, "Error cleaning up snapshot after mount error:", err) | ||||
| 				fmt.Fprintln(cliContext.App.ErrWriter, "Error cleaning up snapshot after mount error:", err) | ||||
| 			} | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		fmt.Fprintln(context.App.Writer, target) | ||||
| 		fmt.Fprintln(cliContext.App.Writer, target) | ||||
| 		return nil | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -85,46 +85,46 @@ command. As part of this process, we do the following: | ||||
| 			Usage: "Fetch content from local client rather than using transfer service", | ||||
| 		}, | ||||
| 	), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			ref = context.Args().First() | ||||
| 			ref = cliContext.Args().First() | ||||
| 		) | ||||
| 		if ref == "" { | ||||
| 			return errors.New("please provide an image reference to pull") | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		if !context.Bool("local") { | ||||
| 		if !cliContext.Bool("local") { | ||||
| 			unsupportedFlags := []string{"max-concurrent-downloads", "print-chainid", | ||||
| 				"skip-verify", "tlscacert", "tlscert", "tlskey", "http-dump", "http-trace", // RegistryFlags | ||||
| 			} | ||||
| 			for _, s := range unsupportedFlags { | ||||
| 				if context.IsSet(s) { | ||||
| 				if cliContext.IsSet(s) { | ||||
| 					return fmt.Errorf("\"--%s\" requires \"--local\" flag", s) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			ch, err := commands.NewStaticCredentials(ctx, context, ref) | ||||
| 			ch, err := commands.NewStaticCredentials(ctx, cliContext, ref) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			var sopts []image.StoreOpt | ||||
| 			p, err := platforms.ParseAll(context.StringSlice("platform")) | ||||
| 			p, err := platforms.ParseAll(cliContext.StringSlice("platform")) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			// Set unpack configuration | ||||
| 			for _, platform := range p { | ||||
| 				sopts = append(sopts, image.WithUnpack(platform, context.String("snapshotter"))) | ||||
| 				sopts = append(sopts, image.WithUnpack(platform, cliContext.String("snapshotter"))) | ||||
| 			} | ||||
| 			if !context.Bool("all-platforms") { | ||||
| 			if !cliContext.Bool("all-platforms") { | ||||
| 				if len(p) == 0 { | ||||
| 					p = append(p, platforms.DefaultSpec()) | ||||
| 				} | ||||
| @@ -133,21 +133,21 @@ command. As part of this process, we do the following: | ||||
| 			// TODO: Support unpack for all platforms..? | ||||
| 			// Pass in a *? | ||||
|  | ||||
| 			if context.Bool("metadata-only") { | ||||
| 			if cliContext.Bool("metadata-only") { | ||||
| 				sopts = append(sopts, image.WithAllMetadata) | ||||
| 				// Any with an empty set is None | ||||
| 				// TODO: Specify way to specify not default platform | ||||
| 				// config.PlatformMatcher = platforms.Any() | ||||
| 			} else if !context.Bool("skip-metadata") { | ||||
| 			} else if !cliContext.Bool("skip-metadata") { | ||||
| 				sopts = append(sopts, image.WithAllMetadata) | ||||
| 			} | ||||
| 			labels := context.StringSlice("label") | ||||
| 			labels := cliContext.StringSlice("label") | ||||
| 			if len(labels) > 0 { | ||||
| 				sopts = append(sopts, image.WithImageLabels(commands.LabelArgs(labels))) | ||||
| 			} | ||||
|  | ||||
| 			opts := []registry.Opt{registry.WithCredentials(ch), registry.WithHostDir(context.String("hosts-dir"))} | ||||
| 			if context.Bool("plain-http") { | ||||
| 			opts := []registry.Opt{registry.WithCredentials(ch), registry.WithHostDir(cliContext.String("hosts-dir"))} | ||||
| 			if cliContext.Bool("plain-http") { | ||||
| 				opts = append(opts, registry.WithDefaultScheme("http")) | ||||
| 			} | ||||
| 			reg, err := registry.NewOCIRegistry(ctx, ref, opts...) | ||||
| @@ -169,7 +169,7 @@ command. As part of this process, we do the following: | ||||
| 		defer done(ctx) | ||||
|  | ||||
| 		// TODO: Handle this locally via transfer config | ||||
| 		config, err := content.NewFetchConfig(ctx, context) | ||||
| 		config, err := content.NewFetchConfig(ctx, cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -184,13 +184,13 @@ command. As part of this process, we do the following: | ||||
| 		// TODO: Show unpack status | ||||
|  | ||||
| 		var p []ocispec.Platform | ||||
| 		if context.Bool("all-platforms") { | ||||
| 		if cliContext.Bool("all-platforms") { | ||||
| 			p, err = images.Platforms(ctx, client.ContentStore(), img.Target) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("unable to resolve image platforms: %w", err) | ||||
| 			} | ||||
| 		} else { | ||||
| 			p, err = platforms.ParseAll(context.StringSlice("platform")) | ||||
| 			p, err = platforms.ParseAll(cliContext.StringSlice("platform")) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -203,11 +203,11 @@ command. As part of this process, we do the following: | ||||
| 		for _, platform := range p { | ||||
| 			fmt.Printf("unpacking %s %s...\n", platforms.Format(platform), img.Target.Digest) | ||||
| 			i := containerd.NewImageWithPlatform(client, img, platforms.Only(platform)) | ||||
| 			err = i.Unpack(ctx, context.String("snapshotter")) | ||||
| 			err = i.Unpack(ctx, cliContext.String("snapshotter")) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			if context.Bool("print-chainid") { | ||||
| 			if cliContext.Bool("print-chainid") { | ||||
| 				diffIDs, err := i.RootFS(ctx) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package images | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/http/httptrace" | ||||
| @@ -78,35 +78,35 @@ var pushCommand = &cli.Command{ | ||||
| 		Name:  "allow-non-distributable-blobs", | ||||
| 		Usage: "Allow pushing blobs that are marked as non-distributable", | ||||
| 	}), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			ref   = context.Args().First() | ||||
| 			local = context.Args().Get(1) | ||||
| 			debug = context.Bool("debug") | ||||
| 			ref   = cliContext.Args().First() | ||||
| 			local = cliContext.Args().Get(1) | ||||
| 			debug = cliContext.Bool("debug") | ||||
| 			desc  ocispec.Descriptor | ||||
| 		) | ||||
| 		if ref == "" { | ||||
| 			return errors.New("please provide a remote image reference to push") | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		if !context.Bool("local") { | ||||
| 		if !cliContext.Bool("local") { | ||||
| 			unsupportedFlags := []string{ | ||||
| 				"manifest", "manifest-type", "max-concurrent-uploaded-layers", "allow-non-distributable-blobs", | ||||
| 				"skip-verify", "tlscacert", "tlscert", "tlskey", "http-dump", "http-trace", // RegistryFlags | ||||
| 			} | ||||
| 			for _, s := range unsupportedFlags { | ||||
| 				if context.IsSet(s) { | ||||
| 				if cliContext.IsSet(s) { | ||||
| 					return fmt.Errorf("\"--%s\" requires \"--local\" flag", s) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			ch, err := commands.NewStaticCredentials(ctx, context, ref) | ||||
| 			ch, err := commands.NewStaticCredentials(ctx, cliContext, ref) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -114,8 +114,8 @@ var pushCommand = &cli.Command{ | ||||
| 			if local == "" { | ||||
| 				local = ref | ||||
| 			} | ||||
| 			opts := []registry.Opt{registry.WithCredentials(ch), registry.WithHostDir(context.String("hosts-dir"))} | ||||
| 			if context.Bool("plain-http") { | ||||
| 			opts := []registry.Opt{registry.WithCredentials(ch), registry.WithHostDir(cliContext.String("hosts-dir"))} | ||||
| 			if cliContext.Bool("plain-http") { | ||||
| 				opts = append(opts, registry.WithDefaultScheme("http")) | ||||
| 			} | ||||
| 			reg, err := registry.NewOCIRegistry(ctx, ref, opts...) | ||||
| @@ -123,7 +123,7 @@ var pushCommand = &cli.Command{ | ||||
| 				return err | ||||
| 			} | ||||
| 			var p []ocispec.Platform | ||||
| 			if pss := context.StringSlice("platform"); len(pss) > 0 { | ||||
| 			if pss := cliContext.StringSlice("platform"); len(pss) > 0 { | ||||
| 				p, err = platforms.ParseAll(pss) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("invalid platform %v: %w", pss, err) | ||||
| @@ -137,12 +137,12 @@ var pushCommand = &cli.Command{ | ||||
| 			return client.Transfer(ctx, is, reg, transfer.WithProgress(pf)) | ||||
| 		} | ||||
|  | ||||
| 		if manifest := context.String("manifest"); manifest != "" { | ||||
| 		if manifest := cliContext.String("manifest"); manifest != "" { | ||||
| 			desc.Digest, err = digest.Parse(manifest) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("invalid manifest digest: %w", err) | ||||
| 			} | ||||
| 			desc.MediaType = context.String("manifest-type") | ||||
| 			desc.MediaType = cliContext.String("manifest-type") | ||||
| 		} else { | ||||
| 			if local == "" { | ||||
| 				local = ref | ||||
| @@ -153,7 +153,7 @@ var pushCommand = &cli.Command{ | ||||
| 			} | ||||
| 			desc = img.Target | ||||
|  | ||||
| 			if pss := context.StringSlice("platform"); len(pss) == 1 { | ||||
| 			if pss := cliContext.StringSlice("platform"); len(pss) == 1 { | ||||
| 				p, err := platforms.Parse(pss[0]) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("invalid platform %q: %w", pss[0], err) | ||||
| @@ -175,10 +175,10 @@ var pushCommand = &cli.Command{ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("http-trace") { | ||||
| 		if cliContext.Bool("http-trace") { | ||||
| 			ctx = httptrace.WithClientTrace(ctx, commands.NewDebugClientTrace(ctx)) | ||||
| 		} | ||||
| 		resolver, err := commands.GetResolver(ctx, context) | ||||
| 		resolver, err := commands.GetResolver(ctx, cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -194,8 +194,8 @@ var pushCommand = &cli.Command{ | ||||
|  | ||||
| 			log.G(ctx).WithField("image", ref).WithField("digest", desc.Digest).Debug("pushing") | ||||
|  | ||||
| 			jobHandler := images.HandlerFunc(func(ctx gocontext.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { | ||||
| 				if !context.Bool("allow-non-distributable-blobs") && images.IsNonDistributable(desc.MediaType) { | ||||
| 			jobHandler := images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { | ||||
| 				if !cliContext.Bool("allow-non-distributable-blobs") && images.IsNonDistributable(desc.MediaType) { | ||||
| 					return nil, nil | ||||
| 				} | ||||
| 				ongoing.add(remotes.MakeRefKey(ctx, desc)) | ||||
| @@ -203,7 +203,7 @@ var pushCommand = &cli.Command{ | ||||
| 			}) | ||||
|  | ||||
| 			handler := jobHandler | ||||
| 			if !context.Bool("allow-non-distributable-blobs") { | ||||
| 			if !cliContext.Bool("allow-non-distributable-blobs") { | ||||
| 				handler = remotes.SkipNonDistributableBlobs(handler) | ||||
| 			} | ||||
|  | ||||
| @@ -212,8 +212,8 @@ var pushCommand = &cli.Command{ | ||||
| 				containerd.WithImageHandler(handler), | ||||
| 			} | ||||
|  | ||||
| 			if context.IsSet("max-concurrent-uploaded-layers") { | ||||
| 				mcu := context.Int("max-concurrent-uploaded-layers") | ||||
| 			if cliContext.IsSet("max-concurrent-uploaded-layers") { | ||||
| 				mcu := cliContext.Int("max-concurrent-uploaded-layers") | ||||
| 				ropts = append(ropts, containerd.WithMaxConcurrentUploadedLayers(mcu)) | ||||
| 			} | ||||
|  | ||||
|   | ||||
| @@ -47,26 +47,26 @@ var tagCommand = &cli.Command{ | ||||
| 			Usage: "Skip the strict check for reference names", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			ref = context.Args().First() | ||||
| 			ref = cliContext.Args().First() | ||||
| 		) | ||||
| 		if ref == "" { | ||||
| 			return errors.New("please provide an image reference to tag from") | ||||
| 		} | ||||
| 		if context.NArg() <= 1 { | ||||
| 		if cliContext.NArg() <= 1 { | ||||
| 			return errors.New("please provide an image reference to tag to") | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		if !context.Bool("local") { | ||||
| 			for _, targetRef := range context.Args().Slice()[1:] { | ||||
| 				if !context.Bool("skip-reference-check") { | ||||
| 		if !cliContext.Bool("local") { | ||||
| 			for _, targetRef := range cliContext.Args().Slice()[1:] { | ||||
| 				if !cliContext.Bool("skip-reference-check") { | ||||
| 					if _, err := reference.ParseAnyReference(targetRef); err != nil { | ||||
| 						return fmt.Errorf("error parsing reference: %q is not a valid repository/tag %v", targetRef, err) | ||||
| 					} | ||||
| @@ -92,8 +92,8 @@ var tagCommand = &cli.Command{ | ||||
| 			return err | ||||
| 		} | ||||
| 		// Support multiple references for one command run | ||||
| 		for _, targetRef := range context.Args().Slice()[1:] { | ||||
| 			if !context.Bool("skip-reference-check") { | ||||
| 		for _, targetRef := range cliContext.Args().Slice()[1:] { | ||||
| 			if !cliContext.Bool("skip-reference-check") { | ||||
| 				if _, err := reference.ParseAnyReference(targetRef); err != nil { | ||||
| 					return fmt.Errorf("error parsing reference: %q is not a valid repository/tag %v", targetRef, err) | ||||
| 				} | ||||
| @@ -103,7 +103,7 @@ var tagCommand = &cli.Command{ | ||||
| 			if _, err = imageService.Create(ctx, image); err != nil { | ||||
| 				// If user has specified force and the image already exists then | ||||
| 				// delete the original image and attempt to create the new one | ||||
| 				if errdefs.IsAlreadyExists(err) && context.Bool("force") { | ||||
| 				if errdefs.IsAlreadyExists(err) && cliContext.Bool("force") { | ||||
| 					if err = imageService.Delete(ctx, targetRef); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
|   | ||||
| @@ -38,15 +38,15 @@ var unmountCommand = &cli.Command{ | ||||
| 			Usage: "Remove the snapshot after a successful unmount", | ||||
| 		}, | ||||
| 	), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			target = context.Args().First() | ||||
| 			target = cliContext.Args().First() | ||||
| 		) | ||||
| 		if target == "" { | ||||
| 			return errors.New("please provide a target path to unmount from") | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -56,8 +56,8 @@ var unmountCommand = &cli.Command{ | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("rm") { | ||||
| 			snapshotter := context.String("snapshotter") | ||||
| 		if cliContext.Bool("rm") { | ||||
| 			snapshotter := cliContext.String("snapshotter") | ||||
| 			s := client.SnapshotService(snapshotter) | ||||
| 			if err := client.LeasesService().Delete(ctx, leases.Lease{ID: target}); err != nil && !errdefs.IsNotFound(err) { | ||||
| 				return fmt.Errorf("error deleting lease: %w", err) | ||||
| @@ -67,7 +67,7 @@ var unmountCommand = &cli.Command{ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		fmt.Fprintln(context.App.Writer, target) | ||||
| 		fmt.Fprintln(cliContext.App.Writer, target) | ||||
| 		return nil | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -36,19 +36,19 @@ var usageCommand = &cli.Command{ | ||||
| 	Usage:     "Display usage of snapshots for a given image ref", | ||||
| 	ArgsUsage: "[flags] <ref>", | ||||
| 	Flags:     commands.SnapshotterFlags, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		var ref = context.Args().First() | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ref = cliContext.Args().First() | ||||
| 		if ref == "" { | ||||
| 			return errors.New("please provide an image reference to mount") | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		snapshotter := context.String("snapshotter") | ||||
| 		snapshotter := cliContext.String("snapshotter") | ||||
| 		if snapshotter == "" { | ||||
| 			snapshotter = defaults.DefaultSnapshotter | ||||
| 		} | ||||
|   | ||||
| @@ -30,8 +30,8 @@ type Info struct { | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "info", | ||||
| 	Usage: "Print the server info", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -44,25 +44,25 @@ var Command = &cli.Command{ | ||||
| 			Usage: "Set an optional install path other than the managed opt directory", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		ref := context.Args().First() | ||||
| 		ref := cliContext.Args().First() | ||||
| 		image, err := client.GetImage(ctx, ref) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		var opts []containerd.InstallOpts | ||||
| 		if context.Bool("libs") { | ||||
| 		if cliContext.Bool("libs") { | ||||
| 			opts = append(opts, containerd.WithInstallLibs) | ||||
| 		} | ||||
| 		if context.Bool("replace") { | ||||
| 		if cliContext.Bool("replace") { | ||||
| 			opts = append(opts, containerd.WithInstallReplace) | ||||
| 		} | ||||
| 		if path := context.String("path"); path != "" { | ||||
| 		if path := cliContext.String("path"); path != "" { | ||||
| 			opts = append(opts, containerd.WithInstallPath(path)) | ||||
| 		} | ||||
| 		return client.Install(ctx, image, opts...) | ||||
|   | ||||
| @@ -54,12 +54,12 @@ var listCommand = &cli.Command{ | ||||
| 			Usage:   "Print only the blob digest", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			filters = context.Args().Slice() | ||||
| 			quiet   = context.Bool("quiet") | ||||
| 			filters = cliContext.Args().Slice() | ||||
| 			quiet   = cliContext.Bool("quiet") | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -117,9 +117,9 @@ var createCommand = &cli.Command{ | ||||
| 			Value:   24 * time.Hour, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		var labelstr = context.Args().Slice() | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var labelstr = cliContext.Args().Slice() | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -136,10 +136,10 @@ var createCommand = &cli.Command{ | ||||
| 			opts = append(opts, leases.WithLabels(labels)) | ||||
| 		} | ||||
|  | ||||
| 		if id := context.String("id"); id != "" { | ||||
| 		if id := cliContext.String("id"); id != "" { | ||||
| 			opts = append(opts, leases.WithID(id)) | ||||
| 		} | ||||
| 		if exp := context.Duration("expires"); exp > 0 { | ||||
| 		if exp := cliContext.Duration("expires"); exp > 0 { | ||||
| 			opts = append(opts, leases.WithExpiration(exp)) | ||||
| 		} | ||||
|  | ||||
| @@ -166,19 +166,19 @@ var deleteCommand = &cli.Command{ | ||||
| 			Usage: "Synchronously remove leases and all unreferenced resources", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		var lids = context.Args().Slice() | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var lids = cliContext.Args().Slice() | ||||
| 		if len(lids) == 0 { | ||||
| 			return cli.ShowSubcommandHelp(context) | ||||
| 			return cli.ShowSubcommandHelp(cliContext) | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		ls := client.LeasesService() | ||||
| 		sync := context.Bool("sync") | ||||
| 		sync := cliContext.Bool("sync") | ||||
| 		for i, lid := range lids { | ||||
| 			var opts []leases.DeleteOpt | ||||
| 			if sync && i == len(lids)-1 { | ||||
|   | ||||
| @@ -49,12 +49,12 @@ var createCommand = &cli.Command{ | ||||
| 	Usage:       "Create a new namespace", | ||||
| 	ArgsUsage:   "<name> [<key>=<value>]", | ||||
| 	Description: "create a new namespace. it must be unique", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		namespace, labels := commands.ObjectWithLabelArgs(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		namespace, labels := commands.ObjectWithLabelArgs(cliContext) | ||||
| 		if namespace == "" { | ||||
| 			return errors.New("please specify a namespace") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -69,12 +69,12 @@ var setLabelsCommand = &cli.Command{ | ||||
| 	Usage:       "Set and clear labels for a namespace", | ||||
| 	ArgsUsage:   "<name> [<key>=<value>, ...]", | ||||
| 	Description: "set and clear labels for a namespace. empty value clears the label", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		namespace, labels := commands.ObjectWithLabelArgs(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		namespace, labels := commands.ObjectWithLabelArgs(cliContext) | ||||
| 		if namespace == "" { | ||||
| 			return errors.New("please specify a namespace") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -102,9 +102,9 @@ var listCommand = &cli.Command{ | ||||
| 			Usage:   "Print only the namespace name", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		quiet := context.Bool("quiet") | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		quiet := cliContext.Bool("quiet") | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -155,17 +155,17 @@ var removeCommand = &cli.Command{ | ||||
| 			Usage:   "Delete the namespace's cgroup", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var exitErr error | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		opts := deleteOpts(context) | ||||
| 		opts := deleteOpts(cliContext) | ||||
| 		namespaces := client.NamespaceService() | ||||
| 		for _, target := range context.Args().Slice() { | ||||
| 		for _, target := range cliContext.Args().Slice() { | ||||
| 			if err := namespaces.Delete(ctx, target, opts...); err != nil { | ||||
| 				if !errdefs.IsNotFound(err) { | ||||
| 					if exitErr == nil { | ||||
|   | ||||
| @@ -22,9 +22,9 @@ import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| ) | ||||
|  | ||||
| func deleteOpts(context *cli.Context) []namespaces.DeleteOpts { | ||||
| func deleteOpts(cliContext *cli.Context) []namespaces.DeleteOpts { | ||||
| 	var delOpts []namespaces.DeleteOpts | ||||
| 	if context.Bool("cgroup") { | ||||
| 	if cliContext.Bool("cgroup") { | ||||
| 		delOpts = append(delOpts, opts.WithNamespaceCgroupDeletion) | ||||
| 	} | ||||
| 	return delOpts | ||||
|   | ||||
| @@ -23,6 +23,6 @@ import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| ) | ||||
|  | ||||
| func deleteOpts(context *cli.Context) []namespaces.DeleteOpts { | ||||
| func deleteOpts(cliContext *cli.Context) []namespaces.DeleteOpts { | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
| @@ -45,12 +45,12 @@ var defaultSpecCommand = &cli.Command{ | ||||
| 			Usage: "Platform of the spec to print (Examples: 'linux/arm64', 'windows/amd64')", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		ctx, cancel := commands.AppContext(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		ctx, cancel := commands.AppContext(cliContext) | ||||
| 		defer cancel() | ||||
|  | ||||
| 		platform := platforms.DefaultString() | ||||
| 		if plat := context.String("platform"); plat != "" { | ||||
| 		if plat := cliContext.String("platform"); plat != "" { | ||||
| 			platform = plat | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -60,18 +60,18 @@ var listCommand = &cli.Command{ | ||||
| 			Usage:   "Print detailed information about each plugin", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			quiet    = context.Bool("quiet") | ||||
| 			detailed = context.Bool("detailed") | ||||
| 			quiet    = cliContext.Bool("quiet") | ||||
| 			detailed = cliContext.Bool("detailed") | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		ps := client.IntrospectionService() | ||||
| 		response, err := ps.Plugins(ctx, context.Args().Slice()...) | ||||
| 		response, err := ps.Plugins(ctx, cliContext.Args().Slice()...) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -172,13 +172,13 @@ var inspectRuntimeCommand = &cli.Command{ | ||||
| 	Usage:     "Display runtime info", | ||||
| 	ArgsUsage: "[flags]", | ||||
| 	Flags:     commands.RuntimeFlags, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		rt := context.String("runtime") | ||||
| 		rtOptions, err := commands.RuntimeOptions(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		rt := cliContext.String("runtime") | ||||
| 		rtOptions, err := commands.RuntimeOptions(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -191,7 +191,7 @@ var inspectRuntimeCommand = &cli.Command{ | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		_, err = fmt.Fprintln(context.App.Writer, string(j)) | ||||
| 		_, err = fmt.Fprintln(cliContext.App.Writer, string(j)) | ||||
| 		return err | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -64,10 +64,10 @@ var pprofGoroutinesCommand = &cli.Command{ | ||||
| 			Value: 2, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client := getPProfClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client := getPProfClient(cliContext) | ||||
|  | ||||
| 		debug := context.Uint("debug") | ||||
| 		debug := cliContext.Uint("debug") | ||||
| 		output, err := httpGetRequest(client, fmt.Sprintf("/debug/pprof/goroutine?debug=%d", debug)) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -88,10 +88,10 @@ var pprofHeapCommand = &cli.Command{ | ||||
| 			Value: 0, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client := getPProfClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client := getPProfClient(cliContext) | ||||
|  | ||||
| 		debug := context.Uint("debug") | ||||
| 		debug := cliContext.Uint("debug") | ||||
| 		output, err := httpGetRequest(client, fmt.Sprintf("/debug/pprof/heap?debug=%d", debug)) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -118,11 +118,11 @@ var pprofProfileCommand = &cli.Command{ | ||||
| 			Value: 0, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client := getPProfClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client := getPProfClient(cliContext) | ||||
|  | ||||
| 		seconds := context.Duration("seconds").Seconds() | ||||
| 		debug := context.Uint("debug") | ||||
| 		seconds := cliContext.Duration("seconds").Seconds() | ||||
| 		debug := cliContext.Uint("debug") | ||||
| 		output, err := httpGetRequest(client, fmt.Sprintf("/debug/pprof/profile?seconds=%v&debug=%d", seconds, debug)) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -149,11 +149,11 @@ var pprofTraceCommand = &cli.Command{ | ||||
| 			Value: 0, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client := getPProfClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client := getPProfClient(cliContext) | ||||
|  | ||||
| 		seconds := context.Duration("seconds").Seconds() | ||||
| 		debug := context.Uint("debug") | ||||
| 		seconds := cliContext.Duration("seconds").Seconds() | ||||
| 		debug := cliContext.Uint("debug") | ||||
| 		uri := fmt.Sprintf("/debug/pprof/trace?seconds=%v&debug=%d", seconds, debug) | ||||
| 		output, err := httpGetRequest(client, uri) | ||||
| 		if err != nil { | ||||
| @@ -175,10 +175,10 @@ var pprofBlockCommand = &cli.Command{ | ||||
| 			Value: 0, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client := getPProfClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client := getPProfClient(cliContext) | ||||
|  | ||||
| 		debug := context.Uint("debug") | ||||
| 		debug := cliContext.Uint("debug") | ||||
| 		output, err := httpGetRequest(client, fmt.Sprintf("/debug/pprof/block?debug=%d", debug)) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -199,10 +199,10 @@ var pprofThreadcreateCommand = &cli.Command{ | ||||
| 			Value: 0, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client := getPProfClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client := getPProfClient(cliContext) | ||||
|  | ||||
| 		debug := context.Uint("debug") | ||||
| 		debug := cliContext.Uint("debug") | ||||
| 		output, err := httpGetRequest(client, fmt.Sprintf("/debug/pprof/threadcreate?debug=%d", debug)) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -213,8 +213,8 @@ var pprofThreadcreateCommand = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func getPProfClient(context *cli.Context) *http.Client { | ||||
| 	dialer := getPProfDialer(context.String("debug-socket")) | ||||
| func getPProfClient(cliContext *cli.Context) *http.Client { | ||||
| 	dialer := getPProfDialer(cliContext.String("debug-socket")) | ||||
|  | ||||
| 	tr := &http.Transport{ | ||||
| 		Dial: dialer.pprofDial, | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package commands | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"crypto/tls" | ||||
| 	"crypto/x509" | ||||
| 	"errors" | ||||
| @@ -58,8 +58,8 @@ func passwordPrompt() (string, error) { | ||||
| } | ||||
|  | ||||
| // GetResolver prepares the resolver from the environment and options | ||||
| func GetResolver(ctx gocontext.Context, clicontext *cli.Context) (remotes.Resolver, error) { | ||||
| 	username := clicontext.String("user") | ||||
| func GetResolver(ctx context.Context, cliContext *cli.Context) (remotes.Resolver, error) { | ||||
| 	username := cliContext.String("user") | ||||
| 	var secret string | ||||
| 	if i := strings.IndexByte(username, ':'); i > 0 { | ||||
| 		secret = username[i+1:] | ||||
| @@ -80,7 +80,7 @@ func GetResolver(ctx gocontext.Context, clicontext *cli.Context) (remotes.Resolv | ||||
|  | ||||
| 			fmt.Print("\n") | ||||
| 		} | ||||
| 	} else if rt := clicontext.String("refresh"); rt != "" { | ||||
| 	} else if rt := cliContext.String("refresh"); rt != "" { | ||||
| 		secret = rt | ||||
| 	} | ||||
|  | ||||
| @@ -90,19 +90,19 @@ func GetResolver(ctx gocontext.Context, clicontext *cli.Context) (remotes.Resolv | ||||
| 		// Only one host | ||||
| 		return username, secret, nil | ||||
| 	} | ||||
| 	if clicontext.Bool("plain-http") { | ||||
| 	if cliContext.Bool("plain-http") { | ||||
| 		hostOptions.DefaultScheme = "http" | ||||
| 	} | ||||
| 	defaultTLS, err := resolverDefaultTLS(clicontext) | ||||
| 	defaultTLS, err := resolverDefaultTLS(cliContext) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	hostOptions.DefaultTLS = defaultTLS | ||||
| 	if hostDir := clicontext.String("hosts-dir"); hostDir != "" { | ||||
| 	if hostDir := cliContext.String("hosts-dir"); hostDir != "" { | ||||
| 		hostOptions.HostDir = config.HostDirFromRoot(hostDir) | ||||
| 	} | ||||
|  | ||||
| 	if clicontext.Bool("http-dump") { | ||||
| 	if cliContext.Bool("http-dump") { | ||||
| 		hostOptions.UpdateClient = func(client *http.Client) error { | ||||
| 			client.Transport = &DebugTransport{ | ||||
| 				transport: client.Transport, | ||||
| @@ -117,27 +117,27 @@ func GetResolver(ctx gocontext.Context, clicontext *cli.Context) (remotes.Resolv | ||||
| 	return docker.NewResolver(options), nil | ||||
| } | ||||
|  | ||||
| func resolverDefaultTLS(clicontext *cli.Context) (*tls.Config, error) { | ||||
| 	config := &tls.Config{} | ||||
| func resolverDefaultTLS(cliContext *cli.Context) (*tls.Config, error) { | ||||
| 	tlsConfig := &tls.Config{} | ||||
|  | ||||
| 	if clicontext.Bool("skip-verify") { | ||||
| 		config.InsecureSkipVerify = true | ||||
| 	if cliContext.Bool("skip-verify") { | ||||
| 		tlsConfig.InsecureSkipVerify = true | ||||
| 	} | ||||
|  | ||||
| 	if tlsRootPath := clicontext.String("tlscacert"); tlsRootPath != "" { | ||||
| 	if tlsRootPath := cliContext.String("tlscacert"); tlsRootPath != "" { | ||||
| 		tlsRootData, err := os.ReadFile(tlsRootPath) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("failed to read %q: %w", tlsRootPath, err) | ||||
| 		} | ||||
|  | ||||
| 		config.RootCAs = x509.NewCertPool() | ||||
| 		if !config.RootCAs.AppendCertsFromPEM(tlsRootData) { | ||||
| 		tlsConfig.RootCAs = x509.NewCertPool() | ||||
| 		if !tlsConfig.RootCAs.AppendCertsFromPEM(tlsRootData) { | ||||
| 			return nil, fmt.Errorf("failed to load TLS CAs from %q: invalid data", tlsRootPath) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	tlsCertPath := clicontext.String("tlscert") | ||||
| 	tlsKeyPath := clicontext.String("tlskey") | ||||
| 	tlsCertPath := cliContext.String("tlscert") | ||||
| 	tlsKeyPath := cliContext.String("tlskey") | ||||
| 	if tlsCertPath != "" || tlsKeyPath != "" { | ||||
| 		if tlsCertPath == "" || tlsKeyPath == "" { | ||||
| 			return nil, errors.New("flags --tlscert and --tlskey must be set together") | ||||
| @@ -146,15 +146,15 @@ func resolverDefaultTLS(clicontext *cli.Context) (*tls.Config, error) { | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("failed to load TLS client credentials (cert=%q, key=%q): %w", tlsCertPath, tlsKeyPath, err) | ||||
| 		} | ||||
| 		config.Certificates = []tls.Certificate{keyPair} | ||||
| 		tlsConfig.Certificates = []tls.Certificate{keyPair} | ||||
| 	} | ||||
|  | ||||
| 	// If nothing was set, return nil rather than empty config | ||||
| 	if !config.InsecureSkipVerify && config.RootCAs == nil && config.Certificates == nil { | ||||
| 	if !tlsConfig.InsecureSkipVerify && tlsConfig.RootCAs == nil && tlsConfig.Certificates == nil { | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	return config, nil | ||||
| 	return tlsConfig, nil | ||||
| } | ||||
|  | ||||
| // DebugTransport wraps the underlying http.RoundTripper interface and dumps all requests/responses to the writer. | ||||
| @@ -193,7 +193,7 @@ func (t DebugTransport) RoundTrip(req *http.Request) (*http.Response, error) { | ||||
|  | ||||
| // NewDebugClientTrace returns a Go http trace client predefined to write DNS and connection | ||||
| // information to the log. This is used via the --http-trace flag on push and pull operations in ctr. | ||||
| func NewDebugClientTrace(ctx gocontext.Context) *httptrace.ClientTrace { | ||||
| func NewDebugClientTrace(ctx context.Context) *httptrace.ClientTrace { | ||||
| 	return &httptrace.ClientTrace{ | ||||
| 		DNSStart: func(dnsInfo httptrace.DNSStartInfo) { | ||||
| 			log.G(ctx).WithField("host", dnsInfo.Host).Debugf("DNS lookup") | ||||
| @@ -223,8 +223,8 @@ type staticCredentials struct { | ||||
| } | ||||
|  | ||||
| // NewStaticCredentials gets credentials from passing in cli context | ||||
| func NewStaticCredentials(ctx gocontext.Context, clicontext *cli.Context, ref string) (registry.CredentialHelper, error) { | ||||
| 	username := clicontext.String("user") | ||||
| func NewStaticCredentials(ctx context.Context, cliContext *cli.Context, ref string) (registry.CredentialHelper, error) { | ||||
| 	username := cliContext.String("user") | ||||
| 	var secret string | ||||
| 	if i := strings.IndexByte(username, ':'); i > 0 { | ||||
| 		secret = username[i+1:] | ||||
| @@ -242,7 +242,7 @@ func NewStaticCredentials(ctx gocontext.Context, clicontext *cli.Context, ref st | ||||
|  | ||||
| 			fmt.Print("\n") | ||||
| 		} | ||||
| 	} else if rt := clicontext.String("refresh"); rt != "" { | ||||
| 	} else if rt := cliContext.String("refresh"); rt != "" { | ||||
| 		secret = rt | ||||
| 	} | ||||
|  | ||||
| @@ -253,7 +253,7 @@ func NewStaticCredentials(ctx gocontext.Context, clicontext *cli.Context, ref st | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (sc *staticCredentials) GetCredentials(ctx gocontext.Context, ref, host string) (registry.Credentials, error) { | ||||
| func (sc *staticCredentials) GetCredentials(ctx context.Context, ref, host string) (registry.Credentials, error) { | ||||
| 	if ref == sc.ref { | ||||
| 		return registry.Credentials{ | ||||
| 			Username: sc.username, | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package run | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"encoding/csv" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| @@ -39,11 +39,11 @@ import ( | ||||
| 	"github.com/containerd/log" | ||||
| ) | ||||
|  | ||||
| func withMounts(context *cli.Context) oci.SpecOpts { | ||||
| 	return func(ctx gocontext.Context, client oci.Client, container *containers.Container, s *specs.Spec) error { | ||||
| func withMounts(cliContext *cli.Context) oci.SpecOpts { | ||||
| 	return func(ctx context.Context, client oci.Client, container *containers.Container, s *specs.Spec) error { | ||||
| 		mounts := make([]specs.Mount, 0) | ||||
| 		dests := make([]string, 0) | ||||
| 		for _, mount := range context.StringSlice("mount") { | ||||
| 		for _, mount := range cliContext.StringSlice("mount") { | ||||
| 			m, err := parseMountFlag(mount) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| @@ -131,27 +131,27 @@ var Command = &cli.Command{ | ||||
| 		append(commands.RuntimeFlags, | ||||
| 			append(append(commands.SnapshotterFlags, []cli.Flag{commands.SnapshotterLabels}...), | ||||
| 				commands.ContainerFlags...)...)...)...), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			err error | ||||
| 			id  string | ||||
| 			ref string | ||||
|  | ||||
| 			rm        = context.Bool("rm") | ||||
| 			tty       = context.Bool("tty") | ||||
| 			detach    = context.Bool("detach") | ||||
| 			config    = context.IsSet("config") | ||||
| 			enableCNI = context.Bool("cni") | ||||
| 			rm        = cliContext.Bool("rm") | ||||
| 			tty       = cliContext.Bool("tty") | ||||
| 			detach    = cliContext.Bool("detach") | ||||
| 			config    = cliContext.IsSet("config") | ||||
| 			enableCNI = cliContext.Bool("cni") | ||||
| 		) | ||||
|  | ||||
| 		if config { | ||||
| 			id = context.Args().First() | ||||
| 			if context.NArg() > 1 { | ||||
| 			id = cliContext.Args().First() | ||||
| 			if cliContext.NArg() > 1 { | ||||
| 				return errors.New("with spec config file, only container id should be provided") | ||||
| 			} | ||||
| 		} else { | ||||
| 			id = context.Args().Get(1) | ||||
| 			ref = context.Args().First() | ||||
| 			id = cliContext.Args().Get(1) | ||||
| 			ref = cliContext.Args().First() | ||||
|  | ||||
| 			if ref == "" { | ||||
| 				return errors.New("image ref must be provided") | ||||
| @@ -164,13 +164,13 @@ var Command = &cli.Command{ | ||||
| 			return errors.New("flags --detach and --rm cannot be specified together") | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		container, err := NewContainer(ctx, client, context) | ||||
| 		container, err := NewContainer(ctx, client, cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -196,9 +196,9 @@ var Command = &cli.Command{ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		opts := tasks.GetNewTaskOpts(context) | ||||
| 		ioOpts := []cio.Opt{cio.WithFIFODir(context.String("fifo-dir"))} | ||||
| 		task, err := tasks.NewTask(ctx, client, container, context.String("checkpoint"), con, context.Bool("null-io"), context.String("log-uri"), ioOpts, opts...) | ||||
| 		opts := tasks.GetNewTaskOpts(cliContext) | ||||
| 		ioOpts := []cio.Opt{cio.WithFIFODir(cliContext.String("fifo-dir"))} | ||||
| 		task, err := tasks.NewTask(ctx, client, container, cliContext.String("checkpoint"), con, cliContext.Bool("null-io"), cliContext.String("log-uri"), ioOpts, opts...) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -221,8 +221,8 @@ var Command = &cli.Command{ | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		if context.IsSet("pid-file") { | ||||
| 			if err := commands.WritePidFile(context.String("pid-file"), int(task.Pid())); err != nil { | ||||
| 		if cliContext.IsSet("pid-file") { | ||||
| 			if err := commands.WritePidFile(cliContext.String("pid-file"), int(task.Pid())); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| package run | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| @@ -82,15 +82,15 @@ var platformRunFlags = []cli.Flag{ | ||||
| } | ||||
|  | ||||
| // NewContainer creates a new container | ||||
| func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli.Context) (containerd.Container, error) { | ||||
| func NewContainer(ctx context.Context, client *containerd.Client, cliContext *cli.Context) (containerd.Container, error) { | ||||
| 	var ( | ||||
| 		id     string | ||||
| 		config = context.IsSet("config") | ||||
| 		config = cliContext.IsSet("config") | ||||
| 	) | ||||
| 	if config { | ||||
| 		id = context.Args().First() | ||||
| 		id = cliContext.Args().First() | ||||
| 	} else { | ||||
| 		id = context.Args().Get(1) | ||||
| 		id = cliContext.Args().Get(1) | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| @@ -99,41 +99,41 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 		spec  containerd.NewContainerOpts | ||||
| 	) | ||||
|  | ||||
| 	if sandbox := context.String("sandbox"); sandbox != "" { | ||||
| 	if sandbox := cliContext.String("sandbox"); sandbox != "" { | ||||
| 		cOpts = append(cOpts, containerd.WithSandbox(sandbox)) | ||||
| 	} | ||||
|  | ||||
| 	if config { | ||||
| 		cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(context.StringSlice("label")))) | ||||
| 		opts = append(opts, oci.WithSpecFromFile(context.String("config"))) | ||||
| 		cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(cliContext.StringSlice("label")))) | ||||
| 		opts = append(opts, oci.WithSpecFromFile(cliContext.String("config"))) | ||||
| 	} else { | ||||
| 		var ( | ||||
| 			ref = context.Args().First() | ||||
| 			ref = cliContext.Args().First() | ||||
| 			// for container's id is Args[1] | ||||
| 			args = context.Args().Slice()[2:] | ||||
| 			args = cliContext.Args().Slice()[2:] | ||||
| 		) | ||||
| 		opts = append(opts, oci.WithDefaultSpec(), oci.WithDefaultUnixDevices) | ||||
| 		if ef := context.String("env-file"); ef != "" { | ||||
| 		if ef := cliContext.String("env-file"); ef != "" { | ||||
| 			opts = append(opts, oci.WithEnvFile(ef)) | ||||
| 		} | ||||
| 		opts = append(opts, oci.WithEnv(context.StringSlice("env"))) | ||||
| 		opts = append(opts, withMounts(context)) | ||||
| 		opts = append(opts, oci.WithEnv(cliContext.StringSlice("env"))) | ||||
| 		opts = append(opts, withMounts(cliContext)) | ||||
|  | ||||
| 		if context.Bool("rootfs") { | ||||
| 		if cliContext.Bool("rootfs") { | ||||
| 			rootfs, err := filepath.Abs(ref) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			opts = append(opts, oci.WithRootFSPath(rootfs)) | ||||
| 			cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(context.StringSlice("label")))) | ||||
| 			cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(cliContext.StringSlice("label")))) | ||||
| 		} else { | ||||
| 			snapshotter := context.String("snapshotter") | ||||
| 			snapshotter := cliContext.String("snapshotter") | ||||
| 			var image containerd.Image | ||||
| 			i, err := client.ImageService().Get(ctx, ref) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			if ps := context.String("platform"); ps != "" { | ||||
| 			if ps := cliContext.String("platform"); ps != "" { | ||||
| 				platform, err := platforms.Parse(ps) | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| @@ -152,14 +152,14 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 					return nil, err | ||||
| 				} | ||||
| 			} | ||||
| 			labels := buildLabels(commands.LabelArgs(context.StringSlice("label")), image.Labels()) | ||||
| 			labels := buildLabels(commands.LabelArgs(cliContext.StringSlice("label")), image.Labels()) | ||||
| 			opts = append(opts, oci.WithImageConfig(image)) | ||||
| 			cOpts = append(cOpts, | ||||
| 				containerd.WithImage(image), | ||||
| 				containerd.WithImageConfigLabels(image), | ||||
| 				containerd.WithAdditionalContainerLabels(labels), | ||||
| 				containerd.WithSnapshotter(snapshotter)) | ||||
| 			if uidmap, gidmap := context.String("uidmap"), context.String("gidmap"); uidmap != "" && gidmap != "" { | ||||
| 			if uidmap, gidmap := cliContext.String("uidmap"), cliContext.String("gidmap"); uidmap != "" && gidmap != "" { | ||||
| 				uidMap, err := parseIDMapping(uidmap) | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| @@ -174,7 +174,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 				// currently the snapshotters known to support the labels are: | ||||
| 				// fuse-overlayfs - https://github.com/containerd/fuse-overlayfs-snapshotter | ||||
| 				// overlay - in case of idmapped mount points are supported by host kernel (Linux kernel 5.19) | ||||
| 				if context.Bool("remap-labels") { | ||||
| 				if cliContext.Bool("remap-labels") { | ||||
| 					cOpts = append(cOpts, containerd.WithNewSnapshot(id, image, | ||||
| 						containerd.WithRemapperLabels(0, uidMap.HostID, 0, gidMap.HostID, uidMap.Size))) | ||||
| 				} else { | ||||
| @@ -187,28 +187,28 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 				// For some snapshotter, such as overlaybd, it can provide 2 kind of writable snapshot(overlayfs dir or block-device) | ||||
| 				// by command label values. | ||||
| 				cOpts = append(cOpts, containerd.WithNewSnapshot(id, image, | ||||
| 					snapshots.WithLabels(commands.LabelArgs(context.StringSlice("snapshotter-label"))))) | ||||
| 					snapshots.WithLabels(commands.LabelArgs(cliContext.StringSlice("snapshotter-label"))))) | ||||
| 			} | ||||
| 			cOpts = append(cOpts, containerd.WithImageStopSignal(image, "SIGTERM")) | ||||
| 		} | ||||
| 		if context.Bool("read-only") { | ||||
| 		if cliContext.Bool("read-only") { | ||||
| 			opts = append(opts, oci.WithRootFSReadonly()) | ||||
| 		} | ||||
| 		if len(args) > 0 { | ||||
| 			opts = append(opts, oci.WithProcessArgs(args...)) | ||||
| 		} | ||||
| 		if cwd := context.String("cwd"); cwd != "" { | ||||
| 		if cwd := cliContext.String("cwd"); cwd != "" { | ||||
| 			opts = append(opts, oci.WithProcessCwd(cwd)) | ||||
| 		} | ||||
| 		if user := context.String("user"); user != "" { | ||||
| 		if user := cliContext.String("user"); user != "" { | ||||
| 			opts = append(opts, oci.WithUser(user), oci.WithAdditionalGIDs(user)) | ||||
| 		} | ||||
| 		if context.Bool("tty") { | ||||
| 		if cliContext.Bool("tty") { | ||||
| 			opts = append(opts, oci.WithTTY) | ||||
| 		} | ||||
|  | ||||
| 		privileged := context.Bool("privileged") | ||||
| 		privilegedWithoutHostDevices := context.Bool("privileged-without-host-devices") | ||||
| 		privileged := cliContext.Bool("privileged") | ||||
| 		privilegedWithoutHostDevices := cliContext.Bool("privileged-without-host-devices") | ||||
| 		if privilegedWithoutHostDevices && !privileged { | ||||
| 			return nil, errors.New("can't use 'privileged-without-host-devices' without 'privileged' specified") | ||||
| 		} | ||||
| @@ -220,7 +220,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("net-host") { | ||||
| 		if cliContext.Bool("net-host") { | ||||
| 			hostname, err := os.Hostname() | ||||
| 			if err != nil { | ||||
| 				return nil, fmt.Errorf("get hostname: %w", err) | ||||
| @@ -232,7 +232,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 				oci.WithEnv([]string{fmt.Sprintf("HOSTNAME=%s", hostname)}), | ||||
| 			) | ||||
| 		} | ||||
| 		if annoStrings := context.StringSlice("annotation"); len(annoStrings) > 0 { | ||||
| 		if annoStrings := cliContext.StringSlice("annotation"); len(annoStrings) > 0 { | ||||
| 			annos, err := commands.AnnotationArgs(annoStrings) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| @@ -240,7 +240,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			opts = append(opts, oci.WithAnnotations(annos)) | ||||
| 		} | ||||
|  | ||||
| 		if caps := context.StringSlice("cap-add"); len(caps) > 0 { | ||||
| 		if caps := cliContext.StringSlice("cap-add"); len(caps) > 0 { | ||||
| 			for _, cap := range caps { | ||||
| 				if !strings.HasPrefix(cap, "CAP_") { | ||||
| 					return nil, errors.New("capabilities must be specified with 'CAP_' prefix") | ||||
| @@ -249,7 +249,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			opts = append(opts, oci.WithAddedCapabilities(caps)) | ||||
| 		} | ||||
|  | ||||
| 		if caps := context.StringSlice("cap-drop"); len(caps) > 0 { | ||||
| 		if caps := cliContext.StringSlice("cap-drop"); len(caps) > 0 { | ||||
| 			for _, cap := range caps { | ||||
| 				if !strings.HasPrefix(cap, "CAP_") { | ||||
| 					return nil, errors.New("capabilities must be specified with 'CAP_' prefix") | ||||
| @@ -258,13 +258,13 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			opts = append(opts, oci.WithDroppedCapabilities(caps)) | ||||
| 		} | ||||
|  | ||||
| 		seccompProfile := context.String("seccomp-profile") | ||||
| 		seccompProfile := cliContext.String("seccomp-profile") | ||||
|  | ||||
| 		if !context.Bool("seccomp") && seccompProfile != "" { | ||||
| 		if !cliContext.Bool("seccomp") && seccompProfile != "" { | ||||
| 			return nil, errors.New("seccomp must be set to true, if using a custom seccomp-profile") | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("seccomp") { | ||||
| 		if cliContext.Bool("seccomp") { | ||||
| 			if seccompProfile != "" { | ||||
| 				opts = append(opts, seccomp.WithProfile(seccompProfile)) | ||||
| 			} else { | ||||
| @@ -272,18 +272,18 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if s := context.String("apparmor-default-profile"); len(s) > 0 { | ||||
| 		if s := cliContext.String("apparmor-default-profile"); len(s) > 0 { | ||||
| 			opts = append(opts, apparmor.WithDefaultProfile(s)) | ||||
| 		} | ||||
|  | ||||
| 		if s := context.String("apparmor-profile"); len(s) > 0 { | ||||
| 			if len(context.String("apparmor-default-profile")) > 0 { | ||||
| 		if s := cliContext.String("apparmor-profile"); len(s) > 0 { | ||||
| 			if len(cliContext.String("apparmor-default-profile")) > 0 { | ||||
| 				return nil, errors.New("apparmor-profile conflicts with apparmor-default-profile") | ||||
| 			} | ||||
| 			opts = append(opts, apparmor.WithProfile(s)) | ||||
| 		} | ||||
|  | ||||
| 		if cpus := context.Float64("cpus"); cpus > 0.0 { | ||||
| 		if cpus := cliContext.Float64("cpus"); cpus > 0.0 { | ||||
| 			var ( | ||||
| 				period = uint64(100000) | ||||
| 				quota  = int64(cpus * 100000.0) | ||||
| @@ -291,32 +291,32 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			opts = append(opts, oci.WithCPUCFS(quota, period)) | ||||
| 		} | ||||
|  | ||||
| 		if cpusetCpus := context.String("cpuset-cpus"); len(cpusetCpus) > 0 { | ||||
| 		if cpusetCpus := cliContext.String("cpuset-cpus"); len(cpusetCpus) > 0 { | ||||
| 			opts = append(opts, oci.WithCPUs(cpusetCpus)) | ||||
| 		} | ||||
|  | ||||
| 		if cpusetMems := context.String("cpuset-mems"); len(cpusetMems) > 0 { | ||||
| 		if cpusetMems := cliContext.String("cpuset-mems"); len(cpusetMems) > 0 { | ||||
| 			opts = append(opts, oci.WithCPUsMems(cpusetMems)) | ||||
| 		} | ||||
|  | ||||
| 		if shares := context.Int("cpu-shares"); shares > 0 { | ||||
| 		if shares := cliContext.Int("cpu-shares"); shares > 0 { | ||||
| 			opts = append(opts, oci.WithCPUShares(uint64(shares))) | ||||
| 		} | ||||
|  | ||||
| 		quota := context.Int64("cpu-quota") | ||||
| 		period := context.Uint64("cpu-period") | ||||
| 		quota := cliContext.Int64("cpu-quota") | ||||
| 		period := cliContext.Uint64("cpu-period") | ||||
| 		if quota != -1 || period != 0 { | ||||
| 			if cpus := context.Float64("cpus"); cpus > 0.0 { | ||||
| 			if cpus := cliContext.Float64("cpus"); cpus > 0.0 { | ||||
| 				return nil, errors.New("cpus and quota/period should be used separately") | ||||
| 			} | ||||
| 			opts = append(opts, oci.WithCPUCFS(quota, period)) | ||||
| 		} | ||||
|  | ||||
| 		if burst := context.Uint64("cpu-burst"); burst != 0 { | ||||
| 		if burst := cliContext.Uint64("cpu-burst"); burst != 0 { | ||||
| 			opts = append(opts, oci.WithCPUBurst(burst)) | ||||
| 		} | ||||
|  | ||||
| 		joinNs := context.StringSlice("with-ns") | ||||
| 		joinNs := cliContext.StringSlice("with-ns") | ||||
| 		for _, ns := range joinNs { | ||||
| 			nsType, nsPath, ok := strings.Cut(ns, ":") | ||||
| 			if !ok { | ||||
| @@ -330,22 +330,22 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 				Path: nsPath, | ||||
| 			})) | ||||
| 		} | ||||
| 		if context.IsSet("gpus") { | ||||
| 			opts = append(opts, nvidia.WithGPUs(nvidia.WithDevices(context.IntSlice("gpus")...), nvidia.WithAllCapabilities)) | ||||
| 		if cliContext.IsSet("gpus") { | ||||
| 			opts = append(opts, nvidia.WithGPUs(nvidia.WithDevices(cliContext.IntSlice("gpus")...), nvidia.WithAllCapabilities)) | ||||
| 		} | ||||
| 		if context.IsSet("allow-new-privs") { | ||||
| 		if cliContext.IsSet("allow-new-privs") { | ||||
| 			opts = append(opts, oci.WithNewPrivileges) | ||||
| 		} | ||||
| 		if context.IsSet("cgroup") { | ||||
| 		if cliContext.IsSet("cgroup") { | ||||
| 			// NOTE: can be set to "" explicitly for disabling cgroup. | ||||
| 			opts = append(opts, oci.WithCgroup(context.String("cgroup"))) | ||||
| 			opts = append(opts, oci.WithCgroup(cliContext.String("cgroup"))) | ||||
| 		} | ||||
| 		limit := context.Uint64("memory-limit") | ||||
| 		limit := cliContext.Uint64("memory-limit") | ||||
| 		if limit != 0 { | ||||
| 			opts = append(opts, oci.WithMemoryLimit(limit)) | ||||
| 		} | ||||
| 		var cdiDeviceIDs []string | ||||
| 		for _, dev := range context.StringSlice("device") { | ||||
| 		for _, dev := range cliContext.StringSlice("device") { | ||||
| 			if parser.IsQualifiedName(dev) { | ||||
| 				cdiDeviceIDs = append(cdiDeviceIDs, dev) | ||||
| 				continue | ||||
| @@ -357,9 +357,9 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 		} | ||||
| 		opts = append(opts, oci.WithCDIDevices(cdiDeviceIDs...)) | ||||
|  | ||||
| 		rootfsPropagation := context.String("rootfs-propagation") | ||||
| 		rootfsPropagation := cliContext.String("rootfs-propagation") | ||||
| 		if rootfsPropagation != "" { | ||||
| 			opts = append(opts, func(_ gocontext.Context, _ oci.Client, _ *containers.Container, s *oci.Spec) error { | ||||
| 			opts = append(opts, func(_ context.Context, _ oci.Client, _ *containers.Container, s *oci.Spec) error { | ||||
| 				if s.Linux != nil { | ||||
| 					s.Linux.RootfsPropagation = rootfsPropagation | ||||
| 				} else { | ||||
| @@ -372,39 +372,39 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			}) | ||||
| 		} | ||||
|  | ||||
| 		if c := context.String("blockio-config-file"); c != "" { | ||||
| 		if c := cliContext.String("blockio-config-file"); c != "" { | ||||
| 			if err := blockio.SetConfigFromFile(c, false); err != nil { | ||||
| 				return nil, fmt.Errorf("blockio-config-file error: %w", err) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if c := context.String("blockio-class"); c != "" { | ||||
| 		if c := cliContext.String("blockio-class"); c != "" { | ||||
| 			if linuxBlockIO, err := blockio.OciLinuxBlockIO(c); err == nil { | ||||
| 				opts = append(opts, oci.WithBlockIO(linuxBlockIO)) | ||||
| 			} else { | ||||
| 				return nil, fmt.Errorf("blockio-class error: %w", err) | ||||
| 			} | ||||
| 		} | ||||
| 		if c := context.String("rdt-class"); c != "" { | ||||
| 		if c := cliContext.String("rdt-class"); c != "" { | ||||
| 			opts = append(opts, oci.WithRdt(c, "", "")) | ||||
| 		} | ||||
| 		if hostname := context.String("hostname"); hostname != "" { | ||||
| 		if hostname := cliContext.String("hostname"); hostname != "" { | ||||
| 			opts = append(opts, oci.WithHostname(hostname)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if context.Bool("cni") { | ||||
| 	if cliContext.Bool("cni") { | ||||
| 		cniMeta := &commands.NetworkMetaData{EnableCni: true} | ||||
| 		cOpts = append(cOpts, containerd.WithContainerExtension(commands.CtrCniMetadataExtension, cniMeta)) | ||||
| 	} | ||||
|  | ||||
| 	runtimeOpts, err := commands.RuntimeOptions(context) | ||||
| 	runtimeOpts, err := commands.RuntimeOptions(cliContext) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	cOpts = append(cOpts, containerd.WithRuntime(context.String("runtime"), runtimeOpts)) | ||||
| 	cOpts = append(cOpts, containerd.WithRuntime(cliContext.String("runtime"), runtimeOpts)) | ||||
|  | ||||
| 	opts = append(opts, oci.WithAnnotations(commands.LabelArgs(context.StringSlice("label")))) | ||||
| 	opts = append(opts, oci.WithAnnotations(commands.LabelArgs(cliContext.StringSlice("label")))) | ||||
| 	var s specs.Spec | ||||
| 	spec = containerd.WithSpec(&s, opts...) | ||||
|  | ||||
| @@ -456,7 +456,7 @@ func validNamespace(ns string) bool { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func getNetNSPath(_ gocontext.Context, task containerd.Task) (string, error) { | ||||
| func getNetNSPath(_ context.Context, task containerd.Task) (string, error) { | ||||
| 	return fmt.Sprintf("/proc/%d/ns/net", task.Pid()), nil | ||||
| } | ||||
|  | ||||
| @@ -464,7 +464,7 @@ func getNetNSPath(_ gocontext.Context, task containerd.Task) (string, error) { | ||||
| // This is used from the `run` command to avoid creating a registry with auto-refresh enabled. | ||||
| // It also provides a way to override the CDI spec file paths if required. | ||||
| func withStaticCDIRegistry() oci.SpecOpts { | ||||
| 	return func(ctx gocontext.Context, _ oci.Client, _ *containers.Container, s *oci.Spec) error { | ||||
| 	return func(ctx context.Context, _ oci.Client, _ *containers.Container, s *oci.Spec) error { | ||||
| 		_ = cdi.Configure(cdi.WithAutoRefresh(false)) | ||||
| 		if err := cdi.Refresh(); err != nil { | ||||
| 			// We don't consider registry refresh failure a fatal error. | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package run | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"strings" | ||||
|  | ||||
| @@ -41,32 +41,32 @@ var platformRunFlags = []cli.Flag{ | ||||
| } | ||||
|  | ||||
| // NewContainer creates a new container | ||||
| func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli.Context) (containerd.Container, error) { | ||||
| func NewContainer(ctx context.Context, client *containerd.Client, cliContext *cli.Context) (containerd.Container, error) { | ||||
| 	var ( | ||||
| 		id    string | ||||
| 		opts  []oci.SpecOpts | ||||
| 		cOpts []containerd.NewContainerOpts | ||||
| 		spec  containerd.NewContainerOpts | ||||
|  | ||||
| 		config = context.IsSet("config") | ||||
| 		config = cliContext.IsSet("config") | ||||
| 	) | ||||
|  | ||||
| 	if sandbox := context.String("sandbox"); sandbox != "" { | ||||
| 	if sandbox := cliContext.String("sandbox"); sandbox != "" { | ||||
| 		cOpts = append(cOpts, containerd.WithSandbox(sandbox)) | ||||
| 	} | ||||
|  | ||||
| 	if config { | ||||
| 		id = context.Args().First() | ||||
| 		opts = append(opts, oci.WithSpecFromFile(context.String("config"))) | ||||
| 		cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(context.StringSlice("label")))) | ||||
| 		id = cliContext.Args().First() | ||||
| 		opts = append(opts, oci.WithSpecFromFile(cliContext.String("config"))) | ||||
| 		cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(cliContext.StringSlice("label")))) | ||||
| 	} else { | ||||
| 		var ( | ||||
| 			ref  = context.Args().First() | ||||
| 			args = context.Args().Slice()[2:] | ||||
| 			ref  = cliContext.Args().First() | ||||
| 			args = cliContext.Args().Slice()[2:] | ||||
| 		) | ||||
|  | ||||
| 		id = context.Args().Get(1) | ||||
| 		snapshotter := context.String("snapshotter") | ||||
| 		id = cliContext.Args().Get(1) | ||||
| 		snapshotter := cliContext.String("snapshotter") | ||||
| 		if snapshotter == "windows-lcow" { | ||||
| 			opts = append(opts, oci.WithDefaultSpecForPlatform("linux/amd64")) | ||||
| 			// Clear the rootfs section. | ||||
| @@ -76,11 +76,11 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			opts = append(opts, oci.WithWindowNetworksAllowUnqualifiedDNSQuery()) | ||||
| 			opts = append(opts, oci.WithWindowsIgnoreFlushesDuringBoot()) | ||||
| 		} | ||||
| 		if ef := context.String("env-file"); ef != "" { | ||||
| 		if ef := cliContext.String("env-file"); ef != "" { | ||||
| 			opts = append(opts, oci.WithEnvFile(ef)) | ||||
| 		} | ||||
| 		opts = append(opts, oci.WithEnv(context.StringSlice("env"))) | ||||
| 		opts = append(opts, withMounts(context)) | ||||
| 		opts = append(opts, oci.WithEnv(cliContext.StringSlice("env"))) | ||||
| 		opts = append(opts, withMounts(cliContext)) | ||||
|  | ||||
| 		image, err := client.GetImage(ctx, ref) | ||||
| 		if err != nil { | ||||
| @@ -96,7 +96,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			} | ||||
| 		} | ||||
| 		opts = append(opts, oci.WithImageConfig(image)) | ||||
| 		labels := buildLabels(commands.LabelArgs(context.StringSlice("label")), image.Labels()) | ||||
| 		labels := buildLabels(commands.LabelArgs(cliContext.StringSlice("label")), image.Labels()) | ||||
| 		cOpts = append(cOpts, | ||||
| 			containerd.WithImage(image), | ||||
| 			containerd.WithImageConfigLabels(image), | ||||
| @@ -104,19 +104,19 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			containerd.WithNewSnapshot( | ||||
| 				id, | ||||
| 				image, | ||||
| 				snapshots.WithLabels(commands.LabelArgs(context.StringSlice("snapshotter-label")))), | ||||
| 				snapshots.WithLabels(commands.LabelArgs(cliContext.StringSlice("snapshotter-label")))), | ||||
| 			containerd.WithAdditionalContainerLabels(labels)) | ||||
|  | ||||
| 		if len(args) > 0 { | ||||
| 			opts = append(opts, oci.WithProcessArgs(args...)) | ||||
| 		} | ||||
| 		if cwd := context.String("cwd"); cwd != "" { | ||||
| 		if cwd := cliContext.String("cwd"); cwd != "" { | ||||
| 			opts = append(opts, oci.WithProcessCwd(cwd)) | ||||
| 		} | ||||
| 		if user := context.String("user"); user != "" { | ||||
| 		if user := cliContext.String("user"); user != "" { | ||||
| 			opts = append(opts, oci.WithUser(user)) | ||||
| 		} | ||||
| 		if context.Bool("tty") { | ||||
| 		if cliContext.Bool("tty") { | ||||
| 			opts = append(opts, oci.WithTTY) | ||||
|  | ||||
| 			con := console.Current() | ||||
| @@ -126,36 +126,36 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 			} | ||||
| 			opts = append(opts, oci.WithTTYSize(int(size.Width), int(size.Height))) | ||||
| 		} | ||||
| 		if context.Bool("net-host") { | ||||
| 		if cliContext.Bool("net-host") { | ||||
| 			return nil, errors.New("Cannot use host mode networking with Windows containers") | ||||
| 		} | ||||
| 		if context.Bool("cni") { | ||||
| 		if cliContext.Bool("cni") { | ||||
| 			ns, err := netns.NewNetNS("") | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			opts = append(opts, oci.WithWindowsNetworkNamespace(ns.GetPath())) | ||||
| 		} | ||||
| 		if context.Bool("isolated") { | ||||
| 		if cliContext.Bool("isolated") { | ||||
| 			opts = append(opts, oci.WithWindowsHyperV) | ||||
| 		} | ||||
| 		limit := context.Uint64("memory-limit") | ||||
| 		limit := cliContext.Uint64("memory-limit") | ||||
| 		if limit != 0 { | ||||
| 			opts = append(opts, oci.WithMemoryLimit(limit)) | ||||
| 		} | ||||
| 		ccount := context.Uint64("cpu-count") | ||||
| 		ccount := cliContext.Uint64("cpu-count") | ||||
| 		if ccount != 0 { | ||||
| 			opts = append(opts, oci.WithWindowsCPUCount(ccount)) | ||||
| 		} | ||||
| 		cshares := context.Uint64("cpu-shares") | ||||
| 		cshares := cliContext.Uint64("cpu-shares") | ||||
| 		if cshares != 0 { | ||||
| 			opts = append(opts, oci.WithWindowsCPUShares(uint16(cshares))) | ||||
| 		} | ||||
| 		cmax := context.Uint64("cpu-max") | ||||
| 		cmax := cliContext.Uint64("cpu-max") | ||||
| 		if cmax != 0 { | ||||
| 			opts = append(opts, oci.WithWindowsCPUMaximum(uint16(cmax))) | ||||
| 		} | ||||
| 		for _, dev := range context.StringSlice("device") { | ||||
| 		for _, dev := range cliContext.StringSlice("device") { | ||||
| 			idType, devID, ok := strings.Cut(dev, "://") | ||||
| 			if !ok { | ||||
| 				return nil, errors.New("devices must be in the format IDType://ID") | ||||
| @@ -167,16 +167,16 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if context.Bool("cni") { | ||||
| 	if cliContext.Bool("cni") { | ||||
| 		cniMeta := &commands.NetworkMetaData{EnableCni: true} | ||||
| 		cOpts = append(cOpts, containerd.WithContainerExtension(commands.CtrCniMetadataExtension, cniMeta)) | ||||
| 	} | ||||
|  | ||||
| 	runtime := context.String("runtime") | ||||
| 	runtime := cliContext.String("runtime") | ||||
| 	var runtimeOpts interface{} | ||||
| 	if runtime == "io.containerd.runhcs.v1" { | ||||
| 		runtimeOpts = &options.Options{ | ||||
| 			Debug: context.Bool("debug"), | ||||
| 			Debug: cliContext.Bool("debug"), | ||||
| 		} | ||||
| 	} | ||||
| 	cOpts = append(cOpts, containerd.WithRuntime(runtime, runtimeOpts)) | ||||
| @@ -189,7 +189,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli | ||||
| 	return client.NewContainer(ctx, id, cOpts...) | ||||
| } | ||||
|  | ||||
| func getNetNSPath(ctx gocontext.Context, t containerd.Task) (string, error) { | ||||
| func getNetNSPath(ctx context.Context, t containerd.Task) (string, error) { | ||||
| 	s, err := t.Spec(ctx) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
|   | ||||
| @@ -54,16 +54,16 @@ var runCommand = &cli.Command{ | ||||
| 			Value: defaults.DefaultRuntime, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		if context.NArg() != 2 { | ||||
| 			return cli.ShowSubcommandHelp(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		if cliContext.NArg() != 2 { | ||||
| 			return cli.ShowSubcommandHelp(cliContext) | ||||
| 		} | ||||
| 		var ( | ||||
| 			id      = context.Args().Get(1) | ||||
| 			runtime = context.String("runtime") | ||||
| 			id      = cliContext.Args().Get(1) | ||||
| 			runtime = cliContext.String("runtime") | ||||
| 		) | ||||
|  | ||||
| 		spec, err := os.ReadFile(context.Args().First()) | ||||
| 		spec, err := os.ReadFile(cliContext.Args().First()) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("failed to read sandbox config: %w", err) | ||||
| 		} | ||||
| @@ -73,7 +73,7 @@ var runCommand = &cli.Command{ | ||||
| 			return fmt.Errorf("failed to parse sandbox config: %w", err) | ||||
| 		} | ||||
|  | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -107,8 +107,8 @@ var listCommand = &cli.Command{ | ||||
| 			Usage: "The list of filters to apply when querying sandboxes from the store", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -116,7 +116,7 @@ var listCommand = &cli.Command{ | ||||
|  | ||||
| 		var ( | ||||
| 			writer  = tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) | ||||
| 			filters = context.StringSlice("filters") | ||||
| 			filters = cliContext.StringSlice("filters") | ||||
| 		) | ||||
|  | ||||
| 		defer func() { | ||||
| @@ -155,16 +155,16 @@ var removeCommand = &cli.Command{ | ||||
| 			Usage:   "Ignore shutdown errors when removing sandbox", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		force := context.Bool("force") | ||||
| 		force := cliContext.Bool("force") | ||||
|  | ||||
| 		for _, id := range context.Args().Slice() { | ||||
| 		for _, id := range cliContext.Args().Slice() { | ||||
| 			sandbox, err := client.LoadSandbox(ctx, id) | ||||
| 			if err != nil { | ||||
| 				log.G(ctx).WithError(err).Errorf("failed to load sandbox %s", id) | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| package shim | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"sync" | ||||
| @@ -37,7 +37,7 @@ var bufPool = sync.Pool{ | ||||
|  | ||||
| func prepareStdio(stdin, stdout, stderr string, console bool) (wg *sync.WaitGroup, err error) { | ||||
| 	wg = &sync.WaitGroup{} | ||||
| 	ctx := gocontext.Background() | ||||
| 	ctx := context.Background() | ||||
|  | ||||
| 	f, err := fifo.OpenFifo(ctx, stdin, unix.O_WRONLY|unix.O_CREAT|unix.O_NONBLOCK, 0700) | ||||
| 	if err != nil { | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| package shim | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| @@ -81,13 +81,13 @@ var Command = &cli.Command{ | ||||
| var startCommand = &cli.Command{ | ||||
| 	Name:  "start", | ||||
| 	Usage: "Start a container with a task", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		service, err := getTaskService(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		service, err := getTaskService(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		_, err = service.Start(gocontext.Background(), &task.StartRequest{ | ||||
| 			ID: context.Args().First(), | ||||
| 		_, err = service.Start(context.Background(), &task.StartRequest{ | ||||
| 			ID: cliContext.Args().First(), | ||||
| 		}) | ||||
| 		return err | ||||
| 	}, | ||||
| @@ -96,13 +96,13 @@ var startCommand = &cli.Command{ | ||||
| var deleteCommand = &cli.Command{ | ||||
| 	Name:  "delete", | ||||
| 	Usage: "Delete a container with a task", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		service, err := getTaskService(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		service, err := getTaskService(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		r, err := service.Delete(gocontext.Background(), &task.DeleteRequest{ | ||||
| 			ID: context.Args().First(), | ||||
| 		r, err := service.Delete(context.Background(), &task.DeleteRequest{ | ||||
| 			ID: cliContext.Args().First(), | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -115,13 +115,13 @@ var deleteCommand = &cli.Command{ | ||||
| var stateCommand = &cli.Command{ | ||||
| 	Name:  "state", | ||||
| 	Usage: "Get the state of all the processes of the task", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		service, err := getTaskService(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		service, err := getTaskService(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		r, err := service.State(gocontext.Background(), &task.StateRequest{ | ||||
| 			ID: context.String("id"), | ||||
| 		r, err := service.State(context.Background(), &task.StateRequest{ | ||||
| 			ID: cliContext.String("id"), | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -155,28 +155,28 @@ var execCommand = &cli.Command{ | ||||
| 			Usage: "Runtime spec", | ||||
| 		}, | ||||
| 	), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		service, err := getTaskService(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		service, err := getTaskService(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		var ( | ||||
| 			id  = context.Args().First() | ||||
| 			ctx = gocontext.Background() | ||||
| 			id  = cliContext.Args().First() | ||||
| 			ctx = context.Background() | ||||
| 		) | ||||
|  | ||||
| 		if id == "" { | ||||
| 			return errors.New("exec id must be provided") | ||||
| 		} | ||||
|  | ||||
| 		tty := context.Bool("tty") | ||||
| 		wg, err := prepareStdio(context.String("stdin"), context.String("stdout"), context.String("stderr"), tty) | ||||
| 		tty := cliContext.Bool("tty") | ||||
| 		wg, err := prepareStdio(cliContext.String("stdin"), cliContext.String("stdout"), cliContext.String("stderr"), tty) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		// read spec file and extract Any object | ||||
| 		spec, err := os.ReadFile(context.String("spec")) | ||||
| 		spec, err := os.ReadFile(cliContext.String("spec")) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -191,9 +191,9 @@ var execCommand = &cli.Command{ | ||||
| 				TypeUrl: url, | ||||
| 				Value:   spec, | ||||
| 			}, | ||||
| 			Stdin:    context.String("stdin"), | ||||
| 			Stdout:   context.String("stdout"), | ||||
| 			Stderr:   context.String("stderr"), | ||||
| 			Stdin:    cliContext.String("stdin"), | ||||
| 			Stdout:   cliContext.String("stdout"), | ||||
| 			Stderr:   cliContext.String("stderr"), | ||||
| 			Terminal: tty, | ||||
| 		} | ||||
| 		if _, err := service.Exec(ctx, rq); err != nil { | ||||
| @@ -206,7 +206,7 @@ var execCommand = &cli.Command{ | ||||
| 			return err | ||||
| 		} | ||||
| 		fmt.Printf("exec running with pid %d\n", r.Pid) | ||||
| 		if context.Bool("attach") { | ||||
| 		if cliContext.Bool("attach") { | ||||
| 			log.L.Info("attaching") | ||||
| 			if tty { | ||||
| 				current := console.Current() | ||||
| @@ -232,19 +232,19 @@ var execCommand = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func getTaskService(context *cli.Context) (task.TTRPCTaskService, error) { | ||||
| 	id := context.String("id") | ||||
| func getTaskService(cliContext *cli.Context) (task.TTRPCTaskService, error) { | ||||
| 	id := cliContext.String("id") | ||||
| 	if id == "" { | ||||
| 		return nil, fmt.Errorf("container id must be specified") | ||||
| 	} | ||||
| 	ns := context.String("namespace") | ||||
| 	ns := cliContext.String("namespace") | ||||
|  | ||||
| 	// /containerd-shim/ns/id/shim.sock is the old way to generate shim socket, | ||||
| 	// compatible it | ||||
| 	s1 := filepath.Join(string(filepath.Separator), "containerd-shim", ns, id, "shim.sock") | ||||
| 	// this should not error, ctr always get a default ns | ||||
| 	ctx := namespaces.WithNamespace(gocontext.Background(), ns) | ||||
| 	s2, _ := shim.SocketAddress(ctx, context.String("address"), id) | ||||
| 	ctx := namespaces.WithNamespace(context.Background(), ns) | ||||
| 	s2, _ := shim.SocketAddress(ctx, cliContext.String("address"), id) | ||||
| 	s2 = strings.TrimPrefix(s2, "unix://") | ||||
|  | ||||
| 	for _, socket := range []string{s2, "\x00" + s1} { | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package commands | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
| 	"syscall" | ||||
| @@ -28,11 +28,11 @@ import ( | ||||
| ) | ||||
|  | ||||
| type killer interface { | ||||
| 	Kill(gocontext.Context, syscall.Signal, ...containerd.KillOpts) error | ||||
| 	Kill(context.Context, syscall.Signal, ...containerd.KillOpts) error | ||||
| } | ||||
|  | ||||
| // ForwardAllSignals forwards signals | ||||
| func ForwardAllSignals(ctx gocontext.Context, task killer) chan os.Signal { | ||||
| func ForwardAllSignals(ctx context.Context, task killer) chan os.Signal { | ||||
| 	sigc := make(chan os.Signal, 128) | ||||
| 	signal.Notify(sigc) | ||||
| 	go func() { | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package snapshots | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| @@ -67,18 +67,18 @@ var listCommand = &cli.Command{ | ||||
| 	Name:    "list", | ||||
| 	Aliases: []string{"ls"}, | ||||
| 	Usage:   "List snapshots", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		var ( | ||||
| 			snapshotter = client.SnapshotService(context.String("snapshotter")) | ||||
| 			snapshotter = client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 			tw          = tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) | ||||
| 		) | ||||
| 		fmt.Fprintln(tw, "KEY\tPARENT\tKIND\t") | ||||
| 		if err := snapshotter.Walk(ctx, func(ctx gocontext.Context, info snapshots.Info) error { | ||||
| 		if err := snapshotter.Walk(ctx, func(ctx context.Context, info snapshots.Info) error { | ||||
| 			fmt.Fprintf(tw, "%v\t%v\t%v\t\n", | ||||
| 				info.Name, | ||||
| 				info.Parent, | ||||
| @@ -111,15 +111,15 @@ var diffCommand = &cli.Command{ | ||||
| 			Usage: "Keep diff content. up to creator to delete it.", | ||||
| 		}, | ||||
| 	}, commands.LabelFlag), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			idA = context.Args().First() | ||||
| 			idB = context.Args().Get(1) | ||||
| 			idA = cliContext.Args().First() | ||||
| 			idB = cliContext.Args().Get(1) | ||||
| 		) | ||||
| 		if idA == "" { | ||||
| 			return errors.New("snapshot id must be provided") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -132,15 +132,15 @@ var diffCommand = &cli.Command{ | ||||
| 		defer done(ctx) | ||||
|  | ||||
| 		var desc ocispec.Descriptor | ||||
| 		labels := commands.LabelArgs(context.StringSlice("label")) | ||||
| 		snapshotter := client.SnapshotService(context.String("snapshotter")) | ||||
| 		labels := commands.LabelArgs(cliContext.StringSlice("label")) | ||||
| 		snapshotter := client.SnapshotService(cliContext.String("snapshotter")) | ||||
|  | ||||
| 		if context.Bool("keep") { | ||||
| 		if cliContext.Bool("keep") { | ||||
| 			labels["containerd.io/gc.root"] = time.Now().UTC().Format(time.RFC3339) | ||||
| 		} | ||||
| 		opts := []diff.Opt{ | ||||
| 			diff.WithMediaType(context.String("media-type")), | ||||
| 			diff.WithReference(context.String("ref")), | ||||
| 			diff.WithMediaType(cliContext.String("media-type")), | ||||
| 			diff.WithReference(cliContext.String("ref")), | ||||
| 			diff.WithLabels(labels), | ||||
| 		} | ||||
| 		// SOURCE_DATE_EPOCH is propagated via the ctx, so no need to specify diff.WithSourceDateEpoch here | ||||
| @@ -172,7 +172,7 @@ var diffCommand = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func withMounts(ctx gocontext.Context, id string, sn snapshots.Snapshotter, f func(mounts []mount.Mount) (ocispec.Descriptor, error)) (ocispec.Descriptor, error) { | ||||
| func withMounts(ctx context.Context, id string, sn snapshots.Snapshotter, f func(mounts []mount.Mount) (ocispec.Descriptor, error)) (ocispec.Descriptor, error) { | ||||
| 	var mounts []mount.Mount | ||||
| 	info, err := sn.Stat(ctx, id) | ||||
| 	if err != nil { | ||||
| @@ -204,9 +204,9 @@ var usageCommand = &cli.Command{ | ||||
| 			Usage: "Display size in bytes", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var displaySize func(int64) string | ||||
| 		if context.Bool("b") { | ||||
| 		if cliContext.Bool("b") { | ||||
| 			displaySize = func(s int64) string { | ||||
| 				return strconv.FormatInt(s, 10) | ||||
| 			} | ||||
| @@ -215,18 +215,18 @@ var usageCommand = &cli.Command{ | ||||
| 				return progress.Bytes(s).String() | ||||
| 			} | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		var ( | ||||
| 			snapshotter = client.SnapshotService(context.String("snapshotter")) | ||||
| 			snapshotter = client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 			tw          = tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) | ||||
| 		) | ||||
| 		fmt.Fprintln(tw, "KEY\tSIZE\tINODES\t") | ||||
| 		if context.NArg() == 0 { | ||||
| 			if err := snapshotter.Walk(ctx, func(ctx gocontext.Context, info snapshots.Info) error { | ||||
| 		if cliContext.NArg() == 0 { | ||||
| 			if err := snapshotter.Walk(ctx, func(ctx context.Context, info snapshots.Info) error { | ||||
| 				usage, err := snapshotter.Usage(ctx, info.Name) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| @@ -237,7 +237,7 @@ var usageCommand = &cli.Command{ | ||||
| 				return err | ||||
| 			} | ||||
| 		} else { | ||||
| 			for _, id := range context.Args().Slice() { | ||||
| 			for _, id := range cliContext.Args().Slice() { | ||||
| 				usage, err := snapshotter.Usage(ctx, id) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| @@ -255,14 +255,14 @@ var removeCommand = &cli.Command{ | ||||
| 	Aliases:   []string{"del", "remove", "rm"}, | ||||
| 	ArgsUsage: "<key> [<key>, ...]", | ||||
| 	Usage:     "Remove snapshots", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		snapshotter := client.SnapshotService(context.String("snapshotter")) | ||||
| 		for _, key := range context.Args().Slice() { | ||||
| 		snapshotter := client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 		for _, key := range cliContext.Args().Slice() { | ||||
| 			err = snapshotter.Remove(ctx, key) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("failed to remove %q: %w", key, err) | ||||
| @@ -288,22 +288,22 @@ var prepareCommand = &cli.Command{ | ||||
| 			Usage: "Print out snapshot mounts as JSON", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		if narg := context.NArg(); narg < 1 || narg > 2 { | ||||
| 			return cli.ShowSubcommandHelp(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		if narg := cliContext.NArg(); narg < 1 || narg > 2 { | ||||
| 			return cli.ShowSubcommandHelp(cliContext) | ||||
| 		} | ||||
| 		var ( | ||||
| 			target = context.String("target") | ||||
| 			key    = context.Args().Get(0) | ||||
| 			parent = context.Args().Get(1) | ||||
| 			target = cliContext.String("target") | ||||
| 			key    = cliContext.Args().Get(0) | ||||
| 			parent = cliContext.Args().Get(1) | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		snapshotter := client.SnapshotService(context.String("snapshotter")) | ||||
| 		snapshotter := client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 		labels := map[string]string{ | ||||
| 			"containerd.io/gc.root": time.Now().UTC().Format(time.RFC3339), | ||||
| 		} | ||||
| @@ -317,7 +317,7 @@ var prepareCommand = &cli.Command{ | ||||
| 			printMounts(target, mounts) | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("mounts") { | ||||
| 		if cliContext.Bool("mounts") { | ||||
| 			commands.PrintAsJSON(mounts) | ||||
| 		} | ||||
|  | ||||
| @@ -340,22 +340,22 @@ var viewCommand = &cli.Command{ | ||||
| 			Usage: "Print out snapshot mounts as JSON", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		if narg := context.NArg(); narg < 1 || narg > 2 { | ||||
| 			return cli.ShowSubcommandHelp(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		if narg := cliContext.NArg(); narg < 1 || narg > 2 { | ||||
| 			return cli.ShowSubcommandHelp(cliContext) | ||||
| 		} | ||||
| 		var ( | ||||
| 			target = context.String("target") | ||||
| 			key    = context.Args().Get(0) | ||||
| 			parent = context.Args().Get(1) | ||||
| 			target = cliContext.String("target") | ||||
| 			key    = cliContext.Args().Get(0) | ||||
| 			parent = cliContext.Args().Get(1) | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		snapshotter := client.SnapshotService(context.String("snapshotter")) | ||||
| 		snapshotter := client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 		mounts, err := snapshotter.View(ctx, key, parent) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -365,7 +365,7 @@ var viewCommand = &cli.Command{ | ||||
| 			printMounts(target, mounts) | ||||
| 		} | ||||
|  | ||||
| 		if context.Bool("mounts") { | ||||
| 		if cliContext.Bool("mounts") { | ||||
| 			commands.PrintAsJSON(mounts) | ||||
| 		} | ||||
|  | ||||
| @@ -378,20 +378,20 @@ var mountCommand = &cli.Command{ | ||||
| 	Aliases:   []string{"m", "mount"}, | ||||
| 	Usage:     "Mount gets mount commands for the snapshots", | ||||
| 	ArgsUsage: "<target> <key>", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		if context.NArg() != 2 { | ||||
| 			return cli.ShowSubcommandHelp(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		if cliContext.NArg() != 2 { | ||||
| 			return cli.ShowSubcommandHelp(cliContext) | ||||
| 		} | ||||
| 		var ( | ||||
| 			target = context.Args().Get(0) | ||||
| 			key    = context.Args().Get(1) | ||||
| 			target = cliContext.Args().Get(0) | ||||
| 			key    = cliContext.Args().Get(1) | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		snapshotter := client.SnapshotService(context.String("snapshotter")) | ||||
| 		snapshotter := client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 		mounts, err := snapshotter.Mounts(ctx, key) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -407,20 +407,20 @@ var commitCommand = &cli.Command{ | ||||
| 	Name:      "commit", | ||||
| 	Usage:     "Commit an active snapshot into the provided name", | ||||
| 	ArgsUsage: "<key> <active>", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		if context.NArg() != 2 { | ||||
| 			return cli.ShowSubcommandHelp(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		if cliContext.NArg() != 2 { | ||||
| 			return cli.ShowSubcommandHelp(cliContext) | ||||
| 		} | ||||
| 		var ( | ||||
| 			key    = context.Args().Get(0) | ||||
| 			active = context.Args().Get(1) | ||||
| 			key    = cliContext.Args().Get(0) | ||||
| 			active = cliContext.Args().Get(1) | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		snapshotter := client.SnapshotService(context.String("snapshotter")) | ||||
| 		snapshotter := client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 		labels := map[string]string{ | ||||
| 			"containerd.io/gc.root": time.Now().UTC().Format(time.RFC3339), | ||||
| 		} | ||||
| @@ -431,18 +431,18 @@ var commitCommand = &cli.Command{ | ||||
| var treeCommand = &cli.Command{ | ||||
| 	Name:  "tree", | ||||
| 	Usage: "Display tree view of snapshot branches", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		var ( | ||||
| 			snapshotter = client.SnapshotService(context.String("snapshotter")) | ||||
| 			snapshotter = client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 			tree        = newSnapshotTree() | ||||
| 		) | ||||
|  | ||||
| 		if err := snapshotter.Walk(ctx, func(ctx gocontext.Context, info snapshots.Info) error { | ||||
| 		if err := snapshotter.Walk(ctx, func(ctx context.Context, info snapshots.Info) error { | ||||
| 			// Get or create node and add node details | ||||
| 			tree.add(info) | ||||
| 			return nil | ||||
| @@ -460,18 +460,18 @@ var infoCommand = &cli.Command{ | ||||
| 	Name:      "info", | ||||
| 	Usage:     "Get info about a snapshot", | ||||
| 	ArgsUsage: "<key>", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		if context.NArg() != 1 { | ||||
| 			return cli.ShowSubcommandHelp(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		if cliContext.NArg() != 1 { | ||||
| 			return cli.ShowSubcommandHelp(cliContext) | ||||
| 		} | ||||
|  | ||||
| 		key := context.Args().Get(0) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		key := cliContext.Args().Get(0) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		snapshotter := client.SnapshotService(context.String("snapshotter")) | ||||
| 		snapshotter := client.SnapshotService(cliContext.String("snapshotter")) | ||||
| 		info, err := snapshotter.Stat(ctx, key) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| @@ -488,15 +488,15 @@ var setLabelCommand = &cli.Command{ | ||||
| 	Usage:       "Add labels to content", | ||||
| 	ArgsUsage:   "<name> [<label>=<value> ...]", | ||||
| 	Description: "labels snapshots in the snapshotter", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		key, labels := commands.ObjectWithLabelArgs(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		key, labels := commands.ObjectWithLabelArgs(cliContext) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
|  | ||||
| 		snapshotter := client.SnapshotService(context.String("snapshotter")) | ||||
| 		snapshotter := client.SnapshotService(cliContext.String("snapshotter")) | ||||
|  | ||||
| 		info := snapshots.Info{ | ||||
| 			Name:   key, | ||||
| @@ -537,12 +537,12 @@ var unpackCommand = &cli.Command{ | ||||
| 	Usage:     "Unpack applies layers from a manifest to a snapshot", | ||||
| 	ArgsUsage: "[flags] <digest>", | ||||
| 	Flags:     commands.SnapshotterFlags, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		dgst, err := digest.Parse(context.Args().First()) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		dgst, err := digest.Parse(cliContext.Args().First()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -557,7 +557,7 @@ var unpackCommand = &cli.Command{ | ||||
| 		for _, image := range images { | ||||
| 			if image.Target().Digest == dgst { | ||||
| 				fmt.Printf("unpacking %s (%s)...", dgst, image.Target().MediaType) | ||||
| 				if err := image.Unpack(ctx, context.String("snapshotter")); err != nil { | ||||
| 				if err := image.Unpack(ctx, cliContext.String("snapshotter")); err != nil { | ||||
| 					fmt.Println() | ||||
| 					return err | ||||
| 				} | ||||
| @@ -570,7 +570,7 @@ var unpackCommand = &cli.Command{ | ||||
| 			return errors.New("manifest not found") | ||||
| 		} | ||||
| 		// TODO: Get rootfs from Image | ||||
| 		//log.G(ctx).Infof("chain ID: %s", chainID.String()) | ||||
| 		// log.G(ctx).Infof("chain ID: %s", chainID.String()) | ||||
| 		return nil | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -28,13 +28,13 @@ var attachCommand = &cli.Command{ | ||||
| 	Name:      "attach", | ||||
| 	Usage:     "Attach to the IO of a running container", | ||||
| 	ArgsUsage: "CONTAINER", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		container, err := client.LoadContainer(ctx, context.Args().First()) | ||||
| 		container, err := client.LoadContainer(ctx, cliContext.Args().First()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -44,12 +44,12 @@ var checkpointCommand = &cli.Command{ | ||||
| 			Usage: "Path to criu work files and logs", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		id := context.Args().First() | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		id := cliContext.Args().First() | ||||
| 		if id == "" { | ||||
| 			return errors.New("container id must be provided") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context, containerd.WithDefaultRuntime(context.String("runtime"))) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext, containerd.WithDefaultRuntime(cliContext.String("runtime"))) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -66,12 +66,12 @@ var checkpointCommand = &cli.Command{ | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		opts := []containerd.CheckpointTaskOpts{withCheckpointOpts(info.Runtime.Name, context)} | ||||
| 		opts := []containerd.CheckpointTaskOpts{withCheckpointOpts(info.Runtime.Name, cliContext)} | ||||
| 		checkpoint, err := task.Checkpoint(ctx, opts...) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if context.String("image-path") == "" { | ||||
| 		if cliContext.String("image-path") == "" { | ||||
| 			fmt.Println(checkpoint.Name()) | ||||
| 		} | ||||
| 		return nil | ||||
| @@ -79,17 +79,17 @@ var checkpointCommand = &cli.Command{ | ||||
| } | ||||
|  | ||||
| // withCheckpointOpts only suitable for runc runtime now | ||||
| func withCheckpointOpts(rt string, context *cli.Context) containerd.CheckpointTaskOpts { | ||||
| func withCheckpointOpts(rt string, cliContext *cli.Context) containerd.CheckpointTaskOpts { | ||||
| 	return func(r *containerd.CheckpointTaskInfo) error { | ||||
| 		imagePath := context.String("image-path") | ||||
| 		workPath := context.String("work-path") | ||||
| 		imagePath := cliContext.String("image-path") | ||||
| 		workPath := cliContext.String("work-path") | ||||
|  | ||||
| 		if r.Options == nil { | ||||
| 			r.Options = &options.CheckpointOptions{} | ||||
| 		} | ||||
| 		opts, _ := r.Options.(*options.CheckpointOptions) | ||||
|  | ||||
| 		if context.Bool("exit") { | ||||
| 		if cliContext.Bool("exit") { | ||||
| 			opts.Exit = true | ||||
| 		} | ||||
| 		if imagePath != "" { | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package tasks | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
|  | ||||
| 	containerd "github.com/containerd/containerd/v2/client" | ||||
| 	"github.com/containerd/containerd/v2/cmd/ctr/commands" | ||||
| @@ -42,12 +42,12 @@ var deleteCommand = &cli.Command{ | ||||
| 			Usage: "Process ID to kill", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			execID = context.String("exec-id") | ||||
| 			force  = context.Bool("force") | ||||
| 			execID = cliContext.String("exec-id") | ||||
| 			force  = cliContext.Bool("force") | ||||
| 		) | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -58,7 +58,7 @@ var deleteCommand = &cli.Command{ | ||||
| 		} | ||||
| 		var exitErr error | ||||
| 		if execID != "" { | ||||
| 			task, err := loadTask(ctx, client, context.Args().First()) | ||||
| 			task, err := loadTask(ctx, client, cliContext.Args().First()) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -74,7 +74,7 @@ var deleteCommand = &cli.Command{ | ||||
| 				return cli.Exit("", int(ec)) | ||||
| 			} | ||||
| 		} else { | ||||
| 			for _, target := range context.Args().Slice() { | ||||
| 			for _, target := range cliContext.Args().Slice() { | ||||
| 				task, err := loadTask(ctx, client, target) | ||||
| 				if err != nil { | ||||
| 					if exitErr == nil { | ||||
| @@ -100,7 +100,7 @@ var deleteCommand = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func loadTask(ctx gocontext.Context, client *containerd.Client, containerID string) (containerd.Task, error) { | ||||
| func loadTask(ctx context.Context, client *containerd.Client, containerID string) (containerd.Task, error) { | ||||
| 	container, err := client.LoadContainer(ctx, containerID) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
|   | ||||
| @@ -68,17 +68,17 @@ var execCommand = &cli.Command{ | ||||
| 			Usage: "User id or name", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			id     = context.Args().First() | ||||
| 			args   = context.Args().Tail() | ||||
| 			tty    = context.Bool("tty") | ||||
| 			detach = context.Bool("detach") | ||||
| 			id     = cliContext.Args().First() | ||||
| 			args   = cliContext.Args().Tail() | ||||
| 			tty    = cliContext.Bool("tty") | ||||
| 			detach = cliContext.Bool("detach") | ||||
| 		) | ||||
| 		if id == "" { | ||||
| 			return errors.New("container id must be provided") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -91,7 +91,7 @@ var execCommand = &cli.Command{ | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if user := context.String("user"); user != "" { | ||||
| 		if user := cliContext.String("user"); user != "" { | ||||
| 			c, err := container.Info(ctx) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| @@ -105,7 +105,7 @@ var execCommand = &cli.Command{ | ||||
| 		pspec.Terminal = tty | ||||
| 		pspec.Args = args | ||||
|  | ||||
| 		if cwd := context.String("cwd"); cwd != "" { | ||||
| 		if cwd := cliContext.String("cwd"); cwd != "" { | ||||
| 			pspec.Cwd = cwd | ||||
| 		} | ||||
|  | ||||
| @@ -122,8 +122,8 @@ var execCommand = &cli.Command{ | ||||
| 			con console.Console | ||||
| 		) | ||||
|  | ||||
| 		fifoDir := context.String("fifo-dir") | ||||
| 		logURI := context.String("log-uri") | ||||
| 		fifoDir := cliContext.String("fifo-dir") | ||||
| 		logURI := cliContext.String("log-uri") | ||||
| 		ioOpts := []cio.Opt{cio.WithFIFODir(fifoDir)} | ||||
| 		switch { | ||||
| 		case tty && logURI != "": | ||||
| @@ -150,7 +150,7 @@ var execCommand = &cli.Command{ | ||||
| 			ioCreator = cio.NewCreator(append([]cio.Opt{cio.WithStreams(stdinC, os.Stdout, os.Stderr)}, ioOpts...)...) | ||||
| 		} | ||||
|  | ||||
| 		process, err := task.Exec(ctx, context.String("exec-id"), pspec, ioCreator) | ||||
| 		process, err := task.Exec(ctx, cliContext.String("exec-id"), pspec, ioCreator) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -82,8 +82,8 @@ var killCommand = &cli.Command{ | ||||
| 			Usage:   "Send signal to all processes inside the container", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		id := context.Args().First() | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		id := cliContext.Args().First() | ||||
| 		if id == "" { | ||||
| 			return errors.New("container id must be provided") | ||||
| 		} | ||||
| @@ -92,14 +92,14 @@ var killCommand = &cli.Command{ | ||||
| 			return err | ||||
| 		} | ||||
| 		var ( | ||||
| 			all    = context.Bool("all") | ||||
| 			execID = context.String("exec-id") | ||||
| 			all    = cliContext.Bool("all") | ||||
| 			execID = cliContext.String("exec-id") | ||||
| 			opts   []containerd.KillOpts | ||||
| 		) | ||||
| 		if all && execID != "" { | ||||
| 			return errors.New("specify an exec-id or all; not both") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -114,8 +114,8 @@ var killCommand = &cli.Command{ | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if context.String("signal") != "" { | ||||
| 			sig, err = signal.ParseSignal(context.String("signal")) | ||||
| 		if cliContext.String("signal") != "" { | ||||
| 			sig, err = signal.ParseSignal(cliContext.String("signal")) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|   | ||||
| @@ -38,9 +38,9 @@ var listCommand = &cli.Command{ | ||||
| 			Usage:   "Print only the task id", | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		quiet := context.Bool("quiet") | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		quiet := cliContext.Bool("quiet") | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -49,13 +49,13 @@ var metricsCommand = &cli.Command{ | ||||
| 			Value: formatTable, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		container, err := client.LoadContainer(ctx, context.Args().First()) | ||||
| 		container, err := client.LoadContainer(ctx, cliContext.Args().First()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -83,7 +83,7 @@ var metricsCommand = &cli.Command{ | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		switch context.String(formatFlag) { | ||||
| 		switch cliContext.String(formatFlag) { | ||||
| 		case formatTable: | ||||
| 			w := tabwriter.NewWriter(os.Stdout, 1, 8, 4, ' ', 0) | ||||
| 			fmt.Fprintf(w, "ID\tTIMESTAMP\t\n") | ||||
|   | ||||
| @@ -25,13 +25,13 @@ var pauseCommand = &cli.Command{ | ||||
| 	Name:      "pause", | ||||
| 	Usage:     "Pause an existing container", | ||||
| 	ArgsUsage: "CONTAINER", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		container, err := client.LoadContainer(ctx, context.Args().First()) | ||||
| 		container, err := client.LoadContainer(ctx, cliContext.Args().First()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -31,12 +31,12 @@ var psCommand = &cli.Command{ | ||||
| 	Name:      "ps", | ||||
| 	Usage:     "List processes for container", | ||||
| 	ArgsUsage: "CONTAINER", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		id := context.Args().First() | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		id := cliContext.Args().First() | ||||
| 		if id == "" { | ||||
| 			return errors.New("container id must be provided") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -25,13 +25,13 @@ var resumeCommand = &cli.Command{ | ||||
| 	Name:      "resume", | ||||
| 	Usage:     "Resume a paused container", | ||||
| 	ArgsUsage: "CONTAINER", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		defer cancel() | ||||
| 		container, err := client.LoadContainer(ctx, context.Args().First()) | ||||
| 		container, err := client.LoadContainer(ctx, cliContext.Args().First()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -55,16 +55,16 @@ var startCommand = &cli.Command{ | ||||
| 			Usage:   "Detach from the task after it has started execution", | ||||
| 		}, | ||||
| 	}...), | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		var ( | ||||
| 			err    error | ||||
| 			id     = context.Args().Get(0) | ||||
| 			detach = context.Bool("detach") | ||||
| 			id     = cliContext.Args().Get(0) | ||||
| 			detach = cliContext.Bool("detach") | ||||
| 		) | ||||
| 		if id == "" { | ||||
| 			return errors.New("container id must be provided") | ||||
| 		} | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -80,8 +80,8 @@ var startCommand = &cli.Command{ | ||||
| 		} | ||||
| 		var ( | ||||
| 			tty    = spec.Process.Terminal | ||||
| 			opts   = GetNewTaskOpts(context) | ||||
| 			ioOpts = []cio.Opt{cio.WithFIFODir(context.String("fifo-dir"))} | ||||
| 			opts   = GetNewTaskOpts(cliContext) | ||||
| 			ioOpts = []cio.Opt{cio.WithFIFODir(cliContext.String("fifo-dir"))} | ||||
| 		) | ||||
| 		var con console.Console | ||||
| 		if tty { | ||||
| @@ -92,7 +92,7 @@ var startCommand = &cli.Command{ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		task, err := NewTask(ctx, client, container, "", con, context.Bool("null-io"), context.String("log-uri"), ioOpts, opts...) | ||||
| 		task, err := NewTask(ctx, client, container, "", con, cliContext.Bool("null-io"), cliContext.String("log-uri"), ioOpts, opts...) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -108,8 +108,8 @@ var startCommand = &cli.Command{ | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		if context.IsSet("pid-file") { | ||||
| 			if err := commands.WritePidFile(context.String("pid-file"), int(task.Pid())); err != nil { | ||||
| 		if cliContext.IsSet("pid-file") { | ||||
| 			if err := commands.WritePidFile(cliContext.String("pid-file"), int(task.Pid())); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
|   | ||||
| @@ -17,13 +17,13 @@ | ||||
| package tasks | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| ) | ||||
|  | ||||
| type resizer interface { | ||||
| 	Resize(ctx gocontext.Context, w, h uint32) error | ||||
| 	Resize(ctx context.Context, w, h uint32) error | ||||
| } | ||||
|  | ||||
| // Command is the cli command for managing tasks | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| package tasks | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| @@ -41,7 +41,7 @@ var platformStartFlags = []cli.Flag{ | ||||
| } | ||||
|  | ||||
| // HandleConsoleResize resizes the console | ||||
| func HandleConsoleResize(ctx gocontext.Context, task resizer, con console.Console) error { | ||||
| func HandleConsoleResize(ctx context.Context, task resizer, con console.Console) error { | ||||
| 	// do an initial resize of the console | ||||
| 	size, err := con.Size() | ||||
| 	if err != nil { | ||||
| @@ -68,7 +68,7 @@ func HandleConsoleResize(ctx gocontext.Context, task resizer, con console.Consol | ||||
| } | ||||
|  | ||||
| // NewTask creates a new task | ||||
| func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, checkpoint string, con console.Console, nullIO bool, logURI string, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { | ||||
| func NewTask(ctx context.Context, client *containerd.Client, container containerd.Container, checkpoint string, con console.Console, nullIO bool, logURI string, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { | ||||
| 	stdinC := &stdinCloser{ | ||||
| 		stdin: os.Stdin, | ||||
| 	} | ||||
| @@ -121,8 +121,8 @@ func NewTask(ctx gocontext.Context, client *containerd.Client, container contain | ||||
| } | ||||
|  | ||||
| // GetNewTaskOpts resolves containerd.NewTaskOpts from cli.Context | ||||
| func GetNewTaskOpts(context *cli.Context) []containerd.NewTaskOpts { | ||||
| 	if context.Bool("no-pivot") { | ||||
| func GetNewTaskOpts(cliContext *cli.Context) []containerd.NewTaskOpts { | ||||
| 	if cliContext.Bool("no-pivot") { | ||||
| 		return []containerd.NewTaskOpts{containerd.WithNoPivotRoot} | ||||
| 	} | ||||
| 	return nil | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| package tasks | ||||
|  | ||||
| import ( | ||||
| 	gocontext "context" | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"net/url" | ||||
| 	"time" | ||||
| @@ -32,7 +32,7 @@ import ( | ||||
| var platformStartFlags = []cli.Flag{} | ||||
|  | ||||
| // HandleConsoleResize resizes the console | ||||
| func HandleConsoleResize(ctx gocontext.Context, task resizer, con console.Console) error { | ||||
| func HandleConsoleResize(ctx context.Context, task resizer, con console.Console) error { | ||||
| 	// do an initial resize of the console | ||||
| 	size, err := con.Size() | ||||
| 	if err != nil { | ||||
| @@ -61,7 +61,7 @@ func HandleConsoleResize(ctx gocontext.Context, task resizer, con console.Consol | ||||
| } | ||||
|  | ||||
| // NewTask creates a new task | ||||
| func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, _ string, con console.Console, nullIO bool, logURI string, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { | ||||
| func NewTask(ctx context.Context, client *containerd.Client, container containerd.Container, _ string, con console.Console, nullIO bool, logURI string, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { | ||||
| 	var ioCreator cio.Creator | ||||
| 	if con != nil { | ||||
| 		if nullIO { | ||||
|   | ||||
| @@ -29,9 +29,9 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "version", | ||||
| 	Usage: "Print the client and server versions", | ||||
| 	Action: func(context *cli.Context) error { | ||||
| 		if context.NArg() != 0 { | ||||
| 			return fmt.Errorf("extra arguments: %v", context.Args()) | ||||
| 	Action: func(cliContext *cli.Context) error { | ||||
| 		if cliContext.NArg() != 0 { | ||||
| 			return fmt.Errorf("extra arguments: %v", cliContext.Args()) | ||||
| 		} | ||||
|  | ||||
| 		fmt.Println("Client:") | ||||
| @@ -39,7 +39,7 @@ var Command = &cli.Command{ | ||||
| 		fmt.Println("  Revision:", version.Revision) | ||||
| 		fmt.Println("  Go version:", version.GoVersion) | ||||
| 		fmt.Println("") | ||||
| 		client, ctx, cancel, err := commands.NewClient(context) | ||||
| 		client, ctx, cancel, err := commands.NewClient(cliContext) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -20,7 +20,6 @@ package server | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	gocontext "context" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/containerd/typeurl/v2" | ||||
| @@ -147,7 +146,7 @@ func updateContainerSpec(ctx context.Context, cntr containerd.Container, spec *r | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("failed to marshal spec %+v: %w", spec, err) | ||||
| 	} | ||||
| 	if err := cntr.Update(ctx, func(ctx gocontext.Context, client *containerd.Client, c *containers.Container) error { | ||||
| 	if err := cntr.Update(ctx, func(ctx context.Context, client *containerd.Client, c *containers.Container) error { | ||||
| 		c.Spec = s | ||||
| 		return nil | ||||
| 	}); err != nil { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sebastiaan van Stijn
					Sebastiaan van Stijn