github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/legacy/terraform/provider_mock.go (about) 1 package terraform 2 3 import ( 4 "encoding/json" 5 "sync" 6 7 "github.com/zclconf/go-cty/cty" 8 ctyjson "github.com/zclconf/go-cty/cty/json" 9 10 "github.com/hashicorp/terraform/internal/configs/hcl2shim" 11 "github.com/hashicorp/terraform/internal/providers" 12 ) 13 14 var _ providers.Interface = (*MockProvider)(nil) 15 16 // MockProvider implements providers.Interface but mocks out all the 17 // calls for testing purposes. 18 type MockProvider struct { 19 sync.Mutex 20 21 // Anything you want, in case you need to store extra data with the mock. 22 Meta interface{} 23 24 GetSchemaCalled bool 25 GetSchemaReturn *ProviderSchema // This is using ProviderSchema directly rather than providers.GetProviderSchemaResponse for compatibility with old tests 26 27 ValidateProviderConfigCalled bool 28 ValidateProviderConfigResponse providers.ValidateProviderConfigResponse 29 ValidateProviderConfigRequest providers.ValidateProviderConfigRequest 30 ValidateProviderConfigFn func(providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse 31 32 ValidateResourceConfigCalled bool 33 ValidateResourceConfigTypeName string 34 ValidateResourceConfigResponse providers.ValidateResourceConfigResponse 35 ValidateResourceConfigRequest providers.ValidateResourceConfigRequest 36 ValidateResourceConfigFn func(providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse 37 38 ValidateDataResourceConfigCalled bool 39 ValidateDataResourceConfigTypeName string 40 ValidateDataResourceConfigResponse providers.ValidateDataResourceConfigResponse 41 ValidateDataResourceConfigRequest providers.ValidateDataResourceConfigRequest 42 ValidateDataResourceConfigFn func(providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse 43 44 UpgradeResourceStateCalled bool 45 UpgradeResourceStateTypeName string 46 UpgradeResourceStateResponse providers.UpgradeResourceStateResponse 47 UpgradeResourceStateRequest providers.UpgradeResourceStateRequest 48 UpgradeResourceStateFn func(providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse 49 50 ConfigureProviderCalled bool 51 ConfigureProviderResponse providers.ConfigureProviderResponse 52 ConfigureProviderRequest providers.ConfigureProviderRequest 53 ConfigureProviderFn func(providers.ConfigureProviderRequest) providers.ConfigureProviderResponse 54 55 StopCalled bool 56 StopFn func() error 57 StopResponse error 58 59 ReadResourceCalled bool 60 ReadResourceResponse providers.ReadResourceResponse 61 ReadResourceRequest providers.ReadResourceRequest 62 ReadResourceFn func(providers.ReadResourceRequest) providers.ReadResourceResponse 63 64 PlanResourceChangeCalled bool 65 PlanResourceChangeResponse providers.PlanResourceChangeResponse 66 PlanResourceChangeRequest providers.PlanResourceChangeRequest 67 PlanResourceChangeFn func(providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse 68 69 ApplyResourceChangeCalled bool 70 ApplyResourceChangeResponse providers.ApplyResourceChangeResponse 71 ApplyResourceChangeRequest providers.ApplyResourceChangeRequest 72 ApplyResourceChangeFn func(providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse 73 74 ImportResourceStateCalled bool 75 ImportResourceStateResponse providers.ImportResourceStateResponse 76 ImportResourceStateRequest providers.ImportResourceStateRequest 77 ImportResourceStateFn func(providers.ImportResourceStateRequest) providers.ImportResourceStateResponse 78 // Legacy return type for existing tests, which will be shimmed into an 79 // ImportResourceStateResponse if set 80 ImportStateReturn []*InstanceState 81 82 ReadDataSourceCalled bool 83 ReadDataSourceResponse providers.ReadDataSourceResponse 84 ReadDataSourceRequest providers.ReadDataSourceRequest 85 ReadDataSourceFn func(providers.ReadDataSourceRequest) providers.ReadDataSourceResponse 86 87 CloseCalled bool 88 CloseError error 89 } 90 91 func (p *MockProvider) GetProviderSchema() providers.GetProviderSchemaResponse { 92 p.Lock() 93 defer p.Unlock() 94 p.GetSchemaCalled = true 95 return p.getSchema() 96 } 97 98 func (p *MockProvider) getSchema() providers.GetProviderSchemaResponse { 99 // This version of getSchema doesn't do any locking, so it's suitable to 100 // call from other methods of this mock as long as they are already 101 // holding the lock. 102 103 ret := providers.GetProviderSchemaResponse{ 104 Provider: providers.Schema{}, 105 DataSources: map[string]providers.Schema{}, 106 ResourceTypes: map[string]providers.Schema{}, 107 } 108 if p.GetSchemaReturn != nil { 109 ret.Provider.Block = p.GetSchemaReturn.Provider 110 ret.ProviderMeta.Block = p.GetSchemaReturn.ProviderMeta 111 for n, s := range p.GetSchemaReturn.DataSources { 112 ret.DataSources[n] = providers.Schema{ 113 Block: s, 114 } 115 } 116 for n, s := range p.GetSchemaReturn.ResourceTypes { 117 ret.ResourceTypes[n] = providers.Schema{ 118 Version: int64(p.GetSchemaReturn.ResourceTypeSchemaVersions[n]), 119 Block: s, 120 } 121 } 122 } 123 124 return ret 125 } 126 127 func (p *MockProvider) ValidateProviderConfig(r providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse { 128 p.Lock() 129 defer p.Unlock() 130 131 p.ValidateProviderConfigCalled = true 132 p.ValidateProviderConfigRequest = r 133 if p.ValidateProviderConfigFn != nil { 134 return p.ValidateProviderConfigFn(r) 135 } 136 return p.ValidateProviderConfigResponse 137 } 138 139 func (p *MockProvider) ValidateResourceConfig(r providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse { 140 p.Lock() 141 defer p.Unlock() 142 143 p.ValidateResourceConfigCalled = true 144 p.ValidateResourceConfigRequest = r 145 146 if p.ValidateResourceConfigFn != nil { 147 return p.ValidateResourceConfigFn(r) 148 } 149 150 return p.ValidateResourceConfigResponse 151 } 152 153 func (p *MockProvider) ValidateDataResourceConfig(r providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse { 154 p.Lock() 155 defer p.Unlock() 156 157 p.ValidateDataResourceConfigCalled = true 158 p.ValidateDataResourceConfigRequest = r 159 160 if p.ValidateDataResourceConfigFn != nil { 161 return p.ValidateDataResourceConfigFn(r) 162 } 163 164 return p.ValidateDataResourceConfigResponse 165 } 166 167 func (p *MockProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse { 168 p.Lock() 169 defer p.Unlock() 170 171 schemas := p.getSchema() 172 schema := schemas.ResourceTypes[r.TypeName] 173 schemaType := schema.Block.ImpliedType() 174 175 p.UpgradeResourceStateCalled = true 176 p.UpgradeResourceStateRequest = r 177 178 if p.UpgradeResourceStateFn != nil { 179 return p.UpgradeResourceStateFn(r) 180 } 181 182 resp := p.UpgradeResourceStateResponse 183 184 if resp.UpgradedState == cty.NilVal { 185 switch { 186 case r.RawStateFlatmap != nil: 187 v, err := hcl2shim.HCL2ValueFromFlatmap(r.RawStateFlatmap, schemaType) 188 if err != nil { 189 resp.Diagnostics = resp.Diagnostics.Append(err) 190 return resp 191 } 192 resp.UpgradedState = v 193 case len(r.RawStateJSON) > 0: 194 v, err := ctyjson.Unmarshal(r.RawStateJSON, schemaType) 195 196 if err != nil { 197 resp.Diagnostics = resp.Diagnostics.Append(err) 198 return resp 199 } 200 resp.UpgradedState = v 201 } 202 } 203 return resp 204 } 205 206 func (p *MockProvider) ConfigureProvider(r providers.ConfigureProviderRequest) providers.ConfigureProviderResponse { 207 p.Lock() 208 defer p.Unlock() 209 210 p.ConfigureProviderCalled = true 211 p.ConfigureProviderRequest = r 212 213 if p.ConfigureProviderFn != nil { 214 return p.ConfigureProviderFn(r) 215 } 216 217 return p.ConfigureProviderResponse 218 } 219 220 func (p *MockProvider) Stop() error { 221 // We intentionally don't lock in this one because the whole point of this 222 // method is to be called concurrently with another operation that can 223 // be cancelled. The provider itself is responsible for handling 224 // any concurrency concerns in this case. 225 226 p.StopCalled = true 227 if p.StopFn != nil { 228 return p.StopFn() 229 } 230 231 return p.StopResponse 232 } 233 234 func (p *MockProvider) ReadResource(r providers.ReadResourceRequest) providers.ReadResourceResponse { 235 p.Lock() 236 defer p.Unlock() 237 238 p.ReadResourceCalled = true 239 p.ReadResourceRequest = r 240 241 if p.ReadResourceFn != nil { 242 return p.ReadResourceFn(r) 243 } 244 245 resp := p.ReadResourceResponse 246 if resp.NewState != cty.NilVal { 247 // make sure the NewState fits the schema 248 // This isn't always the case for the existing tests 249 newState, err := p.GetSchemaReturn.ResourceTypes[r.TypeName].CoerceValue(resp.NewState) 250 if err != nil { 251 panic(err) 252 } 253 resp.NewState = newState 254 return resp 255 } 256 257 // just return the same state we received 258 resp.NewState = r.PriorState 259 return resp 260 } 261 262 func (p *MockProvider) PlanResourceChange(r providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse { 263 p.Lock() 264 defer p.Unlock() 265 266 p.PlanResourceChangeCalled = true 267 p.PlanResourceChangeRequest = r 268 269 if p.PlanResourceChangeFn != nil { 270 return p.PlanResourceChangeFn(r) 271 } 272 273 return p.PlanResourceChangeResponse 274 } 275 276 func (p *MockProvider) ApplyResourceChange(r providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { 277 p.Lock() 278 p.ApplyResourceChangeCalled = true 279 p.ApplyResourceChangeRequest = r 280 p.Unlock() 281 282 if p.ApplyResourceChangeFn != nil { 283 return p.ApplyResourceChangeFn(r) 284 } 285 286 return p.ApplyResourceChangeResponse 287 } 288 289 func (p *MockProvider) ImportResourceState(r providers.ImportResourceStateRequest) providers.ImportResourceStateResponse { 290 p.Lock() 291 defer p.Unlock() 292 293 if p.ImportStateReturn != nil { 294 for _, is := range p.ImportStateReturn { 295 if is.Attributes == nil { 296 is.Attributes = make(map[string]string) 297 } 298 is.Attributes["id"] = is.ID 299 300 typeName := is.Ephemeral.Type 301 // Use the requested type if the resource has no type of it's own. 302 // We still return the empty type, which will error, but this prevents a panic. 303 if typeName == "" { 304 typeName = r.TypeName 305 } 306 307 schema := p.GetSchemaReturn.ResourceTypes[typeName] 308 if schema == nil { 309 panic("no schema found for " + typeName) 310 } 311 312 private, err := json.Marshal(is.Meta) 313 if err != nil { 314 panic(err) 315 } 316 317 state, err := hcl2shim.HCL2ValueFromFlatmap(is.Attributes, schema.ImpliedType()) 318 if err != nil { 319 panic(err) 320 } 321 322 state, err = schema.CoerceValue(state) 323 if err != nil { 324 panic(err) 325 } 326 327 p.ImportResourceStateResponse.ImportedResources = append( 328 p.ImportResourceStateResponse.ImportedResources, 329 providers.ImportedResource{ 330 TypeName: is.Ephemeral.Type, 331 State: state, 332 Private: private, 333 }) 334 } 335 } 336 337 p.ImportResourceStateCalled = true 338 p.ImportResourceStateRequest = r 339 if p.ImportResourceStateFn != nil { 340 return p.ImportResourceStateFn(r) 341 } 342 343 return p.ImportResourceStateResponse 344 } 345 346 func (p *MockProvider) ReadDataSource(r providers.ReadDataSourceRequest) providers.ReadDataSourceResponse { 347 p.Lock() 348 defer p.Unlock() 349 350 p.ReadDataSourceCalled = true 351 p.ReadDataSourceRequest = r 352 353 if p.ReadDataSourceFn != nil { 354 return p.ReadDataSourceFn(r) 355 } 356 357 return p.ReadDataSourceResponse 358 } 359 360 func (p *MockProvider) Close() error { 361 p.CloseCalled = true 362 return p.CloseError 363 }