23c947acf0
The new flow: 1) Provision the instance 2) Tear down the instance, but keep the boot disk 3) Create an image from the disk 4) Tear down the disk The step to update gcloud is no longer needed, since gceimagebundle isn't used anymore. Fixes #1507 and addresses https://github.com/mitchellh/packer/issues/1447#issuecomment-61610235.
47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
package googlecompute
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/mitchellh/multistep"
|
|
"github.com/mitchellh/packer/packer"
|
|
)
|
|
|
|
// StepCreateImage represents a Packer build step that creates GCE machine
|
|
// images.
|
|
type StepCreateImage int
|
|
|
|
// Run executes the Packer build step that creates a GCE machine image.
|
|
//
|
|
// The image is created from the persistent disk used by the instance. The
|
|
// instance must be deleted and the disk retained before doing this step.
|
|
func (s *StepCreateImage) Run(state multistep.StateBag) multistep.StepAction {
|
|
config := state.Get("config").(*Config)
|
|
driver := state.Get("driver").(Driver)
|
|
ui := state.Get("ui").(packer.Ui)
|
|
|
|
ui.Say("Creating image...")
|
|
errCh := driver.CreateImage(config.ImageName, config.ImageDescription, config.Zone, config.DiskName)
|
|
var err error
|
|
select {
|
|
case err = <-errCh:
|
|
case <-time.After(config.stateTimeout):
|
|
err = errors.New("time out while waiting for image to register")
|
|
}
|
|
|
|
if err != nil {
|
|
err := fmt.Errorf("Error waiting for image: %s", err)
|
|
state.Put("error", err)
|
|
ui.Error(err.Error())
|
|
return multistep.ActionHalt
|
|
}
|
|
|
|
state.Put("image_name", config.ImageName)
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
// Cleanup.
|
|
func (s *StepCreateImage) Cleanup(state multistep.StateBag) {}
|