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 }