Merge pull request #1818 from mslacken/FixNetdevOnlyProfile

Allow discover of nodes with network only in profile
This commit is contained in:
Jonathon Anderson
2025-03-20 16:13:46 -06:00
committed by GitHub
3 changed files with 114 additions and 10 deletions

View File

@@ -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.

View File

@@ -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())
}

View 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())
}
})
}
}