From 02406dec9fc4ffa2dcc6eb27e84295218de23376 Mon Sep 17 00:00:00 2001 From: David Allen Date: Wed, 10 Jul 2024 17:02:11 -0600 Subject: [PATCH] Minor changes --- pkg/config.go | 12 +++---- pkg/generator/generator.go | 38 ++++++++++------------ pkg/generator/plugins/conman/conman.go | 2 +- pkg/generator/plugins/dnsmasq/dnsmasq.go | 4 +-- pkg/generator/plugins/warewulf/warewulf.go | 12 +++---- pkg/server/server.go | 16 ++++----- 6 files changed, 41 insertions(+), 43 deletions(-) diff --git a/pkg/config.go b/pkg/config.go index ee113dc..10da3c6 100644 --- a/pkg/config.go +++ b/pkg/config.go @@ -11,9 +11,9 @@ import ( type Options struct{} type Target struct { - Templates []string `yaml:"templates,omitempty"` - FilePaths []string `yaml:"files,omitempty"` - RunTargets []string `yaml:"targets,omitempty"` + TemplatePaths []string `yaml:"templates,omitempty"` + FilePaths []string `yaml:"files,omitempty"` + RunTargets []string `yaml:"targets,omitempty"` } type Jwks struct { @@ -48,13 +48,13 @@ func NewConfig() Config { }, Targets: map[string]Target{ "dnsmasq": Target{ - Templates: []string{}, + TemplatePaths: []string{}, }, "conman": Target{ - Templates: []string{}, + TemplatePaths: []string{}, }, "warewulf": Target{ - Templates: []string{ + TemplatePaths: []string{ "templates/warewulf/defaults/node.jinja", "templates/warewulf/defaults/provision.jinja", }, diff --git a/pkg/generator/generator.go b/pkg/generator/generator.go index 34cb25b..27a032e 100644 --- a/pkg/generator/generator.go +++ b/pkg/generator/generator.go @@ -12,7 +12,6 @@ import ( "github.com/OpenCHAMI/configurator/pkg/util" "github.com/nikolalohinski/gonja/v2" "github.com/nikolalohinski/gonja/v2/exec" - "github.com/sirupsen/logrus" ) type Mappings map[string]any @@ -32,6 +31,7 @@ type Generator interface { type Params struct { Args []string PluginPaths []string + Generators map[string]Generator Target string Verbose bool } @@ -259,14 +259,14 @@ func ApplyTemplateFromFiles(mappings Mappings, paths ...string) (FileMap, error) // Main function to generate a collection of files as a map with the path as the key and // the contents of the file as the value. This function currently expects a list of plugin -// paths to load all plugins within a directory. Then, each plugin's generator.Generate() +// paths to load all plugins within a directory. Then, each plugin's generator.GenerateWithTarget() // function is called for each target specified. // // This function is the corresponding implementation for the "generate" CLI subcommand. // It is also call when running the configurator as a service with the "/generate" route. // // TODO: Separate loading plugins so we can load them once when running as a service. -func Generate(config *configurator.Config, params Params) (FileMap, error) { +func GenerateWithTarget(config *configurator.Config, params Params) (FileMap, error) { // load generator plugins to generate configs or to print var ( generators = make(map[string]Generator) @@ -278,12 +278,12 @@ func Generate(config *configurator.Config, params Params) (FileMap, error) { ) ) - // load all plugins from params + // load all plugins from supplied arguments for _, path := range params.PluginPaths { if params.Verbose { fmt.Printf("loading plugins from '%s'\n", path) } - gens, err := LoadPlugins(path) + plugins, err := LoadPlugins(path) if err != nil { fmt.Printf("failed to load plugins: %v\n", err) err = nil @@ -291,9 +291,12 @@ func Generate(config *configurator.Config, params Params) (FileMap, error) { } // add loaded generator plugins to set - maps.Copy(generators, gens) + maps.Copy(generators, plugins) } + // copy all generators supplied from arguments + maps.Copy(generators, params.Generators) + // show available targets then exit if len(params.Args) == 0 && params.Target == "" { for g := range generators { @@ -302,19 +305,14 @@ func Generate(config *configurator.Config, params Params) (FileMap, error) { return nil, nil } - if params.Target == "" { - logrus.Errorf("no target supplied (--target name)") - } else { - // run the generator plugin from target passed - gen := generators[params.Target] - if gen == nil { - return nil, fmt.Errorf("invalid generator target (%s)", params.Target) - } - return gen.Generate( - config, - WithTarget(gen.GetName()), - WithClient(client), - ) + // run the generator plugin from target passed + gen := generators[params.Target] + if gen == nil { + return nil, fmt.Errorf("invalid generator target (%s)", params.Target) } - return nil, fmt.Errorf("an unknown error has occurred") + return gen.Generate( + config, + WithTarget(gen.GetName()), + WithClient(client), + ) } diff --git a/pkg/generator/plugins/conman/conman.go b/pkg/generator/plugins/conman/conman.go index 2f04978..6a14f89 100644 --- a/pkg/generator/plugins/conman/conman.go +++ b/pkg/generator/plugins/conman/conman.go @@ -62,7 +62,7 @@ func (g *Conman) Generate(config *configurator.Config, opts ...util.Option) (gen "plugin_description": g.GetDescription(), "server_opts": "", "global_opts": "", - }, target.Templates...) + }, target.TemplatePaths...) } var Generator Conman diff --git a/pkg/generator/plugins/dnsmasq/dnsmasq.go b/pkg/generator/plugins/dnsmasq/dnsmasq.go index c5e0ede..9150009 100644 --- a/pkg/generator/plugins/dnsmasq/dnsmasq.go +++ b/pkg/generator/plugins/dnsmasq/dnsmasq.go @@ -58,7 +58,7 @@ func (g *DnsMasq) Generate(config *configurator.Config, opts ...util.Option) (ge // print message if verbose param found if verbose, ok := params["verbose"].(bool); ok { if verbose { - fmt.Printf("template: \n%s\nethernet interfaces found: %v\n", strings.Join(target.Templates, "\n\t"), len(eths)) + fmt.Printf("template: \n%s\nethernet interfaces found: %v\n", strings.Join(target.TemplatePaths, "\n\t"), len(eths)) } } @@ -79,7 +79,7 @@ func (g *DnsMasq) Generate(config *configurator.Config, opts ...util.Option) (ge "plugin_version": g.GetVersion(), "plugin_description": g.GetDescription(), "dhcp-hosts": output, - }, target.Templates...) + }, target.TemplatePaths...) } var Generator DnsMasq diff --git a/pkg/generator/plugins/warewulf/warewulf.go b/pkg/generator/plugins/warewulf/warewulf.go index f9646b8..8f40d7a 100644 --- a/pkg/generator/plugins/warewulf/warewulf.go +++ b/pkg/generator/plugins/warewulf/warewulf.go @@ -5,9 +5,9 @@ import ( "maps" "strings" - configurator "github.com/OpenCHAMI/configurator/internal" - "github.com/OpenCHAMI/configurator/internal/generator" - "github.com/OpenCHAMI/configurator/internal/util" + configurator "github.com/OpenCHAMI/configurator/pkg" + "github.com/OpenCHAMI/configurator/pkg/generator" + "github.com/OpenCHAMI/configurator/pkg/util" ) type Warewulf struct{} @@ -30,7 +30,7 @@ func (g *Warewulf) Generate(config *configurator.Config, opts ...util.Option) (g client = generator.GetClient(params) targetKey = params["target"].(string) target = config.Targets[targetKey] - outputs = make(generator.FileMap, len(target.FilePaths)+len(target.Templates)) + outputs = make(generator.FileMap, len(target.FilePaths)+len(target.TemplatePaths)) ) // check if our client is included and is valid @@ -55,7 +55,7 @@ func (g *Warewulf) Generate(config *configurator.Config, opts ...util.Option) (g // print message if verbose param found if verbose, ok := params["verbose"].(bool); ok { if verbose { - fmt.Printf("template: \n%s\n ethernet interfaces found: %v\n", strings.Join(target.Templates, "\n\t"), len(eths)) + fmt.Printf("template: \n%s\n ethernet interfaces found: %v\n", strings.Join(target.TemplatePaths, "\n\t"), len(eths)) } } @@ -78,7 +78,7 @@ func (g *Warewulf) Generate(config *configurator.Config, opts ...util.Option) (g } templates, err := generator.ApplyTemplateFromFiles(generator.Mappings{ "node_entries": nodeEntries, - }, target.Templates...) + }, target.TemplatePaths...) if err != nil { return nil, fmt.Errorf("failed to load templates: %v", err) } diff --git a/pkg/server/server.go b/pkg/server/server.go index 6b969cd..1144adc 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -119,14 +119,14 @@ func (s *Server) Generate(w http.ResponseWriter, r *http.Request) { // get all of the expect query URL params and validate s.GeneratorParams.Target = r.URL.Query().Get("target") if s.GeneratorParams.Target == "" { - writeError(w, "no targets supplied") + writeErrorResponse(w, "no targets supplied") return } // generate a new config file from supplied params - outputs, err := generator.Generate(s.Config, s.GeneratorParams) + outputs, err := generator.GenerateWithTarget(s.Config, s.GeneratorParams) if err != nil { - writeError(w, "failed to generate config: %v", err) + writeErrorResponse(w, "failed to generate config: %v", err) return } @@ -134,12 +134,12 @@ func (s *Server) Generate(w http.ResponseWriter, r *http.Request) { tmp := generator.ConvertContentsToString(outputs) b, err := json.Marshal(tmp) if err != nil { - writeError(w, "failed to marshal output: %v", err) + writeErrorResponse(w, "failed to marshal output: %v", err) return } _, err = w.Write(b) if err != nil { - writeError(w, "failed to write response: %v", err) + writeErrorResponse(w, "failed to write response: %v", err) return } } @@ -151,15 +151,15 @@ func (s *Server) Generate(w http.ResponseWriter, r *http.Request) { func (s *Server) ManageTemplates(w http.ResponseWriter, r *http.Request) { _, err := w.Write([]byte("this is not implemented yet")) if err != nil { - writeError(w, "failed to write response: %v", err) + writeErrorResponse(w, "failed to write response: %v", err) return } } // Wrapper function to simplify writting error message responses. This function // is only intended to be used with the service and nothing else. -func writeError(w http.ResponseWriter, format string, a ...any) { +func writeErrorResponse(w http.ResponseWriter, format string, a ...any) error { errmsg := fmt.Sprintf(format, a...) - fmt.Printf(errmsg) w.Write([]byte(errmsg)) + return fmt.Errorf(errmsg) }