Merge pull request #1818 from mslacken/FixNetdevOnlyProfile
Allow discover of nodes with network only in profile
This commit is contained in:
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
|
||||
## v4.6.1, unreleased
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed panic in warewulfd if node netdev is only defined in a profile. #1817
|
||||
|
||||
### Changed
|
||||
|
||||
- Update GitHub actions to build aarch64 artifacts.
|
||||
|
||||
@@ -69,36 +69,40 @@ func GetNodeOrSetDiscoverable(hwaddr string) (node.Node, error) {
|
||||
// If we failed to find a node, let's see if we can add one...
|
||||
wwlog.Warn("node not configured: %s", hwaddr)
|
||||
|
||||
node, netdev, err := db.yml.FindDiscoverableNode()
|
||||
nodeFound, netdev, err := db.yml.FindDiscoverableNode()
|
||||
if err != nil {
|
||||
// NOTE: this is taken as there is no discoverable node, so return the
|
||||
// empty one
|
||||
return node, err
|
||||
return nodeFound, err
|
||||
}
|
||||
// update node
|
||||
wwlog.Debug("discoverd node: %s netdev: %s", node.Id(), netdev)
|
||||
nodeChanges, _ := db.yml.GetNodeOnly(node.Id()) // ignore error as nodeId is in db
|
||||
wwlog.Debug("discovered node: %s netdev: %s", nodeFound.Id(), netdev)
|
||||
nodeChanges, _ := db.yml.GetNodeOnly(nodeFound.Id()) // ignore error as nodeId is in db
|
||||
if _, ok := nodeChanges.NetDevs[netdev]; !ok {
|
||||
nodeChanges.NetDevs = make(map[string]*node.NetDev)
|
||||
nodeChanges.NetDevs[netdev] = new(node.NetDev)
|
||||
}
|
||||
wwlog.Debug("node: %v", nodeChanges)
|
||||
nodeChanges.NetDevs[netdev].Hwaddr = hwaddr
|
||||
nodeChanges.Discoverable = "UNDEF"
|
||||
err = db.yml.SetNode(node.Id(), nodeChanges)
|
||||
err = db.yml.SetNode(nodeFound.Id(), nodeChanges)
|
||||
if err != nil {
|
||||
return node, err
|
||||
return nodeFound, err
|
||||
}
|
||||
err = db.yml.Persist()
|
||||
if err != nil {
|
||||
return node, fmt.Errorf("%s (failed to persist node configuration) %w", hwaddr, err)
|
||||
return nodeFound, fmt.Errorf("%s (failed to persist node configuration) %w", hwaddr, err)
|
||||
}
|
||||
err = loadNodeDB()
|
||||
if err != nil {
|
||||
return node, fmt.Errorf("%s (failed to reload configuration) %w", hwaddr, err)
|
||||
return nodeFound, fmt.Errorf("%s (failed to reload configuration) %w", hwaddr, err)
|
||||
}
|
||||
// NOTE: previously all overlays were built here, but that will also
|
||||
// be done automatically when attempting to serve an overlay that
|
||||
// hasn't been built (without blocking the database).
|
||||
|
||||
wwlog.Serv("%s (node %s automatically configured)", hwaddr, node.Id())
|
||||
wwlog.Serv("%s (node %s automatically configured)", hwaddr, nodeFound.Id())
|
||||
|
||||
// return the discovered node
|
||||
return db.yml.GetNode(node.Id())
|
||||
return db.yml.GetNode(nodeFound.Id())
|
||||
}
|
||||
|
||||
96
internal/pkg/warewulfd/nodedb_test.go
Normal file
96
internal/pkg/warewulfd/nodedb_test.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package warewulfd
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/warewulf/warewulf/internal/pkg/testenv"
|
||||
)
|
||||
|
||||
func Test_GetNodeOrSetDiscoverable(t *testing.T) {
|
||||
var tests = map[string]struct {
|
||||
nodesConf string
|
||||
hwaddr string
|
||||
node string
|
||||
err bool
|
||||
}{
|
||||
"empty": {
|
||||
nodesConf: `
|
||||
nodes: {}
|
||||
`,
|
||||
hwaddr: "00:00:00:00:00:00",
|
||||
err: true,
|
||||
},
|
||||
"configured": {
|
||||
nodesConf: `
|
||||
nodes:
|
||||
n1:
|
||||
network devices:
|
||||
default:
|
||||
hwaddr: 00:00:00:00:00:01
|
||||
`,
|
||||
hwaddr: "00:00:00:00:00:01",
|
||||
node: "n1",
|
||||
},
|
||||
"discoverable": {
|
||||
nodesConf: `
|
||||
nodes:
|
||||
n1:
|
||||
discoverable: true
|
||||
network devices:
|
||||
default: {}
|
||||
`,
|
||||
hwaddr: "00:00:00:00:00:01",
|
||||
node: "n1",
|
||||
},
|
||||
"discoverable with primary": {
|
||||
nodesConf: `
|
||||
nodes:
|
||||
n1:
|
||||
discoverable: true
|
||||
primary netdev: default
|
||||
network devices:
|
||||
default: {}
|
||||
`,
|
||||
hwaddr: "00:00:00:00:00:01",
|
||||
node: "n1",
|
||||
},
|
||||
"discoverable without network": {
|
||||
nodesConf: `
|
||||
nodeprofiles:
|
||||
default:
|
||||
network devices:
|
||||
default:
|
||||
netmask: 255.255.255.0
|
||||
nodes:
|
||||
n1:
|
||||
profiles:
|
||||
- default
|
||||
discoverable: true
|
||||
`,
|
||||
hwaddr: "00:00:00:00:00:01",
|
||||
node: "n1",
|
||||
},
|
||||
}
|
||||
|
||||
for name, tt := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
env := testenv.New(t)
|
||||
defer env.RemoveAll()
|
||||
env.WriteFile("/etc/warewulf/nodes.conf", tt.nodesConf)
|
||||
|
||||
err := LoadNodeDB()
|
||||
assert.NoError(t, err)
|
||||
|
||||
node, err := GetNodeOrSetDiscoverable(tt.hwaddr)
|
||||
if tt.err {
|
||||
assert.Error(t, err)
|
||||
} else {
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, tt.node, node.Id())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user