// Copyright 2021 The etcd 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 cmd import ( "fmt" "os" "github.com/spf13/cobra" ) const ( EtcdVersionAnnotation = "etcd_version" ) func RootCmd() *cobra.Command { var annotation string cmd := &cobra.Command{ Use: "proto-annotation", Short: "Proto-annotations prints a dump of annotations used by all protobuf definitions used by Etcd.", Long: `Tool used to extract values of a specific proto annotation used by protobuf definitions used by Etcd. Created to ensure that all newly introduced proto definitions have a etcd_version_* annotation, by analysing diffs between generated by this tool. Proto annotations is printed to stdout in format: : "" For example: ''' etcdserverpb.Member: "3.0" etcdserverpb.Member.ID: "" etcdserverpb.Member.clientURLs: "" etcdserverpb.Member.isLearner: "3.4" etcdserverpb.Member.name: "" etcdserverpb.Member.peerURLs: "" ''' Any errors in proto will be printed to stderr. `, RunE: func(cmd *cobra.Command, args []string) error { return runProtoAnnotation(annotation) }, } cmd.Flags().StringVar(&annotation, "annotation", "", "Specify what proto annotation to read. Options: etcd_version") cmd.MarkFlagRequired("annotation") return cmd } func runProtoAnnotation(annotation string) error { var errs []error switch annotation { case EtcdVersionAnnotation: errs = printEtcdVersion() default: return fmt.Errorf("unknown annotation %q. Options: %q", annotation, EtcdVersionAnnotation) } if len(errs) != 0 { for _, err := range errs { fmt.Fprintln(os.Stderr, err) } return fmt.Errorf("failed reading anotation") } return nil }