diff --git a/builder/googlecompute/config.go b/builder/googlecompute/config.go index 7c5eb6956..9c80b7271 100644 --- a/builder/googlecompute/config.go +++ b/builder/googlecompute/config.go @@ -49,10 +49,11 @@ type Config struct { UseInternalIP bool `mapstructure:"use_internal_ip"` Zone string `mapstructure:"zone"` - Account AccountFile - privateKeyBytes []byte - stateTimeout time.Duration - ctx interpolate.Context + Account AccountFile + privateKeyBytes []byte + stateTimeout time.Duration + imageAlreadyExists bool + ctx interpolate.Context } func NewConfig(raws ...interface{}) (*Config, []string, error) { @@ -191,4 +192,4 @@ func (c *Config) CalcTimeout() error { } c.stateTimeout = stateTimeout return nil -} \ No newline at end of file +} diff --git a/builder/googlecompute/step_check_existing_image.go b/builder/googlecompute/step_check_existing_image.go index 9b87e8337..dbad5cf1c 100644 --- a/builder/googlecompute/step_check_existing_image.go +++ b/builder/googlecompute/step_check_existing_image.go @@ -18,14 +18,14 @@ func (s *StepCheckExistingImage) Run(state multistep.StateBag) multistep.StepAct ui := state.Get("ui").(packer.Ui) ui.Say("Checking image does not exist...") - exists := d.ImageExists(c.ImageName) - if exists { - err := fmt.Errorf("Image %s already exists", c.ImageName) + c.imageAlreadyExists = d.ImageExists(c.ImageName) + if !c.PackerForce && c.imageAlreadyExists { + err := fmt.Errorf("Image %s already exists.\n"+ + "Use the force flag to delete it prior to building.", c.ImageName) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } - return multistep.ActionContinue } diff --git a/builder/googlecompute/step_create_image.go b/builder/googlecompute/step_create_image.go index c8d5b4834..79d0c3df6 100644 --- a/builder/googlecompute/step_create_image.go +++ b/builder/googlecompute/step_create_image.go @@ -22,6 +22,19 @@ func (s *StepCreateImage) Run(state multistep.StateBag) multistep.StepAction { driver := state.Get("driver").(Driver) ui := state.Get("ui").(packer.Ui) + if config.PackerForce && config.imageAlreadyExists { + ui.Say("Deleting previous image...") + + errCh := driver.DeleteImage(config.ImageName) + err := <-errCh + if err != nil { + err := fmt.Errorf("Error deleting image: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + } + ui.Say("Creating image...") imageCh, errCh := driver.CreateImage(