From c2d96250debeceee36b0ee045cc31941c013085a Mon Sep 17 00:00:00 2001 From: Karim Radhouani Date: Wed, 7 Feb 2024 15:04:39 -0800 Subject: [PATCH] build set request from a prototext file --- pkg/app/set.go | 1 + pkg/config/config.go | 7 ++++++- pkg/config/set.go | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/pkg/app/set.go b/pkg/app/set.go index dc5f5022..0086e9f4 100644 --- a/pkg/app/set.go +++ b/pkg/app/set.go @@ -132,6 +132,7 @@ func (a *App) InitSetFlags(cmd *cobra.Command) { cmd.Flags().StringArrayVarP(&a.Config.LocalFlags.SetRequestFile, "request-file", "", []string{}, "set request template file(s)") cmd.Flags().StringVarP(&a.Config.LocalFlags.SetRequestVars, "request-vars", "", "", "set request variables file") cmd.Flags().BoolVarP(&a.Config.LocalFlags.SetDryRun, "dry-run", "", false, "prints the set request without initiating a gRPC connection") + cmd.Flags().StringArrayVarP(&a.Config.LocalFlags.SetRequestProtoFile, "proto-file", "", []string{}, "set request from prototext file") // cmd.Flags().StringArrayVarP(&a.Config.LocalFlags.SetReplaceCli, "replace-cli", "", []string{}, "a cli command to be sent as a set replace request") cmd.Flags().StringVarP(&a.Config.LocalFlags.SetReplaceCliFile, "replace-cli-file", "", "", "path to a file containing a list of commands that will be sent as a set replace request") diff --git a/pkg/config/config.go b/pkg/config/config.go index 671d6ff4..50174bd4 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -153,6 +153,7 @@ type LocalFlags struct { SetTarget string `mapstructure:"set-target,omitempty" json:"set-target,omitempty" yaml:"set-target,omitempty"` SetRequestFile []string `mapstructure:"set-request-file,omitempty" json:"set-request-file,omitempty" yaml:"set-request-file,omitempty"` SetRequestVars string `mapstructure:"set-request-vars,omitempty" json:"set-request-vars,omitempty" yaml:"set-request-vars,omitempty"` + SetRequestProtoFile []string `mapstructure:"set-proto-request-file,omitempty" yaml:"set-proto-request-file,omitempty" json:"set-proto-request-file,omitempty"` SetDryRun bool `mapstructure:"set-dry-run,omitempty" json:"set-dry-run,omitempty" yaml:"set-dry-run,omitempty"` SetReplaceCli []string `mapstructure:"set-replace-cli,omitempty" yaml:"set-replace-cli,omitempty" json:"set-replace-cli,omitempty"` SetReplaceCliFile string `mapstructure:"set-replace-cli-file,omitempty" yaml:"set-replace-cli-file,omitempty" json:"set-replace-cli-file,omitempty"` @@ -583,6 +584,9 @@ func (c *Config) execValueTemplate(tplString string, input interface{}) (string, } func (c *Config) CreateSetRequest(targetName string) ([]*gnmi.SetRequest, error) { + if len(c.SetRequestProtoFile) > 0 { + return c.CreateSetRequestFromProtoFile() + } if len(c.SetRequestFile) > 0 { return c.CreateSetRequestFromFile(targetName) } @@ -854,7 +858,8 @@ func (c *Config) ValidateSetInput() error { len(c.LocalFlags.SetReplaceCli) == 0 && len(c.LocalFlags.SetUpdateCli) == 0 && len(c.LocalFlags.SetReplaceCliFile) == 0 && - len(c.LocalFlags.SetUpdateCliFile) == 0 { + len(c.LocalFlags.SetUpdateCliFile) == 0 && + len(c.LocalFlags.SetRequestProtoFile) == 0 { return errors.New("no paths or request file provided") } if len(c.LocalFlags.SetUpdateFile) > 0 && len(c.LocalFlags.SetUpdateValue) > 0 { diff --git a/pkg/config/set.go b/pkg/config/set.go index d69815d9..2dec4451 100644 --- a/pkg/config/set.go +++ b/pkg/config/set.go @@ -19,6 +19,7 @@ import ( "strings" "text/template" + "google.golang.org/protobuf/encoding/prototext" "gopkg.in/yaml.v2" "github.com/openconfig/gnmi/proto/gnmi" @@ -235,3 +236,20 @@ type templateInput struct { TargetName string Vars map[string]interface{} } + +func (c *Config) CreateSetRequestFromProtoFile() ([]*gnmi.SetRequest, error) { + reqs := make([]*gnmi.SetRequest, 0, len(c.SetRequestProtoFile)) + for _, r := range c.SetRequestProtoFile { + b, err := os.ReadFile(r) + if err != nil { + return nil, err + } + req := new(gnmi.SetRequest) + err = prototext.Unmarshal(b, req) + if err != nil { + return nil, err + } + reqs = append(reqs, req) + } + return reqs, nil +}