From 9ba1aa8d630e826ed36a7cf79ffecbff1beafefa Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Wed, 20 Dec 2023 15:42:44 +0100 Subject: [PATCH] api changes to modify unexported fields changes can now not be done directly but must go to SetNode or SetProfile. Although its also now possible to access the field direclty with GetNodePtr Signed-off-by: Christian Goll --- internal/pkg/api/apiconfig/client.go | 2 +- internal/pkg/api/apiconfig/server.go | 2 +- internal/pkg/api/node/add.go | 14 ++--- internal/pkg/api/node/delete.go | 10 ++-- internal/pkg/api/node/edit.go | 15 +++-- internal/pkg/api/node/list.go | 8 +-- internal/pkg/api/node/set.go | 82 +++++++++++++++------------- internal/pkg/api/profile/add.go | 8 +-- internal/pkg/api/profile/delete.go | 6 +- internal/pkg/api/profile/edit.go | 13 +++-- internal/pkg/api/profile/list.go | 17 +++--- internal/pkg/api/profile/set.go | 75 +++++++++++++------------ 12 files changed, 130 insertions(+), 122 deletions(-) diff --git a/internal/pkg/api/apiconfig/client.go b/internal/pkg/api/apiconfig/client.go index 595409e8..fe201945 100644 --- a/internal/pkg/api/apiconfig/client.go +++ b/internal/pkg/api/apiconfig/client.go @@ -4,7 +4,7 @@ import ( "log" "os" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) // ClientApiConfig contains configuration parameters for an API server. diff --git a/internal/pkg/api/apiconfig/server.go b/internal/pkg/api/apiconfig/server.go index 85be2bce..bc5d9f7a 100644 --- a/internal/pkg/api/apiconfig/server.go +++ b/internal/pkg/api/apiconfig/server.go @@ -4,7 +4,7 @@ import ( "log" "os" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) // ServerApiConfig contains configuration parameters for an API server. diff --git a/internal/pkg/api/node/add.go b/internal/pkg/api/node/add.go index 0ba20630..a5b23f65 100644 --- a/internal/pkg/api/node/add.go +++ b/internal/pkg/api/node/add.go @@ -5,14 +5,14 @@ import ( "fmt" "net" - "github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1" - "github.com/hpcng/warewulf/internal/pkg/node" - "github.com/hpcng/warewulf/internal/pkg/util" - "github.com/hpcng/warewulf/internal/pkg/warewulfd" - "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/hpcng/warewulf/pkg/hostlist" "github.com/pkg/errors" - "gopkg.in/yaml.v2" + "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" + "github.com/warewulf/warewulf/internal/pkg/hostlist" + "github.com/warewulf/warewulf/internal/pkg/node" + "github.com/warewulf/warewulf/internal/pkg/util" + "github.com/warewulf/warewulf/internal/pkg/warewulfd" + "github.com/warewulf/warewulf/internal/pkg/wwlog" + "gopkg.in/yaml.v3" ) // NodeAdd adds nodes for management by Warewulf. diff --git a/internal/pkg/api/node/delete.go b/internal/pkg/api/node/delete.go index 7738c18f..bf17217e 100644 --- a/internal/pkg/api/node/delete.go +++ b/internal/pkg/api/node/delete.go @@ -5,12 +5,12 @@ import ( "fmt" "os" - "github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1" - "github.com/hpcng/warewulf/internal/pkg/node" - "github.com/hpcng/warewulf/internal/pkg/warewulfd" - "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/hpcng/warewulf/pkg/hostlist" "github.com/pkg/errors" + "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" + "github.com/warewulf/warewulf/internal/pkg/hostlist" + "github.com/warewulf/warewulf/internal/pkg/node" + "github.com/warewulf/warewulf/internal/pkg/warewulfd" + "github.com/warewulf/warewulf/internal/pkg/wwlog" ) // NodeDelete adds nodes for management by Warewulf. diff --git a/internal/pkg/api/node/edit.go b/internal/pkg/api/node/edit.go index 05d96ffd..fe777681 100644 --- a/internal/pkg/api/node/edit.go +++ b/internal/pkg/api/node/edit.go @@ -7,7 +7,7 @@ import ( "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" "github.com/warewulf/warewulf/internal/pkg/node" "github.com/warewulf/warewulf/internal/pkg/wwlog" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) /* @@ -19,7 +19,7 @@ func FindAllNodeConfs() *wwapiv1.NodeYaml { wwlog.Error("Could not open nodeDB: %s\n", err) os.Exit(1) } - nodeMap := nodeDB.Nodes + nodeMap, _ := nodeDB.FindAllNodes() // ignore err as nodeDB should always be correct buffer, _ := yaml.Marshal(nodeMap) retVal := wwapiv1.NodeYaml{ @@ -38,8 +38,8 @@ func FilteredNodes(nodeList *wwapiv1.NodeList) *wwapiv1.NodeYaml { wwlog.Error("Could not open nodeDB: %s\n", err) os.Exit(1) } - nodeMap := nodeDB.Nodes - nodeMap = node.FilterNodesByName(nodeMap, nodeList.Output) + nodeMap, _ := nodeDB.FindAllNodes() + nodeMap = node.FilterByName(nodeMap, nodeList.Output) buffer, _ := yaml.Marshal(nodeMap) retVal := wwapiv1.NodeYaml{ NodeConfMapYaml: string(buffer), @@ -59,14 +59,13 @@ func NodeAddFromYaml(nodeList *wwapiv1.NodeYaml) (err error) { nodeMap := make(map[string]*node.NodeConf) err = yaml.Unmarshal([]byte(nodeList.NodeConfMapYaml), nodeMap) if err != nil { - return errors.Wrap(err, "Could not unmarshall Yaml: %s\n") + return errors.Wrap(err, "Could not unmarshal Yaml: %s\n") } for nodeName, node := range nodeMap { - err = node.Check() + err = nodeDB.SetNode(nodeName, *node) if err != nil { - return errors.Errorf("error on node %s: %s", nodeName, err) + return errors.Wrap(err, "couldn't set node") } - nodeDB.Nodes[nodeName] = node } err = nodeDB.Persist() if err != nil { diff --git a/internal/pkg/api/node/list.go b/internal/pkg/api/node/list.go index 58396239..7845ad96 100644 --- a/internal/pkg/api/node/list.go +++ b/internal/pkg/api/node/list.go @@ -43,7 +43,7 @@ func NodeList(nodeGet *wwapiv1.GetNodeList) (nodeList wwapiv1.NodeList, err erro } } else if nodeGet.Type == wwapiv1.GetNodeList_Network { nodeList.Output = append(nodeList.Output, - fmt.Sprintf("%s:=:%s:=:%s:=:%s:=:%s:=:%s", "NODE NAME", "NAME", "HWADDR", "IPADDR", "GATEWAY", "DEVICE")) + fmt.Sprintf("%s:=:%s:=:%s:=:%s:=:%s:=:%s", "NODE", "NETWORK ", "HWADDR", "IPADDR", "GATEWAY", "DEVICE")) for _, n := range node.FilterByName(nodes, nodeGet.Nodes) { if len(n.NetDevs) > 0 { for name := range n.NetDevs { @@ -61,11 +61,11 @@ func NodeList(nodeGet *wwapiv1.GetNodeList) (nodeList wwapiv1.NodeList, err erro } } else if nodeGet.Type == wwapiv1.GetNodeList_Ipmi { nodeList.Output = append(nodeList.Output, - fmt.Sprintf("%s:=:%s:=:%s:=:%s:=:%s", "NODE NAME", "IPMI IPADDR", "IPMI PORT", "IPMI USERNAME", "IPMI INTERFACE")) + fmt.Sprintf("%s:=:%s:=:%s:=:%s:=:%s", "NODE", "IPMI IPADDR", "IPMI PORT", "IPMI USERNAME", "IPMI INTERFACE")) for _, n := range node.FilterByName(nodes, nodeGet.Nodes) { nodeList.Output = append(nodeList.Output, fmt.Sprintf("%s:=:%s:=:%s:=:%s:=:%s:=:%s", n.Id(), - n.Ipmi.Ipaddr, + n.Ipmi.Ipaddr.String(), n.Ipmi.Port, n.Ipmi.UserName, n.Ipmi.Interface, @@ -85,7 +85,7 @@ func NodeList(nodeGet *wwapiv1.GetNodeList) (nodeList wwapiv1.NodeList, err erro for _, n := range node.FilterByName(nodes, nodeGet.Nodes) { nodeList.Output = append(nodeList.Output, fmt.Sprintf("%s:=:%s:=:%s:=:%s", "NODE", "FIELD", "PROFILE", "VALUE")) - fields := nodeDB.GetFields(n, nodeGet.Type == wwapiv1.GetNodeList_All) + fields := nodeDB.GetFields(n) for _, f := range fields { nodeList.Output = append(nodeList.Output, fmt.Sprintf("%s:=:%s:=:%s:=:%s", n.Id(), f.Field, f.Source, f.Value)) diff --git a/internal/pkg/api/node/set.go b/internal/pkg/api/node/set.go index 1814b900..6d539200 100644 --- a/internal/pkg/api/node/set.go +++ b/internal/pkg/api/node/set.go @@ -3,13 +3,13 @@ package apinode import ( "fmt" - "github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1" - "github.com/hpcng/warewulf/internal/pkg/node" - "github.com/hpcng/warewulf/internal/pkg/util" - "github.com/hpcng/warewulf/internal/pkg/wwlog" - "gopkg.in/yaml.v2" - - "github.com/hpcng/warewulf/internal/pkg/warewulfd" + "dario.cat/mergo" + "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" + "github.com/warewulf/warewulf/internal/pkg/node" + "github.com/warewulf/warewulf/internal/pkg/util" + "github.com/warewulf/warewulf/internal/pkg/warewulfd" + "github.com/warewulf/warewulf/internal/pkg/wwlog" + "gopkg.in/yaml.v3" ) // NodeSet is the wwapiv1 implmentation for updating node fields. @@ -47,7 +47,7 @@ func NodeSetParameterCheck(set *wwapiv1.ConfSetParameter) (nodeDB node.NodeYaml, return } if set.ConfList == nil { - err = fmt.Errorf("node nodes to set!") + err = fmt.Errorf("node nodes to set") return } confs := nodeDB.ListAllNodes() @@ -57,33 +57,39 @@ func NodeSetParameterCheck(set *wwapiv1.ConfSetParameter) (nodeDB node.NodeYaml, } else if len(confs) == 0 { wwlog.Warn("no nodes/profiles found") return - } else { - confs = set.ConfList } - //var confobject node.NodeConf - for _, p := range set.ConfList { - if util.InSlice(set.ConfList, p) { - wwlog.Verbose("evaluating profile: %s", p) - if _, ok := nodeDB.Nodes[p]; !ok { + for _, nId := range set.ConfList { + if util.InSlice(set.ConfList, nId) { + wwlog.Debug("evaluating node: %s", nId) + var nodePtr *node.NodeConf + nodePtr, err = nodeDB.GetNodeOnlyPtr(nId) + if err != nil { + wwlog.Warn("invalid node: %s", nId) continue } - err = yaml.Unmarshal([]byte(set.NodeConfYaml), nodeDB.Nodes[p]) + newConf := node.EmptyNode() + err = yaml.Unmarshal([]byte(set.NodeConfYaml), &newConf) + if err != nil { + return + } + // merge in + err = mergo.Merge(nodePtr, &newConf, mergo.WithOverride) if err != nil { return } if set.NetdevDelete != "" { - if _, ok := nodeDB.Nodes[p].NetDevs[set.NetdevDelete]; !ok { + if _, ok := nodePtr.NetDevs[set.NetdevDelete]; !ok { err = fmt.Errorf("network device name doesn't exist: %s", set.NetdevDelete) wwlog.Error(fmt.Sprintf("%v", err.Error())) return } - wwlog.Verbose("Profile: %s, Deleting network device: %s", p, set.NetdevDelete) - delete(nodeDB.Nodes[p].NetDevs, set.NetdevDelete) + wwlog.Verbose("Profile: %s, Deleting network device: %s", nId, set.NetdevDelete) + delete(nodePtr.NetDevs, set.NetdevDelete) } if set.PartitionDelete != "" { - for diskname, disk := range nodeDB.Nodes[p].Disks { + for diskname, disk := range nodePtr.Disks { if _, ok := disk.Partitions[set.PartitionDelete]; ok { - wwlog.Verbose("Node: %s, on disk %, deleting partition: %s", p, diskname, set.PartitionDelete) + wwlog.Verbose("Node: %s, on disk %, deleting partition: %s", nId, diskname, set.PartitionDelete) delete(disk.Partitions, set.PartitionDelete) } else { return nodeDB, count, fmt.Errorf("partition doesn't exist: %s", set.PartitionDelete) @@ -92,45 +98,45 @@ func NodeSetParameterCheck(set *wwapiv1.ConfSetParameter) (nodeDB node.NodeYaml, } } if set.DiskDelete != "" { - if _, ok := nodeDB.Nodes[p].Disks[set.DiskDelete]; ok { - wwlog.Verbose("Node: %s, deleting disk: %s", p, set.DiskDelete) - delete(nodeDB.Nodes[p].Disks, set.DiskDelete) + if _, ok := nodePtr.Disks[set.DiskDelete]; ok { + wwlog.Verbose("Node: %s, deleting disk: %s", nId, set.DiskDelete) + delete(nodePtr.Disks, set.DiskDelete) } else { return nodeDB, count, fmt.Errorf("disk doesn't exist: %s", set.DiskDelete) } } if set.FilesystemDelete != "" { - if _, ok := nodeDB.Nodes[p].FileSystems[set.FilesystemDelete]; ok { - wwlog.Verbose("Node: %s, deleting filesystem: %s", p, set.FilesystemDelete) - delete(nodeDB.Nodes[p].FileSystems, set.FilesystemDelete) + if _, ok := nodePtr.FileSystems[set.FilesystemDelete]; ok { + wwlog.Verbose("Node: %s, deleting filesystem: %s", nId, set.FilesystemDelete) + delete(nodePtr.FileSystems, set.FilesystemDelete) } else { return nodeDB, count, fmt.Errorf("disk doesn't exist: %s", set.FilesystemDelete) } } for _, key := range set.TagDel { - delete(nodeDB.Nodes[p].Tags, key) + delete(nodePtr.Tags, key) } for key, val := range set.TagAdd { - if nodeDB.Nodes[p].Tags == nil { - nodeDB.Nodes[p].Tags = make(map[string]string) + if nodePtr.Tags == nil { + nodePtr.Tags = make(map[string]string) } - nodeDB.Nodes[p].Tags[key] = val + nodePtr.Tags[key] = val } for key, val := range set.IpmiTagAdd { - if nodeDB.Nodes[p].Ipmi.Tags == nil { - nodeDB.Nodes[p].Ipmi.Tags = make(map[string]string) + if nodePtr.Ipmi.Tags == nil { + nodePtr.Ipmi.Tags = make(map[string]string) } - nodeDB.Nodes[p].Ipmi.Tags[key] = val + nodePtr.Ipmi.Tags[key] = val } for _, key := range set.IpmiTagDel { - delete(nodeDB.Nodes[p].Ipmi.Tags, key) + delete(nodePtr.Ipmi.Tags, key) } - if _, ok := nodeDB.Nodes[p].NetDevs[set.Netdev]; ok { + if _, ok := nodePtr.NetDevs[set.Netdev]; ok { for _, key := range set.NetTagDel { - delete(nodeDB.Nodes[p].NetDevs[set.Netdev].Tags, key) + delete(nodePtr.NetDevs[set.Netdev].Tags, key) } for key, val := range set.TagAdd { - nodeDB.Nodes[p].NetDevs[set.Netdev].Tags[key] = val + nodePtr.NetDevs[set.Netdev].Tags[key] = val } } count++ diff --git a/internal/pkg/api/profile/add.go b/internal/pkg/api/profile/add.go index 338ec047..1ffb1b05 100644 --- a/internal/pkg/api/profile/add.go +++ b/internal/pkg/api/profile/add.go @@ -3,11 +3,11 @@ package apiprofile import ( "fmt" - "github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1" - "github.com/hpcng/warewulf/internal/pkg/node" - "github.com/hpcng/warewulf/internal/pkg/util" "github.com/pkg/errors" - "gopkg.in/yaml.v2" + "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" + "github.com/warewulf/warewulf/internal/pkg/node" + "github.com/warewulf/warewulf/internal/pkg/util" + "gopkg.in/yaml.v3" ) /* diff --git a/internal/pkg/api/profile/delete.go b/internal/pkg/api/profile/delete.go index 6f5dfc94..0c241398 100644 --- a/internal/pkg/api/profile/delete.go +++ b/internal/pkg/api/profile/delete.go @@ -21,8 +21,10 @@ func ProfileDelete(ndp *wwapiv1.NodeDeleteParameter) (err error) { return fmt.Errorf("got wrong hash, not modifying profile database") } for _, p := range profileList { - delete(nodeDB.NodeProfiles, p) - wwlog.Verbose("Deleting profile: %s", p) + err = nodeDB.DelProfile(p) + if err != nil { + return + } } err = nodeDB.Persist() diff --git a/internal/pkg/api/profile/edit.go b/internal/pkg/api/profile/edit.go index 465aa356..56458dce 100644 --- a/internal/pkg/api/profile/edit.go +++ b/internal/pkg/api/profile/edit.go @@ -8,7 +8,7 @@ import ( "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" "github.com/warewulf/warewulf/internal/pkg/node" "github.com/warewulf/warewulf/internal/pkg/wwlog" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) /* @@ -20,7 +20,7 @@ func FindAllProfileConfs() *wwapiv1.NodeYaml { wwlog.Error("Could not open nodeDB: %s\n", err) os.Exit(1) } - profileMap := nodeDB.NodeProfiles + profileMap, _ := nodeDB.FindAllProfiles() // ignore err as nodeDB should always be correct buffer, _ := yaml.Marshal(profileMap) retVal := wwapiv1.NodeYaml{ @@ -38,8 +38,8 @@ func FilteredProfiles(profileList *wwapiv1.NodeList) *wwapiv1.NodeYaml { wwlog.Error("Could not open nodeDB: %s\n", err) os.Exit(1) } - profileMap := nodeDB.NodeProfiles - profileMap = node.FilterProfilesByName(profileMap, profileList.Output) + profileMap, _ := nodeDB.FindAllProfiles() + //profileMap = node.FilterProfilesByName(profileMap, profileList.Output) buffer, _ := yaml.Marshal(profileMap) retVal := wwapiv1.NodeYaml{ NodeConfMapYaml: string(buffer), @@ -65,7 +65,10 @@ func ProfileAddFromYaml(nodeList *wwapiv1.NodeAddParameter) (err error) { return errors.Wrap(err, "Could not unmarshall Yaml: %s\n") } for profileName, profile := range profileMap { - nodeDB.NodeProfiles[profileName] = profile + err = nodeDB.SetProfile(profileName, *profile) + if err != nil { + return errors.Wrap(err, "couldn't set profile") + } } err = nodeDB.Persist() if err != nil { diff --git a/internal/pkg/api/profile/list.go b/internal/pkg/api/profile/list.go index 6792bcb5..6eb7a13a 100644 --- a/internal/pkg/api/profile/list.go +++ b/internal/pkg/api/profile/list.go @@ -7,7 +7,6 @@ import ( "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" "github.com/warewulf/warewulf/internal/pkg/node" - "github.com/warewulf/warewulf/internal/pkg/wwlog" "gopkg.in/yaml.v2" ) @@ -24,7 +23,7 @@ func ProfileList(ShowOpt *wwapiv1.GetProfileList) (profileList wwapiv1.ProfileLi if err != nil { return } - profiles = node.FilterByName(profiles, ShowOpt.Profiles) + //profiles = node.FilterByName(profiles, ShowOpt.Profiles) sort.Slice(profiles, func(i, j int) bool { return profiles[i].Id() < profiles[j].Id() }) @@ -32,24 +31,24 @@ func ProfileList(ShowOpt *wwapiv1.GetProfileList) (profileList wwapiv1.ProfileLi for _, p := range profiles { profileList.Output = append(profileList.Output, fmt.Sprintf("%s:=:%s:=:%s", "PROFILE", "FIELD", "VALUE")) - fields := p.GetFields(ShowOpt.ShowAll) + fields := nodeDB.GetFieldsProfile(p) for _, f := range fields { profileList.Output = append(profileList.Output, - fmt.Sprintf("%s:=:%s:=:%s", p.Id.Print(), f.Field, f.Value)) + fmt.Sprintf("%s:=:%s:=:%s", p.Id(), f.Field, f.Value)) } } } else if ShowOpt.ShowYaml { - profileMap := make(map[string]node.NodeInfo) + profileMap := make(map[string]node.ProfileConf) for _, profile := range profiles { - profileMap[profile.Id.Get()] = profile + profileMap[profile.Id()] = profile } buf, _ := yaml.Marshal(profileMap) profileList.Output = append(profileList.Output, string(buf)) } else if ShowOpt.ShowJson { - profileMap := make(map[string]node.NodeInfo) + profileMap := make(map[string]node.ProfileConf) for _, profile := range profiles { - profileMap[profile.Id.Get()] = profile + profileMap[profile.Id()] = profile } buf, _ := json.MarshalIndent(profileMap, "", " ") @@ -60,7 +59,7 @@ func ProfileList(ShowOpt *wwapiv1.GetProfileList) (profileList wwapiv1.ProfileLi for _, profile := range profiles { profileList.Output = append(profileList.Output, - fmt.Sprintf("%s:=:%s", profile.Id.Print(), profile.Comment.Print())) + fmt.Sprintf("%s:=:%s", profile.Id(), profile.Comment)) } } return diff --git a/internal/pkg/api/profile/set.go b/internal/pkg/api/profile/set.go index 44ddb7b6..86f6e108 100644 --- a/internal/pkg/api/profile/set.go +++ b/internal/pkg/api/profile/set.go @@ -3,13 +3,13 @@ package apiprofile import ( "fmt" - "github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1" - "github.com/hpcng/warewulf/internal/pkg/node" - "github.com/hpcng/warewulf/internal/pkg/util" - "github.com/hpcng/warewulf/internal/pkg/warewulfd" - "github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/pkg/errors" - "gopkg.in/yaml.v2" + "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" + "github.com/warewulf/warewulf/internal/pkg/node" + "github.com/warewulf/warewulf/internal/pkg/util" + "github.com/warewulf/warewulf/internal/pkg/warewulfd" + "github.com/warewulf/warewulf/internal/pkg/wwlog" + "gopkg.in/yaml.v3" ) // NodeSet is the wwapiv1 implmentation for updating nodeinfo fields. @@ -40,13 +40,12 @@ func ProfileSetParameterCheck(set *wwapiv1.ConfSetParameter) (nodeDB node.NodeYa wwlog.Error("Could not open configuration: %s", err) return } - //func AbstractSetParameterCheck(set *wwapiv1.ConfSetParameter, confMap map[string]*node.NodeConf, confs []string) (count uint, err error) { if set == nil { err = fmt.Errorf("profile set parameter is nil") return } if set.ConfList == nil { - err = fmt.Errorf("node nodes to set!") + err = fmt.Errorf("node nodes to set") return } confs := nodeDB.ListAllProfiles() @@ -56,33 +55,33 @@ func ProfileSetParameterCheck(set *wwapiv1.ConfSetParameter) (nodeDB node.NodeYa } else if len(confs) == 0 { wwlog.Warn("no nodes/profiles found") return - } else { - confs = set.ConfList } - //var confobject node.NodeConf - for _, p := range set.ConfList { - if util.InSlice(set.ConfList, p) { - wwlog.Verbose("evaluating profile: %s", p) - if _, ok := nodeDB.NodeProfiles[p]; !ok { + for _, profileId := range set.ConfList { + if util.InSlice(set.ConfList, profileId) { + wwlog.Verbose("evaluating profile: %s", profileId) + var profilePtr *node.ProfileConf + profilePtr, err = nodeDB.GetProfilePtr(profileId) + if err != nil { + wwlog.Warn("invalid profile: %s", profileId) continue } - err = yaml.Unmarshal([]byte(set.NodeConfYaml), nodeDB.NodeProfiles[p]) + err = yaml.Unmarshal([]byte(set.NodeConfYaml), profilePtr) if err != nil { return } if set.NetdevDelete != "" { - if _, ok := nodeDB.NodeProfiles[p].NetDevs[set.NetdevDelete]; !ok { + if _, ok := profilePtr.NetDevs[set.NetdevDelete]; !ok { err = fmt.Errorf("network device name doesn't exist: %s", set.NetdevDelete) wwlog.Error(fmt.Sprintf("%v", err.Error())) return } - wwlog.Verbose("Profile: %s, Deleting network device: %s", p, set.NetdevDelete) - delete(nodeDB.NodeProfiles[p].NetDevs, set.NetdevDelete) + wwlog.Verbose("Profile: %s, Deleting network device: %s", profileId, set.NetdevDelete) + delete(profilePtr.NetDevs, set.NetdevDelete) } if set.PartitionDelete != "" { - for diskname, disk := range nodeDB.NodeProfiles[p].Disks { + for diskname, disk := range profilePtr.Disks { if _, ok := disk.Partitions[set.PartitionDelete]; ok { - wwlog.Verbose("Node: %s, on disk %, deleting partition: %s", p, diskname, set.PartitionDelete) + wwlog.Verbose("Node: %s, on disk %, deleting partition: %s", profileId, diskname, set.PartitionDelete) delete(disk.Partitions, set.PartitionDelete) } else { return nodeDB, count, fmt.Errorf("partition doesn't exist: %s", set.PartitionDelete) @@ -91,45 +90,45 @@ func ProfileSetParameterCheck(set *wwapiv1.ConfSetParameter) (nodeDB node.NodeYa } } if set.DiskDelete != "" { - if _, ok := nodeDB.NodeProfiles[p].Disks[set.DiskDelete]; ok { - wwlog.Verbose("Node: %s, deleting disk: %s", p, set.DiskDelete) - delete(nodeDB.NodeProfiles[p].Disks, set.DiskDelete) + if _, ok := profilePtr.Disks[set.DiskDelete]; ok { + wwlog.Verbose("Node: %s, deleting disk: %s", profileId, set.DiskDelete) + delete(profilePtr.Disks, set.DiskDelete) } else { return nodeDB, count, fmt.Errorf("disk doesn't exist: %s", set.DiskDelete) } } if set.FilesystemDelete != "" { - if _, ok := nodeDB.NodeProfiles[p].FileSystems[set.FilesystemDelete]; ok { - wwlog.Verbose("Node: %s, deleting filesystem: %s", p, set.FilesystemDelete) - delete(nodeDB.NodeProfiles[p].FileSystems, set.FilesystemDelete) + if _, ok := profilePtr.FileSystems[set.FilesystemDelete]; ok { + wwlog.Verbose("Node: %s, deleting filesystem: %s", profileId, set.FilesystemDelete) + delete(profilePtr.FileSystems, set.FilesystemDelete) } else { return nodeDB, count, fmt.Errorf("disk doesn't exist: %s", set.FilesystemDelete) } } for _, key := range set.TagDel { - delete(nodeDB.NodeProfiles[p].Tags, key) + delete(profilePtr.Tags, key) } for key, val := range set.TagAdd { - if nodeDB.NodeProfiles[p].Tags == nil { - nodeDB.NodeProfiles[p].Tags = make(map[string]string) + if profilePtr.Tags == nil { + profilePtr.Tags = make(map[string]string) } - nodeDB.NodeProfiles[p].Tags[key] = val + profilePtr.Tags[key] = val } for key, val := range set.IpmiTagAdd { - if nodeDB.NodeProfiles[p].Ipmi.Tags == nil { - nodeDB.NodeProfiles[p].Ipmi.Tags = make(map[string]string) + if profilePtr.Ipmi.Tags == nil { + profilePtr.Ipmi.Tags = make(map[string]string) } - nodeDB.NodeProfiles[p].Ipmi.Tags[key] = val + profilePtr.Ipmi.Tags[key] = val } for _, key := range set.IpmiTagDel { - delete(nodeDB.NodeProfiles[p].Ipmi.Tags, key) + delete(profilePtr.Ipmi.Tags, key) } - if _, ok := nodeDB.NodeProfiles[p].NetDevs[set.Netdev]; ok { + if _, ok := profilePtr.NetDevs[set.Netdev]; ok { for _, key := range set.NetTagDel { - delete(nodeDB.NodeProfiles[p].NetDevs[set.Netdev].Tags, key) + delete(profilePtr.NetDevs[set.Netdev].Tags, key) } for key, val := range set.TagAdd { - nodeDB.NodeProfiles[p].NetDevs[set.Netdev].Tags[key] = val + profilePtr.NetDevs[set.Netdev].Tags[key] = val } } count++