From 99667df17eec7348ebc9bfea0712f4d0ec40c5d0 Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Tue, 13 Dec 2016 16:28:54 -0800 Subject: [PATCH] update image visibility own step --- builder/openstack/builder.go | 1 + builder/openstack/image_config.go | 17 ++++++- builder/openstack/step_create_image.go | 25 ---------- .../openstack/step_update_image_visibility.go | 48 +++++++++++++++++++ 4 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 builder/openstack/step_update_image_visibility.go diff --git a/builder/openstack/builder.go b/builder/openstack/builder.go index 1d444cc84..b5f44bb6e 100644 --- a/builder/openstack/builder.go +++ b/builder/openstack/builder.go @@ -114,6 +114,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe &common.StepProvision{}, &StepStopServer{}, &stepCreateImage{}, + &stepUpdateImageVisibility{}, } // Run! diff --git a/builder/openstack/image_config.go b/builder/openstack/image_config.go index 4d6f9de4f..705725ea8 100644 --- a/builder/openstack/image_config.go +++ b/builder/openstack/image_config.go @@ -11,8 +11,9 @@ import ( type ImageConfig struct { ImageName string `mapstructure:"image_name"` - ImageMetadata map[string]string `mapstructure:"metadata"` - Visibility imageservice.ImageVisibility `mapstructure:"image_visibility"` + ImageMetadata map[string]string `mapstructure:"metadata"` + ImageVisibility imageservice.ImageVisibility `mapstructure:"image_visibility"` + ImageMembers []string `mapstructure:"image_members"` } func (c *ImageConfig) Prepare(ctx *interpolate.Context) []error { @@ -32,6 +33,18 @@ func (c *ImageConfig) Prepare(ctx *interpolate.Context) []error { c.ImageMetadata["image_type"] = "image" } + // ImageVisibility values + // https://wiki.openstack.org/wiki/Glance-v2-community-image-visibility-design + if c.ImageVisibility != "" { + valid := []string{"public", "private", "shared", "community"} + for _, val := range valid { + if string(c.ImageVisibility) == val { + break + } + } + errs = append(errs, fmt.Errorf("Unknown visibility value %s", c.ImageVisibility)) + } + if len(errs) > 0 { return errs } diff --git a/builder/openstack/step_create_image.go b/builder/openstack/step_create_image.go index 6f6aef99e..c5b12b85e 100644 --- a/builder/openstack/step_create_image.go +++ b/builder/openstack/step_create_image.go @@ -8,7 +8,6 @@ import ( "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack/compute/v2/images" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" - imageservice "github.com/gophercloud/gophercloud/openstack/imageservice/v2/images" "github.com/mitchellh/multistep" "github.com/mitchellh/packer/packer" ) @@ -54,30 +53,6 @@ func (s *stepCreateImage) Run(state multistep.StateBag) multistep.StepAction { return multistep.ActionHalt } - if config.Visibility != "" { - imageClient, err := config.imageV2Client() - if err != nil { - err = fmt.Errorf("Error initializing image service client: %s", err) - state.Put("error", err) - return multistep.ActionHalt - } - r := imageservice.Update( - imageClient, - imageId, - imageservice.UpdateOpts{ - imageservice.UpdateVisibility{ - Visibility: config.Visibility, - }, - }, - ) - if _, err = r.Extract(); err != nil { - err = fmt.Errorf("Error updating image visibility: %s", err) - state.Put("error", err) - return multistep.ActionHalt - } - - } - return multistep.ActionContinue } diff --git a/builder/openstack/step_update_image_visibility.go b/builder/openstack/step_update_image_visibility.go new file mode 100644 index 000000000..fbfdf1431 --- /dev/null +++ b/builder/openstack/step_update_image_visibility.go @@ -0,0 +1,48 @@ +package openstack + +import ( + "fmt" + + imageservice "github.com/gophercloud/gophercloud/openstack/imageservice/v2/images" + "github.com/mitchellh/multistep" + "github.com/mitchellh/packer/packer" +) + +type stepUpdateImageVisibility struct{} + +func (s *stepUpdateImageVisibility) Run(state multistep.StateBag) multistep.StepAction { + imageId := state.Get("image").(string) + ui := state.Get("ui").(packer.Ui) + config := state.Get("config").(Config) + + if config.ImageVisibility != "" { + imageClient, err := config.imageV2Client() + if err != nil { + err = fmt.Errorf("Error initializing image service client: %s", err) + state.Put("error", err) + return multistep.ActionHalt + } + ui.Say(fmt.Sprintf("Updating image visibility to %s", config.ImageVisibility)) + r := imageservice.Update( + imageClient, + imageId, + imageservice.UpdateOpts{ + imageservice.UpdateVisibility{ + Visibility: config.ImageVisibility, + }, + }, + ) + if _, err = r.Extract(); err != nil { + err = fmt.Errorf("Error updating image visibility: %s", err) + state.Put("error", err) + return multistep.ActionHalt + } + + } + + return multistep.ActionContinue +} + +func (s *stepUpdateImageVisibility) Cleanup(multistep.StateBag) { + // No cleanup... +}