refactored overlay class

overlay.GetOverlay(name) returns now an error if the overlay doesn't
exist. This is the most canonical way to act if there is no overlay.
This commit is contained in:
Christian Goll
2025-08-04 15:18:51 +02:00
committed by Jonathon Anderson
parent c17fe8d512
commit 6f4fd60d8f
32 changed files with 1105 additions and 437 deletions

View File

@@ -1,21 +0,0 @@
package chmod
import (
"testing"
)
// TestArgsOverlayChmod is a regression test for 260.
// Two arguments should fail, three should succeed.
func TestArgsOverlayChmod(t *testing.T) {
command := GetCommand()
err := command.Args(command, []string{"overlay_name", "file_name"})
if err == nil {
t.Errorf("two arguments to overlay chmod should fail")
}
err = command.Args(command, []string{"overlay_name", "file_name", "0755"})
if err != nil {
t.Errorf("three arguments to overlay chmod should succeed")
}
}

View File

@@ -2,42 +2,22 @@ package chmod
import (
"fmt"
"os"
"strconv"
"github.com/spf13/cobra"
"github.com/warewulf/warewulf/internal/pkg/overlay"
"github.com/warewulf/warewulf/internal/pkg/util"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
overlayName := args[0]
fileName := args[1]
myOverlay, err := overlay.GetOverlay(args[0])
if err != nil {
return err
}
path := args[1]
permissionMode, err := strconv.ParseUint(args[2], 8, 32)
if err != nil {
return fmt.Errorf("could not convert requested mode: %s", err)
}
overlay_ := overlay.GetOverlay(overlayName)
if !overlay_.IsSiteOverlay() {
overlay_, err = overlay_.CloneSiteOverlay()
if err != nil {
return err
}
}
if !overlay_.Exists() {
return fmt.Errorf("overlay does not exist: %s", overlayName)
}
overlayFile := overlay_.File(fileName)
if !(util.IsFile(overlayFile) || util.IsDir(overlayFile)) {
return fmt.Errorf("file does not exist within overlay: %s:%s", overlayName, fileName)
}
err = os.Chmod(overlayFile, os.FileMode(permissionMode))
if err != nil {
return fmt.Errorf("could not set permission: %s", err)
}
return nil
return myOverlay.Chmod(path, permissionMode)
}

View File

@@ -0,0 +1,95 @@
package chmod
import (
"bytes"
"io/fs"
"os"
"path/filepath"
"strconv"
"testing"
"github.com/stretchr/testify/assert"
"github.com/warewulf/warewulf/internal/pkg/testenv"
"github.com/warewulf/warewulf/internal/pkg/warewulfd"
)
func Test_OverlayChmod(t *testing.T) {
tests := []struct {
name string
overlayName string
fileName string
perm string
wantErr bool
system bool
startPerm fs.FileMode
}{
{
name: "simple chmod",
overlayName: "test-overlay",
fileName: "test.txt",
perm: "0600",
wantErr: false,
system: false,
startPerm: 0644,
},
{
name: "system overlay chmod",
overlayName: "wwinit", // A known system overlay
fileName: "init.sh",
perm: "0700",
wantErr: false,
system: true,
startPerm: 0755,
},
}
warewulfd.SetNoDaemon()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
env := testenv.New(t)
conf := env.Configure()
// Setup overlay
var overlayDir string
if tt.system {
overlayDir = filepath.Join(conf.Paths.DistributionOverlaydir(), tt.overlayName)
} else {
overlayDir = filepath.Join(conf.Paths.WWOverlaydir, tt.overlayName)
}
err := os.MkdirAll(overlayDir, 0755)
assert.NoError(t, err)
filePath := filepath.Join(overlayDir, tt.fileName)
err = os.WriteFile(filePath, []byte("test"), tt.startPerm)
assert.NoError(t, err)
baseCmd := GetCommand()
baseCmd.SetArgs([]string{tt.overlayName, tt.fileName, tt.perm})
buf := new(bytes.Buffer)
baseCmd.SetOut(buf)
baseCmd.SetErr(buf)
err = baseCmd.Execute()
if tt.wantErr {
assert.Error(t, err)
} else {
assert.NoError(t, err)
}
// Check permissions
// for system overlays, the file is copied to a site overlay
if tt.system {
overlayDir = filepath.Join(conf.Paths.WWOverlaydir, tt.overlayName)
filePath = filepath.Join(overlayDir, tt.fileName)
}
stat, err := os.Stat(filePath)
assert.NoError(t, err)
if !tt.wantErr {
mode, err := strconv.ParseUint(tt.perm, 8, 32)
assert.NoError(t, err)
assert.Equal(t, fs.FileMode(mode), stat.Mode().Perm())
} else {
assert.Equal(t, tt.startPerm, stat.Mode().Perm())
}
})
}
}