github.com/hashicorp/packer@v1.14.3/provisioner/breakpoint/provisioner.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 //go:generate packer-sdc mapstructure-to-hcl2 -type Config 5 6 package breakpoint 7 8 import ( 9 "context" 10 "fmt" 11 12 "golang.org/x/sync/errgroup" 13 14 "github.com/hashicorp/hcl/v2/hcldec" 15 "github.com/hashicorp/packer-plugin-sdk/common" 16 packersdk "github.com/hashicorp/packer-plugin-sdk/packer" 17 "github.com/hashicorp/packer-plugin-sdk/template/config" 18 "github.com/hashicorp/packer-plugin-sdk/template/interpolate" 19 ) 20 21 type Config struct { 22 common.PackerConfig `mapstructure:",squash"` 23 24 Note string `mapstructure:"note"` 25 Disable bool `mapstructure:"disable"` 26 27 ctx interpolate.Context 28 } 29 30 type Provisioner struct { 31 config Config 32 } 33 34 func (p *Provisioner) ConfigSpec() hcldec.ObjectSpec { return p.config.FlatMapstructure().HCL2Spec() } 35 36 func (p *Provisioner) Prepare(raws ...interface{}) error { 37 err := config.Decode(&p.config, &config.DecodeOpts{ 38 PluginType: "breakpoint", 39 Interpolate: true, 40 InterpolateContext: &p.config.ctx, 41 InterpolateFilter: &interpolate.RenderFilter{ 42 Exclude: []string{}, 43 }, 44 }, raws...) 45 if err != nil { 46 return err 47 } 48 49 return nil 50 } 51 52 func (p *Provisioner) Provision(ctx context.Context, ui packersdk.Ui, comm packersdk.Communicator, _ map[string]interface{}) error { 53 if p.config.Disable { 54 if p.config.Note != "" { 55 ui.Say(fmt.Sprintf( 56 "Breakpoint provisioner with note \"%s\" disabled; continuing...", 57 p.config.Note)) 58 } else { 59 ui.Say("Breakpoint provisioner disabled; continuing...") 60 } 61 62 return nil 63 } 64 if p.config.Note != "" { 65 ui.Say(fmt.Sprintf("Pausing at breakpoint provisioner with note \"%s\".", p.config.Note)) 66 } else { 67 ui.Say("Pausing at breakpoint provisioner.") 68 } 69 70 message := "Press enter to continue." 71 72 var g errgroup.Group 73 result := make(chan string, 1) 74 g.Go(func() error { 75 line, err := ui.Ask(message) 76 if err != nil { 77 return fmt.Errorf("Error asking for input: %s", err) 78 } 79 80 result <- line 81 return nil 82 }) 83 84 if err := g.Wait(); err != nil { 85 return err 86 } 87 return nil 88 }