From ddf72b6b09898a0d6129d74b9d51e402c076e5be Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Fri, 23 Sep 2022 15:31:27 +0200 Subject: [PATCH] import nodes from file --- internal/app/wwctl/node/imprt/main.go | 46 +++++++++++++++++++++++++++ internal/app/wwctl/node/imprt/root.go | 25 +++++++++++++++ internal/app/wwctl/node/root.go | 2 ++ 3 files changed, 73 insertions(+) create mode 100644 internal/app/wwctl/node/imprt/main.go create mode 100644 internal/app/wwctl/node/imprt/root.go diff --git a/internal/app/wwctl/node/imprt/main.go b/internal/app/wwctl/node/imprt/main.go new file mode 100644 index 00000000..76e422a7 --- /dev/null +++ b/internal/app/wwctl/node/imprt/main.go @@ -0,0 +1,46 @@ +package imprt + +import ( + "fmt" + "io" + "os" + + apinode "github.com/hpcng/warewulf/internal/pkg/api/node" + "github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1" + apiutil "github.com/hpcng/warewulf/internal/pkg/api/util" + "github.com/hpcng/warewulf/internal/pkg/node" + "github.com/hpcng/warewulf/internal/pkg/wwlog" + "github.com/spf13/cobra" + "gopkg.in/yaml.v2" +) + +func CobraRunE(cmd *cobra.Command, args []string) error { + file, err := os.Open(args[0]) + if err != nil { + wwlog.Error("Could not open file:%s \n", err) + os.Exit(1) + } + defer file.Close() + + importMap := make(map[string]*node.NodeConf) + buffer, err := io.ReadAll(file) + if err != nil { + wwlog.Error("Could not read:%s\n", err) + os.Exit(1) + } + err = yaml.Unmarshal(buffer, importMap) + if err == nil { + yes := apiutil.ConfirmationPrompt(fmt.Sprintf("Are you sure you want to modify %d nodes", len(importMap))) + if yes { + err = apinode.NodeAddFromYaml(&wwapiv1.NodeYaml{NodeConfMapYaml: string(buffer)}) + if err != nil { + wwlog.Error("Got following problem when writing back yaml: %s", err) + os.Exit(1) + } + } + } else { + wwlog.Error("Could not parse import file") + } + + return nil +} diff --git a/internal/app/wwctl/node/imprt/root.go b/internal/app/wwctl/node/imprt/root.go new file mode 100644 index 00000000..393958a4 --- /dev/null +++ b/internal/app/wwctl/node/imprt/root.go @@ -0,0 +1,25 @@ +package imprt + +import ( + "github.com/spf13/cobra" +) + +var ( + baseCmd = &cobra.Command{ + DisableFlagsInUseLine: true, + Use: "import [OPTIONS] NODENAME", + Short: "Import node(s) from yaml file", + Long: "This command imports all the nodes defined in a file. It will overwrite nodes with same name.", + RunE: CobraRunE, + Args: cobra.MinimumNArgs(1), + Aliases: []string{"imprt"}, + } +) + +func init() { +} + +// GetRootCommand returns the root cobra.Command for the application. +func GetCommand() *cobra.Command { + return baseCmd +} diff --git a/internal/app/wwctl/node/root.go b/internal/app/wwctl/node/root.go index 13377cea..27ca7a92 100644 --- a/internal/app/wwctl/node/root.go +++ b/internal/app/wwctl/node/root.go @@ -5,6 +5,7 @@ import ( "github.com/hpcng/warewulf/internal/app/wwctl/node/console" "github.com/hpcng/warewulf/internal/app/wwctl/node/delete" "github.com/hpcng/warewulf/internal/app/wwctl/node/edit" + "github.com/hpcng/warewulf/internal/app/wwctl/node/imprt" "github.com/hpcng/warewulf/internal/app/wwctl/node/list" "github.com/hpcng/warewulf/internal/app/wwctl/node/sensors" "github.com/hpcng/warewulf/internal/app/wwctl/node/set" @@ -32,6 +33,7 @@ func init() { baseCmd.AddCommand(console.GetCommand()) baseCmd.AddCommand(nodestatus.GetCommand()) baseCmd.AddCommand(edit.GetCommand()) + baseCmd.AddCommand(imprt.GetCommand()) } // GetRootCommand returns the root cobra.Command for the application.