github.phpd.cn/hashicorp/packer@v1.3.2/builder/googlecompute/step_create_image.go (about)

     1  package googlecompute
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"time"
     8  
     9  	"github.com/hashicorp/packer/helper/multistep"
    10  	"github.com/hashicorp/packer/packer"
    11  )
    12  
    13  // StepCreateImage represents a Packer build step that creates GCE machine
    14  // images.
    15  type StepCreateImage int
    16  
    17  // Run executes the Packer build step that creates a GCE machine image.
    18  //
    19  // The image is created from the persistent disk used by the instance. The
    20  // instance must be deleted and the disk retained before doing this step.
    21  func (s *StepCreateImage) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
    22  	config := state.Get("config").(*Config)
    23  	driver := state.Get("driver").(Driver)
    24  	ui := state.Get("ui").(packer.Ui)
    25  
    26  	if config.PackerForce && config.imageAlreadyExists {
    27  		ui.Say("Deleting previous image...")
    28  
    29  		errCh := driver.DeleteImage(config.ImageName)
    30  		err := <-errCh
    31  		if err != nil {
    32  			err := fmt.Errorf("Error deleting image: %s", err)
    33  			state.Put("error", err)
    34  			ui.Error(err.Error())
    35  			return multistep.ActionHalt
    36  		}
    37  	}
    38  
    39  	ui.Say("Creating image...")
    40  
    41  	imageCh, errCh := driver.CreateImage(
    42  		config.ImageName, config.ImageDescription, config.ImageFamily, config.Zone,
    43  		config.DiskName, config.ImageLabels, config.ImageLicenses)
    44  	var err error
    45  	select {
    46  	case err = <-errCh:
    47  	case <-time.After(config.stateTimeout):
    48  		err = errors.New("time out while waiting for image to register")
    49  	}
    50  
    51  	if err != nil {
    52  		err := fmt.Errorf("Error waiting for image: %s", err)
    53  		state.Put("error", err)
    54  		ui.Error(err.Error())
    55  		return multistep.ActionHalt
    56  	}
    57  
    58  	state.Put("image", <-imageCh)
    59  	return multistep.ActionContinue
    60  }
    61  
    62  // Cleanup.
    63  func (s *StepCreateImage) Cleanup(state multistep.StateBag) {}