github.phpd.cn/hashicorp/packer@v1.3.2/builder/ncloud/step_terminate_server_instance.go (about) 1 package ncloud 2 3 import ( 4 "context" 5 "errors" 6 "time" 7 8 ncloud "github.com/NaverCloudPlatform/ncloud-sdk-go/sdk" 9 "github.com/hashicorp/packer/helper/multistep" 10 "github.com/hashicorp/packer/packer" 11 ) 12 13 type StepTerminateServerInstance struct { 14 Conn *ncloud.Conn 15 TerminateServerInstance func(serverInstanceNo string) error 16 Say func(message string) 17 Error func(e error) 18 } 19 20 func NewStepTerminateServerInstance(conn *ncloud.Conn, ui packer.Ui) *StepTerminateServerInstance { 21 var step = &StepTerminateServerInstance{ 22 Conn: conn, 23 Say: func(message string) { ui.Say(message) }, 24 Error: func(e error) { ui.Error(e.Error()) }, 25 } 26 27 step.TerminateServerInstance = step.terminateServerInstance 28 29 return step 30 } 31 32 func (s *StepTerminateServerInstance) terminateServerInstance(serverInstanceNo string) error { 33 reqParams := new(ncloud.RequestTerminateServerInstances) 34 reqParams.ServerInstanceNoList = []string{serverInstanceNo} 35 36 _, err := s.Conn.TerminateServerInstances(reqParams) 37 if err != nil { 38 return err 39 } 40 41 c1 := make(chan error, 1) 42 43 go func() { 44 reqParams := new(ncloud.RequestGetServerInstanceList) 45 reqParams.ServerInstanceNoList = []string{serverInstanceNo} 46 47 for { 48 49 serverInstanceList, err := s.Conn.GetServerInstanceList(reqParams) 50 if err != nil { 51 c1 <- err 52 return 53 } else if serverInstanceList.TotalRows == 0 { 54 c1 <- nil 55 return 56 } 57 58 time.Sleep(time.Second * 3) 59 } 60 }() 61 62 select { 63 case res := <-c1: 64 return res 65 case <-time.After(time.Second * 60): 66 return errors.New("TIMEOUT : Can't terminate server instance") 67 } 68 } 69 70 func (s *StepTerminateServerInstance) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 71 s.Say("Terminate Server Instance") 72 73 var serverInstanceNo = state.Get("InstanceNo").(string) 74 75 err := s.TerminateServerInstance(serverInstanceNo) 76 77 return processStepResult(err, s.Error, state) 78 } 79 80 func (*StepTerminateServerInstance) Cleanup(multistep.StateBag) { 81 }