diff --git a/builder/azure/chroot/builder.go b/builder/azure/chroot/builder.go new file mode 100644 index 000000000..073c13aac --- /dev/null +++ b/builder/azure/chroot/builder.go @@ -0,0 +1,75 @@ +package chroot + +import ( + "context" + "errors" + "runtime" + + azcommon "github.com/hashicorp/packer/builder/azure/common" + "github.com/hashicorp/packer/common" + "github.com/hashicorp/packer/helper/config" + "github.com/hashicorp/packer/helper/multistep" + "github.com/hashicorp/packer/packer" + "github.com/hashicorp/packer/template/interpolate" +) + +type Config struct { + common.PackerConfig `mapstructure:",squash"` + + ctx interpolate.Context +} + +type Builder struct { + config Config + runner multistep.Runner +} + +func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { + b.config.ctx.Funcs = azcommon.TemplateFuncs + err := config.Decode(&b.config, &config.DecodeOpts{ + Interpolate: true, + InterpolateContext: &b.config.ctx, + InterpolateFilter: &interpolate.RenderFilter{ + Exclude: []string{ + // fields to exclude from interpolation + }, + }, + }, raws...) + + // checks, accumulate any errors or warnings + var errs *packer.MultiError + var warns []string + + if err != nil { + return nil, err + } + return warns, errs +} + +func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (packer.Artifact, error) { + if runtime.GOOS != "linux" { + return nil, errors.New("The azure-chroot builder only works on Linux environments.") + } + + // Setup the state bag and initial state for the steps + state := new(multistep.BasicStateBag) + state.Put("config", &b.config) + state.Put("hook", hook) + state.Put("ui", ui) + + // Build the steps + var steps []multistep.Step + + // Run! + b.runner = common.NewRunner(steps, b.config.PackerConfig, ui) + b.runner.Run(ctx, state) + + // If there was an error, return that + if rawErr, ok := state.GetOk("error"); ok { + return nil, rawErr.(error) + } + + return nil, nil +} + +var _ packer.Builder = &Builder{}