github.phpd.cn/hashicorp/packer@v1.3.2/builder/ncloud/step_create_server_image.go (about)

     1  package ncloud
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"time"
     8  
     9  	ncloud "github.com/NaverCloudPlatform/ncloud-sdk-go/sdk"
    10  	"github.com/hashicorp/packer/helper/multistep"
    11  	"github.com/hashicorp/packer/packer"
    12  )
    13  
    14  type StepCreateServerImage struct {
    15  	Conn              *ncloud.Conn
    16  	CreateServerImage func(serverInstanceNo string) (*ncloud.ServerImage, error)
    17  	Say               func(message string)
    18  	Error             func(e error)
    19  	Config            *Config
    20  }
    21  
    22  func NewStepCreateServerImage(conn *ncloud.Conn, ui packer.Ui, config *Config) *StepCreateServerImage {
    23  	var step = &StepCreateServerImage{
    24  		Conn:   conn,
    25  		Say:    func(message string) { ui.Say(message) },
    26  		Error:  func(e error) { ui.Error(e.Error()) },
    27  		Config: config,
    28  	}
    29  
    30  	step.CreateServerImage = step.createServerImage
    31  
    32  	return step
    33  }
    34  
    35  func (s *StepCreateServerImage) createServerImage(serverInstanceNo string) (*ncloud.ServerImage, error) {
    36  	// Can't create server image when status of server instance is stopping (not stopped)
    37  	if err := waiterServerInstanceStatus(s.Conn, serverInstanceNo, "NSTOP", 1*time.Minute); err != nil {
    38  		return nil, err
    39  	}
    40  
    41  	reqParams := new(ncloud.RequestCreateServerImage)
    42  	reqParams.MemberServerImageName = s.Config.ServerImageName
    43  	reqParams.MemberServerImageDescription = s.Config.ServerImageDescription
    44  	reqParams.ServerInstanceNo = serverInstanceNo
    45  
    46  	memberServerImageList, err := s.Conn.CreateMemberServerImage(reqParams)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	serverImage := memberServerImageList.MemberServerImageList[0]
    52  
    53  	s.Say(fmt.Sprintf("Server Image[%s:%s] is creating...", serverImage.MemberServerImageName, serverImage.MemberServerImageNo))
    54  
    55  	if err := waiterMemberServerImageStatus(s.Conn, serverImage.MemberServerImageNo, "CREAT", 6*time.Hour); err != nil {
    56  		return nil, errors.New("TIMEOUT : Server Image is not created")
    57  	}
    58  
    59  	s.Say(fmt.Sprintf("Server Image[%s:%s] is created", serverImage.MemberServerImageName, serverImage.MemberServerImageNo))
    60  
    61  	return &serverImage, nil
    62  }
    63  
    64  func (s *StepCreateServerImage) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
    65  	s.Say("Create Server Image")
    66  
    67  	serverInstanceNo := state.Get("InstanceNo").(string)
    68  
    69  	serverImage, err := s.CreateServerImage(serverInstanceNo)
    70  	if err == nil {
    71  		state.Put("memberServerImage", serverImage)
    72  	}
    73  
    74  	return processStepResult(err, s.Error, state)
    75  }
    76  
    77  func (*StepCreateServerImage) Cleanup(multistep.StateBag) {
    78  }