Bugfix: cloning a site overlay when parent dir does not exist

Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
Jonathon Anderson
2025-07-27 01:38:33 -06:00
parent 749e79b7ec
commit e149a332e6
4 changed files with 9 additions and 8 deletions

View File

@@ -17,14 +17,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Restore default idempotency of `PUT /api/nodes/{id}` - Restore default idempotency of `PUT /api/nodes/{id}`
- `DELETE /api/overlays/{name}?force=true` can delete overlays that are in use - `DELETE /api/overlays/{name}?force=true` can delete overlays that are in use
### Changed
- `warewulfd` overlay autobuild rebuilds overlays after node discovery. #1468 - `warewulfd` overlay autobuild rebuilds overlays after node discovery. #1468
### Fixed ### Fixed
- Improved netplan support. #1873 - Improved netplan support. #1873
### Fixed
- Fixed a bug when cloning an overlay to site when parent is missing
## v4.6.2, 2025-07-09 ## v4.6.2, 2025-07-09
### Added ### Added

View File

@@ -68,8 +68,8 @@ func (overlay Overlay) CloneSiteOverlay() (siteOverlay Overlay, err error) {
if siteOverlay.Exists() { if siteOverlay.Exists() {
return siteOverlay, fmt.Errorf("site overlay already exists: %s", siteOverlay.Name()) return siteOverlay, fmt.Errorf("site overlay already exists: %s", siteOverlay.Name())
} }
if !util.IsDir(filepath.Dir(overlay.Path())) { if !util.IsDir(filepath.Dir(siteOverlay.Path())) {
if err := os.MkdirAll(filepath.Dir(overlay.Path()), 0o755); err != nil { if err := os.MkdirAll(filepath.Dir(siteOverlay.Path()), 0o755); err != nil {
return siteOverlay, err return siteOverlay, err
} }
} }

View File

@@ -330,7 +330,7 @@ func FindOverlays() (overlayList []string) {
files = append(files, distfiles...) files = append(files, distfiles...)
} }
if sitefiles, err := os.ReadDir(controller.Paths.SiteOverlaydir()); err != nil { if sitefiles, err := os.ReadDir(controller.Paths.SiteOverlaydir()); err != nil {
wwlog.Warn("error reading overalys from %s: %s", controller.Paths.SiteOverlaydir(), err) wwlog.Warn("error reading overlays from %s: %s", controller.Paths.SiteOverlaydir(), err)
} else { } else {
files = append(files, sitefiles...) files = append(files, sitefiles...)
} }

View File

@@ -103,7 +103,7 @@ func TestOverlayAPI(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.NoError(t, resp.Body.Close()) assert.NoError(t, resp.Body.Close())
assert.JSONEq(t, `{"files":["/email.ww"], "site":false}`, string(body)) assert.JSONEq(t, `{"files":["/email.ww"], "site":true}`, string(body))
// get again // get again
req, err = http.NewRequest(http.MethodGet, srv.URL+"/api/overlays/testoverlay/file?path=email.ww", nil) req, err = http.NewRequest(http.MethodGet, srv.URL+"/api/overlays/testoverlay/file?path=email.ww", nil)
@@ -155,7 +155,7 @@ func TestOverlayAPI(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.NoError(t, resp.Body.Close()) assert.NoError(t, resp.Body.Close())
assert.JSONEq(t, `{"test":{"files":null, "site":true},"testoverlay":{"files":["/email.ww"], "site":false}}`, string(body)) assert.JSONEq(t, `{"test":{"files":null, "site":true},"testoverlay":{"files":["/email.ww"], "site":true}}`, string(body))
}) })
t.Run("test delete overlay file", func(t *testing.T) { t.Run("test delete overlay file", func(t *testing.T) {