From 0a9c5cb0cf564a016f1f4c71bd4b9d698e4fdbf5 Mon Sep 17 00:00:00 2001 From: Katrina Verey Date: Wed, 30 Mar 2022 11:22:30 -0400 Subject: [PATCH] Refactor to fix gocyclo complaint --- cmd/config/internal/commands/run-fns.go | 199 +++++++++++++----------- 1 file changed, 110 insertions(+), 89 deletions(-) diff --git a/cmd/config/internal/commands/run-fns.go b/cmd/config/internal/commands/run-fns.go index 815ba256c..b2c0fcef3 100644 --- a/cmd/config/internal/commands/run-fns.go +++ b/cmd/config/internal/commands/run-fns.go @@ -112,87 +112,47 @@ func (r *RunFnRunner) runE(c *cobra.Command, args []string) error { // getContainerFunctions parses the commandline flags and arguments into explicit // Functions to run. -func (r *RunFnRunner) getContainerFunctions(c *cobra.Command, dataItems []string) ( +func (r *RunFnRunner) getContainerFunctions(dataItems []string) ( []*yaml.RNode, error) { - if r.Image == "" && r.StarPath == "" && r.ExecPath == "" && r.StarURL == "" { return nil, nil } - var fn *yaml.RNode - var err error - - if r.Image != "" { - // create the function spec to set as an annotation - fn, err = yaml.Parse(`container: {}`) - if err != nil { - return nil, err - } - // TODO: add support network, volumes, etc based on flag values - err = fn.PipeE( - yaml.Lookup("container"), - yaml.SetField("image", yaml.NewScalarRNode(r.Image))) - if err != nil { - return nil, err - } - if r.Network { - n := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: "true", - Tag: yaml.NodeTagBool, - } - err = fn.PipeE( - yaml.Lookup("container"), - yaml.SetField("network", yaml.NewRNode(n))) - if err != nil { - return nil, err - } - } - } else if r.EnableStar && (r.StarPath != "" || r.StarURL != "") { - // create the function spec to set as an annotation - fn, err = yaml.Parse(`starlark: {}`) - if err != nil { - return nil, err - } - - if r.StarPath != "" { - err = fn.PipeE( - yaml.Lookup("starlark"), - yaml.SetField("path", yaml.NewScalarRNode(r.StarPath))) - if err != nil { - return nil, err - } - } - if r.StarURL != "" { - err = fn.PipeE( - yaml.Lookup("starlark"), - yaml.SetField("url", yaml.NewScalarRNode(r.StarURL))) - if err != nil { - return nil, err - } - } - err = fn.PipeE( - yaml.Lookup("starlark"), - yaml.SetField("name", yaml.NewScalarRNode(r.StarName))) - if err != nil { - return nil, err - } - - } else if r.EnableExec && r.ExecPath != "" { - // create the function spec to set as an annotation - fn, err = yaml.Parse(`exec: {}`) - if err != nil { - return nil, err - } - - err = fn.PipeE( - yaml.Lookup("exec"), - yaml.SetField("path", yaml.NewScalarRNode(r.ExecPath))) - if err != nil { - return nil, err - } + res, err := buildFnConfigResource(dataItems) + if err != nil { + return nil, err } + // create the function spec to set as an annotation + var fnAnnotation *yaml.RNode + switch { + case r.Image != "": + fnAnnotation, err = fnAnnotationForImage(r.Image, r.Network) + case r.EnableStar && (r.StarPath != "" || r.StarURL != ""): + fnAnnotation, err = fnAnnotationForStar(r.StarPath, r.StarURL, r.StarName) + case r.EnableExec && r.ExecPath != "": + fnAnnotation, err = fnAnnotationForExec(r.ExecPath) + } + if err != nil { + return nil, err + } + + // set the function annotation on the function config, so that it is parsed by RunFns + value, err := fnAnnotation.String() + if err != nil { + return nil, err + } + err = res.PipeE( + yaml.LookupCreate(yaml.MappingNode, "metadata", "annotations"), + yaml.SetField(runtimeutil.FunctionAnnotationKey, yaml.NewScalarRNode(value))) + if err != nil { + return nil, err + } + + return []*yaml.RNode{res}, nil +} + +func buildFnConfigResource(dataItems []string) (*yaml.RNode, error) { // create the function config rc, err := yaml.Parse(` metadata: @@ -203,19 +163,6 @@ data: {} return nil, err } - // set the function annotation on the function config so it - // is parsed by RunFns - value, err := fn.String() - if err != nil { - return nil, err - } - err = rc.PipeE( - yaml.LookupCreate(yaml.MappingNode, "metadata", "annotations"), - yaml.SetField(runtimeutil.FunctionAnnotationKey, yaml.NewScalarRNode(value))) - if err != nil { - return nil, err - } - // default the function config kind to ConfigMap, this may be overridden var kind = "ConfigMap" var version = "v1" @@ -253,7 +200,81 @@ data: {} if err != nil { return nil, err } - return []*yaml.RNode{rc}, nil + return rc, nil +} + +func fnAnnotationForExec(path string) (*yaml.RNode, error) { + fn, err := yaml.Parse(`exec: {}`) + if err != nil { + return nil, err + } + + err = fn.PipeE( + yaml.Lookup("exec"), + yaml.SetField("path", yaml.NewScalarRNode(path))) + if err != nil { + return nil, err + } + return fn, nil +} + +func fnAnnotationForStar(path string, url string, name string) (*yaml.RNode, error) { + fn, err := yaml.Parse(`starlark: {}`) + if err != nil { + return nil, err + } + + if path != "" { + err = fn.PipeE( + yaml.Lookup("starlark"), + yaml.SetField("path", yaml.NewScalarRNode(path))) + if err != nil { + return nil, err + } + } + if url != "" { + err = fn.PipeE( + yaml.Lookup("starlark"), + yaml.SetField("url", yaml.NewScalarRNode(url))) + if err != nil { + return nil, err + } + } + err = fn.PipeE( + yaml.Lookup("starlark"), + yaml.SetField("name", yaml.NewScalarRNode(name))) + if err != nil { + return nil, err + } + return fn, nil +} + +func fnAnnotationForImage(image string, enableNetwork bool) (*yaml.RNode, error) { + fn, err := yaml.Parse(`container: {}`) + if err != nil { + return nil, err + } + // TODO: add support network, volumes, etc based on flag values + err = fn.PipeE( + yaml.Lookup("container"), + yaml.SetField("image", yaml.NewScalarRNode(image))) + if err != nil { + return nil, err + } + if enableNetwork { + n := &yaml.Node{ + Kind: yaml.ScalarNode, + Value: "true", + Tag: yaml.NodeTagBool, + } + err = fn.PipeE( + yaml.Lookup("container"), + yaml.SetField("network", yaml.NewRNode(n))) + if err != nil { + return nil, err + } + } + return fn, nil } func toStorageMounts(mounts []string) []runtimeutil.StorageMount { @@ -287,7 +308,7 @@ func (r *RunFnRunner) preRunE(c *cobra.Command, args []string) error { return errors.Errorf("0 or 1 arguments supported, function arguments go after '--'") } - fns, err := r.getContainerFunctions(c, dataItems) + fns, err := r.getContainerFunctions(dataItems) if err != nil { return err }