diff --git a/pkg/driver/command_driver_nix.go b/pkg/driver/command_driver_nix.go new file mode 100644 index 00000000..046f709e --- /dev/null +++ b/pkg/driver/command_driver_nix.go @@ -0,0 +1,20 @@ +// +build !windows + +package driver + +import ( + "fmt" + "os" + "os/exec" +) + +// CheckDriverExists checks to see if the named driver exists +func (d *CommandDriver) CheckDriverExists() bool { + cmd := exec.Command("/bin/sh", "-c", fmt.Sprintf("command -v %s", d.cliName())) + cmd.Env = os.Environ() + if err := cmd.Run(); err != nil { + return false + } + + return true +} diff --git a/pkg/driver/command_driver_test.go b/pkg/driver/command_driver_test.go index 9c1266bb..12089927 100644 --- a/pkg/driver/command_driver_test.go +++ b/pkg/driver/command_driver_test.go @@ -1,5 +1,46 @@ package driver -import "github.com/deislabs/cnab-go/driver" +import ( + "fmt" + "io/ioutil" + "os" + "strings" + "testing" + + "github.com/deislabs/cnab-go/driver" +) var _ driver.Driver = &CommandDriver{} + +func TestCheckDriverExists(t *testing.T) { + name := "missing-driver" + cmddriver := &CommandDriver{Name: name} + if cmddriver.CheckDriverExists() { + t.Errorf("Expected driver %s not to exist", name) + } + + name = "existing-driver" + cmddriver = &CommandDriver{Name: name} + dirname, err := ioutil.TempDir("", "duffle") + if err != nil { + t.Fatal(err) + } + + defer os.RemoveAll(dirname) + filename := fmt.Sprintf("%s/duffle-%s", dirname, name) + newfile, err := os.Create(filename) + if err != nil { + t.Fatal(err) + } + + newfile.Chmod(0755) + path := os.Getenv("PATH") + pathlist := []string{dirname, path} + newpath := strings.Join(pathlist, string(os.PathListSeparator)) + defer os.Setenv("PATH", path) + os.Setenv("PATH", newpath) + if !cmddriver.CheckDriverExists() { + t.Fatalf("Expected driver %s to exist", name) + } + +} diff --git a/pkg/driver/command_driver_windows.go b/pkg/driver/command_driver_windows.go new file mode 100644 index 00000000..b423dd5d --- /dev/null +++ b/pkg/driver/command_driver_windows.go @@ -0,0 +1,19 @@ +// +build windows + +package driver + +import ( + "os" + "os/exec" +) + +// CheckDriverExists checks to see if the named driver exists +func (d *CommandDriver) CheckDriverExists() bool { + cmd := exec.Command("where", d.cliName()) + cmd.Env = os.Environ() + if err := cmd.Run(); err != nil { + return false + } + + return true +} diff --git a/pkg/driver/lookup.go b/pkg/driver/lookup.go index 362eb72e..512a7fbd 100644 --- a/pkg/driver/lookup.go +++ b/pkg/driver/lookup.go @@ -15,9 +15,12 @@ func Lookup(name string) (driver.Driver, error) { return &KubernetesDriver{}, nil case "debug": return &driver.DebugDriver{}, nil - case "command": - return &CommandDriver{Name: name}, nil default: - return nil, fmt.Errorf("unsupported driver: %s", name) + cmddriver := &CommandDriver{Name: name} + if cmddriver.CheckDriverExists() { + return cmddriver, nil + } + + return nil, fmt.Errorf("unsupported driver or driver not found in PATH: %s", name) } }