From 13be373ce70ee5b90da6989b84f1a6c507e40706 Mon Sep 17 00:00:00 2001 From: Pradeep Sawlani Date: Fri, 5 Apr 2019 17:42:17 -0700 Subject: [PATCH] For windows, use exec.Command instead of syscall.Execve. sycall.Execve is not supported on windows. --- pkg/kubectl/cmd/cmd.go | 24 +++++++++++++++---- pkg/kubectl/cmd/cmd_test.go | 4 ++-- test/cmd/plugins.sh | 4 ++++ .../pkg/kubectl/plugins/bar/kubectl-bar | 3 +++ 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100755 test/fixtures/pkg/kubectl/plugins/bar/kubectl-bar diff --git a/pkg/kubectl/cmd/cmd.go b/pkg/kubectl/cmd/cmd.go index 9e8a51638ab..3378ae13463 100644 --- a/pkg/kubectl/cmd/cmd.go +++ b/pkg/kubectl/cmd/cmd.go @@ -22,6 +22,7 @@ import ( "io" "os" "os/exec" + "runtime" "strings" "syscall" @@ -364,7 +365,24 @@ func (h *DefaultPluginHandler) Lookup(filename string) (string, bool) { // Execute implements PluginHandler func (h *DefaultPluginHandler) Execute(executablePath string, cmdArgs, environment []string) error { - return syscall.Exec(executablePath, cmdArgs, environment) + + // Windows does not support exec syscall. + if runtime.GOOS == "windows" { + cmd := exec.Command(executablePath, cmdArgs...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Stdin = os.Stdin + cmd.Env = environment + err := cmd.Run() + if err == nil { + os.Exit(0) + } + return err + } + + // invoke cmd binary relaying the environment and args given + // append executablePath to cmdArgs, as execve will make first argument the "binary name". + return syscall.Exec(executablePath, append([]string{executablePath}, cmdArgs...), environment) } // HandlePluginCommand receives a pluginHandler and command-line arguments and attempts to find @@ -398,9 +416,7 @@ func HandlePluginCommand(pluginHandler PluginHandler, cmdArgs []string) error { } // invoke cmd binary relaying the current environment and args given - // remainingArgs will always have at least one element. - // execve will make remainingArgs[0] the "binary name". - if err := pluginHandler.Execute(foundBinaryPath, append([]string{foundBinaryPath}, cmdArgs[len(remainingArgs):]...), os.Environ()); err != nil { + if err := pluginHandler.Execute(foundBinaryPath, cmdArgs[len(remainingArgs):], os.Environ()); err != nil { return err } diff --git a/pkg/kubectl/cmd/cmd_test.go b/pkg/kubectl/cmd/cmd_test.go index fab6dc6d361..6d402c44614 100644 --- a/pkg/kubectl/cmd/cmd_test.go +++ b/pkg/kubectl/cmd/cmd_test.go @@ -125,7 +125,7 @@ func TestKubectlCommandHandlesPlugins(t *testing.T) { name: "test that a plugin executable is found based on command args", args: []string{"kubectl", "foo", "--bar"}, expectPlugin: "plugin/testdata/kubectl-foo", - expectPluginArgs: []string{"foo", "--bar"}, + expectPluginArgs: []string{"--bar"}, }, { name: "test that a plugin does not execute over an existing command by the same name", @@ -158,7 +158,7 @@ func TestKubectlCommandHandlesPlugins(t *testing.T) { } if len(pluginsHandler.withArgs) != len(test.expectPluginArgs) { - t.Fatalf("unexpected plugin execution args: expedcted %q, got %q", test.expectPluginArgs, pluginsHandler.withArgs) + t.Fatalf("unexpected plugin execution args: expected %q, got %q", test.expectPluginArgs, pluginsHandler.withArgs) } }) } diff --git a/test/cmd/plugins.sh b/test/cmd/plugins.sh index a389eaf6b40..83c03e3bd73 100755 --- a/test/cmd/plugins.sh +++ b/test/cmd/plugins.sh @@ -44,6 +44,10 @@ run_plugins_tests() { output_message=$(PATH=${PATH}:"test/fixtures/pkg/kubectl/plugins" kubectl foo) kube::test::if_has_string "${output_message}" 'plugin foo' + # check arguments passed to the plugin + output_message=$(PATH=${PATH}:"test/fixtures/pkg/kubectl/plugins/bar" kubectl bar arg1) + kube::test::if_has_string "${output_message}" 'test/fixtures/pkg/kubectl/plugins/bar/kubectl-bar arg1' + # ensure that a kubectl command supersedes a plugin that overshadows it output_message=$(PATH=${PATH}:"test/fixtures/pkg/kubectl/plugins/version" kubectl version) kube::test::if_has_string "${output_message}" 'Client Version' diff --git a/test/fixtures/pkg/kubectl/plugins/bar/kubectl-bar b/test/fixtures/pkg/kubectl/plugins/bar/kubectl-bar new file mode 100755 index 00000000000..c4eb0becac5 --- /dev/null +++ b/test/fixtures/pkg/kubectl/plugins/bar/kubectl-bar @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "I am plugin bar called with args $0 $@"