diff --git a/client.go b/client.go index 2e253a08d..ad41ee57e 100644 --- a/client.go +++ b/client.go @@ -25,6 +25,7 @@ import ( "github.com/containerd/containerd/diff" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" + "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/platforms" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/reference" @@ -34,6 +35,7 @@ import ( contentservice "github.com/containerd/containerd/services/content" diffservice "github.com/containerd/containerd/services/diff" imagesservice "github.com/containerd/containerd/services/images" + namespacesservice "github.com/containerd/containerd/services/namespaces" snapshotservice "github.com/containerd/containerd/services/snapshot" "github.com/containerd/containerd/snapshot" "github.com/containerd/typeurl" @@ -414,9 +416,9 @@ func (c *Client) Close() error { return c.conn.Close() } -// NamespaceService returns the underlying NamespacesClient -func (c *Client) NamespaceService() namespacesapi.NamespacesClient { - return namespacesapi.NewNamespacesClient(c.conn) +// NamespaceService returns the underlying Namespaces Store +func (c *Client) NamespaceService() namespaces.Store { + return namespacesservice.NewStoreFromClient(namespacesapi.NewNamespacesClient(c.conn)) } // ContainerService returns the underlying container Store diff --git a/cmd/ctr/content.go b/cmd/ctr/content.go index 96187ff08..36e1cba2d 100644 --- a/cmd/ctr/content.go +++ b/cmd/ctr/content.go @@ -49,10 +49,11 @@ var ( return err } - cs, err := getContentStore(context) + client, err := newClient(context) if err != nil { return err } + cs := client.ContentStore() ra, err := cs.ReaderAt(ctx, dgst) if err != nil { @@ -98,10 +99,11 @@ var ( return errors.New("must specify a transaction reference") } - cs, err := getContentStore(context) + client, err := newClient(context) if err != nil { return err } + cs := client.ContentStore() // TODO(stevvooe): Allow ingest to be reentrant. Currently, we expect // all data to be written in a single invocation. Allow multiple writes @@ -135,10 +137,11 @@ var ( ctx, cancel := appContext(context) defer cancel() - cs, err := getContentStore(context) + client, err := newClient(context) if err != nil { return err } + cs := client.ContentStore() active, err := cs.ListStatuses(ctx, match) if err != nil { @@ -178,10 +181,11 @@ var ( ctx, cancel := appContext(context) defer cancel() - cs, err := getContentStore(context) + client, err := newClient(context) if err != nil { return err } + cs := client.ContentStore() var walkFn content.WalkFunc if quiet { @@ -231,10 +235,11 @@ var ( ctx, cancel := appContext(context) defer cancel() - cs, err := getContentStore(context) + client, err := newClient(context) if err != nil { return err } + cs := client.ContentStore() dgst, err := digest.Parse(object) if err != nil { @@ -306,10 +311,11 @@ var ( return err } - cs, err := getContentStore(context) + client, err := newClient(context) if err != nil { return err } + cs := client.ContentStore() ra, err := cs.ReaderAt(ctx, dgst) if err != nil { @@ -357,10 +363,11 @@ var ( ctx, cancel := appContext(context) defer cancel() - cs, err := getContentStore(context) + client, err := newClient(context) if err != nil { return err } + cs := client.ContentStore() for _, arg := range args { dgst, err := digest.Parse(arg) diff --git a/cmd/ctr/events.go b/cmd/ctr/events.go index e648bf0fa..a99f3c027 100644 --- a/cmd/ctr/events.go +++ b/cmd/ctr/events.go @@ -13,12 +13,14 @@ var eventsCommand = cli.Command{ Name: "events", Usage: "display containerd events", Action: func(context *cli.Context) error { - eventsClient, err := getEventsService(context) + ctx, cancel := appContext(context) + defer cancel() + + client, err := newClient(context) if err != nil { return err } - ctx, cancel := appContext(context) - defer cancel() + eventsClient := client.EventService() events, err := eventsClient.Subscribe(ctx, &eventsapi.SubscribeRequest{ Filters: context.Args(), diff --git a/cmd/ctr/namespaces.go b/cmd/ctr/namespaces.go index 7b096641a..4d535d988 100644 --- a/cmd/ctr/namespaces.go +++ b/cmd/ctr/namespaces.go @@ -40,10 +40,11 @@ var namespacesCreateCommand = cli.Command{ return errors.New("please specify a namespace") } - namespaces, err := getNamespacesService(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + namespaces := client.NamespaceService() return namespaces.Create(ctx, namespace, labels) }, } @@ -60,10 +61,11 @@ var namespacesSetLabelsCommand = cli.Command{ namespace, labels = objectWithLabelArgs(clicontext) ) - namespaces, err := getNamespacesService(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + namespaces := client.NamespaceService() if namespace == "" { return errors.New("please specify a namespace") @@ -97,10 +99,11 @@ var namespacesListCommand = cli.Command{ quiet = clicontext.Bool("quiet") ) - namespaces, err := getNamespacesService(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + namespaces := client.NamespaceService() nss, err := namespaces.List(ctx) if err != nil { @@ -150,10 +153,11 @@ var namespacesRemoveCommand = cli.Command{ exitErr error ) - namespaces, err := getNamespacesService(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + namespaces := client.NamespaceService() for _, target := range clicontext.Args() { if err := namespaces.Delete(ctx, target); err != nil { diff --git a/cmd/ctr/pushobject.go b/cmd/ctr/pushobject.go index 2c832d119..f659283c7 100644 --- a/cmd/ctr/pushobject.go +++ b/cmd/ctr/pushobject.go @@ -43,10 +43,11 @@ var pushObjectCommand = cli.Command{ return err } - cs, err := getContentStore(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + cs := client.ContentStore() info, err := cs.Info(ctx, dgst) if err != nil { diff --git a/cmd/ctr/snapshot.go b/cmd/ctr/snapshot.go index 3b990cdb5..04e977bd8 100644 --- a/cmd/ctr/snapshot.go +++ b/cmd/ctr/snapshot.go @@ -40,10 +40,11 @@ var listSnapshotCommand = cli.Command{ ctx, cancel := appContext(clicontext) defer cancel() - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) fmt.Fprintln(tw, "KEY\tPARENT\tKIND\t") @@ -87,10 +88,11 @@ var usageSnapshotCommand = cli.Command{ } } - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0) fmt.Fprintln(tw, "KEY\tSIZE\tINODES\t") @@ -129,10 +131,11 @@ var removeSnapshotCommand = cli.Command{ ctx, cancel := appContext(clicontext) defer cancel() - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) for _, key := range clicontext.Args() { err = snapshotter.Remove(ctx, key) @@ -167,10 +170,11 @@ var prepareSnapshotCommand = cli.Command{ key := clicontext.Args().Get(0) parent := clicontext.Args().Get(1) - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) mounts, err := snapshotter.Prepare(ctx, key, parent) if err != nil { @@ -207,10 +211,11 @@ var viewSnapshotCommand = cli.Command{ key := clicontext.Args().Get(0) parent := clicontext.Args().Get(1) - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) mounts, err := snapshotter.View(ctx, key, parent) if err != nil { @@ -240,10 +245,11 @@ var mountSnapshotCommand = cli.Command{ target := clicontext.Args().Get(0) key := clicontext.Args().Get(1) - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) mounts, err := snapshotter.Mounts(ctx, key) if err != nil { @@ -271,10 +277,11 @@ var commitSnapshotCommand = cli.Command{ key := clicontext.Args().Get(0) active := clicontext.Args().Get(1) - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) return snapshotter.Commit(ctx, key, active) }, @@ -287,10 +294,11 @@ var treeSnapshotCommand = cli.Command{ ctx, cancel := appContext(clicontext) defer cancel() - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) tree := make(map[string]*snapshotTreeNode) @@ -328,10 +336,11 @@ var infoSnapshotCommand = cli.Command{ key := clicontext.Args().Get(0) - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) info, err := snapshotter.Stat(ctx, key) if err != nil { @@ -357,10 +366,11 @@ var labelSnapshotCommand = cli.Command{ ctx, cancel := appContext(clicontext) defer cancel() - snapshotter, err := getSnapshotter(clicontext) + client, err := newClient(clicontext) if err != nil { return err } + snapshotter := client.SnapshotService(clicontext.GlobalString("snapshotter")) info := snapshot.Info{ Name: key, diff --git a/cmd/ctr/utils.go b/cmd/ctr/utils.go index fa5c8000f..da55b6e0d 100644 --- a/cmd/ctr/utils.go +++ b/cmd/ctr/utils.go @@ -18,35 +18,18 @@ import ( "github.com/containerd/console" "github.com/containerd/containerd" - containersapi "github.com/containerd/containerd/api/services/containers/v1" - contentapi "github.com/containerd/containerd/api/services/content/v1" - diffapi "github.com/containerd/containerd/api/services/diff/v1" - "github.com/containerd/containerd/api/services/events/v1" - imagesapi "github.com/containerd/containerd/api/services/images/v1" - namespacesapi "github.com/containerd/containerd/api/services/namespaces/v1" - snapshotapi "github.com/containerd/containerd/api/services/snapshot/v1" - "github.com/containerd/containerd/api/services/tasks/v1" - versionservice "github.com/containerd/containerd/api/services/version/v1" "github.com/containerd/containerd/content" - "github.com/containerd/containerd/diff" "github.com/containerd/containerd/images" "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/platforms" "github.com/containerd/containerd/remotes" "github.com/containerd/containerd/remotes/docker" "github.com/containerd/containerd/rootfs" - contentservice "github.com/containerd/containerd/services/content" - diffservice "github.com/containerd/containerd/services/diff" - imagesservice "github.com/containerd/containerd/services/images" - namespacesservice "github.com/containerd/containerd/services/namespaces" - snapshotservice "github.com/containerd/containerd/services/snapshot" - "github.com/containerd/containerd/snapshot" ocispec "github.com/opencontainers/image-spec/specs-go/v1" specs "github.com/opencontainers/runtime-spec/specs-go" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" - "google.golang.org/grpc" ) var ( @@ -83,8 +66,6 @@ var ( } ) -var grpcConn *grpc.ClientConn - // appContext returns the context for a command. Should only be called once per // command, near the start. // @@ -109,83 +90,10 @@ func appContext(clicontext *cli.Context) (gocontext.Context, gocontext.CancelFun return ctx, cancel } -func getNamespacesService(clicontext *cli.Context) (namespaces.Store, error) { - conn, err := getGRPCConnection(clicontext) - if err != nil { - return nil, err - } - return namespacesservice.NewStoreFromClient(namespacesapi.NewNamespacesClient(conn)), nil -} - func newClient(context *cli.Context) (*containerd.Client, error) { return containerd.New(context.GlobalString("address")) } -func getContainersService(context *cli.Context) (containersapi.ContainersClient, error) { - conn, err := getGRPCConnection(context) - if err != nil { - return nil, err - } - return containersapi.NewContainersClient(conn), nil -} - -func getTasksService(context *cli.Context) (tasks.TasksClient, error) { - conn, err := getGRPCConnection(context) - if err != nil { - return nil, err - } - return tasks.NewTasksClient(conn), nil -} - -func getEventsService(context *cli.Context) (events.EventsClient, error) { - conn, err := getGRPCConnection(context) - if err != nil { - return nil, err - } - - return events.NewEventsClient(conn), nil -} - -func getContentStore(context *cli.Context) (content.Store, error) { - conn, err := getGRPCConnection(context) - if err != nil { - return nil, err - } - return contentservice.NewStoreFromClient(contentapi.NewContentClient(conn)), nil -} - -func getSnapshotter(context *cli.Context) (snapshot.Snapshotter, error) { - conn, err := getGRPCConnection(context) - if err != nil { - return nil, err - } - return snapshotservice.NewSnapshotterFromClient(snapshotapi.NewSnapshotsClient(conn), context.GlobalString("snapshotter")), nil -} - -func getImageStore(clicontext *cli.Context) (images.Store, error) { - conn, err := getGRPCConnection(clicontext) - if err != nil { - return nil, err - } - return imagesservice.NewStoreFromClient(imagesapi.NewImagesClient(conn)), nil -} - -func getDiffService(context *cli.Context) (diff.Differ, error) { - conn, err := getGRPCConnection(context) - if err != nil { - return nil, err - } - return diffservice.NewDiffServiceFromClient(diffapi.NewDiffClient(conn)), nil -} - -func getVersionService(context *cli.Context) (versionservice.VersionClient, error) { - conn, err := getGRPCConnection(context) - if err != nil { - return nil, err - } - return versionservice.NewVersionClient(conn), nil -} - func passwordPrompt() (string, error) { c := console.Current() defer c.Reset() diff --git a/cmd/ctr/utils_unix.go b/cmd/ctr/utils_unix.go index 0ef7b8dd3..69967f6f3 100644 --- a/cmd/ctr/utils_unix.go +++ b/cmd/ctr/utils_unix.go @@ -4,18 +4,12 @@ package main import ( gocontext "context" - "fmt" "io" - "net" "os" "sync" - "time" "github.com/containerd/fifo" - "github.com/pkg/errors" - "github.com/urfave/cli" "golang.org/x/sys/unix" - "google.golang.org/grpc" ) func prepareStdio(stdin, stdout, stderr string, console bool) (wg *sync.WaitGroup, err error) { @@ -72,25 +66,3 @@ func prepareStdio(stdin, stdout, stderr string, console bool) (wg *sync.WaitGrou return wg, nil } - -func getGRPCConnection(context *cli.Context) (*grpc.ClientConn, error) { - if grpcConn != nil { - return grpcConn, nil - } - - bindSocket := context.GlobalString("address") - dialOpts := []grpc.DialOption{grpc.WithInsecure(), grpc.WithTimeout(100 * time.Second)} - dialOpts = append(dialOpts, - grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { - return net.DialTimeout("unix", bindSocket, timeout) - }, - )) - - conn, err := grpc.Dial(fmt.Sprintf("unix://%s", bindSocket), dialOpts...) - if err != nil { - return nil, errors.Wrapf(err, "failed to dial %q", bindSocket) - } - - grpcConn = conn - return grpcConn, nil -} diff --git a/cmd/ctr/utils_windows.go b/cmd/ctr/utils_windows.go index a883b7f8a..652478f65 100644 --- a/cmd/ctr/utils_windows.go +++ b/cmd/ctr/utils_windows.go @@ -6,38 +6,13 @@ import ( "os" "sync" "syscall" - "time" "github.com/Microsoft/go-winio" clog "github.com/containerd/containerd/log" "github.com/pkg/errors" - "github.com/urfave/cli" "golang.org/x/sys/windows" - "google.golang.org/grpc" ) -func getGRPCConnection(context *cli.Context) (*grpc.ClientConn, error) { - if grpcConn != nil { - return grpcConn, nil - } - - bindAddress := context.GlobalString("address") - dialOpts := []grpc.DialOption{grpc.WithInsecure(), grpc.WithTimeout(100 * time.Second)} - dialOpts = append(dialOpts, - grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { - return winio.DialPipe(bindAddress, &timeout) - }, - )) - - conn, err := grpc.Dial(bindAddress, dialOpts...) - if err != nil { - return nil, errors.Wrapf(err, "failed to dial %q", bindAddress) - } - - grpcConn = conn - return grpcConn, nil -} - func prepareStdio(stdin, stdout, stderr string, console bool) (*sync.WaitGroup, error) { var wg sync.WaitGroup