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:
parent
ff1ffd90e0
commit
eaef2961cb
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user