From 832b4408a596dca81a88ee21619a8378baa42cd8 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 9 Nov 2013 21:26:05 -0800 Subject: [PATCH] builder/docker: verify docker is available on path --- builder/docker/builder.go | 9 ++++++--- builder/docker/driver.go | 3 +++ builder/docker/driver_docker.go | 8 ++++++++ builder/docker/driver_mock.go | 7 +++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/builder/docker/builder.go b/builder/docker/builder.go index 824f1697f..0cf9d6aa9 100644 --- a/builder/docker/builder.go +++ b/builder/docker/builder.go @@ -25,6 +25,11 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { } func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { + driver := &DockerDriver{Ui: ui} + if err := driver.Verify(); err != nil { + return nil, err + } + steps := []multistep.Step{ &StepTempDir{}, &StepPull{}, @@ -40,9 +45,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe state.Put("ui", ui) // Setup the driver that will talk to Docker - state.Put("driver", &DockerDriver{ - Ui: ui, - }) + state.Put("driver", driver) // Run! if b.config.PackerDebug { diff --git a/builder/docker/driver.go b/builder/docker/driver.go index 04f4e3fd5..c19a8823b 100644 --- a/builder/docker/driver.go +++ b/builder/docker/driver.go @@ -20,6 +20,9 @@ type Driver interface { // StopContainer forcibly stops a container. StopContainer(id string) error + + // Verify verifies that the driver can run + Verify() error } // ContainerConfig is the configuration used to start a container. diff --git a/builder/docker/driver_docker.go b/builder/docker/driver_docker.go index 932d46101..91e367acc 100644 --- a/builder/docker/driver_docker.go +++ b/builder/docker/driver_docker.go @@ -82,3 +82,11 @@ func (d *DockerDriver) StartContainer(config *ContainerConfig) (string, error) { func (d *DockerDriver) StopContainer(id string) error { return exec.Command("docker", "kill", id).Run() } + +func (d *DockerDriver) Verify() error { + if _, err := exec.LookPath("docker"); err != nil { + return err + } + + return nil +} diff --git a/builder/docker/driver_mock.go b/builder/docker/driver_mock.go index 9cf2fb31b..be28d680d 100644 --- a/builder/docker/driver_mock.go +++ b/builder/docker/driver_mock.go @@ -12,6 +12,7 @@ type MockDriver struct { StartID string StartError error StopError error + VerifyError error ExportCalled bool ExportID string @@ -21,6 +22,7 @@ type MockDriver struct { StartConfig *ContainerConfig StopCalled bool StopID string + VerifyCalled bool } func (d *MockDriver) Export(id string, dst io.Writer) error { @@ -54,3 +56,8 @@ func (d *MockDriver) StopContainer(id string) error { d.StopID = id return d.StopError } + +func (d *MockDriver) Verify() error { + d.VerifyCalled = true + return d.VerifyError +}