Support specifying licenses for Google Compute images

This is needed to enable features such as the nested virtualization:
https://cloud.google.com/compute/docs/instances/enable-nested-virtualization-vm-instances
This commit is contained in:
Petr Hosek 2017-12-18 12:51:39 -08:00 committed by Sean Malloy
parent ff1ffd90e0
commit eaef2961cb
7 changed files with 13 additions and 8 deletions

@ -36,6 +36,7 @@ type Config struct {
ImageDescription string `mapstructure:"image_description"` ImageDescription string `mapstructure:"image_description"`
ImageFamily string `mapstructure:"image_family"` ImageFamily string `mapstructure:"image_family"`
ImageLabels map[string]string `mapstructure:"image_labels"` ImageLabels map[string]string `mapstructure:"image_labels"`
ImageLicenses []string `mapstructure:"image_licenses"`
InstanceName string `mapstructure:"instance_name"` InstanceName string `mapstructure:"instance_name"`
Labels map[string]string `mapstructure:"labels"` Labels map[string]string `mapstructure:"labels"`
MachineType string `mapstructure:"machine_type"` MachineType string `mapstructure:"machine_type"`

@ -309,6 +309,9 @@ func testConfig(t *testing.T) map[string]interface{} {
"label-1": "value-1", "label-1": "value-1",
"label-2": "value-2", "label-2": "value-2",
}, },
"image_licenses": []string{
"test-license",
},
"zone": "us-east1-a", "zone": "us-east1-a",
} }
} }

@ -11,7 +11,7 @@ import (
type Driver interface { type Driver interface {
// CreateImage creates an image from the given disk in Google Compute // CreateImage creates an image from the given disk in Google Compute
// Engine. // Engine.
CreateImage(name, description, family, zone, disk string, image_labels map[string]string) (<-chan *Image, <-chan error) CreateImage(name, description, family, zone, disk string, image_labels map[string]string, image_licenses []string) (<-chan *Image, <-chan error)
// DeleteImage deletes the image with the given name. // DeleteImage deletes the image with the given name.
DeleteImage(name string) <-chan error DeleteImage(name string) <-chan error

@ -97,12 +97,13 @@ func NewDriverGCE(ui packer.Ui, p string, a *AccountFile) (Driver, error) {
}, nil }, nil
} }
func (d *driverGCE) CreateImage(name, description, family, zone, disk string, image_labels map[string]string) (<-chan *Image, <-chan error) { func (d *driverGCE) CreateImage(name, description, family, zone, disk string, image_labels map[string]string, image_licenses []string) (<-chan *Image, <-chan error) {
gce_image := &compute.Image{ gce_image := &compute.Image{
Description: description, Description: description,
Name: name, Name: name,
Family: family, Family: family,
Labels: image_labels, Labels: image_labels,
Licenses: image_licenses,
SourceDisk: fmt.Sprintf("%s%s/zones/%s/disks/%s", d.service.BasePath, d.projectId, zone, disk), SourceDisk: fmt.Sprintf("%s%s/zones/%s/disks/%s", d.service.BasePath, d.projectId, zone, disk),
SourceType: "RAW", SourceType: "RAW",
} }

@ -9,9 +9,9 @@ type DriverMock struct {
CreateImageDesc string CreateImageDesc string
CreateImageFamily string CreateImageFamily string
CreateImageLabels map[string]string CreateImageLabels map[string]string
CreateImageLicenses []string
CreateImageZone string CreateImageZone string
CreateImageDisk string CreateImageDisk string
CreateImageResultLicenses []string
CreateImageResultProjectId string CreateImageResultProjectId string
CreateImageResultSelfLink string CreateImageResultSelfLink string
CreateImageResultSizeGb int64 CreateImageResultSizeGb int64
@ -82,11 +82,12 @@ type DriverMock struct {
WaitForInstanceErrCh <-chan error WaitForInstanceErrCh <-chan error
} }
func (d *DriverMock) CreateImage(name, description, family, zone, disk string, image_labels map[string]string) (<-chan *Image, <-chan error) { func (d *DriverMock) CreateImage(name, description, family, zone, disk string, image_labels map[string]string, image_licenses []string) (<-chan *Image, <-chan error) {
d.CreateImageName = name d.CreateImageName = name
d.CreateImageDesc = description d.CreateImageDesc = description
d.CreateImageFamily = family d.CreateImageFamily = family
d.CreateImageLabels = image_labels d.CreateImageLabels = image_labels
d.CreateImageLicenses = image_licenses
d.CreateImageZone = zone d.CreateImageZone = zone
d.CreateImageDisk = disk d.CreateImageDisk = disk
if d.CreateImageResultProjectId == "" { if d.CreateImageResultProjectId == "" {
@ -106,7 +107,7 @@ func (d *DriverMock) CreateImage(name, description, family, zone, disk string, i
ch := make(chan *Image, 1) ch := make(chan *Image, 1)
ch <- &Image{ ch <- &Image{
Labels: d.CreateImageLabels, Labels: d.CreateImageLabels,
Licenses: d.CreateImageResultLicenses, Licenses: d.CreateImageLicenses,
Name: name, Name: name,
ProjectId: d.CreateImageResultProjectId, ProjectId: d.CreateImageResultProjectId,
SelfLink: d.CreateImageResultSelfLink, SelfLink: d.CreateImageResultSelfLink,

@ -40,7 +40,7 @@ func (s *StepCreateImage) Run(_ context.Context, state multistep.StateBag) multi
imageCh, errCh := driver.CreateImage( imageCh, errCh := driver.CreateImage(
config.ImageName, config.ImageDescription, config.ImageFamily, config.Zone, config.ImageName, config.ImageDescription, config.ImageFamily, config.Zone,
config.DiskName, config.ImageLabels) config.DiskName, config.ImageLabels, config.ImageLicenses)
var err error var err error
select { select {
case err = <-errCh: case err = <-errCh:

@ -22,7 +22,6 @@ func TestStepCreateImage(t *testing.T) {
d := state.Get("driver").(*DriverMock) d := state.Get("driver").(*DriverMock)
// These are the values of the image the driver will return. // These are the values of the image the driver will return.
d.CreateImageResultLicenses = []string{"test-license"}
d.CreateImageResultProjectId = "test-project" d.CreateImageResultProjectId = "test-project"
d.CreateImageResultSizeGb = 100 d.CreateImageResultSizeGb = 100
@ -36,7 +35,6 @@ func TestStepCreateImage(t *testing.T) {
assert.True(t, ok, "Image in state is not an Image.") assert.True(t, ok, "Image in state is not an Image.")
// Verify created Image results. // Verify created Image results.
assert.Equal(t, image.Licenses, d.CreateImageResultLicenses, "Created image licenses don't match the licenses returned by the driver.")
assert.Equal(t, image.Name, c.ImageName, "Created image does not match config name.") assert.Equal(t, image.Name, c.ImageName, "Created image does not match config name.")
assert.Equal(t, image.ProjectId, d.CreateImageResultProjectId, "Created image project does not match driver project.") assert.Equal(t, image.ProjectId, d.CreateImageResultProjectId, "Created image project does not match driver project.")
assert.Equal(t, image.SizeGb, d.CreateImageResultSizeGb, "Created image size does not match the size returned by the driver.") assert.Equal(t, image.SizeGb, d.CreateImageResultSizeGb, "Created image size does not match the size returned by the driver.")
@ -48,6 +46,7 @@ func TestStepCreateImage(t *testing.T) {
assert.Equal(t, d.CreateImageZone, c.Zone, "Incorrect image zone 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.CreateImageDisk, c.DiskName, "Incorrect disk passed to driver.")
assert.Equal(t, d.CreateImageLabels, c.ImageLabels, "Incorrect image_labels passed to driver.") assert.Equal(t, d.CreateImageLabels, c.ImageLabels, "Incorrect image_labels passed to driver.")
assert.Equal(t, d.CreateImageLicenses, c.ImageLicenses, "Incorrect image_licenses passed to driver.")
} }
func TestStepCreateImage_errorOnChannel(t *testing.T) { func TestStepCreateImage_errorOnChannel(t *testing.T) {