Recursive handling for command line flags

Every struct in a NodeConf with `lopt:"foo" set is now added as a
command-line flag with the RecursiveCreateFlags call. For maps a struct
with the key UNDEF is added so that it can be parsed out.

As the flags for the command-line need variables which hold the values,
for every map an element map[UNDEF] is added.  When now calling the
internal add, these map element can be filtered out and replace by the
given name. (e.g., --netname)

* rewrote node/profile add for recursive functions
* rewrote node/profile set for recursive functions
* rewrote node/profile list for recursive functions

Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
Christian Goll
2023-08-11 10:31:29 -06:00
committed by Jonathon Anderson
parent c55c5a2ac4
commit 45539a0d1f
29 changed files with 1346 additions and 714 deletions

View File

@@ -8,9 +8,9 @@ import (
"os"
"github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1"
warewulfconf "github.com/hpcng/warewulf/internal/pkg/config"
"github.com/hpcng/warewulf/internal/pkg/node"
"github.com/hpcng/warewulf/internal/pkg/util"
warewulfconf "github.com/hpcng/warewulf/internal/pkg/config"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
"github.com/hpcng/warewulf/pkg/hostlist"
"github.com/pkg/errors"
@@ -270,15 +270,51 @@ func NodeSetParameterCheck(set *wwapiv1.NodeSetParameter, console bool) (nodeDB
wwlog.Error(fmt.Sprintf("%v", err.Error()))
return
}
wwlog.Verbose("Node: %s, Deleting network device: %s", n.Id.Get(), set.NetdevDelete)
delete(n.NetDevs, set.NetdevDelete)
}
if set.PartitionDelete != "" {
deletedPart := false
for diskname, disk := range n.Disks {
if _, ok := disk.Partitions[set.PartitionDelete]; ok {
wwlog.Verbose("Node: %s, on disk %, deleting partition: %s", n.Id.Get(), diskname, set.PartitionDelete)
deletedPart = true
delete(disk.Partitions, set.PartitionDelete)
}
if !deletedPart {
wwlog.Error(fmt.Sprintf("%v", err.Error()))
err = fmt.Errorf("partition doesn't exist: %s", set.PartitionDelete)
return
}
}
}
if set.DiskDelete != "" {
if _, ok := n.Disks[set.DiskDelete]; !ok {
err = fmt.Errorf("disk doesn't exist: %s", set.DiskDelete)
wwlog.Error(fmt.Sprintf("%v", err.Error()))
return
}
wwlog.Verbose("Node: %s, deleting disk: %s", n.Id.Get(), set.DiskDelete)
delete(n.Disks, set.DiskDelete)
}
if set.FilesystemDelete != "" {
if _, ok := n.FileSystems[set.FilesystemDelete]; !ok {
err = fmt.Errorf("filesystem doesn't exist: %s", set.FilesystemDelete)
wwlog.Error(fmt.Sprintf("%v", err.Error()))
return
}
wwlog.Verbose("Node: %s, deleting filesystem: %s", n.Id.Get(), set.FilesystemDelete)
delete(n.FileSystems, set.FilesystemDelete)
}
for _, key := range nodeConf.TagsDel {
wwlog.Debug("deleting tag %s", key)
delete(n.Tags, key)
}
for _, key := range nodeConf.Ipmi.TagsDel {
delete(n.Ipmi.Tags, key)
if nodeConf.Ipmi != nil {
for _, key := range nodeConf.Ipmi.TagsDel {
wwlog.Debug("deleting Ipmi tag %s", key)
delete(n.Ipmi.Tags, key)
}
}
for net := range nodeConf.NetDevs {
for _, key := range nodeConf.NetDevs[net].TagsDel {