diff --git a/vendor/k8s.io/kubernetes/pkg/volume/git_repo/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/git_repo/BUILD
index 38ae008ad14c..e765cb03c6e8 100644
--- a/vendor/k8s.io/kubernetes/pkg/volume/git_repo/BUILD
+++ b/vendor/k8s.io/kubernetes/pkg/volume/git_repo/BUILD
@@ -14,12 +14,12 @@ go_library(
],
importpath = "k8s.io/kubernetes/pkg/volume/git_repo",
deps = [
- "//pkg/util/mount:go_default_library",
"//pkg/util/strings:go_default_library",
"//pkg/volume:go_default_library",
"//pkg/volume/util:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
+ "//vendor/k8s.io/utils/exec:go_default_library",
],
)
@@ -28,13 +28,14 @@ go_test(
srcs = ["git_repo_test.go"],
embed = [":go_default_library"],
deps = [
- "//pkg/util/mount:go_default_library",
"//pkg/volume:go_default_library",
"//pkg/volume/empty_dir:go_default_library",
"//pkg/volume/testing:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
+ "//vendor/k8s.io/utils/exec:go_default_library",
+ "//vendor/k8s.io/utils/exec/testing:go_default_library",
],
)
diff --git a/vendor/k8s.io/kubernetes/pkg/volume/git_repo/git_repo.go b/vendor/k8s.io/kubernetes/pkg/volume/git_repo/git_repo.go
index e432befb3c59..94f174862b50 100644
--- a/vendor/k8s.io/kubernetes/pkg/volume/git_repo/git_repo.go
+++ b/vendor/k8s.io/kubernetes/pkg/volume/git_repo/git_repo.go
@@ -24,10 +24,10 @@ import (
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types"
- "k8s.io/kubernetes/pkg/util/mount"
utilstrings "k8s.io/kubernetes/pkg/util/strings"
"k8s.io/kubernetes/pkg/volume"
volumeutil "k8s.io/kubernetes/pkg/volume/util"
+ "k8s.io/utils/exec"
)
// This is the primary entrypoint for volume plugins.
@@ -100,8 +100,7 @@ func (plugin *gitRepoPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, opts vol
source: spec.Volume.GitRepo.Repository,
revision: spec.Volume.GitRepo.Revision,
target: spec.Volume.GitRepo.Directory,
- mounter: plugin.host.GetMounter(plugin.GetPluginName()),
- exec: plugin.host.GetExec(plugin.GetPluginName()),
+ exec: exec.New(),
opts: opts,
}, nil
}
@@ -150,8 +149,7 @@ type gitRepoVolumeMounter struct {
source string
revision string
target string
- mounter mount.Interface
- exec mount.Exec
+ exec exec.Interface
opts volume.VolumeOptions
}
@@ -197,7 +195,7 @@ func (b *gitRepoVolumeMounter) SetUpAt(dir string, fsGroup *int64) error {
if len(b.target) != 0 {
args = append(args, b.target)
}
- if output, err := b.execGit(args, dir); err != nil {
+ if output, err := b.execCommand("git", args, dir); err != nil {
return fmt.Errorf("failed to exec 'git %s': %s: %v",
strings.Join(args, " "), output, err)
}
@@ -227,10 +225,10 @@ func (b *gitRepoVolumeMounter) SetUpAt(dir string, fsGroup *int64) error {
return fmt.Errorf("unexpected directory contents: %v", files)
}
- if output, err := b.execGit([]string{"checkout", b.revision}, subdir); err != nil {
+ if output, err := b.execCommand("git", []string{"checkout", b.revision}, subdir); err != nil {
return fmt.Errorf("failed to exec 'git checkout %s': %s: %v", b.revision, output, err)
}
- if output, err := b.execGit([]string{"reset", "--hard"}, subdir); err != nil {
+ if output, err := b.execCommand("git", []string{"reset", "--hard"}, subdir); err != nil {
return fmt.Errorf("failed to exec 'git reset --hard': %s: %v", output, err)
}
@@ -244,10 +242,10 @@ func (b *gitRepoVolumeMounter) getMetaDir() string {
return path.Join(b.plugin.host.GetPodPluginDir(b.podUID, utilstrings.EscapeQualifiedNameForDisk(gitRepoPluginName)), b.volName)
}
-func (b *gitRepoVolumeMounter) execGit(args []string, dir string) ([]byte, error) {
- // run git -C
- fullArgs := append([]string{"-C", dir}, args...)
- return b.exec.Run("git", fullArgs...)
+func (b *gitRepoVolumeMounter) execCommand(command string, args []string, dir string) ([]byte, error) {
+ cmd := b.exec.Command(command, args...)
+ cmd.SetDir(dir)
+ return cmd.CombinedOutput()
}
// gitRepoVolumeUnmounter cleans git repo volumes.
diff --git a/vendor/k8s.io/kubernetes/pkg/volume/git_repo/git_repo_test.go b/vendor/k8s.io/kubernetes/pkg/volume/git_repo/git_repo_test.go
index 46e4c13379cc..8c6a41a1c1e3 100644
--- a/vendor/k8s.io/kubernetes/pkg/volume/git_repo/git_repo_test.go
+++ b/vendor/k8s.io/kubernetes/pkg/volume/git_repo/git_repo_test.go
@@ -28,16 +28,11 @@ import (
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
- "k8s.io/kubernetes/pkg/util/mount"
"k8s.io/kubernetes/pkg/volume"
"k8s.io/kubernetes/pkg/volume/empty_dir"
volumetest "k8s.io/kubernetes/pkg/volume/testing"
-)
-
-const (
- gitUrl = "https://github.com/kubernetes/kubernetes.git"
- revision = "2a30ce65c5ab586b98916d83385c5983edd353a1"
- gitRepositoryName = "kubernetes"
+ "k8s.io/utils/exec"
+ fakeexec "k8s.io/utils/exec/testing"
)
func newTestHost(t *testing.T) (string, volume.VolumeHost) {
@@ -67,18 +62,23 @@ func TestCanSupport(t *testing.T) {
}
// Expected command
-type expectedCommand []string
-
-type testScenario struct {
- name string
- vol *v1.Volume
- repositoryDir string
- expecteds []expectedCommand
- isExpectedFailure bool
+type expectedCommand struct {
+ // The git command
+ cmd []string
+ // The dir of git command is executed
+ dir string
}
func TestPlugin(t *testing.T) {
- scenarios := []testScenario{
+ gitUrl := "https://github.com/kubernetes/kubernetes.git"
+ revision := "2a30ce65c5ab586b98916d83385c5983edd353a1"
+
+ scenarios := []struct {
+ name string
+ vol *v1.Volume
+ expecteds []expectedCommand
+ isExpectedFailure bool
+ }{
{
name: "target-dir",
vol: &v1.Volume{
@@ -91,11 +91,19 @@ func TestPlugin(t *testing.T) {
},
},
},
- repositoryDir: "target_dir",
expecteds: []expectedCommand{
- []string{"git", "-C", "volume-dir", "clone", gitUrl, "target_dir"},
- []string{"git", "-C", "volume-dir/target_dir", "checkout", revision},
- []string{"git", "-C", "volume-dir/target_dir", "reset", "--hard"},
+ {
+ cmd: []string{"git", "clone", gitUrl, "target_dir"},
+ dir: "",
+ },
+ {
+ cmd: []string{"git", "checkout", revision},
+ dir: "/target_dir",
+ },
+ {
+ cmd: []string{"git", "reset", "--hard"},
+ dir: "/target_dir",
+ },
},
isExpectedFailure: false,
},
@@ -110,9 +118,11 @@ func TestPlugin(t *testing.T) {
},
},
},
- repositoryDir: "target_dir",
expecteds: []expectedCommand{
- []string{"git", "-C", "volume-dir", "clone", gitUrl, "target_dir"},
+ {
+ cmd: []string{"git", "clone", gitUrl, "target_dir"},
+ dir: "",
+ },
},
isExpectedFailure: false,
},
@@ -126,9 +136,11 @@ func TestPlugin(t *testing.T) {
},
},
},
- repositoryDir: "kubernetes",
expecteds: []expectedCommand{
- []string{"git", "-C", "volume-dir", "clone", gitUrl},
+ {
+ cmd: []string{"git", "clone", gitUrl},
+ dir: "",
+ },
},
isExpectedFailure: false,
},
@@ -144,11 +156,19 @@ func TestPlugin(t *testing.T) {
},
},
},
- repositoryDir: "kubernetes",
expecteds: []expectedCommand{
- []string{"git", "-C", "volume-dir", "clone", gitUrl},
- []string{"git", "-C", "volume-dir/kubernetes", "checkout", revision},
- []string{"git", "-C", "volume-dir/kubernetes", "reset", "--hard"},
+ {
+ cmd: []string{"git", "clone", gitUrl},
+ dir: "",
+ },
+ {
+ cmd: []string{"git", "checkout", revision},
+ dir: "/kubernetes",
+ },
+ {
+ cmd: []string{"git", "reset", "--hard"},
+ dir: "/kubernetes",
+ },
},
isExpectedFailure: false,
},
@@ -164,11 +184,19 @@ func TestPlugin(t *testing.T) {
},
},
},
- repositoryDir: "",
expecteds: []expectedCommand{
- []string{"git", "-C", "volume-dir", "clone", gitUrl, "."},
- []string{"git", "-C", "volume-dir", "checkout", revision},
- []string{"git", "-C", "volume-dir", "reset", "--hard"},
+ {
+ cmd: []string{"git", "clone", gitUrl, "."},
+ dir: "",
+ },
+ {
+ cmd: []string{"git", "checkout", revision},
+ dir: "",
+ },
+ {
+ cmd: []string{"git", "reset", "--hard"},
+ dir: "",
+ },
},
isExpectedFailure: false,
},
@@ -186,7 +214,12 @@ func TestPlugin(t *testing.T) {
}
-func doTestPlugin(scenario testScenario, t *testing.T) []error {
+func doTestPlugin(scenario struct {
+ name string
+ vol *v1.Volume
+ expecteds []expectedCommand
+ isExpectedFailure bool
+}, t *testing.T) []error {
allErrs := []error{}
plugMgr := volume.VolumePluginMgr{}
@@ -278,42 +311,73 @@ func doTestPlugin(scenario testScenario, t *testing.T) []error {
return allErrs
}
-func doTestSetUp(scenario testScenario, mounter volume.Mounter) []error {
+func doTestSetUp(scenario struct {
+ name string
+ vol *v1.Volume
+ expecteds []expectedCommand
+ isExpectedFailure bool
+}, mounter volume.Mounter) []error {
expecteds := scenario.expecteds
allErrs := []error{}
- var commandLog []expectedCommand
- execCallback := func(cmd string, args ...string) ([]byte, error) {
- if len(args) < 2 {
- return nil, fmt.Errorf("expected at least 2 arguments, got %q", args)
- }
- if args[0] != "-C" {
- return nil, fmt.Errorf("expected the first argument to be \"-C\", got %q", args[0])
- }
- // command is 'git -C
- gitDir := args[1]
- gitCommand := args[2]
- if gitCommand == "clone" {
- // Clone creates a directory
- if scenario.repositoryDir != "" {
- os.MkdirAll(path.Join(gitDir, scenario.repositoryDir), 0750)
- }
+ // Construct combined outputs from expected commands
+ var fakeOutputs []fakeexec.FakeCombinedOutputAction
+ var fcmd fakeexec.FakeCmd
+ for _, expected := range expecteds {
+ if expected.cmd[1] == "clone" {
+ fakeOutputs = append(fakeOutputs, func() ([]byte, error) {
+ // git clone, it creates new dir/files
+ os.MkdirAll(path.Join(fcmd.Dirs[0], expected.dir), 0750)
+ return []byte{}, nil
+ })
+ } else {
+ // git checkout || git reset, they create nothing
+ fakeOutputs = append(fakeOutputs, func() ([]byte, error) {
+ return []byte{}, nil
+ })
}
- // add the command to log with de-randomized gitDir
- args[1] = strings.Replace(gitDir, mounter.GetPath(), "volume-dir", 1)
- cmdline := append([]string{cmd}, args...)
- commandLog = append(commandLog, cmdline)
- return []byte{}, nil
}
+ fcmd = fakeexec.FakeCmd{
+ CombinedOutputScript: fakeOutputs,
+ }
+
+ // Construct fake exec outputs from fcmd
+ var fakeAction []fakeexec.FakeCommandAction
+ for i := 0; i < len(expecteds); i++ {
+ fakeAction = append(fakeAction, func(cmd string, args ...string) exec.Cmd {
+ return fakeexec.InitFakeCmd(&fcmd, cmd, args...)
+ })
+
+ }
+ fake := fakeexec.FakeExec{
+ CommandScript: fakeAction,
+ }
+
g := mounter.(*gitRepoVolumeMounter)
- g.mounter = &mount.FakeMounter{}
- g.exec = mount.NewFakeExec(execCallback)
+ g.exec = &fake
g.SetUp(nil)
- if !reflect.DeepEqual(expecteds, commandLog) {
+ if fake.CommandCalls != len(expecteds) {
+ allErrs = append(allErrs,
+ fmt.Errorf("unexpected command calls in scenario: expected %d, saw: %d", len(expecteds), fake.CommandCalls))
+ }
+ var expectedCmds [][]string
+ for _, expected := range expecteds {
+ expectedCmds = append(expectedCmds, expected.cmd)
+ }
+ if !reflect.DeepEqual(expectedCmds, fcmd.CombinedOutputLog) {
+ allErrs = append(allErrs,
+ fmt.Errorf("unexpected commands: %v, expected: %v", fcmd.CombinedOutputLog, expectedCmds))
+ }
+
+ var expectedPaths []string
+ for _, expected := range expecteds {
+ expectedPaths = append(expectedPaths, g.GetPath()+expected.dir)
+ }
+ if len(fcmd.Dirs) != len(expectedPaths) || !reflect.DeepEqual(expectedPaths, fcmd.Dirs) {
allErrs = append(allErrs,
- fmt.Errorf("unexpected commands: %v, expected: %v", commandLog, expecteds))
+ fmt.Errorf("unexpected directories: %v, expected: %v", fcmd.Dirs, expectedPaths))
}
return allErrs