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 }