From 90a57c411fba78acc3ef1f565b46f2cf00e96a83 Mon Sep 17 00:00:00 2001 From: Julian Phillips Date: Sun, 19 Jan 2014 18:32:44 +0000 Subject: [PATCH] Expand Artifact API to expose build state In order that something consuming an artifact can have access to extra builder specific data add the State method which allows the caller to ask for arbitary values by name. --- builder/amazon/common/artifact.go | 4 ++++ builder/digitalocean/artifact.go | 4 ++++ builder/docker/artifact_export.go | 4 ++++ builder/docker/artifact_import.go | 4 ++++ builder/googlecompute/artifact.go | 4 ++++ builder/null/artifact_export.go | 4 ++++ builder/openstack/artifact.go | 4 ++++ builder/parallels/common/artifact.go | 4 ++++ builder/qemu/artifact.go | 4 ++++ builder/virtualbox/common/artifact.go | 4 ++++ builder/vmware/common/artifact.go | 4 ++++ builder/vmware/iso/artifact.go | 4 ++++ packer/artifact.go | 4 ++++ packer/artifact_mock.go | 6 ++++++ packer/artifact_test.go | 6 ++++++ packer/rpc/artifact.go | 10 ++++++++++ post-processor/compress/artifact.go | 4 ++++ post-processor/vagrant-cloud/artifact.go | 4 ++++ post-processor/vagrant/artifact.go | 4 ++++ 19 files changed, 86 insertions(+) diff --git a/builder/amazon/common/artifact.go b/builder/amazon/common/artifact.go index 455994d59..8831d313b 100644 --- a/builder/amazon/common/artifact.go +++ b/builder/amazon/common/artifact.go @@ -52,6 +52,10 @@ func (a *Artifact) String() string { return fmt.Sprintf("AMIs were created:\n\n%s", strings.Join(amiStrings, "\n")) } +func (a *Artifact) State(name string) interface{} { + return nil +} + func (a *Artifact) Destroy() error { errors := make([]error, 0) diff --git a/builder/digitalocean/artifact.go b/builder/digitalocean/artifact.go index ebabdd41c..a6c8d8a7d 100644 --- a/builder/digitalocean/artifact.go +++ b/builder/digitalocean/artifact.go @@ -37,6 +37,10 @@ func (a *Artifact) String() string { return fmt.Sprintf("A snapshot was created: '%v' in region '%v'", a.snapshotName, a.regionName) } +func (a *Artifact) State(name string) interface{} { + return nil +} + func (a *Artifact) Destroy() error { log.Printf("Destroying image: %d (%s)", a.snapshotId, a.snapshotName) return a.client.DestroyImage(a.snapshotId) diff --git a/builder/docker/artifact_export.go b/builder/docker/artifact_export.go index 29cbefb48..d9eb83f67 100644 --- a/builder/docker/artifact_export.go +++ b/builder/docker/artifact_export.go @@ -27,6 +27,10 @@ func (a *ExportArtifact) String() string { return fmt.Sprintf("Exported Docker file: %s", a.path) } +func (a *ExportArtifact) State(name string) interface{} { + return nil +} + func (a *ExportArtifact) Destroy() error { return os.Remove(a.path) } diff --git a/builder/docker/artifact_import.go b/builder/docker/artifact_import.go index 4c926eb53..6ab0fe482 100644 --- a/builder/docker/artifact_import.go +++ b/builder/docker/artifact_import.go @@ -28,6 +28,10 @@ func (a *ImportArtifact) String() string { return fmt.Sprintf("Imported Docker image: %s", a.Id()) } +func (*ImportArtifact) State(name string) interface{} { + return nil +} + func (a *ImportArtifact) Destroy() error { return a.Driver.DeleteImage(a.Id()) } diff --git a/builder/googlecompute/artifact.go b/builder/googlecompute/artifact.go index a09946f9f..cb2ad88bb 100644 --- a/builder/googlecompute/artifact.go +++ b/builder/googlecompute/artifact.go @@ -37,3 +37,7 @@ func (a *Artifact) Id() string { func (a *Artifact) String() string { return fmt.Sprintf("A disk image was created: %v", a.imageName) } + +func (a *Artifact) State(name string) interface{} { + return nil +} diff --git a/builder/null/artifact_export.go b/builder/null/artifact_export.go index ad7bebc15..3962358e0 100644 --- a/builder/null/artifact_export.go +++ b/builder/null/artifact_export.go @@ -24,6 +24,10 @@ func (a *NullArtifact) String() string { return fmt.Sprintf("Did not export anything. This is the null builder") } +func (a *NullArtifact) State(name string) interface{} { + return nil +} + func (a *NullArtifact) Destroy() error { return nil } diff --git a/builder/openstack/artifact.go b/builder/openstack/artifact.go index a2ba552c5..035e245f6 100644 --- a/builder/openstack/artifact.go +++ b/builder/openstack/artifact.go @@ -35,6 +35,10 @@ func (a *Artifact) String() string { return fmt.Sprintf("An image was created: %v", a.ImageId) } +func (a *Artifact) State(name string) interface{} { + return nil +} + func (a *Artifact) Destroy() error { log.Printf("Destroying image: %d", a.ImageId) return a.Conn.DeleteImageById(a.ImageId) diff --git a/builder/parallels/common/artifact.go b/builder/parallels/common/artifact.go index 4930e0c32..8ce7755fa 100644 --- a/builder/parallels/common/artifact.go +++ b/builder/parallels/common/artifact.go @@ -66,6 +66,10 @@ func (a *artifact) String() string { return fmt.Sprintf("VM files in directory: %s", a.dir) } +func (a *artifact) State(name string) interface{} { + return nil +} + func (a *artifact) Destroy() error { return os.RemoveAll(a.dir) } diff --git a/builder/qemu/artifact.go b/builder/qemu/artifact.go index a3f1f9a46..1dea61c68 100644 --- a/builder/qemu/artifact.go +++ b/builder/qemu/artifact.go @@ -28,6 +28,10 @@ func (a *Artifact) String() string { return fmt.Sprintf("VM files in directory: %s", a.dir) } +func (a *Artifact) State(name string) interface{} { + return nil +} + func (a *Artifact) Destroy() error { return os.RemoveAll(a.dir) } diff --git a/builder/virtualbox/common/artifact.go b/builder/virtualbox/common/artifact.go index f4fc48100..9755c7a44 100644 --- a/builder/virtualbox/common/artifact.go +++ b/builder/virtualbox/common/artifact.go @@ -56,6 +56,10 @@ func (a *artifact) String() string { return fmt.Sprintf("VM files in directory: %s", a.dir) } +func (a *artifact) State(name string) interface{} { + return nil +} + func (a *artifact) Destroy() error { return os.RemoveAll(a.dir) } diff --git a/builder/vmware/common/artifact.go b/builder/vmware/common/artifact.go index ddc2b1a35..710ed9aad 100644 --- a/builder/vmware/common/artifact.go +++ b/builder/vmware/common/artifact.go @@ -56,6 +56,10 @@ func (a *localArtifact) String() string { return fmt.Sprintf("VM files in directory: %s", a.dir) } +func (a *localArtifact) State(name string) interface{} { + return nil +} + func (a *localArtifact) Destroy() error { return os.RemoveAll(a.dir) } diff --git a/builder/vmware/iso/artifact.go b/builder/vmware/iso/artifact.go index d6ddf8921..d0e1a6d8b 100644 --- a/builder/vmware/iso/artifact.go +++ b/builder/vmware/iso/artifact.go @@ -28,6 +28,10 @@ func (a *Artifact) String() string { return fmt.Sprintf("VM files in directory: %s", a.dir) } +func (a *Artifact) State(name string) interface{} { + return nil +} + func (a *Artifact) Destroy() error { return a.dir.RemoveAll() } diff --git a/packer/artifact.go b/packer/artifact.go index 486c322f6..8eaf3bcd5 100644 --- a/packer/artifact.go +++ b/packer/artifact.go @@ -25,6 +25,10 @@ type Artifact interface { // This is used for UI output. It can be multiple lines. String() string + // State allows the caller to ask for builder specific state information + // relating to the artifact instance. + State(name string) interface{} + // Destroy deletes the artifact. Packer calls this for various reasons, // such as if a post-processor has processed this artifact and it is // no longer needed. diff --git a/packer/artifact_mock.go b/packer/artifact_mock.go index a59af5331..18f4e562f 100644 --- a/packer/artifact_mock.go +++ b/packer/artifact_mock.go @@ -5,6 +5,7 @@ type MockArtifact struct { BuilderIdValue string FilesValue []string IdValue string + StateValues map[string]interface{} DestroyCalled bool } @@ -37,6 +38,11 @@ func (*MockArtifact) String() string { return "string" } +func (a *MockArtifact) State(name string) interface{} { + value, _ := a.StateValues[name] + return value +} + func (a *MockArtifact) Destroy() error { a.DestroyCalled = true return nil diff --git a/packer/artifact_test.go b/packer/artifact_test.go index ab6f39fb4..4ddc5f0ac 100644 --- a/packer/artifact_test.go +++ b/packer/artifact_test.go @@ -2,6 +2,7 @@ package packer type TestArtifact struct { id string + state map[string]interface{} destroyCalled bool } @@ -26,6 +27,11 @@ func (*TestArtifact) String() string { return "string" } +func (a *TestArtifact) State(name string) interface{} { + value, _ := a.state[name] + return value +} + func (a *TestArtifact) Destroy() error { a.destroyCalled = true return nil diff --git a/packer/rpc/artifact.go b/packer/rpc/artifact.go index c6e0a208d..3532cfbad 100644 --- a/packer/rpc/artifact.go +++ b/packer/rpc/artifact.go @@ -38,6 +38,11 @@ func (a *artifact) String() (result string) { return } +func (a *artifact) State(name string) (result interface{}) { + a.client.Call(a.endpoint+".State", name, &result) + return +} + func (a *artifact) Destroy() error { var result error if err := a.client.Call(a.endpoint+".Destroy", new(interface{}), &result); err != nil { @@ -67,6 +72,11 @@ func (s *ArtifactServer) String(args *interface{}, reply *string) error { return nil } +func (s *ArtifactServer) State(name string, reply *interface{}) error { + *reply = s.artifact.State(name) + return nil +} + func (s *ArtifactServer) Destroy(args *interface{}, reply *error) error { err := s.artifact.Destroy() if err != nil { diff --git a/post-processor/compress/artifact.go b/post-processor/compress/artifact.go index 54985d529..34a7ce8d6 100644 --- a/post-processor/compress/artifact.go +++ b/post-processor/compress/artifact.go @@ -35,6 +35,10 @@ func (self *Artifact) String() string { return fmt.Sprintf("'%s' compressing: %s", self.Provider, self.Path) } +func (*Artifact) State(name string) interface{} { + return nil +} + func (self *Artifact) Destroy() error { return os.Remove(self.Path) } diff --git a/post-processor/vagrant-cloud/artifact.go b/post-processor/vagrant-cloud/artifact.go index 775bc2998..9f1d4f4bd 100644 --- a/post-processor/vagrant-cloud/artifact.go +++ b/post-processor/vagrant-cloud/artifact.go @@ -34,6 +34,10 @@ func (a *Artifact) String() string { return fmt.Sprintf("'%s': %s", a.Provider, a.Tag) } +func (*Artifact) State(name string) interface{} { + return nil +} + func (a *Artifact) Destroy() error { return nil } diff --git a/post-processor/vagrant/artifact.go b/post-processor/vagrant/artifact.go index c4cfe394b..5974e9901 100644 --- a/post-processor/vagrant/artifact.go +++ b/post-processor/vagrant/artifact.go @@ -35,6 +35,10 @@ func (a *Artifact) String() string { return fmt.Sprintf("'%s' provider box: %s", a.Provider, a.Path) } +func (a *Artifact) State(name string) interface{} { + return nil +} + func (a *Artifact) Destroy() error { return os.Remove(a.Path) }