From f7ce392af2caa7c2501ab170e57f477318a355d1 Mon Sep 17 00:00:00 2001 From: David Son Date: Mon, 9 Oct 2023 17:45:33 +0000 Subject: [PATCH] Remove most references to ctr Signed-off-by: David Son --- cmd/soci/commands/create.go | 3 +- cmd/soci/commands/image/rpull.go | 8 +-- cmd/soci/commands/index/list.go | 4 +- cmd/soci/commands/index/rm.go | 4 +- cmd/soci/commands/internal/client.go | 84 +++++++++++++++++++++++ cmd/soci/commands/internal/label.go | 42 ++++++++++++ cmd/soci/commands/internal/registry.go | 81 ++++++++++++++++++++++ cmd/soci/commands/internal/snapshotter.go | 45 ++++++++++++ cmd/soci/commands/push.go | 9 ++- cmd/soci/commands/rebuild_db.go | 4 +- cmd/soci/commands/ztoc/get-file.go | 4 +- cmd/soci/commands/ztoc/list.go | 4 +- 12 files changed, 271 insertions(+), 21 deletions(-) create mode 100644 cmd/soci/commands/internal/client.go create mode 100644 cmd/soci/commands/internal/label.go create mode 100644 cmd/soci/commands/internal/registry.go create mode 100644 cmd/soci/commands/internal/snapshotter.go diff --git a/cmd/soci/commands/create.go b/cmd/soci/commands/create.go index f9eb609bf..0bf9cf34e 100644 --- a/cmd/soci/commands/create.go +++ b/cmd/soci/commands/create.go @@ -24,7 +24,6 @@ import ( "github.com/awslabs/soci-snapshotter/config" "github.com/awslabs/soci-snapshotter/soci" "github.com/awslabs/soci-snapshotter/soci/store" - "github.com/containerd/containerd/cmd/ctr/commands" "github.com/urfave/cli" ) @@ -61,7 +60,7 @@ var CreateCommand = cli.Command{ return errors.New("source image needs to be specified") } - client, ctx, cancel, err := commands.NewClient(cliContext) + client, ctx, cancel, err := internal.NewClient(cliContext) if err != nil { return err } diff --git a/cmd/soci/commands/image/rpull.go b/cmd/soci/commands/image/rpull.go index a488170e0..39d620854 100644 --- a/cmd/soci/commands/image/rpull.go +++ b/cmd/soci/commands/image/rpull.go @@ -64,9 +64,9 @@ After pulling an image, it should be ready to use the same reference in a run command. `, Flags: append(append(append( - commands.RegistryFlags, - commands.LabelFlag), - commands.SnapshotterFlags...), + internal.RegistryFlags, + internal.LabelFlag), + internal.SnapshotterFlags...), cli.BoolFlag{ Name: skipContentVerifyOpt, Usage: "Skip content verification for layers contained in this image.", @@ -92,7 +92,7 @@ command. config.indexDigest = context.String("soci-index-digest") - client, ctx, cancel, err := commands.NewClient(context) + client, ctx, cancel, err := internal.NewClient(context) if err != nil { return err } diff --git a/cmd/soci/commands/index/list.go b/cmd/soci/commands/index/list.go index c4ba23f5a..e0e856261 100644 --- a/cmd/soci/commands/index/list.go +++ b/cmd/soci/commands/index/list.go @@ -24,8 +24,8 @@ import ( "text/tabwriter" "time" + "github.com/awslabs/soci-snapshotter/cmd/soci/commands/internal" "github.com/awslabs/soci-snapshotter/soci" - "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/containerd/images" "github.com/containerd/containerd/platforms" specs "github.com/opencontainers/image-spec/specs-go/v1" @@ -92,7 +92,7 @@ var listCommand = cli.Command{ plats = append(plats, pp) } - client, ctx, cancel, err := commands.NewClient(cliContext) + client, ctx, cancel, err := internal.NewClient(cliContext) if err != nil { return err } diff --git a/cmd/soci/commands/index/rm.go b/cmd/soci/commands/index/rm.go index d44abd886..a217af987 100644 --- a/cmd/soci/commands/index/rm.go +++ b/cmd/soci/commands/index/rm.go @@ -20,9 +20,9 @@ import ( "context" "fmt" + "github.com/awslabs/soci-snapshotter/cmd/soci/commands/internal" "github.com/awslabs/soci-snapshotter/soci" "github.com/awslabs/soci-snapshotter/soci/store" - "github.com/containerd/containerd/cmd/ctr/commands" "github.com/opencontainers/go-digest" "github.com/urfave/cli" ) @@ -66,7 +66,7 @@ var rmCommand = cli.Command{ return err } } else { - client, ctx, cancel, err := commands.NewClient(cliContext) + client, ctx, cancel, err := internal.NewClient(cliContext) if err != nil { return err } diff --git a/cmd/soci/commands/internal/client.go b/cmd/soci/commands/internal/client.go new file mode 100644 index 000000000..7b489d192 --- /dev/null +++ b/cmd/soci/commands/internal/client.go @@ -0,0 +1,84 @@ +/* + Copyright The Soci Snapshotter Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package internal + +import ( + gocontext "context" + + "github.com/containerd/containerd" + "github.com/containerd/containerd/namespaces" + "github.com/containerd/containerd/pkg/epoch" + "github.com/containerd/log" + "github.com/urfave/cli" +) + +// Largely taken from containerd/cmd/ctr/commands/client.go + +// AppContext returns the context for a command. Should only be called once per +// command, near the start. +// +// This will ensure the namespace is picked up and set the timeout, if one is +// defined. +func AppContext(context *cli.Context) (gocontext.Context, gocontext.CancelFunc) { + var ( + ctx = gocontext.Background() + timeout = context.GlobalDuration("timeout") + namespace = context.GlobalString("namespace") + cancel gocontext.CancelFunc + ) + ctx = namespaces.WithNamespace(ctx, namespace) + if timeout > 0 { + ctx, cancel = gocontext.WithTimeout(ctx, timeout) + } else { + ctx, cancel = gocontext.WithCancel(ctx) + } + if tm, err := epoch.SourceDateEpoch(); err != nil { + log.L.WithError(err).Warn("Failed to read SOURCE_DATE_EPOCH") + } else if tm != nil { + log.L.Debugf("Using SOURCE_DATE_EPOCH: %v", tm) + ctx = epoch.WithSourceDateEpoch(ctx, tm) + } + return ctx, cancel +} + +// NewClient returns a new containerd client +func NewClient(context *cli.Context, opts ...containerd.ClientOpt) (*containerd.Client, gocontext.Context, gocontext.CancelFunc, error) { + timeoutOpt := containerd.WithTimeout(context.GlobalDuration("connect-timeout")) + opts = append(opts, timeoutOpt) + client, err := containerd.New(context.GlobalString("address"), opts...) + if err != nil { + return nil, nil, nil, err + } + ctx, cancel := AppContext(context) + return client, ctx, cancel, nil +} diff --git a/cmd/soci/commands/internal/label.go b/cmd/soci/commands/internal/label.go new file mode 100644 index 000000000..04754cfb1 --- /dev/null +++ b/cmd/soci/commands/internal/label.go @@ -0,0 +1,42 @@ +/* + Copyright The Soci Snapshotter Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package internal + +import ( + "github.com/urfave/cli" +) + +var LabelFlag = cli.StringSliceFlag{ + Name: "label", + Usage: "Labels to attach to the image", +} diff --git a/cmd/soci/commands/internal/registry.go b/cmd/soci/commands/internal/registry.go new file mode 100644 index 000000000..e4519065a --- /dev/null +++ b/cmd/soci/commands/internal/registry.go @@ -0,0 +1,81 @@ +/* + Copyright The Soci Snapshotter Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package internal + +import ( + "github.com/urfave/cli" +) + +var RegistryFlags = []cli.Flag{ + cli.BoolFlag{ + Name: "skip-verify,k", + Usage: "Skip SSL certificate validation", + }, + cli.BoolFlag{ + Name: "plain-http", + Usage: "Allow connections using plain HTTP", + }, + cli.StringFlag{ + Name: "user,u", + Usage: "User[:password] Registry user and password", + }, + cli.StringFlag{ + Name: "refresh", + Usage: "Refresh token for authorization server", + }, + cli.StringFlag{ + Name: "hosts-dir", + // compatible with "/etc/docker/certs.d" + Usage: "Custom hosts configuration directory", + }, + cli.StringFlag{ + Name: "tlscacert", + Usage: "Path to TLS root CA", + }, + cli.StringFlag{ + Name: "tlscert", + Usage: "Path to TLS client certificate", + }, + cli.StringFlag{ + Name: "tlskey", + Usage: "Path to TLS client key", + }, + cli.BoolFlag{ + Name: "http-dump", + Usage: "Dump all HTTP request/responses when interacting with container registry", + }, + cli.BoolFlag{ + Name: "http-trace", + Usage: "Enable HTTP tracing for registry interactions", + }, +} diff --git a/cmd/soci/commands/internal/snapshotter.go b/cmd/soci/commands/internal/snapshotter.go new file mode 100644 index 000000000..a34536c24 --- /dev/null +++ b/cmd/soci/commands/internal/snapshotter.go @@ -0,0 +1,45 @@ +/* + Copyright The Soci Snapshotter Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package internal + +import ( + "github.com/urfave/cli" +) + +var SnapshotterFlags = []cli.Flag{ + cli.StringFlag{ + Name: "snapshotter", + Usage: "Snapshotter name. Empty value stands for the default value.", + EnvVar: "CONTAINERD_SNAPSHOTTER", + }, +} diff --git a/cmd/soci/commands/push.go b/cmd/soci/commands/push.go index 06295f63b..17f9c6736 100644 --- a/cmd/soci/commands/push.go +++ b/cmd/soci/commands/push.go @@ -29,7 +29,6 @@ import ( "github.com/awslabs/soci-snapshotter/fs" "github.com/awslabs/soci-snapshotter/soci" "github.com/awslabs/soci-snapshotter/soci/store" - "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/containerd/reference" dockercliconfig "github.com/docker/cli/cli/config" ocispec "github.com/opencontainers/image-spec/specs-go/v1" @@ -51,9 +50,9 @@ After pushing the soci artifacts, they should be available in the registry. Soci if they are available in the snapshotter's local content store. `, Flags: append(append(append(append( - commands.RegistryFlags, - commands.LabelFlag), - commands.SnapshotterFlags...), + internal.RegistryFlags, + internal.LabelFlag), + internal.SnapshotterFlags...), internal.PlatformFlags...), internal.ExistingIndexFlag, cli.Uint64Flag{ @@ -73,7 +72,7 @@ if they are available in the snapshotter's local content store. return fmt.Errorf("please provide an image reference to push") } - client, ctx, cancel, err := commands.NewClient(cliContext) + client, ctx, cancel, err := internal.NewClient(cliContext) if err != nil { return err } diff --git a/cmd/soci/commands/rebuild_db.go b/cmd/soci/commands/rebuild_db.go index c588d3c88..84097c26a 100644 --- a/cmd/soci/commands/rebuild_db.go +++ b/cmd/soci/commands/rebuild_db.go @@ -19,9 +19,9 @@ package commands import ( "path/filepath" + "github.com/awslabs/soci-snapshotter/cmd/soci/commands/internal" "github.com/awslabs/soci-snapshotter/soci" "github.com/awslabs/soci-snapshotter/soci/store" - "github.com/containerd/containerd/cmd/ctr/commands" "github.com/urfave/cli" ) @@ -29,7 +29,7 @@ var RebuildDBCommand = cli.Command{ Name: "rebuild-db", Usage: `rebuild the artifacts database. You should use this command after "rpull" so that indices/ztocs can be discovered by commands like "soci index list", and after "index rm" when using the containerd content store so that deleted orphaned zTOCs will be forgotten`, Action: func(cliContext *cli.Context) error { - client, ctx, cancel, err := commands.NewClient(cliContext) + client, ctx, cancel, err := internal.NewClient(cliContext) if err != nil { return err } diff --git a/cmd/soci/commands/ztoc/get-file.go b/cmd/soci/commands/ztoc/get-file.go index 25927e1df..9d124254b 100644 --- a/cmd/soci/commands/ztoc/get-file.go +++ b/cmd/soci/commands/ztoc/get-file.go @@ -23,10 +23,10 @@ import ( "io" "os" + "github.com/awslabs/soci-snapshotter/cmd/soci/commands/internal" "github.com/awslabs/soci-snapshotter/soci" "github.com/awslabs/soci-snapshotter/soci/store" "github.com/awslabs/soci-snapshotter/ztoc" - "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/containerd/content" "github.com/opencontainers/go-digest" v1 "github.com/opencontainers/image-spec/specs-go/v1" @@ -54,7 +54,7 @@ var getFileCommand = cli.Command{ } file := cliContext.Args()[1] - client, ctx, cancel, err := commands.NewClient(cliContext) + client, ctx, cancel, err := internal.NewClient(cliContext) if err != nil { return err } diff --git a/cmd/soci/commands/ztoc/list.go b/cmd/soci/commands/ztoc/list.go index ab2e98955..75b3d63f9 100644 --- a/cmd/soci/commands/ztoc/list.go +++ b/cmd/soci/commands/ztoc/list.go @@ -21,8 +21,8 @@ import ( "os" "text/tabwriter" + "github.com/awslabs/soci-snapshotter/cmd/soci/commands/internal" "github.com/awslabs/soci-snapshotter/soci" - "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/containerd/images" "github.com/containerd/containerd/platforms" ocispec "github.com/opencontainers/image-spec/specs-go/v1" @@ -70,7 +70,7 @@ var listCommand = cli.Command{ return nil }) } else { - client, ctx, cancel, err := commands.NewClient(cliContext) + client, ctx, cancel, err := internal.NewClient(cliContext) if err != nil { return err }