Merge pull request #1675 from crosbymichael/ctr-newclient

[ctr] streamline new client creation
This commit is contained in:
Michael Crosby 2017-10-23 15:39:55 -04:00 committed by GitHub
commit 04659d9405
30 changed files with 299 additions and 450 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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 {

View File

@ -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(),
})

View File

@ -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

View File

@ -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
}
}

View File

@ -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),

View File

@ -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] <ref> [<ref>, ...]",
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] <ref> [<ref>, ...]",
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 {

View File

@ -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
},

View File

@ -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

View File

@ -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

View File

@ -14,21 +14,16 @@ var containersSetLabelsCommand = cli.Command{
ArgsUsage: "[flags] <name> [<key>=<value>, ...]",
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 {

View File

@ -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] <name> [<key>=<value]",
Description: "Create a new namespace. It must be unique.",
Action: func(clicontext *cli.Context) error {
var (
ctx = context.Background()
namespace, labels = objectWithLabelArgs(clicontext)
)
Action: func(context *cli.Context) error {
namespace, labels := objectWithLabelArgs(context)
if namespace == "" {
return errors.New("please specify a namespace")
}
client, err := newClient(clicontext)
client, ctx, cancel, err := newClient(context)
if err != nil {
return err
}
defer cancel()
namespaces := client.NamespaceService()
return namespaces.Create(ctx, namespace, labels)
},
@ -55,28 +50,22 @@ var namespacesSetLabelsCommand = cli.Command{
ArgsUsage: "[flags] <name> [<key>=<value>, ...]",
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] <name> [<name>, ...]",
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
},
}

View File

@ -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

View File

@ -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(),

View File

@ -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

View File

@ -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")
}

View File

@ -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
})

View File

@ -16,21 +16,23 @@ var pushObjectCommand = cli.Command{
ArgsUsage: "[flags] <remote> <object> <type>",
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)

View File

@ -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

View File

@ -22,34 +22,27 @@ var rootfsUnpackCommand = cli.Command{
Usage: "unpack applies layers from a manifest to a snapshot",
ArgsUsage: "[flags] <digest>",
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
},
}

View File

@ -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

View File

@ -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: "<key> [<key>, ...]",
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] <target> <key>",
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] <key> <active>",
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: "<key>",
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] <name> [<label>=<value> ...]",
Description: `Labels snapshots in the snapshotter`,
Flags: []cli.Flag{},
Action: func(clicontext *cli.Context) error {
var (
key, labels = objectWithLabelArgs(clicontext)
)
ctx, cancel := appContext(clicontext)
defer cancel()
client, err := newClient(clicontext)
Action: func(context *cli.Context) error {
key, labels := objectWithLabelArgs(context)
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 := snapshot.Info{
Name: key,

View File

@ -20,20 +20,16 @@ var taskStartCommand = cli.Command{
Action: func(context *cli.Context) error {
var (
err error
ctx, cancel = appContext(context)
id = context.Args().Get(0)
id = context.Args().Get(0)
)
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

View File

@ -31,16 +31,12 @@ var tasksCommand = cli.Command{
taskDeleteCommand,
},
Action: func(context *cli.Context) error {
var (
quiet = context.Bool("quiet")
ctx, cancel = appContext(context)
)
defer cancel()
client, err := newClient(context)
quiet := context.Bool("quiet")
client, ctx, cancel, err := newClient(context)
if err != nil {
return err
}
defer cancel()
s := client.TaskService()
response, err := s.List(ctx, &tasks.ListTasksRequest{})
if err != nil {

View File

@ -7,12 +7,11 @@ var taskDeleteCommand = cli.Command{
Usage: "delete a task",
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

View File

@ -90,8 +90,13 @@ func appContext(clicontext *cli.Context) (gocontext.Context, gocontext.CancelFun
return ctx, cancel
}
func newClient(context *cli.Context) (*containerd.Client, error) {
return containerd.New(context.GlobalString("address"))
func newClient(context *cli.Context) (*containerd.Client, gocontext.Context, gocontext.CancelFunc, error) {
client, err := containerd.New(context.GlobalString("address"))
if err != nil {
return nil, nil, nil, err
}
ctx, cancel := appContext(context)
return client, ctx, cancel, nil
}
func passwordPrompt() (string, error) {

View File

@ -1,7 +1,6 @@
package main
import (
gocontext "context"
"fmt"
"os"
@ -20,11 +19,12 @@ var versionCommand = cli.Command{
fmt.Printf(" Version: %s\n", version.Version)
fmt.Printf(" Revision: %s\n", version.Revision)
fmt.Println("")
client, err := newClient(context)
client, ctx, cancel, err := newClient(context)
if err != nil {
return err
}
v, err := client.Version(gocontext.Background())
defer cancel()
v, err := client.Version(ctx)
if err != nil {
return err
}