mirror of
https://github.com/hashicorp/packer.git
synced 2026-02-27 20:11:15 -05:00
create a null data source for testing. We can choose to document if we want to, but it's a convenience for us add a test to catch cyclic datasource dependency, update tests to include out of order data sources, and update the code to clean up the returned diagnostics generated from the recursive evaluation PR review comments
68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
//go:generate packer-sdc struct-markdown
|
|
//go:generate packer-sdc mapstructure-to-hcl2 -type DatasourceOutput,Config
|
|
package null
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/zclconf/go-cty/cty"
|
|
|
|
"github.com/hashicorp/hcl/v2/hcldec"
|
|
"github.com/hashicorp/packer-plugin-sdk/common"
|
|
"github.com/hashicorp/packer-plugin-sdk/hcl2helper"
|
|
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
|
"github.com/hashicorp/packer-plugin-sdk/template/config"
|
|
)
|
|
|
|
type Datasource struct {
|
|
config Config
|
|
}
|
|
|
|
// The Null data source is designed to demonstrate how data sources work, and
|
|
// to provide a test plugin. It does not do anything useful; you assign an
|
|
// input string and it gets returned as an output string.
|
|
type Config struct {
|
|
common.PackerConfig `mapstructure:",squash"`
|
|
// This variable will get stored as "output" in the output spec.
|
|
Input string `mapstructure:"input" required:"true"`
|
|
}
|
|
|
|
func (d *Datasource) ConfigSpec() hcldec.ObjectSpec {
|
|
return d.config.FlatMapstructure().HCL2Spec()
|
|
}
|
|
|
|
func (d *Datasource) Configure(raws ...interface{}) error {
|
|
err := config.Decode(&d.config, nil, raws...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var errs *packersdk.MultiError
|
|
|
|
if d.config.Input == "" {
|
|
errs = packersdk.MultiErrorAppend(errs, fmt.Errorf("The `input` must be specified"))
|
|
}
|
|
|
|
if errs != nil && len(errs.Errors) > 0 {
|
|
return errs
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type DatasourceOutput struct {
|
|
// Output will return the input variable, as output.
|
|
Output string `mapstructure:"output"`
|
|
}
|
|
|
|
func (d *Datasource) OutputSpec() hcldec.ObjectSpec {
|
|
return (&DatasourceOutput{}).FlatMapstructure().HCL2Spec()
|
|
}
|
|
|
|
func (d *Datasource) Execute() (cty.Value, error) {
|
|
// Pass input variable through to output.
|
|
output := DatasourceOutput{
|
|
Output: d.config.Input,
|
|
}
|
|
|
|
return hcl2helper.HCL2ValueFromConfig(output, d.OutputSpec()), nil
|
|
}
|