From 8789ae72e8316666b784d1af4bcb4bf1cf68c596 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Mon, 18 Sep 2017 15:44:01 +0100 Subject: [PATCH 1/7] Make the googlecompute builder label the resulting image. ... so that it's possible to find images matching particular characteristics more easily. --- builder/googlecompute/driver.go | 2 +- builder/googlecompute/driver_gce.go | 3 ++- builder/googlecompute/step_create_image.go | 2 +- website/source/docs/builders/googlecompute.html.md | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/builder/googlecompute/driver.go b/builder/googlecompute/driver.go index 60707ac84..70815c8cd 100644 --- a/builder/googlecompute/driver.go +++ b/builder/googlecompute/driver.go @@ -11,7 +11,7 @@ import ( type Driver interface { // CreateImage creates an image from the given disk in Google Compute // Engine. - CreateImage(name, description, family, zone, disk string) (<-chan *Image, <-chan error) + CreateImage(name, description, family, zone, disk string, labels map[string]string) (<-chan *Image, <-chan error) // DeleteImage deletes the image with the given name. DeleteImage(name string) <-chan error diff --git a/builder/googlecompute/driver_gce.go b/builder/googlecompute/driver_gce.go index 0df21eba6..432c0c333 100644 --- a/builder/googlecompute/driver_gce.go +++ b/builder/googlecompute/driver_gce.go @@ -98,11 +98,12 @@ func NewDriverGCE(ui packer.Ui, p string, a *AccountFile) (Driver, error) { }, nil } -func (d *driverGCE) CreateImage(name, description, family, zone, disk string) (<-chan *Image, <-chan error) { +func (d *driverGCE) CreateImage(name, description, family, zone, disk string, labels map[string]string) (<-chan *Image, <-chan error) { gce_image := &compute.Image{ Description: description, Name: name, Family: family, + Labels: labels, SourceDisk: fmt.Sprintf("%s%s/zones/%s/disks/%s", d.service.BasePath, d.projectId, zone, disk), SourceType: "RAW", } diff --git a/builder/googlecompute/step_create_image.go b/builder/googlecompute/step_create_image.go index 13339d82f..ec287ae16 100644 --- a/builder/googlecompute/step_create_image.go +++ b/builder/googlecompute/step_create_image.go @@ -39,7 +39,7 @@ func (s *StepCreateImage) Run(state multistep.StateBag) multistep.StepAction { imageCh, errCh := driver.CreateImage( config.ImageName, config.ImageDescription, config.ImageFamily, config.Zone, - config.DiskName) + config.DiskName, config.Labels) var err error select { case err = <-errCh: diff --git a/website/source/docs/builders/googlecompute.html.md b/website/source/docs/builders/googlecompute.html.md index dda8841dd..70001947d 100644 --- a/website/source/docs/builders/googlecompute.html.md +++ b/website/source/docs/builders/googlecompute.html.md @@ -205,7 +205,7 @@ builder. this must be unique. Defaults to `"packer-{{uuid}}"`. - `labels` (object of key/value strings) - Key/value pair labels to apply to - the launched instance. + the launched instance and the created image. - `machine_type` (string) - The machine type. Defaults to `"n1-standard-1"`. From e579b947b14b4f4dff2314809d4767dfc37394d1 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Mon, 18 Sep 2017 17:34:06 +0100 Subject: [PATCH 2/7] Fix signature that I missed --- builder/googlecompute/driver_mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/googlecompute/driver_mock.go b/builder/googlecompute/driver_mock.go index f9423b8aa..22989c141 100644 --- a/builder/googlecompute/driver_mock.go +++ b/builder/googlecompute/driver_mock.go @@ -81,7 +81,7 @@ type DriverMock struct { WaitForInstanceErrCh <-chan error } -func (d *DriverMock) CreateImage(name, description, family, zone, disk string) (<-chan *Image, <-chan error) { +func (d *DriverMock) CreateImage(name, description, family, zone, disk string, labels map[string]string) (<-chan *Image, <-chan error) { d.CreateImageName = name d.CreateImageDesc = description d.CreateImageFamily = family From ac8eedf171b4034adf104b1de457a8588d5de200 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Mon, 18 Sep 2017 17:53:40 +0100 Subject: [PATCH 3/7] Introduce a new configuration parameter instead ... so that one can have a different list compared to instances. --- builder/googlecompute/config.go | 1 + builder/googlecompute/driver.go | 2 +- builder/googlecompute/driver_gce.go | 2 +- builder/googlecompute/driver_mock.go | 2 +- builder/googlecompute/step_create_image.go | 2 +- website/source/docs/builders/googlecompute.html.md | 5 ++++- 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/builder/googlecompute/config.go b/builder/googlecompute/config.go index c4aa79d22..020ec9ab8 100644 --- a/builder/googlecompute/config.go +++ b/builder/googlecompute/config.go @@ -35,6 +35,7 @@ type Config struct { ImageName string `mapstructure:"image_name"` ImageDescription string `mapstructure:"image_description"` ImageFamily string `mapstructure:"image_family"` + ImageLabels map[string]string `mapstructure:"image_labels"` InstanceName string `mapstructure:"instance_name"` Labels map[string]string `mapstructure:"labels"` MachineType string `mapstructure:"machine_type"` diff --git a/builder/googlecompute/driver.go b/builder/googlecompute/driver.go index 70815c8cd..bd302ddc0 100644 --- a/builder/googlecompute/driver.go +++ b/builder/googlecompute/driver.go @@ -11,7 +11,7 @@ import ( type Driver interface { // CreateImage creates an image from the given disk in Google Compute // Engine. - CreateImage(name, description, family, zone, disk string, labels map[string]string) (<-chan *Image, <-chan error) + CreateImage(name, description, family, zone, disk string, image_labels map[string]string) (<-chan *Image, <-chan error) // DeleteImage deletes the image with the given name. DeleteImage(name string) <-chan error diff --git a/builder/googlecompute/driver_gce.go b/builder/googlecompute/driver_gce.go index 432c0c333..37ba622e0 100644 --- a/builder/googlecompute/driver_gce.go +++ b/builder/googlecompute/driver_gce.go @@ -98,7 +98,7 @@ func NewDriverGCE(ui packer.Ui, p string, a *AccountFile) (Driver, error) { }, nil } -func (d *driverGCE) CreateImage(name, description, family, zone, disk string, labels map[string]string) (<-chan *Image, <-chan error) { +func (d *driverGCE) CreateImage(name, description, family, zone, disk string, image_labels map[string]string) (<-chan *Image, <-chan error) { gce_image := &compute.Image{ Description: description, Name: name, diff --git a/builder/googlecompute/driver_mock.go b/builder/googlecompute/driver_mock.go index 22989c141..89ea0b8de 100644 --- a/builder/googlecompute/driver_mock.go +++ b/builder/googlecompute/driver_mock.go @@ -81,7 +81,7 @@ type DriverMock struct { WaitForInstanceErrCh <-chan error } -func (d *DriverMock) CreateImage(name, description, family, zone, disk string, labels map[string]string) (<-chan *Image, <-chan error) { +func (d *DriverMock) CreateImage(name, description, family, zone, disk string, image_labels map[string]string) (<-chan *Image, <-chan error) { d.CreateImageName = name d.CreateImageDesc = description d.CreateImageFamily = family diff --git a/builder/googlecompute/step_create_image.go b/builder/googlecompute/step_create_image.go index ec287ae16..bcb840e78 100644 --- a/builder/googlecompute/step_create_image.go +++ b/builder/googlecompute/step_create_image.go @@ -39,7 +39,7 @@ func (s *StepCreateImage) Run(state multistep.StateBag) multistep.StepAction { imageCh, errCh := driver.CreateImage( config.ImageName, config.ImageDescription, config.ImageFamily, config.Zone, - config.DiskName, config.Labels) + config.DiskName, config.ImageLabels) var err error select { case err = <-errCh: diff --git a/website/source/docs/builders/googlecompute.html.md b/website/source/docs/builders/googlecompute.html.md index 70001947d..12db018c4 100644 --- a/website/source/docs/builders/googlecompute.html.md +++ b/website/source/docs/builders/googlecompute.html.md @@ -198,6 +198,9 @@ builder. instead of a specific image name. The image family always returns its latest image that is not deprecated. +- `image_labels` (object of key/value strings) - Key/value pair labels to + apply to the created image. + - `image_name` (string) - The unique name of the resulting image. Defaults to `"packer-{{timestamp}}"`. @@ -205,7 +208,7 @@ builder. this must be unique. Defaults to `"packer-{{uuid}}"`. - `labels` (object of key/value strings) - Key/value pair labels to apply to - the launched instance and the created image. + the launched instance. - `machine_type` (string) - The machine type. Defaults to `"n1-standard-1"`. From 5bcb0644c3fefcf53e6bef1ef0b8c628f1d9d119 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Mon, 18 Sep 2017 18:13:21 +0100 Subject: [PATCH 4/7] Using CI for compilation errors because am on Windows --- builder/googlecompute/driver_gce.go | 2 +- builder/googlecompute/image.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/builder/googlecompute/driver_gce.go b/builder/googlecompute/driver_gce.go index 37ba622e0..02a230cfe 100644 --- a/builder/googlecompute/driver_gce.go +++ b/builder/googlecompute/driver_gce.go @@ -103,7 +103,7 @@ func (d *driverGCE) CreateImage(name, description, family, zone, disk string, im Description: description, Name: name, Family: family, - Labels: labels, + Labels: image_labels, SourceDisk: fmt.Sprintf("%s%s/zones/%s/disks/%s", d.service.BasePath, d.projectId, zone, disk), SourceType: "RAW", } diff --git a/builder/googlecompute/image.go b/builder/googlecompute/image.go index 11fe7df55..fae69db75 100644 --- a/builder/googlecompute/image.go +++ b/builder/googlecompute/image.go @@ -5,6 +5,7 @@ import ( ) type Image struct { + Labels map[string]string Licenses []string Name string ProjectId string From 2239d55fdbc8568e77da23e751e16681726106c4 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Tue, 19 Sep 2017 11:31:05 +0100 Subject: [PATCH 5/7] Add test coverage --- builder/googlecompute/config_test.go | 6 +++++- builder/googlecompute/step_create_image_test.go | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/builder/googlecompute/config_test.go b/builder/googlecompute/config_test.go index 7255add30..4d72b4ecf 100644 --- a/builder/googlecompute/config_test.go +++ b/builder/googlecompute/config_test.go @@ -305,7 +305,11 @@ func testConfig(t *testing.T) map[string]interface{} { "source_image": "foo", "ssh_username": "root", "image_family": "bar", - "zone": "us-east1-a", + "image_labels": string{ + "label-1": "value-1", + "label-2": "value-2", + }, + "zone": "us-east1-a", } } diff --git a/builder/googlecompute/step_create_image_test.go b/builder/googlecompute/step_create_image_test.go index 63c962904..639b25255 100644 --- a/builder/googlecompute/step_create_image_test.go +++ b/builder/googlecompute/step_create_image_test.go @@ -46,6 +46,7 @@ func TestStepCreateImage(t *testing.T) { assert.Equal(t, d.CreateImageFamily, c.ImageFamily, "Incorrect image family passed to driver.") assert.Equal(t, d.CreateImageZone, c.Zone, "Incorrect image zone passed to driver.") assert.Equal(t, d.CreateImageDisk, c.DiskName, "Incorrect disk passed to driver.") + assert.Equal(t, d.CreateImageLabels, c.ImageLabels, "Incorrect image_labels passed to driver.") } func TestStepCreateImage_errorOnChannel(t *testing.T) { From 15a456750b4ccf868d25261d37cc37c1a919d729 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Tue, 19 Sep 2017 11:34:08 +0100 Subject: [PATCH 6/7] CI as compiler! --- builder/googlecompute/config_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/googlecompute/config_test.go b/builder/googlecompute/config_test.go index 4d72b4ecf..551692b29 100644 --- a/builder/googlecompute/config_test.go +++ b/builder/googlecompute/config_test.go @@ -305,7 +305,7 @@ func testConfig(t *testing.T) map[string]interface{} { "source_image": "foo", "ssh_username": "root", "image_family": "bar", - "image_labels": string{ + "image_labels": map[string]string{ "label-1": "value-1", "label-2": "value-2", }, From 7cbd57faa677e40b2cd3ed9a0068847074b5ba74 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Tue, 19 Sep 2017 11:40:01 +0100 Subject: [PATCH 7/7] Filling it back --- builder/googlecompute/driver_mock.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/builder/googlecompute/driver_mock.go b/builder/googlecompute/driver_mock.go index 89ea0b8de..895775da5 100644 --- a/builder/googlecompute/driver_mock.go +++ b/builder/googlecompute/driver_mock.go @@ -8,6 +8,7 @@ type DriverMock struct { CreateImageName string CreateImageDesc string CreateImageFamily string + CreateImageLabels map[string]string CreateImageZone string CreateImageDisk string CreateImageResultLicenses []string @@ -85,6 +86,7 @@ func (d *DriverMock) CreateImage(name, description, family, zone, disk string, i d.CreateImageName = name d.CreateImageDesc = description d.CreateImageFamily = family + d.CreateImageLabels = image_labels d.CreateImageZone = zone d.CreateImageDisk = disk if d.CreateImageResultProjectId == "" { @@ -103,6 +105,7 @@ func (d *DriverMock) CreateImage(name, description, family, zone, disk string, i if resultCh == nil { ch := make(chan *Image, 1) ch <- &Image{ + Labels: d.CreateImageLabels, Licenses: d.CreateImageResultLicenses, Name: name, ProjectId: d.CreateImageResultProjectId,