diff --git a/builder/nutanix/config.go b/builder/nutanix/config.go index efd6ec7..1e97258 100644 --- a/builder/nutanix/config.go +++ b/builder/nutanix/config.go @@ -38,6 +38,7 @@ type Config struct { ImageDescription string `mapstructure:"image_description" json:"image_description" required:"false"` ImageCategoryKey string `mapstructure:"image_category_key" json:"image_category_key" required:"false"` ImageCategoryValue string `mapstructure:"image_category_value" json:"image_category_value" required:"false"` + ImageDelete bool `mapstructure:"image_delete" json:"image_delete" required:"false"` WaitTimeout time.Duration `mapstructure:"ip_wait_timeout" json:"ip_wait_timeout" required:"false"` ctx interpolate.Context diff --git a/builder/nutanix/config.hcl2spec.go b/builder/nutanix/config.hcl2spec.go index 2c9da4d..42eafd6 100644 --- a/builder/nutanix/config.hcl2spec.go +++ b/builder/nutanix/config.hcl2spec.go @@ -123,6 +123,7 @@ type FlatConfig struct { ImageDescription *string `mapstructure:"image_description" json:"image_description" required:"false" cty:"image_description" hcl:"image_description"` ImageCategoryKey *string `mapstructure:"image_category_key" json:"image_category_key" required:"false" cty:"image_category_key" hcl:"image_category_key"` ImageCategoryValue *string `mapstructure:"image_category_value" json:"image_category_value" required:"false" cty:"image_category_value" hcl:"image_category_value"` + ImageDelete *bool `mapstructure:"image_delete" json:"image_delete" required:"false" cty:"image_delete" hcl:"image_delete"` WaitTimeout *string `mapstructure:"ip_wait_timeout" json:"ip_wait_timeout" required:"false" cty:"ip_wait_timeout" hcl:"ip_wait_timeout"` } @@ -220,6 +221,7 @@ func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec { "image_description": &hcldec.AttrSpec{Name: "image_description", Type: cty.String, Required: false}, "image_category_key": &hcldec.AttrSpec{Name: "image_category_key", Type: cty.String, Required: false}, "image_category_value": &hcldec.AttrSpec{Name: "image_category_value", Type: cty.String, Required: false}, + "image_delete": &hcldec.AttrSpec{Name: "image_delete", Type: cty.Bool, Required: false}, "ip_wait_timeout": &hcldec.AttrSpec{Name: "ip_wait_timeout", Type: cty.String, Required: false}, } return s diff --git a/builder/nutanix/step_copy_image.go b/builder/nutanix/step_copy_image.go index afc3414..c19d8ce 100644 --- a/builder/nutanix/step_copy_image.go +++ b/builder/nutanix/step_copy_image.go @@ -52,4 +52,22 @@ func (s *stepCopyImage) Run(ctx context.Context, state multistep.StateBag) multi } func (s *stepCopyImage) Cleanup(state multistep.StateBag) { + ui := state.Get("ui").(packer.Ui) + d := state.Get("driver").(Driver) + + if !s.Config.ImageDelete { + return + } + + if imgUUID, ok := state.GetOk("image_uuid"); ok { + ui.Say(fmt.Sprintf("Deleting image %s...", s.Config.ImageName)) + + err := d.DeleteImage(imgUUID.(string)) + if err != nil { + ui.Error("An error occurred while deleting image") + return + } else { + ui.Message("Image successfully deleted") + } + } } diff --git a/docs/builders/nutanix.mdx b/docs/builders/nutanix.mdx index 73d119b..1d601d2 100644 --- a/docs/builders/nutanix.mdx +++ b/docs/builders/nutanix.mdx @@ -41,6 +41,7 @@ These parameters allow to configure everything around image creation, from the t - `image_category_key` (string) - Name of the category to assign to the image. - `image_category_value` (string) - Value of the category to assign to the image. - `force_deregister` (bool) - Allow output image override if already exists. +- `image_delete` (bool) - Delete image once build process is completed. - `shutdown_command` (string) - Command line to shutdown your temporary VM. - `shutdown_timeout` (string) - Timeout for VM shutdown (format : 2m). - `communicator` (string) - Protocol used for Packer connection (ex "winrm" or "ssh"). Default is : "ssh".