github.com/rothwerx/packer@v0.9.0/builder/googlecompute/step_teardown_instance.go (about)

     1  package googlecompute
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/mitchellh/multistep"
     9  	"github.com/mitchellh/packer/packer"
    10  )
    11  
    12  // StepTeardownInstance represents a Packer build step that tears down GCE
    13  // instances.
    14  type StepTeardownInstance struct {
    15  	Debug bool
    16  }
    17  
    18  // Run executes the Packer build step that tears down a GCE instance.
    19  func (s *StepTeardownInstance) Run(state multistep.StateBag) multistep.StepAction {
    20  	config := state.Get("config").(*Config)
    21  	driver := state.Get("driver").(Driver)
    22  	ui := state.Get("ui").(packer.Ui)
    23  
    24  	name := config.InstanceName
    25  	if name == "" {
    26  		return multistep.ActionHalt
    27  	}
    28  
    29  	ui.Say("Deleting instance...")
    30  	errCh, err := driver.DeleteInstance(config.Zone, name)
    31  	if err == nil {
    32  		select {
    33  		case err = <-errCh:
    34  		case <-time.After(config.stateTimeout):
    35  			err = errors.New("time out while waiting for instance to delete")
    36  		}
    37  	}
    38  
    39  	if err != nil {
    40  		ui.Error(fmt.Sprintf(
    41  			"Error deleting instance. Please delete it manually.\n\n"+
    42  				"Name: %s\n"+
    43  				"Error: %s", name, err))
    44  		return multistep.ActionHalt
    45  	}
    46  
    47  	ui.Message("Instance has been deleted!")
    48  	state.Put("instance_name", "")
    49  
    50  	return multistep.ActionContinue
    51  }
    52  
    53  // Deleting the instance does not remove the boot disk. This cleanup removes
    54  // the disk.
    55  func (s *StepTeardownInstance) Cleanup(state multistep.StateBag) {
    56  	config := state.Get("config").(*Config)
    57  	driver := state.Get("driver").(Driver)
    58  	ui := state.Get("ui").(packer.Ui)
    59  
    60  	ui.Say("Deleting disk...")
    61  	errCh, err := driver.DeleteDisk(config.Zone, config.DiskName)
    62  	if err == nil {
    63  		select {
    64  		case err = <-errCh:
    65  		case <-time.After(config.stateTimeout):
    66  			err = errors.New("time out while waiting for disk to delete")
    67  		}
    68  	}
    69  
    70  	if err != nil {
    71  		ui.Error(fmt.Sprintf(
    72  			"Error deleting disk. Please delete it manually.\n\n"+
    73  				"Name: %s\n"+
    74  				"Error: %s", config.InstanceName, err))
    75  	}
    76  
    77  	ui.Message("Disk has been deleted!")
    78  
    79  	return
    80  }