Bugfix: cloning a site overlay when parent dir does not exist
Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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...)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user