From 9f76083a8fa19d9a2386531973ade6bcbdd4110a Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Mon, 23 Oct 2017 13:38:15 -0400 Subject: [PATCH] Refactor newClient in ctr Signed-off-by: Michael Crosby --- cmd/ctr/attach.go | 5 +- cmd/ctr/checkpoint.go | 10 +- cmd/ctr/container_delete.go | 5 +- cmd/ctr/containers.go | 10 +- cmd/ctr/content.go | 61 ++++------- cmd/ctr/events.go | 7 +- cmd/ctr/exec.go | 12 +-- cmd/ctr/export.go | 20 ++-- cmd/ctr/fetch.go | 16 ++- cmd/ctr/images.go | 72 ++++++------- cmd/ctr/import.go | 20 ++-- cmd/ctr/info.go | 11 +- cmd/ctr/kill.go | 9 +- cmd/ctr/labels.go | 19 ++-- cmd/ctr/namespaces.go | 103 +++++++----------- cmd/ctr/pause.go | 6 +- cmd/ctr/plugins.go | 10 +- cmd/ctr/ps.go | 10 +- cmd/ctr/pull.go | 10 +- cmd/ctr/push.go | 24 ++--- cmd/ctr/pushobject.go | 20 ++-- cmd/ctr/resume.go | 6 +- cmd/ctr/rootfs.go | 29 ++---- cmd/ctr/run.go | 13 ++- cmd/ctr/snapshot.go | 201 ++++++++++++++++-------------------- cmd/ctr/start.go | 10 +- cmd/ctr/task.go | 10 +- cmd/ctr/task_delete.go | 5 +- cmd/ctr/utils.go | 9 +- cmd/ctr/version.go | 6 +- 30 files changed, 299 insertions(+), 450 deletions(-) diff --git a/cmd/ctr/attach.go b/cmd/ctr/attach.go index 87ba70c6d..45f028984 100644 --- a/cmd/ctr/attach.go +++ b/cmd/ctr/attach.go @@ -14,12 +14,11 @@ var taskAttachCommand = cli.Command{ Usage: "attach to the IO of a running container", ArgsUsage: "CONTAINER", Action: func(context *cli.Context) error { - ctx, cancel := appContext(context) - defer cancel() - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() container, err := client.LoadContainer(ctx, context.Args().First()) if err != nil { return err diff --git a/cmd/ctr/checkpoint.go b/cmd/ctr/checkpoint.go index bf39f7851..58cf949dd 100644 --- a/cmd/ctr/checkpoint.go +++ b/cmd/ctr/checkpoint.go @@ -19,19 +19,15 @@ var taskCheckpointCommand = cli.Command{ }, }, Action: func(context *cli.Context) error { - var ( - ctx, cancel = appContext(context) - id = context.Args().First() - ) - defer cancel() - + id := context.Args().First() if id == "" { return errors.New("container id must be provided") } - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() container, err := client.LoadContainer(ctx, id) if err != nil { return err diff --git a/cmd/ctr/container_delete.go b/cmd/ctr/container_delete.go index 8840b7651..1a50555f4 100644 --- a/cmd/ctr/container_delete.go +++ b/cmd/ctr/container_delete.go @@ -23,12 +23,11 @@ var containersDeleteCommand = cli.Command{ }, Action: func(context *cli.Context) error { var exitErr error - ctx, cancel := appContext(context) - defer cancel() - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() deleteOpts := []containerd.DeleteOpts{} if !context.Bool("keep-snapshot") { deleteOpts = append(deleteOpts, containerd.WithSnapshotCleanup) diff --git a/cmd/ctr/containers.go b/cmd/ctr/containers.go index 12f6fb9cb..a46092d6b 100644 --- a/cmd/ctr/containers.go +++ b/cmd/ctr/containers.go @@ -26,16 +26,14 @@ var containersCommand = cli.Command{ ArgsUsage: "[filter, ...]", Action: func(context *cli.Context) error { var ( - filters = context.Args() - quiet = context.Bool("quiet") - ctx, cancel = appContext(context) + filters = context.Args() + quiet = context.Bool("quiet") ) - defer cancel() - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() containers, err := client.Containers(ctx, filters...) if err != nil { return err diff --git a/cmd/ctr/content.go b/cmd/ctr/content.go index 36e1cba2d..11333c029 100644 --- a/cmd/ctr/content.go +++ b/cmd/ctr/content.go @@ -41,20 +41,16 @@ var ( Description: "Display the image object.", Flags: []cli.Flag{}, Action: func(context *cli.Context) error { - ctx, cancel := appContext(context) - defer cancel() - dgst, err := digest.Parse(context.Args().First()) if err != nil { return err } - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() cs := client.ContentStore() - ra, err := cs.ReaderAt(ctx, dgst) if err != nil { return err @@ -87,22 +83,18 @@ var ( expectedSize = context.Int64("expected-size") expectedDigest = digest.Digest(context.String("expected-digest")) ) - - ctx, cancel := appContext(context) - defer cancel() - if err := expectedDigest.Validate(); expectedDigest != "" && err != nil { return err } - if ref == "" { return errors.New("must specify a transaction reference") } - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() + cs := client.ContentStore() // TODO(stevvooe): Allow ingest to be reentrant. Currently, we expect @@ -130,24 +122,17 @@ var ( }, }, Action: func(context *cli.Context) error { - var ( - match = context.Args().First() - ) - - ctx, cancel := appContext(context) - defer cancel() - - client, err := newClient(context) + match := context.Args().First() + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() cs := client.ContentStore() - active, err := cs.ListStatuses(ctx, match) if err != nil { return err } - tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, '\t', 0) fmt.Fprintln(tw, "REF\tSIZE\tAGE\t") for _, active := range active { @@ -178,13 +163,11 @@ var ( quiet = context.Bool("quiet") args = []string(context.Args()) ) - ctx, cancel := appContext(context) - defer cancel() - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() cs := client.ContentStore() var walkFn content.WalkFunc @@ -229,16 +212,13 @@ var ( Description: `Labels blobs in the content store`, Flags: []cli.Flag{}, Action: func(context *cli.Context) error { - var ( - object, labels = objectWithLabelArgs(context) - ) - ctx, cancel := appContext(context) - defer cancel() - - client, err := newClient(context) + object, labels := objectWithLabelArgs(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() + cs := client.ContentStore() dgst, err := digest.Parse(object) @@ -296,8 +276,6 @@ var ( validate = context.String("validate") object = context.Args().First() ) - ctx, cancel := appContext(context) - defer cancel() if validate != "" { return errors.New("validating the edit result not supported") @@ -310,13 +288,12 @@ var ( if err != nil { return err } - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() cs := client.ContentStore() - ra, err := cs.ReaderAt(ctx, dgst) if err != nil { return err @@ -360,13 +337,11 @@ var ( args = []string(context.Args()) exitError error ) - ctx, cancel := appContext(context) - defer cancel() - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() cs := client.ContentStore() for _, arg := range args { diff --git a/cmd/ctr/events.go b/cmd/ctr/events.go index a99f3c027..7c0628852 100644 --- a/cmd/ctr/events.go +++ b/cmd/ctr/events.go @@ -13,15 +13,12 @@ var eventsCommand = cli.Command{ Name: "events", Usage: "display containerd events", Action: func(context *cli.Context) error { - ctx, cancel := appContext(context) - defer cancel() - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() eventsClient := client.EventService() - events, err := eventsClient.Subscribe(ctx, &eventsapi.SubscribeRequest{ Filters: context.Args(), }) diff --git a/cmd/ctr/exec.go b/cmd/ctr/exec.go index fd8ec65fc..35bcc7c55 100644 --- a/cmd/ctr/exec.go +++ b/cmd/ctr/exec.go @@ -29,20 +29,18 @@ var taskExecCommand = cli.Command{ }, Action: func(context *cli.Context) error { var ( - ctx, cancel = appContext(context) - id = context.Args().First() - args = context.Args().Tail() - tty = context.Bool("tty") + id = context.Args().First() + args = context.Args().Tail() + tty = context.Bool("tty") ) - defer cancel() - if id == "" { return errors.New("container id must be provided") } - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() container, err := client.LoadContainer(ctx, id) if err != nil { return err diff --git a/cmd/ctr/export.go b/cmd/ctr/export.go index f7899150a..18285e55b 100644 --- a/cmd/ctr/export.go +++ b/cmd/ctr/export.go @@ -32,27 +32,23 @@ var imagesExportCommand = cli.Command{ Value: ocispec.MediaTypeImageManifest, }, }, - Action: func(clicontext *cli.Context) error { + Action: func(context *cli.Context) error { var ( - out = clicontext.Args().First() - local = clicontext.Args().Get(1) + out = context.Args().First() + local = context.Args().Get(1) desc ocispec.Descriptor ) - - ctx, cancel := appContext(clicontext) - defer cancel() - - client, err := newClient(clicontext) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - - if manifest := clicontext.String("manifest"); manifest != "" { + defer cancel() + if manifest := context.String("manifest"); manifest != "" { desc.Digest, err = digest.Parse(manifest) if err != nil { return errors.Wrap(err, "invalid manifest digest") } - desc.MediaType = clicontext.String("manifest-type") + desc.MediaType = context.String("manifest-type") } else { img, err := client.ImageService().Get(ctx, local) if err != nil { @@ -68,7 +64,7 @@ var imagesExportCommand = cli.Command{ if ociRefName := determineOCIRefName(local); ociRefName != "" { desc.Annotations[ocispec.AnnotationRefName] = ociRefName } - if ociRefName := clicontext.String("oci-ref-name"); ociRefName != "" { + if ociRefName := context.String("oci-ref-name"); ociRefName != "" { desc.Annotations[ocispec.AnnotationRefName] = ociRefName } } diff --git a/cmd/ctr/fetch.go b/cmd/ctr/fetch.go index 65fb8587b..f6d47aa1e 100644 --- a/cmd/ctr/fetch.go +++ b/cmd/ctr/fetch.go @@ -44,21 +44,19 @@ Most of this is experimental and there are few leaps to make this work.`, var ( ref = clicontext.Args().First() ) - ctx, cancel := appContext(clicontext) - defer cancel() - - _, err := fetch(ctx, ref, clicontext) + _, err := fetch(ref, clicontext) return err }, } -func fetch(ctx context.Context, ref string, clicontext *cli.Context) (containerd.Image, error) { - client, err := newClient(clicontext) +func fetch(ref string, cliContext *cli.Context) (containerd.Image, error) { + client, ctx, cancel, err := newClient(cliContext) if err != nil { return nil, err } + defer cancel() - resolver, err := getResolver(ctx, clicontext) + resolver, err := getResolver(ctx, cliContext) if err != nil { return nil, err } @@ -69,7 +67,7 @@ func fetch(ctx context.Context, ref string, clicontext *cli.Context) (containerd progress := make(chan struct{}) go func() { - if !clicontext.GlobalBool("debug") { + if !cliContext.GlobalBool("debug") { // no progress bar, because it hides some debug logs showProgress(pctx, ongoing, client.ContentStore(), os.Stdout) } @@ -84,7 +82,7 @@ func fetch(ctx context.Context, ref string, clicontext *cli.Context) (containerd }) log.G(pctx).WithField("image", ref).Debug("fetching") - labels := labelArgs(clicontext.StringSlice("label")) + labels := labelArgs(cliContext.StringSlice("label")) img, err := client.Pull(pctx, ref, containerd.WithPullLabels(labels), containerd.WithResolver(resolver), diff --git a/cmd/ctr/images.go b/cmd/ctr/images.go index bf8880f16..a3764930e 100644 --- a/cmd/ctr/images.go +++ b/cmd/ctr/images.go @@ -41,21 +41,20 @@ var imagesListCommand = cli.Command{ Usage: "print only the image refs", }, }, - Action: func(clicontext *cli.Context) error { + Action: func(context *cli.Context) error { var ( - filters = clicontext.Args() - quiet = clicontext.Bool("quiet") - ctx, cancel = appContext(clicontext) + filters = context.Args() + quiet = context.Bool("quiet") ) - defer cancel() - - client, err := newClient(clicontext) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - - imageStore := client.ImageService() - cs := client.ContentStore() + defer cancel() + var ( + imageStore = client.ImageService() + cs = client.ContentStore() + ) imageList, err := imageStore.List(ctx, filters...) if err != nil { return errors.Wrap(err, "failed to list images") @@ -125,19 +124,16 @@ var imagesSetLabelsCommand = cli.Command{ Usage: "replace all labels", }, }, - Action: func(clicontext *cli.Context) error { + Action: func(context *cli.Context) error { var ( - ctx, cancel = appContext(clicontext) - replaceAll = clicontext.Bool("replace-all") - name, labels = objectWithLabelArgs(clicontext) + replaceAll = context.Bool("replace-all") + name, labels = objectWithLabelArgs(context) ) - defer cancel() - - client, err := newClient(clicontext) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - + defer cancel() if name == "" { return errors.New("please specify an image") } @@ -182,25 +178,23 @@ var imagesCheckCommand = cli.Command{ ArgsUsage: "[flags] [, ...]", Description: "Check that an image has all content available locally.", Flags: []cli.Flag{}, - Action: func(clicontext *cli.Context) error { + Action: func(context *cli.Context) error { var ( exitErr error ) - ctx, cancel := appContext(clicontext) - defer cancel() - - client, err := newClient(clicontext) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - - imageStore := client.ImageService() - contentStore := client.ContentStore() - - tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) + defer cancel() + var ( + imageStore = client.ImageService() + contentStore = client.ContentStore() + tw = tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) + ) fmt.Fprintln(tw, "REF\tTYPE\tDIGEST\tSTATUS\tSIZE\t") - args := []string(clicontext.Args()) + args := []string(context.Args()) imageList, err := imageStore.List(ctx, args...) if err != nil { return errors.Wrap(err, "failed listing images") @@ -267,21 +261,17 @@ var imageRemoveCommand = cli.Command{ ArgsUsage: "[flags] [, ...]", Description: `Remove one or more images by reference.`, Flags: []cli.Flag{}, - Action: func(clicontext *cli.Context) error { - var ( - exitErr error - ) - ctx, cancel := appContext(clicontext) - defer cancel() - - client, err := newClient(clicontext) + Action: func(context *cli.Context) error { + client, ctx, cancel, err := newClient(context) if err != nil { return err } - - imageStore := client.ImageService() - - for _, target := range clicontext.Args() { + defer cancel() + var ( + exitErr error + imageStore = client.ImageService() + ) + for _, target := range context.Args() { if err := imageStore.Delete(ctx, target); err != nil { if !errdefs.IsNotFound(err) { if exitErr == nil { diff --git a/cmd/ctr/import.go b/cmd/ctr/import.go index 0cc6b0b60..51cff0709 100644 --- a/cmd/ctr/import.go +++ b/cmd/ctr/import.go @@ -23,22 +23,18 @@ var imagesImportCommand = cli.Command{ }, labelFlag, }, - Action: func(clicontext *cli.Context) error { + Action: func(context *cli.Context) error { var ( - ref = clicontext.Args().First() - in = clicontext.Args().Get(1) - refObject = clicontext.String("ref-object") - labels = labelArgs(clicontext.StringSlice("label")) + ref = context.Args().First() + in = context.Args().Get(1) + refObject = context.String("ref-object") + labels = labelArgs(context.StringSlice("label")) ) - - ctx, cancel := appContext(clicontext) - defer cancel() - - client, err := newClient(clicontext) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - + defer cancel() var r io.ReadCloser if in == "-" { r = os.Stdin @@ -65,7 +61,7 @@ var imagesImportCommand = cli.Command{ // TODO: Show unpack status fmt.Printf("unpacking %s...", img.Target().Digest) - err = img.Unpack(ctx, clicontext.String("snapshotter")) + err = img.Unpack(ctx, context.String("snapshotter")) fmt.Println("done") return err }, diff --git a/cmd/ctr/info.go b/cmd/ctr/info.go index c61e7561f..d7e89604a 100644 --- a/cmd/ctr/info.go +++ b/cmd/ctr/info.go @@ -10,24 +10,19 @@ var containerInfoCommand = cli.Command{ Usage: "get info about a container", ArgsUsage: "CONTAINER", Action: func(context *cli.Context) error { - var ( - ctx, cancel = appContext(context) - id = context.Args().First() - ) - defer cancel() + id := context.Args().First() if id == "" { return errors.New("container id must be provided") } - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - + defer cancel() container, err := client.LoadContainer(ctx, id) if err != nil { return err } - info, err := container.Info(ctx) if err != nil { return err diff --git a/cmd/ctr/kill.go b/cmd/ctr/kill.go index ff914d18b..39cac7aea 100644 --- a/cmd/ctr/kill.go +++ b/cmd/ctr/kill.go @@ -26,11 +26,7 @@ var taskKillCommand = cli.Command{ }, }, Action: func(context *cli.Context) error { - var ( - id = context.Args().First() - ctx, cancel = appContext(context) - ) - defer cancel() + id := context.Args().First() if id == "" { return errors.New("container id must be provided") } @@ -45,10 +41,11 @@ var taskKillCommand = cli.Command{ if pid > 0 && all { return errors.New("enter a pid or all; not both") } - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() container, err := client.LoadContainer(ctx, id) if err != nil { return err diff --git a/cmd/ctr/labels.go b/cmd/ctr/labels.go index 67fe2fb76..74612a292 100644 --- a/cmd/ctr/labels.go +++ b/cmd/ctr/labels.go @@ -14,21 +14,16 @@ var containersSetLabelsCommand = cli.Command{ ArgsUsage: "[flags] [=, ...]", Description: "Set and clear labels for a container.", Flags: []cli.Flag{}, - Action: func(clicontext *cli.Context) error { - var ( - ctx, cancel = appContext(clicontext) - containerID, labels = objectWithLabelArgs(clicontext) - ) - defer cancel() - - client, err := newClient(clicontext) - if err != nil { - return err - } - + Action: func(context *cli.Context) error { + containerID, labels := objectWithLabelArgs(context) if containerID == "" { return errors.New("please specify a container") } + client, ctx, cancel, err := newClient(context) + if err != nil { + return err + } + defer cancel() container, err := client.LoadContainer(ctx, containerID) if err != nil { diff --git a/cmd/ctr/namespaces.go b/cmd/ctr/namespaces.go index 4d535d988..658dda665 100644 --- a/cmd/ctr/namespaces.go +++ b/cmd/ctr/namespaces.go @@ -1,7 +1,6 @@ package main import ( - "context" "fmt" "os" "sort" @@ -30,20 +29,16 @@ var namespacesCreateCommand = cli.Command{ Usage: "create a new namespace.", ArgsUsage: "[flags] [= [=, ...]", Description: "Set and clear labels for a namespace.", Flags: []cli.Flag{}, - Action: func(clicontext *cli.Context) error { - var ( - ctx = context.Background() - namespace, labels = objectWithLabelArgs(clicontext) - ) - - client, err := newClient(clicontext) - if err != nil { - return err - } - namespaces := client.NamespaceService() - + Action: func(context *cli.Context) error { + namespace, labels := objectWithLabelArgs(context) if namespace == "" { return errors.New("please specify a namespace") } - + client, ctx, cancel, err := newClient(context) + if err != nil { + return err + } + defer cancel() + namespaces := client.NamespaceService() for k, v := range labels { if err := namespaces.SetLabel(ctx, namespace, k, v); err != nil { return err } } - return nil }, } @@ -93,18 +82,14 @@ var namespacesListCommand = cli.Command{ Usage: "print only the namespace name.", }, }, - Action: func(clicontext *cli.Context) error { - var ( - ctx = context.Background() - quiet = clicontext.Bool("quiet") - ) - - client, err := newClient(clicontext) + Action: func(context *cli.Context) error { + quiet := context.Bool("quiet") + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() namespaces := client.NamespaceService() - nss, err := namespaces.List(ctx) if err != nil { return err @@ -114,30 +99,26 @@ var namespacesListCommand = cli.Command{ for _, ns := range nss { fmt.Println(ns) } - } else { - - tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) - fmt.Fprintln(tw, "NAME\tLABELS\t") - - for _, ns := range nss { - labels, err := namespaces.Labels(ctx, ns) - if err != nil { - return err - } - - var labelStrings []string - for k, v := range labels { - labelStrings = append(labelStrings, strings.Join([]string{k, v}, "=")) - } - sort.Strings(labelStrings) - - fmt.Fprintf(tw, "%v\t%v\t\n", ns, strings.Join(labelStrings, ",")) - } - - return tw.Flush() + return nil } - return nil + tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) + fmt.Fprintln(tw, "NAME\tLABELS\t") + for _, ns := range nss { + labels, err := namespaces.Labels(ctx, ns) + if err != nil { + return err + } + + var labelStrings []string + for k, v := range labels { + labelStrings = append(labelStrings, strings.Join([]string{k, v}, "=")) + } + sort.Strings(labelStrings) + + fmt.Fprintf(tw, "%v\t%v\t\n", ns, strings.Join(labelStrings, ",")) + } + return tw.Flush() }, } @@ -147,19 +128,15 @@ var namespacesRemoveCommand = cli.Command{ Usage: "remove one or more namespaces", ArgsUsage: "[flags] [, ...]", Description: "Remove one or more namespaces. For now, the namespace must be empty.", - Action: func(clicontext *cli.Context) error { - var ( - ctx = context.Background() - exitErr error - ) - - client, err := newClient(clicontext) + Action: func(context *cli.Context) error { + var exitErr error + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() namespaces := client.NamespaceService() - - for _, target := range clicontext.Args() { + for _, target := range context.Args() { if err := namespaces.Delete(ctx, target); err != nil { if !errdefs.IsNotFound(err) { if exitErr == nil { @@ -173,8 +150,6 @@ var namespacesRemoveCommand = cli.Command{ fmt.Println(target) } - return exitErr - }, } diff --git a/cmd/ctr/pause.go b/cmd/ctr/pause.go index 4ed454248..03956d567 100644 --- a/cmd/ctr/pause.go +++ b/cmd/ctr/pause.go @@ -7,13 +7,11 @@ var taskPauseCommand = cli.Command{ Usage: "pause an existing container", ArgsUsage: "CONTAINER", Action: func(context *cli.Context) error { - ctx, cancel := appContext(context) - defer cancel() - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() container, err := client.LoadContainer(ctx, context.Args().First()) if err != nil { return err diff --git a/cmd/ctr/plugins.go b/cmd/ctr/plugins.go index 8002ae443..75e5ce523 100644 --- a/cmd/ctr/plugins.go +++ b/cmd/ctr/plugins.go @@ -30,16 +30,14 @@ var pluginsCommand = cli.Command{ }, Action: func(context *cli.Context) error { var ( - quiet = context.Bool("quiet") - detailed = context.Bool("detailed") - ctx, cancel = appContext(context) + quiet = context.Bool("quiet") + detailed = context.Bool("detailed") ) - defer cancel() - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() ps := client.IntrospectionService() response, err := ps.Plugins(ctx, &introspection.PluginsRequest{ Filters: context.Args(), diff --git a/cmd/ctr/ps.go b/cmd/ctr/ps.go index a0d51ed14..ae52f2e46 100644 --- a/cmd/ctr/ps.go +++ b/cmd/ctr/ps.go @@ -15,19 +15,15 @@ var taskPsCommand = cli.Command{ Usage: "list processes for container", ArgsUsage: "CONTAINER", Action: func(context *cli.Context) error { - var ( - id = context.Args().First() - ctx, cancel = appContext(context) - ) - defer cancel() - + id := context.Args().First() if id == "" { return errors.New("container id must be provided") } - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() container, err := client.LoadContainer(ctx, id) if err != nil { return err diff --git a/cmd/ctr/pull.go b/cmd/ctr/pull.go index 41050db66..1a967761c 100644 --- a/cmd/ctr/pull.go +++ b/cmd/ctr/pull.go @@ -21,15 +21,15 @@ command. As part of this process, we do the following: 3. Register metadata for the image. `, Flags: append(registryFlags, append(snapshotterFlags, labelFlag)...), - Action: func(clicontext *cli.Context) error { + Action: func(context *cli.Context) error { var ( - ref = clicontext.Args().First() + ref = context.Args().First() ) - ctx, cancel := appContext(clicontext) + ctx, cancel := appContext(context) defer cancel() - img, err := fetch(ctx, ref, clicontext) + img, err := fetch(ref, context) if err != nil { return err } @@ -38,7 +38,7 @@ command. As part of this process, we do the following: // TODO: Show unpack status fmt.Printf("unpacking %s...\n", img.Target().Digest) - err = img.Unpack(ctx, clicontext.String("snapshotter")) + err = img.Unpack(ctx, context.String("snapshotter")) if err == nil { fmt.Println("done") } diff --git a/cmd/ctr/push.go b/cmd/ctr/push.go index 7dc62253e..9f5cf02ad 100644 --- a/cmd/ctr/push.go +++ b/cmd/ctr/push.go @@ -1,7 +1,7 @@ package main import ( - "context" + gocontext "context" "os" "sync" "text/tabwriter" @@ -45,27 +45,23 @@ var pushCommand = cli.Command{ Usage: "media type of manifest digest", Value: ocispec.MediaTypeImageManifest, }), - Action: func(clicontext *cli.Context) error { + Action: func(context *cli.Context) error { var ( - ref = clicontext.Args().First() - local = clicontext.Args().Get(1) + ref = context.Args().First() + local = context.Args().Get(1) desc ocispec.Descriptor ) - - ctx, cancel := appContext(clicontext) - defer cancel() - - client, err := newClient(clicontext) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - - if manifest := clicontext.String("manifest"); manifest != "" { + defer cancel() + if manifest := context.String("manifest"); manifest != "" { desc.Digest, err = digest.Parse(manifest) if err != nil { return errors.Wrap(err, "invalid manifest digest") } - desc.MediaType = clicontext.String("manifest-type") + desc.MediaType = context.String("manifest-type") } else { if local == "" { local = ref @@ -77,7 +73,7 @@ var pushCommand = cli.Command{ desc = img.Target } - resolver, err := getResolver(ctx, clicontext) + resolver, err := getResolver(ctx, context) if err != nil { return err } @@ -88,7 +84,7 @@ var pushCommand = cli.Command{ eg.Go(func() error { log.G(ctx).WithField("image", ref).WithField("digest", desc.Digest).Debug("pushing") - jobHandler := images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { + jobHandler := images.HandlerFunc(func(ctx gocontext.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { ongoing.add(remotes.MakeRefKey(ctx, desc)) return nil, nil }) diff --git a/cmd/ctr/pushobject.go b/cmd/ctr/pushobject.go index f659283c7..080e5aa6a 100644 --- a/cmd/ctr/pushobject.go +++ b/cmd/ctr/pushobject.go @@ -16,21 +16,23 @@ var pushObjectCommand = cli.Command{ ArgsUsage: "[flags] ", Description: `Push objects by identifier to a remote.`, Flags: registryFlags, - Action: func(clicontext *cli.Context) error { + Action: func(context *cli.Context) error { var ( - ref = clicontext.Args().Get(0) - object = clicontext.Args().Get(1) - media = clicontext.Args().Get(2) + ref = context.Args().Get(0) + object = context.Args().Get(1) + media = context.Args().Get(2) ) dgst, err := digest.Parse(object) if err != nil { return err } - - ctx, cancel := appContext(clicontext) + client, ctx, cancel, err := newClient(context) + if err != nil { + return err + } defer cancel() - resolver, err := getResolver(ctx, clicontext) + resolver, err := getResolver(ctx, context) if err != nil { return err } @@ -43,10 +45,6 @@ var pushObjectCommand = cli.Command{ return err } - client, err := newClient(clicontext) - if err != nil { - return err - } cs := client.ContentStore() info, err := cs.Info(ctx, dgst) diff --git a/cmd/ctr/resume.go b/cmd/ctr/resume.go index 79258c29c..4f8158fe5 100644 --- a/cmd/ctr/resume.go +++ b/cmd/ctr/resume.go @@ -7,13 +7,11 @@ var taskResumeCommand = cli.Command{ Usage: "resume a paused container", ArgsUsage: "CONTAINER", Action: func(context *cli.Context) error { - ctx, cancel := appContext(context) - defer cancel() - - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() container, err := client.LoadContainer(ctx, context.Args().First()) if err != nil { return err diff --git a/cmd/ctr/rootfs.go b/cmd/ctr/rootfs.go index 7c7871b81..d985dcfcb 100644 --- a/cmd/ctr/rootfs.go +++ b/cmd/ctr/rootfs.go @@ -22,34 +22,27 @@ var rootfsUnpackCommand = cli.Command{ Usage: "unpack applies layers from a manifest to a snapshot", ArgsUsage: "[flags] ", Flags: snapshotterFlags, - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) + Action: func(context *cli.Context) error { + dgst, err := digest.Parse(context.Args().First()) + if err != nil { + return err + } + client, ctx, cancel, err := newClient(context) + if err != nil { + return err + } defer cancel() - - dgst, err := digest.Parse(clicontext.Args().First()) - if err != nil { - return err - } - log.G(ctx).Debugf("unpacking layers from manifest %s", dgst.String()) - - client, err := newClient(clicontext) - if err != nil { - return err - } - // TODO: Support unpack by name - images, err := client.ListImages(ctx) if err != nil { return err } - var unpacked bool for _, image := range images { if image.Target().Digest == dgst { fmt.Printf("unpacking %s (%s)...", dgst, image.Target().MediaType) - if err := image.Unpack(ctx, clicontext.String("snapshotter")); err != nil { + if err := image.Unpack(ctx, context.String("snapshotter")); err != nil { fmt.Println() return err } @@ -61,10 +54,8 @@ var rootfsUnpackCommand = cli.Command{ if !unpacked { return errors.New("manifest not found") } - // TODO: Get rootfs from Image //log.G(ctx).Infof("chain ID: %s", chainID.String()) - return nil }, } diff --git a/cmd/ctr/run.go b/cmd/ctr/run.go index ffe4c6ea7..054371d24 100644 --- a/cmd/ctr/run.go +++ b/cmd/ctr/run.go @@ -105,13 +105,11 @@ var runCommand = cli.Command{ var ( err error - ctx, cancel = appContext(context) - id = context.Args().Get(1) - imageRef = context.Args().First() - tty = context.Bool("tty") - detach = context.Bool("detach") + id = context.Args().Get(1) + imageRef = context.Args().First() + tty = context.Bool("tty") + detach = context.Bool("detach") ) - defer cancel() if imageRef == "" { return errors.New("image ref must be provided") @@ -119,10 +117,11 @@ var runCommand = cli.Command{ if id == "" { return errors.New("container id must be provided") } - client, err := newClient(context) + client, ctx, cancel, err := newClient(context) if err != nil { return err } + defer cancel() container, err := newContainer(ctx, client, context) if err != nil { return err diff --git a/cmd/ctr/snapshot.go b/cmd/ctr/snapshot.go index 04e977bd8..ba55733ee 100644 --- a/cmd/ctr/snapshot.go +++ b/cmd/ctr/snapshot.go @@ -1,7 +1,7 @@ package main import ( - "context" + gocontext "context" "fmt" "os" "strings" @@ -36,20 +36,18 @@ var listSnapshotCommand = cli.Command{ Name: "list", Aliases: []string{"ls"}, Usage: "list snapshots", - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - - client, err := newClient(clicontext) + Action: func(context *cli.Context) error { + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) - - tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) + defer cancel() + var ( + snapshotter = client.SnapshotService(context.GlobalString("snapshotter")) + tw = tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) + ) fmt.Fprintln(tw, "KEY\tPARENT\tKIND\t") - - if err := snapshotter.Walk(ctx, func(ctx context.Context, info snapshot.Info) error { + if err := snapshotter.Walk(ctx, func(ctx gocontext.Context, info snapshot.Info) error { fmt.Fprintf(tw, "%v\t%v\t%v\t\n", info.Name, info.Parent, @@ -73,12 +71,9 @@ var usageSnapshotCommand = cli.Command{ Usage: "display size in bytes", }, }, - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - + Action: func(context *cli.Context) error { var displaySize func(int64) string - if clicontext.Bool("b") { + if context.Bool("b") { displaySize = func(s int64) string { return fmt.Sprintf("%d", s) } @@ -87,18 +82,18 @@ var usageSnapshotCommand = cli.Command{ return progress.Bytes(s).String() } } - - client, err := newClient(clicontext) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) - - tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) + defer cancel() + var ( + snapshotter = client.SnapshotService(context.GlobalString("snapshotter")) + tw = tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) + ) fmt.Fprintln(tw, "KEY\tSIZE\tINODES\t") - - if clicontext.NArg() == 0 { - if err := snapshotter.Walk(ctx, func(ctx context.Context, info snapshot.Info) error { + if context.NArg() == 0 { + if err := snapshotter.Walk(ctx, func(ctx gocontext.Context, info snapshot.Info) error { usage, err := snapshotter.Usage(ctx, info.Name) if err != nil { return err @@ -109,7 +104,7 @@ var usageSnapshotCommand = cli.Command{ return err } } else { - for _, id := range clicontext.Args() { + for _, id := range context.Args() { usage, err := snapshotter.Usage(ctx, id) if err != nil { return err @@ -127,17 +122,14 @@ var removeSnapshotCommand = cli.Command{ Aliases: []string{"rm"}, ArgsUsage: " [, ...]", Usage: "remove snapshots", - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - - client, err := newClient(clicontext) + Action: func(context *cli.Context) error { + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) - - for _, key := range clicontext.Args() { + defer cancel() + snapshotter := client.SnapshotService(context.GlobalString("snapshotter")) + for _, key := range context.Args() { err = snapshotter.Remove(ctx, key) if err != nil { return errors.Wrapf(err, "failed to remove %q", key) @@ -158,24 +150,22 @@ var prepareSnapshotCommand = cli.Command{ Usage: "mount target path, will print mount, if provided", }, }, - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - - if clicontext.NArg() != 2 { - return cli.ShowSubcommandHelp(clicontext) + Action: func(context *cli.Context) error { + if context.NArg() != 2 { + return cli.ShowSubcommandHelp(context) } - - target := clicontext.String("target") - key := clicontext.Args().Get(0) - parent := clicontext.Args().Get(1) - - client, err := newClient(clicontext) + var ( + target = context.String("target") + key = context.Args().Get(0) + parent = context.Args().Get(1) + ) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) + defer cancel() + snapshotter := client.SnapshotService(context.GlobalString("snapshotter")) mounts, err := snapshotter.Prepare(ctx, key, parent) if err != nil { return err @@ -199,24 +189,22 @@ var viewSnapshotCommand = cli.Command{ Usage: "mount target path, will print mount, if provided", }, }, - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - - if clicontext.NArg() != 2 { - return cli.ShowSubcommandHelp(clicontext) + Action: func(context *cli.Context) error { + if context.NArg() != 2 { + return cli.ShowSubcommandHelp(context) } - - target := clicontext.String("target") - key := clicontext.Args().Get(0) - parent := clicontext.Args().Get(1) - - client, err := newClient(clicontext) + var ( + target = context.String("target") + key = context.Args().Get(0) + parent = context.Args().Get(1) + ) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) + defer cancel() + snapshotter := client.SnapshotService(context.GlobalString("snapshotter")) mounts, err := snapshotter.View(ctx, key, parent) if err != nil { return err @@ -235,22 +223,20 @@ var mountSnapshotCommand = cli.Command{ Aliases: []string{"m", "mount"}, Usage: "mount gets mount commands for the snapshots", ArgsUsage: "[flags] ", - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - - if clicontext.NArg() != 2 { - return cli.ShowSubcommandHelp(clicontext) + Action: func(context *cli.Context) error { + if context.NArg() != 2 { + return cli.ShowSubcommandHelp(context) } - - target := clicontext.Args().Get(0) - key := clicontext.Args().Get(1) - client, err := newClient(clicontext) + var ( + target = context.Args().Get(0) + key = context.Args().Get(1) + ) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) - + defer cancel() + snapshotter := client.SnapshotService(context.GlobalString("snapshotter")) mounts, err := snapshotter.Mounts(ctx, key) if err != nil { return err @@ -266,23 +252,20 @@ var commitSnapshotCommand = cli.Command{ Name: "commit", Usage: "commit an active snapshot into the provided name", ArgsUsage: "[flags] ", - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - - if clicontext.NArg() != 2 { - return cli.ShowSubcommandHelp(clicontext) + Action: func(context *cli.Context) error { + if context.NArg() != 2 { + return cli.ShowSubcommandHelp(context) } - - key := clicontext.Args().Get(0) - active := clicontext.Args().Get(1) - - client, err := newClient(clicontext) + var ( + key = context.Args().Get(0) + active = context.Args().Get(1) + ) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) - + defer cancel() + snapshotter := client.SnapshotService(context.GlobalString("snapshotter")) return snapshotter.Commit(ctx, key, active) }, } @@ -290,19 +273,18 @@ var commitSnapshotCommand = cli.Command{ var treeSnapshotCommand = cli.Command{ Name: "tree", Usage: "display tree view of snapshot branches", - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - - client, err := newClient(clicontext) + Action: func(context *cli.Context) error { + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) + defer cancel() + var ( + snapshotter = client.SnapshotService(context.GlobalString("snapshotter")) + tree = make(map[string]*snapshotTreeNode) + ) - tree := make(map[string]*snapshotTreeNode) - - if err := snapshotter.Walk(ctx, func(ctx context.Context, info snapshot.Info) error { + if err := snapshotter.Walk(ctx, func(ctx gocontext.Context, info snapshot.Info) error { // Get or create node and add node details node := getOrCreateTreeNode(info.Name, tree) if info.Parent != "" { @@ -326,22 +308,18 @@ var infoSnapshotCommand = cli.Command{ Name: "info", Usage: "get info about a snapshot", ArgsUsage: "", - Action: func(clicontext *cli.Context) error { - ctx, cancel := appContext(clicontext) - defer cancel() - - if clicontext.NArg() != 1 { - return cli.ShowSubcommandHelp(clicontext) + Action: func(context *cli.Context) error { + if context.NArg() != 1 { + return cli.ShowSubcommandHelp(context) } - key := clicontext.Args().Get(0) - - client, err := newClient(clicontext) + key := context.Args().Get(0) + client, ctx, cancel, err := newClient(context) if err != nil { return err } - snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) - + defer cancel() + snapshotter := client.SnapshotService(context.GlobalString("snapshotter")) info, err := snapshotter.Stat(ctx, key) if err != nil { return err @@ -359,18 +337,15 @@ var labelSnapshotCommand = cli.Command{ ArgsUsage: "[flags] [