ctr: new deprecations command
Signed-off-by: Samuel Karp <samuelkarp@google.com>
This commit is contained in:
		| @@ -20,8 +20,13 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"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/containers" | ||||||
| 	"github.com/containerd/containerd/cmd/ctr/commands/content" | 	"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/events" | ||||||
| 	"github.com/containerd/containerd/cmd/ctr/commands/images" | 	"github.com/containerd/containerd/cmd/ctr/commands/images" | ||||||
| 	"github.com/containerd/containerd/cmd/ctr/commands/info" | 	"github.com/containerd/containerd/cmd/ctr/commands/info" | ||||||
| @@ -39,9 +44,6 @@ import ( | |||||||
| 	"github.com/containerd/containerd/defaults" | 	"github.com/containerd/containerd/defaults" | ||||||
| 	"github.com/containerd/containerd/namespaces" | 	"github.com/containerd/containerd/namespaces" | ||||||
| 	"github.com/containerd/containerd/version" | 	"github.com/containerd/containerd/version" | ||||||
| 	"github.com/containerd/log" |  | ||||||
| 	"github.com/urfave/cli" |  | ||||||
| 	"google.golang.org/grpc/grpclog" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var extraCmds = []cli.Command{} | var extraCmds = []cli.Command{} | ||||||
| @@ -118,6 +120,7 @@ containerd CLI | |||||||
| 		ociCmd.Command, | 		ociCmd.Command, | ||||||
| 		sandboxes.Command, | 		sandboxes.Command, | ||||||
| 		info.Command, | 		info.Command, | ||||||
|  | 		deprecations.Command, | ||||||
| 	}, extraCmds...) | 	}, extraCmds...) | ||||||
| 	app.Before = func(context *cli.Context) error { | 	app.Before = func(context *cli.Context) error { | ||||||
| 		if context.GlobalBool("debug") { | 		if context.GlobalBool("debug") { | ||||||
|   | |||||||
							
								
								
									
										113
									
								
								cmd/ctr/commands/deprecations/deprecations.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								cmd/ctr/commands/deprecations/deprecations.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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, | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Samuel Karp
					Samuel Karp