package main import ( contextpkg "context" "os" contentapi "github.com/containerd/containerd/api/services/content" "github.com/containerd/containerd/content" contentservice "github.com/containerd/containerd/services/content" "github.com/opencontainers/go-digest" "github.com/pkg/errors" "github.com/urfave/cli" ) var ingestCommand = cli.Command{ Name: "ingest", Usage: "accept content into the store", ArgsUsage: "[flags] ", Description: `Ingest objects into the local content store.`, Flags: []cli.Flag{ cli.Int64Flag{ Name: "expected-size", Usage: "validate against provided size", }, cli.StringFlag{ Name: "expected-digest", Usage: "verify content against expected digest", }, }, Action: func(context *cli.Context) error { var ( ctx = background cancel func() ref = context.Args().First() expectedSize = context.Int64("expected-size") expectedDigest = digest.Digest(context.String("expected-digest")) ) ctx, cancel = contextpkg.WithCancel(ctx) defer cancel() if err := expectedDigest.Validate(); expectedDigest != "" && err != nil { return err } conn, err := connectGRPC(context) if err != nil { return err } if ref == "" { return errors.New("must specify a transaction reference") } ingester := contentservice.NewIngesterFromClient(contentapi.NewContentClient(conn)) // TODO(stevvooe): Allow ingest to be reentrant. Currently, we expect // all data to be written in a single invocation. Allow multiple writes // to the same transaction key followed by a commit. return content.WriteBlob(ctx, ingester, ref, os.Stdin, expectedSize, expectedDigest) }, }