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  }