api changes for use without NodeInfo
Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
committed by
Jonathon Anderson
parent
457c7c16b1
commit
ffef31969e
42
internal/pkg/api/profile/add.go
Normal file
42
internal/pkg/api/profile/add.go
Normal file
@@ -0,0 +1,42 @@
|
||||
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"
|
||||
)
|
||||
|
||||
/*
|
||||
Adds a new profile with the given name
|
||||
*/
|
||||
func ProfileAdd(nsp *wwapiv1.NodeAddParameter) error {
|
||||
if nsp == nil {
|
||||
return fmt.Errorf("NodeAddParameter is nill")
|
||||
}
|
||||
nodeDB, err := node.New()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Could not open database")
|
||||
}
|
||||
for _, p := range nsp.NodeNames {
|
||||
if util.InSlice(nodeDB.ListAllProfiles(), p) {
|
||||
return errors.New(fmt.Sprintf("profile with name %s already exists", p))
|
||||
}
|
||||
pNew, err := nodeDB.AddProfile(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = yaml.Unmarshal([]byte(nsp.NodeConfYaml), &pNew)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to add profile")
|
||||
}
|
||||
}
|
||||
err = nodeDB.Persist()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to persist new profile")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -2,7 +2,6 @@ package apiprofile
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1"
|
||||
@@ -14,36 +13,22 @@ import (
|
||||
|
||||
// ProfileDelete adds profile deletion for management by Warewulf.
|
||||
func ProfileDelete(ndp *wwapiv1.NodeDeleteParameter) (err error) {
|
||||
|
||||
var profileList []node.NodeInfo
|
||||
profileList, err = ProfileDeleteParameterCheck(ndp, false)
|
||||
nodeDB, profileList, err := ProfileDeleteParameterCheck(ndp, false)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
nodeDB, err := node.New()
|
||||
if err != nil {
|
||||
wwlog.Error("Failed to open node database: %s\n", err)
|
||||
return
|
||||
}
|
||||
if nodeDB.StringHash() != ndp.Hash && !ndp.Force {
|
||||
return fmt.Errorf("got wrong hash, not modifying profile database")
|
||||
}
|
||||
for _, p := range profileList {
|
||||
err := nodeDB.DelProfile(p.Id.Get())
|
||||
if err != nil {
|
||||
wwlog.Error("%s\n", err)
|
||||
} else {
|
||||
//count++
|
||||
wwlog.Verbose("Deleting profile: %s\n", p.Id.Print())
|
||||
}
|
||||
delete(nodeDB.NodeProfiles, p)
|
||||
wwlog.Verbose("Deleting profile: %s", p)
|
||||
}
|
||||
|
||||
err = nodeDB.Persist()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to persist nodedb")
|
||||
}
|
||||
|
||||
err = warewulfd.DaemonReload()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to reload warewulf daemon")
|
||||
@@ -54,43 +39,36 @@ func ProfileDelete(ndp *wwapiv1.NodeDeleteParameter) (err error) {
|
||||
// ProfileDeleteParameterCheck does error checking on ProfileDeleteParameter.
|
||||
// Output to the console if console is true.
|
||||
// Returns the profiles to delete.
|
||||
func ProfileDeleteParameterCheck(ndp *wwapiv1.NodeDeleteParameter, console bool) (profileList []node.NodeInfo, err error) {
|
||||
func ProfileDeleteParameterCheck(ndp *wwapiv1.NodeDeleteParameter, console bool) (nodeDB node.NodeYaml, profileList []string, err error) {
|
||||
|
||||
if ndp == nil {
|
||||
err = fmt.Errorf("ProfileDeleteParameter is nil")
|
||||
err = fmt.Errorf("profileDeleteParameter is nil")
|
||||
return
|
||||
}
|
||||
|
||||
nodeDB, err := node.New()
|
||||
nodeDB, err = node.New()
|
||||
if err != nil {
|
||||
wwlog.Error("Failed to open node database: %s\n", err)
|
||||
wwlog.Error("failed to open node database: %s\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
profiles, err := nodeDB.FindAllProfiles()
|
||||
if err != nil {
|
||||
wwlog.Error("Could not get node list: %s\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
node_args := hostlist.Expand(ndp.NodeNames)
|
||||
|
||||
for _, r := range node_args {
|
||||
var match bool
|
||||
for _, p := range profiles {
|
||||
if p.Id.Get() == r {
|
||||
profileList = nodeDB.ListAllProfiles()
|
||||
profileArgs := hostlist.Expand(ndp.NodeNames)
|
||||
for _, r := range profileArgs {
|
||||
match := false
|
||||
for _, p := range profileList {
|
||||
if p == r {
|
||||
profileList = append(profileList, p)
|
||||
match = true
|
||||
}
|
||||
}
|
||||
|
||||
if !match {
|
||||
fmt.Fprintf(os.Stderr, "ERROR: No match for node: %s\n", r)
|
||||
wwlog.Error("no match for profile: %s", r)
|
||||
}
|
||||
}
|
||||
|
||||
if len(profileList) == 0 {
|
||||
fmt.Printf("No s found\n")
|
||||
wwlog.Warn("no profiles found\n")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ func FilteredProfiles(profileList *wwapiv1.NodeList) *wwapiv1.NodeYaml {
|
||||
os.Exit(1)
|
||||
}
|
||||
profileMap := nodeDB.NodeProfiles
|
||||
profileMap = node.FilterMapByName(profileMap, profileList.Output)
|
||||
profileMap = node.FilterProfilesByName(profileMap, profileList.Output)
|
||||
buffer, _ := yaml.Marshal(profileMap)
|
||||
retVal := wwapiv1.NodeYaml{
|
||||
NodeConfMapYaml: string(buffer),
|
||||
@@ -59,7 +59,7 @@ func ProfileAddFromYaml(nodeList *wwapiv1.NodeAddParameter) (err error) {
|
||||
return fmt.Errorf("got wrong hash, not modifying profile database")
|
||||
}
|
||||
|
||||
profileMap := make(map[string]*node.NodeConf)
|
||||
profileMap := make(map[string]*node.ProfileConf)
|
||||
err = yaml.Unmarshal([]byte(nodeList.NodeConfYaml), profileMap)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Could not unmarshall Yaml: %s\n")
|
||||
|
||||
@@ -18,18 +18,15 @@ func ProfileList(ShowOpt *wwapiv1.GetProfileList) (profileList wwapiv1.ProfileLi
|
||||
profileList.Output = []string{}
|
||||
nodeDB, err := node.New()
|
||||
if err != nil {
|
||||
wwlog.Error("Could not open node configuration: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
profiles, err := nodeDB.FindAllProfiles()
|
||||
if err != nil {
|
||||
wwlog.Error("Could not find all profiles: %s", err)
|
||||
return
|
||||
}
|
||||
profiles = node.FilterByName(profiles, ShowOpt.Profiles)
|
||||
sort.Slice(profiles, func(i, j int) bool {
|
||||
return profiles[i].Id.Get() < profiles[j].Id.Get()
|
||||
return profiles[i].Id() < profiles[j].Id()
|
||||
})
|
||||
if ShowOpt.ShowAll || ShowOpt.ShowFullAll {
|
||||
for _, p := range profiles {
|
||||
|
||||
@@ -1,197 +0,0 @@
|
||||
package apiprofile
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
apinode "github.com/warewulf/warewulf/internal/pkg/api/node"
|
||||
"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/wwlog"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
// NodeSet is the wwapiv1 implmentation for updating nodeinfo fields.
|
||||
func ProfileSet(set *wwapiv1.ProfileSetParameter) (err error) {
|
||||
if set == nil {
|
||||
return fmt.Errorf("NodeAddParameter is nil")
|
||||
}
|
||||
|
||||
var nodeDB node.NodeYaml
|
||||
nodeDB, _, err = ProfileSetParameterCheck(set, false)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Could not open database")
|
||||
}
|
||||
dbError := apinode.DbSave(&nodeDB)
|
||||
return dbError
|
||||
}
|
||||
|
||||
// ProfileSetParameterCheck does error checking on ProfileSetParameter.
|
||||
// Output to the console if console is true.
|
||||
// TODO: Determine if the console switch does wwlog or not.
|
||||
// - console may end up being textOutput?
|
||||
func ProfileSetParameterCheck(set *wwapiv1.ProfileSetParameter, console bool) (nodeDB node.NodeYaml, profileCount uint, err error) {
|
||||
if set == nil {
|
||||
err = fmt.Errorf("profile set parameter is nil")
|
||||
if console {
|
||||
fmt.Printf("%v\n", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if set.ProfileNames == nil {
|
||||
err = fmt.Errorf("profile set parameter: ProfileNames is nil")
|
||||
if console {
|
||||
fmt.Printf("%v\n", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
nodeDB, err = node.New()
|
||||
if err != nil {
|
||||
wwlog.Error("Could not open configuration: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
profiles, err := nodeDB.FindAllProfiles()
|
||||
if err != nil {
|
||||
wwlog.Error("Could not get profile list: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Note: This does not do expansion on the nodes.
|
||||
|
||||
if set.AllProfiles || (len(set.ProfileNames) == 0) {
|
||||
if console {
|
||||
fmt.Printf("\n*** WARNING: This command will modify all profiles! ***\n\n")
|
||||
}
|
||||
}
|
||||
|
||||
if len(profiles) == 0 {
|
||||
if console {
|
||||
fmt.Printf("No profiles found\n")
|
||||
}
|
||||
return
|
||||
}
|
||||
var pConf node.NodeConf
|
||||
err = yaml.Unmarshal([]byte(set.NodeConfYaml), &pConf)
|
||||
if err != nil {
|
||||
wwlog.Error(fmt.Sprintf("%v", err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
for _, p := range profiles {
|
||||
if util.InSlice(set.ProfileNames, p.Id.Get()) {
|
||||
wwlog.Verbose("Evaluating profile: %s", p.Id.Get())
|
||||
p.SetFrom(&pConf)
|
||||
if set.NetdevDelete != "" {
|
||||
if _, ok := p.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.Id.Get(), set.NetdevDelete)
|
||||
delete(p.NetDevs, set.NetdevDelete)
|
||||
}
|
||||
if set.PartitionDelete != "" {
|
||||
deletedPart := false
|
||||
for diskname, disk := range p.Disks {
|
||||
if _, ok := disk.Partitions[set.PartitionDelete]; ok {
|
||||
wwlog.Verbose("Node: %s, on disk %, deleting partition: %s", p.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 := p.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", p.Id.Get(), set.DiskDelete)
|
||||
delete(p.Disks, set.DiskDelete)
|
||||
}
|
||||
if set.FilesystemDelete != "" {
|
||||
if _, ok := p.FileSystems[set.FilesystemDelete]; !ok {
|
||||
err = fmt.Errorf("disk doesn't exist: %s", set.FilesystemDelete)
|
||||
wwlog.Error(fmt.Sprintf("%v", err.Error()))
|
||||
return
|
||||
}
|
||||
wwlog.Verbose("Node: %s, deleting filesystem: %s", p.Id.Get(), set.FilesystemDelete)
|
||||
delete(p.FileSystems, set.FilesystemDelete)
|
||||
}
|
||||
|
||||
for _, key := range pConf.TagsDel {
|
||||
delete(p.Tags, key)
|
||||
}
|
||||
for _, key := range pConf.Ipmi.TagsDel {
|
||||
delete(p.Ipmi.Tags, key)
|
||||
}
|
||||
for net := range pConf.NetDevs {
|
||||
for _, key := range pConf.NetDevs[net].TagsDel {
|
||||
if _, ok := p.NetDevs[net]; ok {
|
||||
delete(p.NetDevs[net].Tags, key)
|
||||
}
|
||||
}
|
||||
}
|
||||
err := nodeDB.ProfileUpdate(p)
|
||||
if err != nil {
|
||||
wwlog.Error("%s", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
profileCount++
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
Adds a new profile with the given name
|
||||
*/
|
||||
|
||||
func AddProfile(nsp *wwapiv1.ProfileSetParameter) error {
|
||||
if nsp == nil {
|
||||
return fmt.Errorf("NodeSetParameter is nill")
|
||||
}
|
||||
|
||||
nodeDB, err := node.New()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Could not open database")
|
||||
}
|
||||
|
||||
if util.InSlice(nodeDB.ListAllProfiles(), nsp.ProfileNames[0]) {
|
||||
return errors.New(fmt.Sprintf("profile with name %s already exists", nsp.ProfileNames[0]))
|
||||
}
|
||||
|
||||
var nodeConf node.NodeConf
|
||||
err = yaml.Unmarshal([]byte(nsp.NodeConfYaml), &nodeConf)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to decode nodeConf")
|
||||
}
|
||||
|
||||
n, err := nodeDB.AddProfile(nsp.ProfileNames[0])
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to add node")
|
||||
}
|
||||
n.SetFrom(&nodeConf)
|
||||
|
||||
err = nodeDB.ProfileUpdate(n)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to update nodedb")
|
||||
}
|
||||
|
||||
err = nodeDB.Persist()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to persist new profile")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
139
internal/pkg/api/profile/set.go
Normal file
139
internal/pkg/api/profile/set.go
Normal file
@@ -0,0 +1,139 @@
|
||||
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"
|
||||
)
|
||||
|
||||
// NodeSet is the wwapiv1 implmentation for updating nodeinfo fields.
|
||||
func ProfileSet(set *wwapiv1.ConfSetParameter) (err error) {
|
||||
if set == nil {
|
||||
return fmt.Errorf("ProfileAddParameter is nil")
|
||||
}
|
||||
nodeDB, _, err := ProfileSetParameterCheck(set)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "profile set parameters are wrong")
|
||||
}
|
||||
if err = nodeDB.Persist(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = warewulfd.DaemonReload(); err != nil {
|
||||
return err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
NodeSetParameterCheck does error checking and returns a modified
|
||||
NodeYml which than can be persisted
|
||||
*/
|
||||
func ProfileSetParameterCheck(set *wwapiv1.ConfSetParameter) (nodeDB node.NodeYaml, count uint, err error) {
|
||||
nodeDB, err = node.New()
|
||||
if err != nil {
|
||||
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!")
|
||||
return
|
||||
}
|
||||
confs := nodeDB.ListAllProfiles()
|
||||
// Note: This does not do expansion on the nodes.
|
||||
if set.AllConfs || (len(set.ConfList) == 0) {
|
||||
wwlog.Warn("this command will modify all nodes/profiles")
|
||||
} 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 {
|
||||
continue
|
||||
}
|
||||
err = yaml.Unmarshal([]byte(set.NodeConfYaml), nodeDB.NodeProfiles[p])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if set.NetdevDelete != "" {
|
||||
if _, ok := nodeDB.NodeProfiles[p].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)
|
||||
}
|
||||
if set.PartitionDelete != "" {
|
||||
for diskname, disk := range nodeDB.NodeProfiles[p].Disks {
|
||||
if _, ok := disk.Partitions[set.PartitionDelete]; ok {
|
||||
wwlog.Verbose("Node: %s, on disk %, deleting partition: %s", p, diskname, set.PartitionDelete)
|
||||
delete(disk.Partitions, set.PartitionDelete)
|
||||
} else {
|
||||
return nodeDB, count, fmt.Errorf("partition doesn't exist: %s", set.PartitionDelete)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
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)
|
||||
} 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)
|
||||
} else {
|
||||
return nodeDB, count, fmt.Errorf("disk doesn't exist: %s", set.FilesystemDelete)
|
||||
}
|
||||
}
|
||||
for _, key := range set.TagDel {
|
||||
delete(nodeDB.NodeProfiles[p].Tags, key)
|
||||
}
|
||||
for key, val := range set.TagAdd {
|
||||
if nodeDB.NodeProfiles[p].Tags == nil {
|
||||
nodeDB.NodeProfiles[p].Tags = make(map[string]string)
|
||||
}
|
||||
nodeDB.NodeProfiles[p].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)
|
||||
}
|
||||
nodeDB.NodeProfiles[p].Ipmi.Tags[key] = val
|
||||
}
|
||||
for _, key := range set.IpmiTagDel {
|
||||
delete(nodeDB.NodeProfiles[p].Ipmi.Tags, key)
|
||||
}
|
||||
if _, ok := nodeDB.NodeProfiles[p].NetDevs[set.Netdev]; ok {
|
||||
for _, key := range set.NetTagDel {
|
||||
delete(nodeDB.NodeProfiles[p].NetDevs[set.Netdev].Tags, key)
|
||||
}
|
||||
for key, val := range set.TagAdd {
|
||||
nodeDB.NodeProfiles[p].NetDevs[set.Netdev].Tags[key] = val
|
||||
}
|
||||
}
|
||||
count++
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user