From 8fd93030b4b9ad20a6ddea2b52d63214b3f9d50b Mon Sep 17 00:00:00 2001 From: Jeffrey Regan Date: Thu, 18 Oct 2018 09:54:45 -0700 Subject: [PATCH] Delete unused exec package. --- pkg/exec/doc.go | 21 ---- pkg/exec/exec.go | 217 ------------------------------------------ pkg/exec/exec_test.go | 141 --------------------------- pkg/exec/new_test.go | 35 ------- 4 files changed, 414 deletions(-) delete mode 100644 pkg/exec/doc.go delete mode 100644 pkg/exec/exec.go delete mode 100644 pkg/exec/exec_test.go delete mode 100644 pkg/exec/new_test.go diff --git a/pkg/exec/doc.go b/pkg/exec/doc.go deleted file mode 100644 index 391b5d4ec..000000000 --- a/pkg/exec/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package exec provides an injectable interface and implementations for running commands. -// TODO: delete this package, use k8s.io/utils/exec instead. -// That package was copied here as a temporary workaround to make progress on b/80488884 -// (avoid the need to import exec first). -package exec diff --git a/pkg/exec/exec.go b/pkg/exec/exec.go deleted file mode 100644 index 9cc58d930..000000000 --- a/pkg/exec/exec.go +++ /dev/null @@ -1,217 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package exec - -import ( - "context" - "io" - osexec "os/exec" - "syscall" - "time" -) - -// ErrExecutableNotFound is returned if the executable is not found. -var ErrExecutableNotFound = osexec.ErrNotFound - -// Interface is an interface that presents a subset of the os/exec API. Use this -// when you want to inject fakeable/mockable exec behavior. -type Interface interface { - // Command returns a Cmd instance which can be used to run a single command. - // This follows the pattern of package os/exec. - Command(cmd string, args ...string) Cmd - - // CommandContext returns a Cmd instance which can be used to run a single command. - // - // The provided context is used to kill the process if the context becomes done - // before the command completes on its own. For example, a timeout can be set in - // the context. - CommandContext(ctx context.Context, cmd string, args ...string) Cmd - - // LookPath wraps os/exec.LookPath - LookPath(file string) (string, error) -} - -// Cmd is an interface that presents an API that is very similar to Cmd from os/exec. -// As more functionality is needed, this can grow. Since Cmd is a struct, we will have -// to replace fields with get/set method pairs. -type Cmd interface { - // Run runs the command to the completion. - Run() error - // CombinedOutput runs the command and returns its combined standard output - // and standard error. This follows the pattern of package os/exec. - CombinedOutput() ([]byte, error) - // Output runs the command and returns standard output, but not standard err - Output() ([]byte, error) - SetDir(dir string) - SetStdin(in io.Reader) - SetStdout(out io.Writer) - SetStderr(out io.Writer) - // Stops the command by sending SIGTERM. It is not guaranteed the - // process will stop before this function returns. If the process is not - // responding, an internal timer function will send a SIGKILL to force - // terminate after 10 seconds. - Stop() -} - -// ExitError is an interface that presents an API similar to os.ProcessState, which is -// what ExitError from os/exec is. This is designed to make testing a bit easier and -// probably loses some of the cross-platform properties of the underlying library. -type ExitError interface { - String() string - Error() string - Exited() bool - ExitStatus() int -} - -// Implements Interface in terms of really exec()ing. -type executor struct{} - -// New returns a new Interface which will os/exec to run commands. -func New() Interface { - return &executor{} -} - -// Command is part of the Interface interface. -func (executor *executor) Command(cmd string, args ...string) Cmd { - return (*cmdWrapper)(osexec.Command(cmd, args...)) -} - -// CommandContext is part of the Interface interface. -func (executor *executor) CommandContext(ctx context.Context, cmd string, args ...string) Cmd { - return (*cmdWrapper)(osexec.CommandContext(ctx, cmd, args...)) -} - -// LookPath is part of the Interface interface -func (executor *executor) LookPath(file string) (string, error) { - return osexec.LookPath(file) -} - -// Wraps exec.Cmd so we can capture errors. -type cmdWrapper osexec.Cmd - -var _ Cmd = &cmdWrapper{} - -func (cmd *cmdWrapper) SetDir(dir string) { - cmd.Dir = dir -} - -func (cmd *cmdWrapper) SetStdin(in io.Reader) { - cmd.Stdin = in -} - -func (cmd *cmdWrapper) SetStdout(out io.Writer) { - cmd.Stdout = out -} - -func (cmd *cmdWrapper) SetStderr(out io.Writer) { - cmd.Stderr = out -} - -// Run is part of the Cmd interface. -func (cmd *cmdWrapper) Run() error { - err := (*osexec.Cmd)(cmd).Run() - return handleError(err) -} - -// CombinedOutput is part of the Cmd interface. -func (cmd *cmdWrapper) CombinedOutput() ([]byte, error) { - out, err := (*osexec.Cmd)(cmd).CombinedOutput() - return out, handleError(err) -} - -func (cmd *cmdWrapper) Output() ([]byte, error) { - out, err := (*osexec.Cmd)(cmd).Output() - return out, handleError(err) -} - -// Stop is part of the Cmd interface. -func (cmd *cmdWrapper) Stop() { - c := (*osexec.Cmd)(cmd) - - if c.Process == nil { - return - } - - c.Process.Signal(syscall.SIGTERM) - - time.AfterFunc(10*time.Second, func() { - if !c.ProcessState.Exited() { - c.Process.Signal(syscall.SIGKILL) - } - }) -} - -func handleError(err error) error { - if err == nil { - return nil - } - - switch e := err.(type) { - case *osexec.ExitError: - return &ExitErrorWrapper{e} - case *osexec.Error: - if e.Err == osexec.ErrNotFound { - return ErrExecutableNotFound - } - } - - return err -} - -// ExitErrorWrapper is an implementation of ExitError in terms of os/exec ExitError. -// Note: standard exec.ExitError is type *os.ProcessState, which already implements Exited(). -type ExitErrorWrapper struct { - *osexec.ExitError -} - -var _ ExitError = &ExitErrorWrapper{} - -// ExitStatus is part of the ExitError interface. -func (eew ExitErrorWrapper) ExitStatus() int { - ws, ok := eew.Sys().(syscall.WaitStatus) - if !ok { - panic("can't call ExitStatus() on a non-WaitStatus exitErrorWrapper") - } - return ws.ExitStatus() -} - -// CodeExitError is an implementation of ExitError consisting of an error object -// and an exit code (the upper bits of os.exec.ExitStatus). -type CodeExitError struct { - Err error - Code int -} - -var _ ExitError = CodeExitError{} - -func (e CodeExitError) Error() string { - return e.Err.Error() -} - -func (e CodeExitError) String() string { - return e.Err.Error() -} - -// Exited returns true. -func (e CodeExitError) Exited() bool { - return true -} - -// ExitStatus delegates to Code. -func (e CodeExitError) ExitStatus() int { - return e.Code -} diff --git a/pkg/exec/exec_test.go b/pkg/exec/exec_test.go deleted file mode 100644 index 5a2209e75..000000000 --- a/pkg/exec/exec_test.go +++ /dev/null @@ -1,141 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package exec - -import ( - "context" - osexec "os/exec" - "testing" - "time" -) - -func TestExecutorNoArgs(t *testing.T) { - ex := New() - - cmd := ex.Command("true") - out, err := cmd.CombinedOutput() - if err != nil { - t.Errorf("expected success, got %v", err) - } - if len(out) != 0 { - t.Errorf("expected no output, got %q", string(out)) - } - - cmd = ex.Command("false") - out, err = cmd.CombinedOutput() - if err == nil { - t.Errorf("expected failure, got nil error") - } - if len(out) != 0 { - t.Errorf("expected no output, got %q", string(out)) - } - ee, ok := err.(ExitError) - if !ok { - t.Errorf("expected an ExitError, got %+v", err) - } - if ee.Exited() { - if code := ee.ExitStatus(); code != 1 { - t.Errorf("expected exit status 1, got %d", code) - } - } - - cmd = ex.Command("/does/not/exist") - _, err = cmd.CombinedOutput() - if err == nil { - t.Errorf("expected failure, got nil error") - } - if ee, ok := err.(ExitError); ok { - t.Errorf("expected non-ExitError, got %+v", ee) - } -} - -func TestExecutorWithArgs(t *testing.T) { - ex := New() - - cmd := ex.Command("echo", "stdout") - out, err := cmd.CombinedOutput() - if err != nil { - t.Errorf("expected success, got %+v", err) - } - if string(out) != "stdout\n" { - t.Errorf("unexpected output: %q", string(out)) - } - - cmd = ex.Command("/bin/sh", "-c", "echo stderr > /dev/stderr") - out, err = cmd.CombinedOutput() - if err != nil { - t.Errorf("expected success, got %+v", err) - } - if string(out) != "stderr\n" { - t.Errorf("unexpected output: %q", string(out)) - } -} - -func TestLookPath(t *testing.T) { - ex := New() - - shExpected, _ := osexec.LookPath("sh") - sh, _ := ex.LookPath("sh") - if sh != shExpected { - t.Errorf("unexpected result for LookPath: got %s, expected %s", sh, shExpected) - } -} - -func TestExecutableNotFound(t *testing.T) { - exec := New() - - cmd := exec.Command("fake_executable_name") - _, err := cmd.CombinedOutput() - if err != ErrExecutableNotFound { - t.Errorf("cmd.CombinedOutput(): Expected error ErrExecutableNotFound but got %v", err) - } - - cmd = exec.Command("fake_executable_name") - _, err = cmd.Output() - if err != ErrExecutableNotFound { - t.Errorf("cmd.Output(): Expected error ErrExecutableNotFound but got %v", err) - } - - cmd = exec.Command("fake_executable_name") - err = cmd.Run() - if err != ErrExecutableNotFound { - t.Errorf("cmd.Run(): Expected error ErrExecutableNotFound but got %v", err) - } -} - -func TestStopBeforeStart(t *testing.T) { - cmd := New().Command("echo", "hello") - - // no panic calling Stop before calling Run - cmd.Stop() - - cmd.Run() - - // no panic calling Stop after command is done - cmd.Stop() -} - -func TestTimeout(t *testing.T) { - exec := New() - ctx, cancel := context.WithTimeout(context.Background(), time.Nanosecond) - defer cancel() - - err := exec.CommandContext(ctx, "sleep", "2").Run() - if err != context.DeadlineExceeded { - t.Errorf("expected %v but got %v", context.DeadlineExceeded, err) - } -} diff --git a/pkg/exec/new_test.go b/pkg/exec/new_test.go deleted file mode 100644 index 90d5a823a..000000000 --- a/pkg/exec/new_test.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package exec_test - -import ( - "bytes" - "fmt" - - "sigs.k8s.io/kustomize/pkg/exec" -) - -func ExampleNew() { - cmd := exec.New().Command("echo", "Bonjour!") - buff := bytes.Buffer{} - cmd.SetStdout(&buff) - if err := cmd.Run(); err != nil { - panic(err) - } - fmt.Println(buff.String()) - // Output: Bonjour! -}