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:
committed by
Jonathon Anderson
parent
c17fe8d512
commit
6f4fd60d8f
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
95
internal/app/wwctl/overlay/chmod/main_test.go
Normal file
95
internal/app/wwctl/overlay/chmod/main_test.go
Normal 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())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user