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