fixed tests and added explcit error handling

Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
Christian Goll
2023-09-20 11:24:37 +02:00
committed by Jonathon Anderson
parent e90616cafb
commit 242276bba9
4 changed files with 34 additions and 35 deletions

View File

@@ -19,6 +19,10 @@ import (
"github.com/pkg/errors"
)
var (
ErrDoesNotExist = errors.New("overlay does not exist")
)
/*
Build all overlays (runtime and generic) for a node
*/
@@ -187,11 +191,7 @@ func BuildOverlayIndir(nodeInfo node.NodeInfo, overlayNames []string, outputDir
wwlog.Debug("Starting to build overlay %s\nChanging directory to OverlayDir: %s", overlayName, overlaySourceDir)
err := os.Chdir(overlaySourceDir)
if err != nil {
return errors.Wrap(err, "could not change directory to overlay dir")
}
wwlog.Debug("Checking to see if overlay directory exists: %s", overlaySourceDir)
if !util.IsDir(overlaySourceDir) {
return errors.New("overlay does not exist: " + overlayName)
return errors.Wrapf(ErrDoesNotExist, " name: %s", overlayName)
}
wwlog.Verbose("Walking the overlay structure: %s", overlaySourceDir)

View File

@@ -2,6 +2,7 @@ package warewulfd
import (
"bytes"
"errors"
"net/http"
"path"
"strconv"
@@ -11,6 +12,7 @@ import (
warewulfconf "github.com/hpcng/warewulf/internal/pkg/config"
"github.com/hpcng/warewulf/internal/pkg/container"
"github.com/hpcng/warewulf/internal/pkg/kernel"
"github.com/hpcng/warewulf/internal/pkg/overlay"
"github.com/hpcng/warewulf/internal/pkg/util"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
)
@@ -135,13 +137,19 @@ func ProvisionSend(w http.ResponseWriter, req *http.Request) {
} else {
context = rinfo.stage
}
stage_file, err = getOverlayFile(
node.Id.Get(),
node,
context,
request_overlays,
conf.Warewulf.AutobuildOverlays)
if err != nil {
if errors.Is(err, overlay.ErrDoesNotExist) {
w.WriteHeader(http.StatusNotFound)
wwlog.ErrorExc(err, "")
return
}
w.WriteHeader(http.StatusInternalServerError)
wwlog.ErrorExc(err, "")
return

View File

@@ -1,7 +1,6 @@
package warewulfd
import (
"fmt"
"net/http"
"os"
@@ -44,16 +43,15 @@ func sendFile(
}
func getOverlayFile(
nodeId string,
n node.NodeInfo,
context string,
stage_overlays []string,
autobuild bool) (stage_file string, err error) {
stage_file = overlay.OverlayImage(nodeId, context, stage_overlays)
stage_file = overlay.OverlayImage(n.Id.Get(), context, stage_overlays)
err = nil
build := !util.IsFile(stage_file)
wwlog.Verbose("stage file: %s", stage_file)
if !build && autobuild {
build = util.PathIsNewer(stage_file, nodepkg.ConfigFile)
@@ -63,22 +61,10 @@ func getOverlayFile(
}
if build {
nodeDB, errNested := node.New()
if err != nil {
return stage_file, errNested
}
myNode, errNested := nodeDB.FindAllNodes()
if err != nil {
return stage_file, errNested
}
myNode = node.FilterByName(myNode, []string{nodeId})
if len(myNode) != 1 {
return stage_file, fmt.Errorf("couldn't find node %s", nodeId)
}
err = overlay.BuildOverlay(myNode[0], context, stage_overlays)
err = overlay.BuildOverlay(n, context, stage_overlays)
if err != nil {
wwlog.Error("Failed to build overlay: %s, %s, %s\n%s",
nodeId, stage_overlays, stage_file, err)
n.Id.Get(), stage_overlays, stage_file, err)
}
}

View File

@@ -2,6 +2,8 @@ package warewulfd
import (
warewulfconf "github.com/hpcng/warewulf/internal/pkg/config"
"github.com/hpcng/warewulf/internal/pkg/node"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
"github.com/stretchr/testify/assert"
"testing"
)
@@ -12,24 +14,27 @@ var getOverlayFileTests = []struct {
context string
overlays []string
result string
succeed bool
succeed bool // getOverlayFile will always fail if no overlay dir is defined!
}{
{"empty", "", "", nil, "", true},
{"empty node", "node1", "", nil, "", true},
{"specific overlays without node", "", "", []string{"o1", "o2"}, "p/overlays/o1-o2.img", true},
{"system overlay", "node1", "system", nil, "p/overlays/node1/__SYSTEM__.img", true},
{"runtime overlay", "node1", "runtime", nil, "p/overlays/node1/__RUNTIME__.img", true},
{"specific overlay", "node1", "", []string{"o1"}, "p/overlays/node1/o1.img", true},
{"multiple specific overlays", "node1", "", []string{"o1", "o2"}, "p/overlays/node1/o1-o2.img", true},
{"multiple specific overlays with context", "node1", "system", []string{"o1", "o2"}, "p/overlays/node1/__SYSTEM__.img", true},
{"empty", "", "", nil, "", false},
{"empty node", "node1", "", nil, "", false},
{"specific overlays without node", "", "", []string{"o1", "o2"}, "p/overlays/node1/o1-o2.img", false},
{"system overlay", "node1", "system", nil, "p/overlays/node1/__SYSTEM__.img", false},
{"runtime overlay", "node1", "runtime", nil, "p/overlays/node1/__RUNTIME__.img", false},
{"specific overlay", "node1", "", []string{"o1"}, "p/overlays/node1/o1.img", false},
{"multiple specific overlays", "node1", "", []string{"o1", "o2"}, "p/overlays/node1/o1-o2.img", false},
{"multiple specific overlays with context", "node1", "system", []string{"o1", "o2"}, "p/overlays/node1/__SYSTEM__.img", false},
}
func Test_getOverlayFile(t *testing.T) {
wwlog.SetLogLevel(wwlog.VERBOSE)
conf := warewulfconf.Get()
conf.Paths.WWProvisiondir = "p"
var n node.NodeInfo
for _, tt := range getOverlayFileTests {
n.Id.Set(tt.node)
t.Run(tt.description, func(t *testing.T) {
result, err := getOverlayFile(tt.node, tt.context, tt.overlays, false)
result, err := getOverlayFile(n, tt.context, tt.overlays, false)
if !tt.succeed {
assert.Error(t, err)
} else {