diff --git a/integration/volume_copy_up_test.go b/integration/volume_copy_up_test.go index 07023c3b0..664f4de35 100644 --- a/integration/volume_copy_up_test.go +++ b/integration/volume_copy_up_test.go @@ -18,13 +18,15 @@ package integration import ( "fmt" + "io/ioutil" + "os" + "path/filepath" goruntime "runtime" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - exec "golang.org/x/sys/execabs" ) const ( @@ -69,12 +71,14 @@ func TestVolumeCopyUp(t *testing.T) { assert.Equal(t, "test_content\n", string(stdout)) t.Logf("Check host path of the volume") - // Windows paths might have spaces in them (e.g.: Program Files), which would - // cause issues for this command. This will allow us to bypass them. - hostCmd := fmt.Sprintf("find '%s/containers/%s/volumes/' -type f -print0 | xargs -0 cat", *criRoot, cn) - output, err := exec.Command("sh", "-c", hostCmd).CombinedOutput() + volumePaths, err := getHostPathForVolumes(*criRoot, cn) require.NoError(t, err) - assert.Equal(t, "test_content\n", string(output)) + assert.Equal(t, len(volumePaths), 1, "expected exactly 1 volume") + + testFilePath := filepath.Join(volumePaths[0], "test_file") + contents, err := ioutil.ReadFile(testFilePath) + require.NoError(t, err) + assert.Equal(t, "test_content\n", string(contents)) t.Logf("Update volume from inside the container") _, _, err = runtimeService.ExecSync(cn, []string{ @@ -85,9 +89,9 @@ func TestVolumeCopyUp(t *testing.T) { require.NoError(t, err) t.Logf("Check whether host path of the volume is updated") - output, err = exec.Command("sh", "-c", hostCmd).CombinedOutput() + contents, err = ioutil.ReadFile(testFilePath) require.NoError(t, err) - assert.Equal(t, "new_content\n", string(output)) + assert.Equal(t, "new_content\n", string(contents)) } func TestVolumeOwnership(t *testing.T) { @@ -140,7 +144,34 @@ func TestVolumeOwnership(t *testing.T) { assert.Equal(t, expectedContainerOutput, string(stdout)) t.Logf("Check ownership of test directory on the host") - output, err := getVolumeHostPathOwnership(*criRoot, cn) + volumePaths, err := getHostPathForVolumes(*criRoot, cn) + require.NoError(t, err) + assert.Equal(t, len(volumePaths), 1, "expected exactly 1 volume") + + output, err := getOwnership(volumePaths[0]) require.NoError(t, err) assert.Equal(t, expectedHostOutput, output) } + +func getHostPathForVolumes(criRoot, containerID string) ([]string, error) { + hostPath := filepath.Join(criRoot, "containers", containerID, "volumes") + if _, err := os.Stat(hostPath); err != nil { + return nil, err + } + + volumes, err := ioutil.ReadDir(hostPath) + if err != nil { + return nil, err + } + + if len(volumes) == 0 { + return []string{}, nil + } + + volumePaths := make([]string, len(volumes)) + for idx, volume := range volumes { + volumePaths[idx] = filepath.Join(hostPath, volume.Name()) + } + + return volumePaths, nil +} diff --git a/integration/volume_copy_up_unix_test.go b/integration/volume_copy_up_unix_test.go index e191aaa2d..1dc76abc6 100644 --- a/integration/volume_copy_up_unix_test.go +++ b/integration/volume_copy_up_unix_test.go @@ -25,8 +25,8 @@ import ( exec "golang.org/x/sys/execabs" ) -func getVolumeHostPathOwnership(criRoot, containerID string) (string, error) { - hostCmd := fmt.Sprintf("find %s/containers/%s/volumes/* | xargs stat -c %%U:%%G", criRoot, containerID) +func getOwnership(path string) (string, error) { + hostCmd := fmt.Sprintf("stat -c %%U:%%G '%s'", path) output, err := exec.Command("sh", "-c", hostCmd).CombinedOutput() if err != nil { return "", err diff --git a/integration/volume_copy_up_windows_test.go b/integration/volume_copy_up_windows_test.go index f879b53aa..3ea5b2b18 100644 --- a/integration/volume_copy_up_windows_test.go +++ b/integration/volume_copy_up_windows_test.go @@ -20,31 +20,12 @@ package integration import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "golang.org/x/sys/windows" ) -func getVolumeHostPathOwnership(criRoot, containerID string) (string, error) { - hostPath := fmt.Sprintf("%s/containers/%s/volumes/", criRoot, containerID) - if _, err := os.Stat(hostPath); err != nil { - return "", err - } - - volumes, err := ioutil.ReadDir(hostPath) - if err != nil { - return "", err - } - - if len(volumes) != 1 { - return "", fmt.Errorf("expected to find exactly 1 volume (got %d)", len(volumes)) - } - +func getOwnership(path string) (string, error) { secInfo, err := windows.GetNamedSecurityInfo( - filepath.Join(hostPath, volumes[0].Name()), windows.SE_FILE_OBJECT, + path, windows.SE_FILE_OBJECT, windows.OWNER_SECURITY_INFORMATION|windows.DACL_SECURITY_INFORMATION) if err != nil {