diff --git a/cmd/ctr/app/main.go b/cmd/ctr/app/main.go index 0a740dd1b..6def24047 100644 --- a/cmd/ctr/app/main.go +++ b/cmd/ctr/app/main.go @@ -20,8 +20,13 @@ import ( "fmt" "io" + "github.com/containerd/log" + "github.com/urfave/cli" + "google.golang.org/grpc/grpclog" + "github.com/containerd/containerd/cmd/ctr/commands/containers" "github.com/containerd/containerd/cmd/ctr/commands/content" + "github.com/containerd/containerd/cmd/ctr/commands/deprecations" "github.com/containerd/containerd/cmd/ctr/commands/events" "github.com/containerd/containerd/cmd/ctr/commands/images" "github.com/containerd/containerd/cmd/ctr/commands/info" @@ -39,9 +44,6 @@ import ( "github.com/containerd/containerd/defaults" "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/version" - "github.com/containerd/log" - "github.com/urfave/cli" - "google.golang.org/grpc/grpclog" ) var extraCmds = []cli.Command{} @@ -118,6 +120,7 @@ containerd CLI ociCmd.Command, sandboxes.Command, info.Command, + deprecations.Command, }, extraCmds...) app.Before = func(context *cli.Context) error { if context.GlobalBool("debug") { diff --git a/cmd/ctr/commands/deprecations/deprecations.go b/cmd/ctr/commands/deprecations/deprecations.go new file mode 100644 index 000000000..bd3534926 --- /dev/null +++ b/cmd/ctr/commands/deprecations/deprecations.go @@ -0,0 +1,113 @@ +/* + 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 deprecations + +import ( + "fmt" + "os" + "text/tabwriter" + "time" + + "github.com/urfave/cli" + + api "github.com/containerd/containerd/api/services/introspection/v1" + "github.com/containerd/containerd/cmd/ctr/commands" + "github.com/containerd/containerd/protobuf" + ptypes "github.com/containerd/containerd/protobuf/types" +) + +// Command is the parent for all commands under "deprecations" +var Command = cli.Command{ + Name: "deprecations", + Subcommands: []cli.Command{ + listCommand, + }, +} +var listCommand = cli.Command{ + Name: "list", + Usage: "Print warnings for deprecations", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "format", + Usage: "output format to use (Examples: 'default', 'json')", + }, + }, + Action: func(context *cli.Context) error { + client, ctx, cancel, err := commands.NewClient(context) + if err != nil { + return err + } + defer cancel() + + resp, err := client.IntrospectionService().Server(ctx, &ptypes.Empty{}) + if err != nil { + return err + } + wrn := warnings(resp) + if len(wrn) > 0 { + switch context.String("format") { + case "json": + commands.PrintAsJSON(warnings(resp)) + return nil + default: + w := tabwriter.NewWriter(os.Stdout, 4, 8, 4, ' ', 0) + fmt.Fprintln(w, "ID\tLAST OCCURRENCE\tMESSAGE\t") + for _, dw := range wrn { + if _, err := fmt.Fprintf(w, "%s\t%s\t%s\n", + dw.ID, + dw.LastOccurrence.Format(time.RFC3339Nano), + dw.Message, + ); err != nil { + return err + } + } + return w.Flush() + } + + } + return nil + }, +} + +type deprecationWarning struct { + ID string `json:"id"` + Message string `json:"message"` + LastOccurrence time.Time `json:"lastOccurrence"` +} + +func warnings(in *api.ServerResponse) []deprecationWarning { + var warnings []deprecationWarning + for _, dw := range in.Deprecations { + wrn := deprecationWarningFromPB(dw) + if wrn == nil { + continue + } + warnings = append(warnings, *wrn) + } + return warnings +} +func deprecationWarningFromPB(in *api.DeprecationWarning) *deprecationWarning { + if in == nil { + return nil + } + lo := protobuf.FromTimestamp(in.LastOccurrence) + return &deprecationWarning{ + ID: in.ID, + Message: in.Message, + LastOccurrence: lo, + } +}