diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index 2dd9003d..b22545c4 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -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) diff --git a/internal/pkg/warewulfd/provision.go b/internal/pkg/warewulfd/provision.go index 03b2798c..f2851a26 100644 --- a/internal/pkg/warewulfd/provision.go +++ b/internal/pkg/warewulfd/provision.go @@ -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 diff --git a/internal/pkg/warewulfd/util.go b/internal/pkg/warewulfd/util.go index 9f2cd4a4..3290a678 100644 --- a/internal/pkg/warewulfd/util.go +++ b/internal/pkg/warewulfd/util.go @@ -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) } } diff --git a/internal/pkg/warewulfd/util_test.go b/internal/pkg/warewulfd/util_test.go index 036a938e..c2853982 100644 --- a/internal/pkg/warewulfd/util_test.go +++ b/internal/pkg/warewulfd/util_test.go @@ -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 {