diff --git a/builder/googlecompute/config.go b/builder/googlecompute/config.go index ab2d5b7cb..871176396 100644 --- a/builder/googlecompute/config.go +++ b/builder/googlecompute/config.go @@ -28,6 +28,7 @@ type Config struct { DiskType string `mapstructure:"disk_type"` ImageName string `mapstructure:"image_name"` ImageDescription string `mapstructure:"image_description"` + ImageFamily string `mapstructure:"image_family"` InstanceName string `mapstructure:"instance_name"` MachineType string `mapstructure:"machine_type"` Metadata map[string]string `mapstructure:"metadata"` diff --git a/builder/googlecompute/config_test.go b/builder/googlecompute/config_test.go index 5c6ea6334..5124eadc9 100644 --- a/builder/googlecompute/config_test.go +++ b/builder/googlecompute/config_test.go @@ -108,6 +108,21 @@ func TestConfigPrepare(t *testing.T) { "SO VERY BAD", true, }, + { + "image_family", + nil, + false, + }, + { + "image_family", + "", + false, + }, + { + "image_family", + "foo-bar", + false, + }, } for _, tc := range cases { @@ -182,6 +197,7 @@ func testConfig(t *testing.T) map[string]interface{} { "account_file": testAccountFile(t), "project_id": "hashicorp", "source_image": "foo", + "image_family": "bar", "zone": "us-east1-a", } } diff --git a/builder/googlecompute/driver.go b/builder/googlecompute/driver.go index 5f4ad3ca7..13cd2809e 100644 --- a/builder/googlecompute/driver.go +++ b/builder/googlecompute/driver.go @@ -10,7 +10,7 @@ type Driver interface { // CreateImage creates an image from the given disk in Google Compute // Engine. - CreateImage(name, description, zone, disk string) <-chan error + CreateImage(name, description, family, zone, disk string) <-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 bea0c4770..306ab1756 100644 --- a/builder/googlecompute/driver_gce.go +++ b/builder/googlecompute/driver_gce.go @@ -91,10 +91,11 @@ func (d *driverGCE) ImageExists(name string) bool { return err == nil } -func (d *driverGCE) CreateImage(name, description, zone, disk string) <-chan error { +func (d *driverGCE) CreateImage(name, description, family, zone, disk string) <-chan error { image := &compute.Image{ Description: description, Name: name, + Family: family, SourceDisk: fmt.Sprintf("%s%s/zones/%s/disks/%s", d.service.BasePath, d.projectId, zone, disk), SourceType: "RAW", } diff --git a/builder/googlecompute/driver_mock.go b/builder/googlecompute/driver_mock.go index 196aa1d81..551671a91 100644 --- a/builder/googlecompute/driver_mock.go +++ b/builder/googlecompute/driver_mock.go @@ -6,11 +6,12 @@ type DriverMock struct { ImageExistsName string ImageExistsResult bool - CreateImageName string - CreateImageDesc string - CreateImageZone string - CreateImageDisk string - CreateImageErrCh <-chan error + CreateImageName string + CreateImageDesc string + CreateImageFamily string + CreateImageZone string + CreateImageDisk string + CreateImageErrCh <-chan error DeleteImageName string DeleteImageErrCh <-chan error @@ -50,9 +51,10 @@ func (d *DriverMock) ImageExists(name string) bool { return d.ImageExistsResult } -func (d *DriverMock) CreateImage(name, description, zone, disk string) <-chan error { +func (d *DriverMock) CreateImage(name, description, family, zone, disk string) <-chan error { d.CreateImageName = name d.CreateImageDesc = description + d.CreateImageFamily = family d.CreateImageZone = zone d.CreateImageDisk = disk diff --git a/builder/googlecompute/step_create_image.go b/builder/googlecompute/step_create_image.go index 47838bc6c..dbb690dd3 100644 --- a/builder/googlecompute/step_create_image.go +++ b/builder/googlecompute/step_create_image.go @@ -23,7 +23,7 @@ func (s *StepCreateImage) Run(state multistep.StateBag) multistep.StepAction { ui := state.Get("ui").(packer.Ui) ui.Say("Creating image...") - errCh := driver.CreateImage(config.ImageName, config.ImageDescription, config.Zone, config.DiskName) + errCh := driver.CreateImage(config.ImageName, config.ImageDescription, config.ImageFamily, config.Zone, config.DiskName) var err error select { case err = <-errCh: diff --git a/builder/googlecompute/step_create_image_test.go b/builder/googlecompute/step_create_image_test.go index c9043a39a..4358f10de 100644 --- a/builder/googlecompute/step_create_image_test.go +++ b/builder/googlecompute/step_create_image_test.go @@ -31,6 +31,9 @@ func TestStepCreateImage(t *testing.T) { if driver.CreateImageDesc != config.ImageDescription { t.Fatalf("bad: %#v", driver.CreateImageDesc) } + if driver.CreateImageFamily != config.ImageFamily { + t.Fatalf("bad: %#v", driver.CreateImageFamily) + } if driver.CreateImageZone != config.Zone { t.Fatalf("bad: %#v", driver.CreateImageZone) } diff --git a/website/source/docs/builders/googlecompute.html.md b/website/source/docs/builders/googlecompute.html.md index 0d264bc97..24f33b8cb 100644 --- a/website/source/docs/builders/googlecompute.html.md +++ b/website/source/docs/builders/googlecompute.html.md @@ -126,11 +126,13 @@ builder. - `disk_type` (string) - Type of disk used to back your instance, like `pd-ssd` or `pd-standard`. Defaults to `pd-standard`. +- `image_description` (string) - The description of the resulting image. + +- `image_family` (string) - The name of the image family to which the resulting image belongs. You can create disks by specifying an image family instead of a specific image name. The image family always returns its latest image that is not deprecated. + - `image_name` (string) - The unique name of the resulting image. Defaults to `"packer-{{timestamp}}"`. -- `image_description` (string) - The description of the resulting image. - - `instance_name` (string) - A name to give the launched instance. Beware that this must be unique. Defaults to `"packer-{{uuid}}"`.