added profile set over API
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
package node
|
||||
package apinode
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
@@ -477,7 +477,7 @@ func NodeSet(set *wwapiv1.NodeSetParameter) (err error) {
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return nodeDbSave(&nodeDB)
|
||||
return DbSave(&nodeDB)
|
||||
}
|
||||
|
||||
// NodeSetParameterCheck does error checking on NodeSetParameter.
|
||||
@@ -658,24 +658,6 @@ func checkNetNameRequired(netname string) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// nodeDbSave persists the nodeDB to disk and restarts warewulfd.
|
||||
// TODO: We will likely need locking around anything changing nodeDB
|
||||
// or restarting warewulfd. Determine if the reason for restart is
|
||||
// just to reinitialize warewulfd with the new nodeDB or if there is
|
||||
// something more to it.
|
||||
func nodeDbSave(nodeDB *node.NodeYaml) (err error) {
|
||||
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")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
Add the netname to the options map, as its only known after the map
|
||||
command line options have been read out.
|
||||
|
||||
25
internal/pkg/api/node/utils.go
Normal file
25
internal/pkg/api/node/utils.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package apinode
|
||||
|
||||
import (
|
||||
"github.com/hpcng/warewulf/internal/pkg/node"
|
||||
"github.com/hpcng/warewulf/internal/pkg/warewulfd"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// nodeDbSave persists the nodeDB to disk and restarts warewulfd.
|
||||
// TODO: We will likely need locking around anything changing nodeDB
|
||||
// or restarting warewulfd. Determine if the reason for restart is
|
||||
// just to reinitialize warewulfd with the new nodeDB or if there is
|
||||
// something more to it.
|
||||
func DbSave(nodeDB *node.NodeYaml) (err error) {
|
||||
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")
|
||||
}
|
||||
return
|
||||
}
|
||||
109
internal/pkg/api/profile/profile.go
Normal file
109
internal/pkg/api/profile/profile.go
Normal file
@@ -0,0 +1,109 @@
|
||||
package apiprofile
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
apinode "github.com/hpcng/warewulf/internal/pkg/api/node"
|
||||
"github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1"
|
||||
"github.com/hpcng/warewulf/internal/pkg/node"
|
||||
"github.com/hpcng/warewulf/internal/pkg/wwlog"
|
||||
)
|
||||
|
||||
// NodeSet is the wwapiv1 implmentation for updating node fields.
|
||||
func ProfileSet(set *wwapiv1.NodeSetParameter) (err error) {
|
||||
|
||||
if set == nil {
|
||||
return fmt.Errorf("NodeAddParameter is nil")
|
||||
}
|
||||
|
||||
var nodeDB node.NodeYaml
|
||||
nodeDB, _, err = ProfileSetParameterCheck(set, false)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return apinode.DbSave(&nodeDB)
|
||||
}
|
||||
|
||||
// NodeSetParameterCheck does error checking on NodeSetParameter.
|
||||
// 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.NodeSetParameter, 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.NodeNames == 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.Printf(wwlog.ERROR, "Could not open configuration: %s\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
profiles, err := nodeDB.FindAllProfiles()
|
||||
if err != nil {
|
||||
wwlog.Printf(wwlog.ERROR, "Could not get profile list: %s\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Note: This does not do expansion on the nodes.
|
||||
|
||||
if set.AllNodes || (len(set.NodeNames) == 0 && len(profiles) > 0) {
|
||||
if console {
|
||||
fmt.Printf("\n*** WARNING: This command will modify all profiles! ***\n\n")
|
||||
}
|
||||
} else {
|
||||
profiles = node.FilterByName(profiles, set.NodeNames)
|
||||
}
|
||||
|
||||
if len(profiles) == 0 {
|
||||
if console {
|
||||
fmt.Printf("No profiles found\n")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
for _, p := range profiles {
|
||||
wwlog.Printf(wwlog.VERBOSE, "Evaluating profile: %s\n", p.Id.Get())
|
||||
for key, val := range set.OptionsStrMap {
|
||||
if val != "" {
|
||||
wwlog.Verbose("profile:%s setting %s to %s\n", p.Id.Get(), key, val)
|
||||
p.SetField(key, val)
|
||||
}
|
||||
}
|
||||
|
||||
if set.NetdevDelete != "" {
|
||||
|
||||
if _, ok := p.NetDevs[set.NetdevDelete]; !ok {
|
||||
err = fmt.Errorf("Network device name doesn't exist: %s", set.NetdevDelete)
|
||||
wwlog.Printf(wwlog.ERROR, fmt.Sprintf("%v\n", err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
wwlog.Printf(wwlog.VERBOSE, "Node: %s, Deleting network device: %s\n", p.Id.Get(), set.NetdevDelete)
|
||||
delete(p.NetDevs, set.NetdevDelete)
|
||||
}
|
||||
|
||||
err := nodeDB.NodeUpdate(p)
|
||||
if err != nil {
|
||||
wwlog.Printf(wwlog.ERROR, "%s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
profileCount++
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user