blob: 86d5b0e0e06be5296fc2c6fd670e84eedfe7fef3 [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
//go:generate packer-sdc mapstructure-to-hcl2 -type MockConfig,NestedMockConfig,MockTag
package hcl2template
import (
"context"
"time"
"github.com/hashicorp/hcl/v2/hcldec"
"github.com/hashicorp/packer-plugin-sdk/hcl2helper"
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
"github.com/hashicorp/packer-plugin-sdk/template/config"
"github.com/zclconf/go-cty/cty"
"github.com/zclconf/go-cty/cty/json"
)
type NestedMockConfig struct {
String string `mapstructure:"string"`
Int int `mapstructure:"int"`
Int64 int64 `mapstructure:"int64"`
Bool bool `mapstructure:"bool"`
Trilean config.Trilean `mapstructure:"trilean"`
Duration time.Duration `mapstructure:"duration"`
MapStringString map[string]string `mapstructure:"map_string_string"`
SliceString []string `mapstructure:"slice_string"`
SliceSliceString [][]string `mapstructure:"slice_slice_string"`
NamedMapStringString NamedMapStringString `mapstructure:"named_map_string_string"`
NamedString NamedString `mapstructure:"named_string"`
Tags []MockTag `mapstructure:"tag"`
Datasource string `mapstructure:"data_source"`
}
type MockTag struct {
Key string `mapstructure:"key"`
Value string `mapstructure:"value"`
}
type MockConfig struct {
NotSquashed string `mapstructure:"not_squashed"`
NestedMockConfig `mapstructure:",squash"`
Nested NestedMockConfig `mapstructure:"nested"`
NestedSlice []NestedMockConfig `mapstructure:"nested_slice"`
}
func (b *MockConfig) Prepare(raws ...interface{}) error {
for i, raw := range raws {
cval, ok := raw.(cty.Value)
if !ok {
continue
}
b, err := json.Marshal(cval, cty.DynamicPseudoType)
if err != nil {
return err
}
ccval, err := json.Unmarshal(b, cty.DynamicPseudoType)
if err != nil {
return err
}
raws[i] = ccval
}
return config.Decode(b, &config.DecodeOpts{
Interpolate: true,
}, raws...)
}
//////
// MockBuilder
//////
type MockBuilder struct {
Config MockConfig
}
var _ packersdk.Builder = new(MockBuilder)
func (b *MockBuilder) ConfigSpec() hcldec.ObjectSpec { return b.Config.FlatMapstructure().HCL2Spec() }
func (b *MockBuilder) Prepare(raws ...interface{}) ([]string, []string, error) {
return []string{"ID"}, nil, b.Config.Prepare(raws...)
}
func (b *MockBuilder) Run(ctx context.Context, ui packersdk.Ui, hook packersdk.Hook) (packersdk.Artifact, error) {
return nil, nil
}
//////
// MockProvisioner
//////
type MockProvisioner struct {
Config MockConfig
}
var _ packersdk.Provisioner = new(MockProvisioner)
func (b *MockProvisioner) ConfigSpec() hcldec.ObjectSpec {
return b.Config.FlatMapstructure().HCL2Spec()
}
func (b *MockProvisioner) Prepare(raws ...interface{}) error {
return b.Config.Prepare(raws...)
}
func (b *MockProvisioner) Provision(ctx context.Context, ui packersdk.Ui, comm packersdk.Communicator, _ map[string]interface{}) error {
return nil
}
//////
// MockDatasource
//////
type MockDatasource struct {
Config MockConfig
}
var _ packersdk.Datasource = new(MockDatasource)
func (d *MockDatasource) ConfigSpec() hcldec.ObjectSpec {
return d.Config.FlatMapstructure().HCL2Spec()
}
func (d *MockDatasource) OutputSpec() hcldec.ObjectSpec {
return d.Config.FlatMapstructure().HCL2Spec()
}
func (d *MockDatasource) Configure(raws ...interface{}) error {
return d.Config.Prepare(raws...)
}
func (d *MockDatasource) Execute() (cty.Value, error) {
return hcl2helper.HCL2ValueFromConfig(d.Config, d.OutputSpec()), nil
}
//////
// MockPostProcessor
//////
type MockPostProcessor struct {
Config MockConfig
}
var _ packersdk.PostProcessor = new(MockPostProcessor)
func (b *MockPostProcessor) ConfigSpec() hcldec.ObjectSpec {
return b.Config.FlatMapstructure().HCL2Spec()
}
func (b *MockPostProcessor) Configure(raws ...interface{}) error {
return b.Config.Prepare(raws...)
}
func (b *MockPostProcessor) PostProcess(ctx context.Context, ui packersdk.Ui, a packersdk.Artifact) (packersdk.Artifact, bool, bool, error) {
return nil, false, false, nil
}
//////
// MockCommunicator
//////
type MockCommunicator struct {
Config MockConfig
packersdk.Communicator
}
var _ packersdk.ConfigurableCommunicator = new(MockCommunicator)
func (b *MockCommunicator) ConfigSpec() hcldec.ObjectSpec {
return b.Config.FlatMapstructure().HCL2Spec()
}
func (b *MockCommunicator) Configure(raws ...interface{}) ([]string, error) {
return nil, b.Config.Prepare(raws...)
}
//////
// Utils
//////
type NamedMapStringString map[string]string
type NamedString string