github.com/StackPointCloud/packer@v0.10.2-0.20180716202532-b28098e0f79b/builder/ncloud/builder.go (about)

     1  package ncloud
     2  
     3  import (
     4  	ncloud "github.com/NaverCloudPlatform/ncloud-sdk-go/sdk"
     5  	"github.com/hashicorp/packer/common"
     6  	"github.com/hashicorp/packer/helper/communicator"
     7  	"github.com/hashicorp/packer/helper/multistep"
     8  	"github.com/hashicorp/packer/packer"
     9  )
    10  
    11  // Builder assume this implements packer.Builder
    12  type Builder struct {
    13  	config   *Config
    14  	stateBag multistep.StateBag
    15  	runner   multistep.Runner
    16  }
    17  
    18  func (b *Builder) Prepare(raws ...interface{}) ([]string, error) {
    19  	c, warnings, errs := NewConfig(raws...)
    20  	if errs != nil {
    21  		return warnings, errs
    22  	}
    23  	b.config = c
    24  
    25  	b.stateBag = new(multistep.BasicStateBag)
    26  
    27  	return warnings, nil
    28  }
    29  
    30  func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) {
    31  	ui.Message("Creating Naver Cloud Platform Connection ...")
    32  	conn := ncloud.NewConnection(b.config.AccessKey, b.config.SecretKey)
    33  
    34  	b.stateBag.Put("hook", hook)
    35  	b.stateBag.Put("ui", ui)
    36  
    37  	var steps []multistep.Step
    38  
    39  	steps = []multistep.Step{}
    40  
    41  	if b.config.Comm.Type == "ssh" {
    42  		steps = []multistep.Step{
    43  			NewStepValidateTemplate(conn, ui, b.config),
    44  			NewStepCreateLoginKey(conn, ui),
    45  			NewStepCreateServerInstance(conn, ui, b.config),
    46  			NewStepCreateBlockStorageInstance(conn, ui, b.config),
    47  			NewStepGetRootPassword(conn, ui),
    48  			NewStepCreatePublicIPInstance(conn, ui, b.config),
    49  			&communicator.StepConnectSSH{
    50  				Config: &b.config.Comm,
    51  				Host: func(stateBag multistep.StateBag) (string, error) {
    52  					return stateBag.Get("PublicIP").(string), nil
    53  				},
    54  				SSHConfig: SSHConfig(b.config.Comm.SSHUsername),
    55  			},
    56  			&common.StepProvision{},
    57  			NewStepStopServerInstance(conn, ui),
    58  			NewStepCreateServerImage(conn, ui, b.config),
    59  			NewStepDeleteBlockStorageInstance(conn, ui, b.config),
    60  			NewStepTerminateServerInstance(conn, ui),
    61  		}
    62  	} else if b.config.Comm.Type == "winrm" {
    63  		steps = []multistep.Step{
    64  			NewStepValidateTemplate(conn, ui, b.config),
    65  			NewStepCreateLoginKey(conn, ui),
    66  			NewStepCreateServerInstance(conn, ui, b.config),
    67  			NewStepCreateBlockStorageInstance(conn, ui, b.config),
    68  			NewStepGetRootPassword(conn, ui),
    69  			NewStepCreatePublicIPInstance(conn, ui, b.config),
    70  			&communicator.StepConnectWinRM{
    71  				Config: &b.config.Comm,
    72  				Host: func(stateBag multistep.StateBag) (string, error) {
    73  					return stateBag.Get("PublicIP").(string), nil
    74  				},
    75  				WinRMConfig: func(state multistep.StateBag) (*communicator.WinRMConfig, error) {
    76  					return &communicator.WinRMConfig{
    77  						Username: b.config.Comm.WinRMUser,
    78  						Password: state.Get("Password").(string),
    79  					}, nil
    80  				},
    81  			},
    82  			&common.StepProvision{},
    83  			NewStepStopServerInstance(conn, ui),
    84  			NewStepCreateServerImage(conn, ui, b.config),
    85  			NewStepDeleteBlockStorageInstance(conn, ui, b.config),
    86  			NewStepTerminateServerInstance(conn, ui),
    87  		}
    88  	}
    89  
    90  	// Run!
    91  	b.runner = common.NewRunnerWithPauseFn(steps, b.config.PackerConfig, ui, b.stateBag)
    92  	b.runner.Run(b.stateBag)
    93  
    94  	// If there was an error, return that
    95  	if rawErr, ok := b.stateBag.GetOk("Error"); ok {
    96  		return nil, rawErr.(error)
    97  	}
    98  
    99  	// Build the artifact and return it
   100  	artifact := &Artifact{}
   101  
   102  	if serverImage, ok := b.stateBag.GetOk("memberServerImage"); ok {
   103  		artifact.ServerImage = serverImage.(*ncloud.ServerImage)
   104  	}
   105  
   106  	return artifact, nil
   107  }
   108  
   109  func (b *Builder) Cancel() {
   110  	b.runner.Cancel()
   111  }