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  }