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