Merge pull request #1925 from MatthewHink/mhink-ovl

Add uid, gid, and permissions to OverlayFile struct
This commit is contained in:
Jonathon Anderson
2025-06-16 17:13:20 -06:00
committed by GitHub
5 changed files with 41 additions and 5 deletions

View File

@@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Added override.conf for nm-wait-online-initrd.service with dracut.
- Added userdocs for `wwctl node import` from yaml/csv.
- Added uid, gid, and permissions to OverlayFile in REST API. #1925
### Fixed

1
go.mod
View File

@@ -20,6 +20,7 @@ require (
github.com/google/uuid v1.6.0
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1
github.com/hashicorp/go-version v1.7.0
github.com/kinbiko/jsonassert v1.2.0
github.com/manifoldco/promptui v0.9.0
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
github.com/opencontainers/image-spec v1.1.0

2
go.sum
View File

@@ -207,6 +207,8 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kinbiko/jsonassert v1.2.0 h1:+/JthIVXdIrThrOtSN9ry0mNtWKXMWuvxR0nU7gQ+tI=
github.com/kinbiko/jsonassert v1.2.0/go.mod h1:pCc3uudOt+lVAbkji9O0uw8MSVt4s+1ZJ0y8Ux2F1Og=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=

View File

@@ -6,6 +6,7 @@ import (
"net/url"
"os"
"path"
"syscall"
"github.com/swaggest/usecase"
"github.com/swaggest/usecase/status"
@@ -68,9 +69,12 @@ func getOverlayByName() usecase.Interactor {
}
type OverlayFile struct {
Overlay string `json:"overlay"`
Path string `json:"path"`
Contents string `json:"contents"`
Overlay string `json:"overlay"`
Path string `json:"path"`
Contents string `json:"contents"`
Perms os.FileMode `json:"perms"`
Uid uint32 `json:"uid"`
Gid uint32 `json:"gid"`
rendered bool
}
@@ -83,7 +87,23 @@ func (of *OverlayFile) Exists() bool {
}
func (of *OverlayFile) readContents() (string, error) {
f, err := os.ReadFile(of.FullPath())
fullPath := of.FullPath()
f, err := os.ReadFile(fullPath)
if err != nil {
wwlog.Warn("os.ReadFile err %w", err)
return "", err
}
// Populate the permissions, uid, and gid.
s, err := os.Stat(fullPath)
if err != nil {
wwlog.Warn("os.Stat err %w", err)
return "", err
}
fileMode := s.Mode()
of.Perms = fileMode & os.ModePerm
sys := s.Sys()
of.Uid = sys.(*syscall.Stat_t).Uid
of.Gid = sys.(*syscall.Stat_t).Gid
return string(f), err
}

View File

@@ -7,6 +7,7 @@ import (
"net/http/httptest"
"testing"
"github.com/kinbiko/jsonassert"
"github.com/stretchr/testify/assert"
"github.com/warewulf/warewulf/internal/pkg/testenv"
"github.com/warewulf/warewulf/internal/pkg/warewulfd"
@@ -74,7 +75,18 @@ func TestOverlayAPI(t *testing.T) {
assert.NoError(t, err)
assert.NoError(t, resp.Body.Close())
assert.JSONEq(t, `{"overlay":"testoverlay","path":"email.ww","contents":"\n{{ if .Tags.email }}eMail: {{ .Tags.email }}{{else}} noMail{{- end }}\n"}`, string(body))
// gid and uid values may vary depending on where this test is run. (local box, github, etc)
// Assert the keys exist, but ignore the values.
ja := jsonassert.New(t)
ja.Assert(string(body), `
{
"overlay": "testoverlay",
"path": "email.ww",
"contents": "\n{{ if .Tags.email }}eMail: {{ .Tags.email }}{{else}} noMail{{- end }}\n",
"perms": "<<PRESENCE>>",
"uid": "<<PRESENCE>>",
"gid": "<<PRESENCE>>"
}`)
})
t.Run("create an overlay", func(t *testing.T) {