github.com/hashicorp/packer@v1.14.3/hcl2template/internal/mock.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  //go:generate packer-sdc mapstructure-to-hcl2 -type MockConfig,NestedMockConfig,MockTag
     5  
     6  package hcl2template
     7  
     8  import (
     9  	"context"
    10  	"time"
    11  
    12  	"github.com/hashicorp/hcl/v2/hcldec"
    13  	"github.com/hashicorp/packer-plugin-sdk/hcl2helper"
    14  	packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
    15  	"github.com/hashicorp/packer-plugin-sdk/template/config"
    16  	"github.com/zclconf/go-cty/cty"
    17  	"github.com/zclconf/go-cty/cty/json"
    18  )
    19  
    20  type NestedMockConfig struct {
    21  	String               string               `mapstructure:"string"`
    22  	Int                  int                  `mapstructure:"int"`
    23  	Int64                int64                `mapstructure:"int64"`
    24  	Bool                 bool                 `mapstructure:"bool"`
    25  	Trilean              config.Trilean       `mapstructure:"trilean"`
    26  	Duration             time.Duration        `mapstructure:"duration"`
    27  	MapStringString      map[string]string    `mapstructure:"map_string_string"`
    28  	SliceString          []string             `mapstructure:"slice_string"`
    29  	SliceSliceString     [][]string           `mapstructure:"slice_slice_string"`
    30  	NamedMapStringString NamedMapStringString `mapstructure:"named_map_string_string"`
    31  	NamedString          NamedString          `mapstructure:"named_string"`
    32  	Tags                 []MockTag            `mapstructure:"tag"`
    33  	Datasource           string               `mapstructure:"data_source"`
    34  }
    35  
    36  type MockTag struct {
    37  	Key   string `mapstructure:"key"`
    38  	Value string `mapstructure:"value"`
    39  }
    40  
    41  type MockConfig struct {
    42  	NotSquashed      string `mapstructure:"not_squashed"`
    43  	NestedMockConfig `mapstructure:",squash"`
    44  	Nested           NestedMockConfig   `mapstructure:"nested"`
    45  	NestedSlice      []NestedMockConfig `mapstructure:"nested_slice"`
    46  }
    47  
    48  func (b *MockConfig) Prepare(raws ...interface{}) error {
    49  	for i, raw := range raws {
    50  		cval, ok := raw.(cty.Value)
    51  		if !ok {
    52  			continue
    53  		}
    54  		b, err := json.Marshal(cval, cty.DynamicPseudoType)
    55  		if err != nil {
    56  			return err
    57  		}
    58  		ccval, err := json.Unmarshal(b, cty.DynamicPseudoType)
    59  		if err != nil {
    60  			return err
    61  		}
    62  		raws[i] = ccval
    63  	}
    64  	return config.Decode(b, &config.DecodeOpts{
    65  		Interpolate: true,
    66  	}, raws...)
    67  }
    68  
    69  //////
    70  // MockBuilder
    71  //////
    72  
    73  type MockBuilder struct {
    74  	Config MockConfig
    75  }
    76  
    77  var _ packersdk.Builder = new(MockBuilder)
    78  
    79  func (b *MockBuilder) ConfigSpec() hcldec.ObjectSpec { return b.Config.FlatMapstructure().HCL2Spec() }
    80  
    81  func (b *MockBuilder) Prepare(raws ...interface{}) ([]string, []string, error) {
    82  	return []string{"ID"}, nil, b.Config.Prepare(raws...)
    83  }
    84  
    85  func (b *MockBuilder) Run(ctx context.Context, ui packersdk.Ui, hook packersdk.Hook) (packersdk.Artifact, error) {
    86  	return nil, nil
    87  }
    88  
    89  //////
    90  // MockProvisioner
    91  //////
    92  
    93  type MockProvisioner struct {
    94  	Config MockConfig
    95  }
    96  
    97  var _ packersdk.Provisioner = new(MockProvisioner)
    98  
    99  func (b *MockProvisioner) ConfigSpec() hcldec.ObjectSpec {
   100  	return b.Config.FlatMapstructure().HCL2Spec()
   101  }
   102  
   103  func (b *MockProvisioner) Prepare(raws ...interface{}) error {
   104  	return b.Config.Prepare(raws...)
   105  }
   106  
   107  func (b *MockProvisioner) Provision(ctx context.Context, ui packersdk.Ui, comm packersdk.Communicator, _ map[string]interface{}) error {
   108  	return nil
   109  }
   110  
   111  //////
   112  // MockDatasource
   113  //////
   114  
   115  type MockDatasource struct {
   116  	Config MockConfig
   117  }
   118  
   119  var _ packersdk.Datasource = new(MockDatasource)
   120  
   121  func (d *MockDatasource) ConfigSpec() hcldec.ObjectSpec {
   122  	return d.Config.FlatMapstructure().HCL2Spec()
   123  }
   124  
   125  func (d *MockDatasource) OutputSpec() hcldec.ObjectSpec {
   126  	return d.Config.FlatMapstructure().HCL2Spec()
   127  }
   128  
   129  func (d *MockDatasource) Configure(raws ...interface{}) error {
   130  	return d.Config.Prepare(raws...)
   131  }
   132  
   133  func (d *MockDatasource) Execute() (cty.Value, error) {
   134  	return hcl2helper.HCL2ValueFromConfig(d.Config, d.OutputSpec()), nil
   135  }
   136  
   137  //////
   138  // MockPostProcessor
   139  //////
   140  
   141  type MockPostProcessor struct {
   142  	Config MockConfig
   143  }
   144  
   145  var _ packersdk.PostProcessor = new(MockPostProcessor)
   146  
   147  func (b *MockPostProcessor) ConfigSpec() hcldec.ObjectSpec {
   148  	return b.Config.FlatMapstructure().HCL2Spec()
   149  }
   150  
   151  func (b *MockPostProcessor) Configure(raws ...interface{}) error {
   152  	return b.Config.Prepare(raws...)
   153  }
   154  
   155  func (b *MockPostProcessor) PostProcess(ctx context.Context, ui packersdk.Ui, a packersdk.Artifact) (packersdk.Artifact, bool, bool, error) {
   156  	return nil, false, false, nil
   157  }
   158  
   159  //////
   160  // MockCommunicator
   161  //////
   162  
   163  type MockCommunicator struct {
   164  	Config MockConfig
   165  	packersdk.Communicator
   166  }
   167  
   168  var _ packersdk.ConfigurableCommunicator = new(MockCommunicator)
   169  
   170  func (b *MockCommunicator) ConfigSpec() hcldec.ObjectSpec {
   171  	return b.Config.FlatMapstructure().HCL2Spec()
   172  }
   173  
   174  func (b *MockCommunicator) Configure(raws ...interface{}) ([]string, error) {
   175  	return nil, b.Config.Prepare(raws...)
   176  }
   177  
   178  //////
   179  // Utils
   180  //////
   181  
   182  type NamedMapStringString map[string]string
   183  type NamedString string