github.com/amanya/packer@v0.12.1-0.20161117214323-902ac5ab2eb6/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  	instanceLog, _ := driver.GetSerialPortOutput(config.Zone, name)
    31  	state.Put("instance_log", instanceLog)
    32  	errCh, err := driver.DeleteInstance(config.Zone, name)
    33  	if err == nil {
    34  		select {
    35  		case err = <-errCh:
    36  		case <-time.After(config.stateTimeout):
    37  			err = errors.New("time out while waiting for instance to delete")
    38  		}
    39  	}
    40  
    41  	if err != nil {
    42  		ui.Error(fmt.Sprintf(
    43  			"Error deleting instance. Please delete it manually.\n\n"+
    44  				"Name: %s\n"+
    45  				"Error: %s", name, err))
    46  		return multistep.ActionHalt
    47  	}
    48  	ui.Message("Instance has been deleted!")
    49  	state.Put("instance_name", "")
    50  
    51  	return multistep.ActionContinue
    52  }
    53  
    54  // Deleting the instance does not remove the boot disk. This cleanup removes
    55  // the disk.
    56  func (s *StepTeardownInstance) Cleanup(state multistep.StateBag) {
    57  	config := state.Get("config").(*Config)
    58  	driver := state.Get("driver").(Driver)
    59  	ui := state.Get("ui").(packer.Ui)
    60  
    61  	ui.Say("Deleting disk...")
    62  	errCh, err := driver.DeleteDisk(config.Zone, config.DiskName)
    63  	if err == nil {
    64  		select {
    65  		case err = <-errCh:
    66  		case <-time.After(config.stateTimeout):
    67  			err = errors.New("time out while waiting for disk to delete")
    68  		}
    69  	}
    70  
    71  	if err != nil {
    72  		ui.Error(fmt.Sprintf(
    73  			"Error deleting disk. Please delete it manually.\n\n"+
    74  				"DiskName: %s\n"+
    75  				"Zone: %s\n"+
    76  				"Error: %s", config.DiskName, config.Zone, err))
    77  	}
    78  
    79  	ui.Message("Disk has been deleted!")
    80  
    81  	return
    82  }