mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
183833affc
In order to parse provider, resource and data source configuration from HCL2 config files, we need to know the relevant configuration schema. This new method allows Terraform Core to request these from a provider. This is a breaking change to this interface, so all of its implementers in this package are updated too. This includes concrete implementations of the new method in helper/schema that use the schema conversion code added in an earlier commit to produce a configschema.Block automatically. Plugins compiled against prior versions of helper/schema will not have support for this method, and so calls to them will fail. Callers of this new method will therefore need to sniff for support using the SchemaAvailable field added to both ResourceType and DataSource. This careful handling will need to persist until next time we increment the plugin protocol version, at which point we can make the breaking change of requiring this information to be available.
315 lines
8.5 KiB
Go
315 lines
8.5 KiB
Go
package terraform
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// MockResourceProvider implements ResourceProvider but mocks out all the
|
|
// calls for testing purposes.
|
|
type MockResourceProvider struct {
|
|
sync.Mutex
|
|
|
|
// Anything you want, in case you need to store extra data with the mock.
|
|
Meta interface{}
|
|
|
|
CloseCalled bool
|
|
CloseError error
|
|
GetSchemaCalled bool
|
|
GetSchemaRequest *ProviderSchemaRequest
|
|
GetSchemaReturn *ProviderSchema
|
|
GetSchemaReturnError error
|
|
InputCalled bool
|
|
InputInput UIInput
|
|
InputConfig *ResourceConfig
|
|
InputReturnConfig *ResourceConfig
|
|
InputReturnError error
|
|
InputFn func(UIInput, *ResourceConfig) (*ResourceConfig, error)
|
|
ApplyCalled bool
|
|
ApplyInfo *InstanceInfo
|
|
ApplyState *InstanceState
|
|
ApplyDiff *InstanceDiff
|
|
ApplyFn func(*InstanceInfo, *InstanceState, *InstanceDiff) (*InstanceState, error)
|
|
ApplyReturn *InstanceState
|
|
ApplyReturnError error
|
|
ConfigureCalled bool
|
|
ConfigureConfig *ResourceConfig
|
|
ConfigureFn func(*ResourceConfig) error
|
|
ConfigureReturnError error
|
|
DiffCalled bool
|
|
DiffInfo *InstanceInfo
|
|
DiffState *InstanceState
|
|
DiffDesired *ResourceConfig
|
|
DiffFn func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error)
|
|
DiffReturn *InstanceDiff
|
|
DiffReturnError error
|
|
RefreshCalled bool
|
|
RefreshInfo *InstanceInfo
|
|
RefreshState *InstanceState
|
|
RefreshFn func(*InstanceInfo, *InstanceState) (*InstanceState, error)
|
|
RefreshReturn *InstanceState
|
|
RefreshReturnError error
|
|
ResourcesCalled bool
|
|
ResourcesReturn []ResourceType
|
|
ReadDataApplyCalled bool
|
|
ReadDataApplyInfo *InstanceInfo
|
|
ReadDataApplyDiff *InstanceDiff
|
|
ReadDataApplyFn func(*InstanceInfo, *InstanceDiff) (*InstanceState, error)
|
|
ReadDataApplyReturn *InstanceState
|
|
ReadDataApplyReturnError error
|
|
ReadDataDiffCalled bool
|
|
ReadDataDiffInfo *InstanceInfo
|
|
ReadDataDiffDesired *ResourceConfig
|
|
ReadDataDiffFn func(*InstanceInfo, *ResourceConfig) (*InstanceDiff, error)
|
|
ReadDataDiffReturn *InstanceDiff
|
|
ReadDataDiffReturnError error
|
|
StopCalled bool
|
|
StopFn func() error
|
|
StopReturnError error
|
|
DataSourcesCalled bool
|
|
DataSourcesReturn []DataSource
|
|
ValidateCalled bool
|
|
ValidateConfig *ResourceConfig
|
|
ValidateFn func(*ResourceConfig) ([]string, []error)
|
|
ValidateReturnWarns []string
|
|
ValidateReturnErrors []error
|
|
ValidateResourceFn func(string, *ResourceConfig) ([]string, []error)
|
|
ValidateResourceCalled bool
|
|
ValidateResourceType string
|
|
ValidateResourceConfig *ResourceConfig
|
|
ValidateResourceReturnWarns []string
|
|
ValidateResourceReturnErrors []error
|
|
ValidateDataSourceFn func(string, *ResourceConfig) ([]string, []error)
|
|
ValidateDataSourceCalled bool
|
|
ValidateDataSourceType string
|
|
ValidateDataSourceConfig *ResourceConfig
|
|
ValidateDataSourceReturnWarns []string
|
|
ValidateDataSourceReturnErrors []error
|
|
|
|
ImportStateCalled bool
|
|
ImportStateInfo *InstanceInfo
|
|
ImportStateID string
|
|
ImportStateReturn []*InstanceState
|
|
ImportStateReturnError error
|
|
ImportStateFn func(*InstanceInfo, string) ([]*InstanceState, error)
|
|
}
|
|
|
|
func (p *MockResourceProvider) Close() error {
|
|
p.CloseCalled = true
|
|
return p.CloseError
|
|
}
|
|
|
|
func (p *MockResourceProvider) GetSchema(req *ProviderSchemaRequest) (*ProviderSchema, error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.GetSchemaCalled = true
|
|
p.GetSchemaRequest = req
|
|
return p.GetSchemaReturn, p.GetSchemaReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) Input(
|
|
input UIInput, c *ResourceConfig) (*ResourceConfig, error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
p.InputCalled = true
|
|
p.InputInput = input
|
|
p.InputConfig = c
|
|
if p.InputFn != nil {
|
|
return p.InputFn(input, c)
|
|
}
|
|
return p.InputReturnConfig, p.InputReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) Validate(c *ResourceConfig) ([]string, []error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.ValidateCalled = true
|
|
p.ValidateConfig = c
|
|
if p.ValidateFn != nil {
|
|
return p.ValidateFn(c)
|
|
}
|
|
return p.ValidateReturnWarns, p.ValidateReturnErrors
|
|
}
|
|
|
|
func (p *MockResourceProvider) ValidateResource(t string, c *ResourceConfig) ([]string, []error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.ValidateResourceCalled = true
|
|
p.ValidateResourceType = t
|
|
p.ValidateResourceConfig = c
|
|
|
|
if p.ValidateResourceFn != nil {
|
|
return p.ValidateResourceFn(t, c)
|
|
}
|
|
|
|
return p.ValidateResourceReturnWarns, p.ValidateResourceReturnErrors
|
|
}
|
|
|
|
func (p *MockResourceProvider) Configure(c *ResourceConfig) error {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.ConfigureCalled = true
|
|
p.ConfigureConfig = c
|
|
|
|
if p.ConfigureFn != nil {
|
|
return p.ConfigureFn(c)
|
|
}
|
|
|
|
return p.ConfigureReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) Stop() error {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.StopCalled = true
|
|
if p.StopFn != nil {
|
|
return p.StopFn()
|
|
}
|
|
|
|
return p.StopReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) Apply(
|
|
info *InstanceInfo,
|
|
state *InstanceState,
|
|
diff *InstanceDiff) (*InstanceState, error) {
|
|
// We only lock while writing data. Reading is fine
|
|
p.Lock()
|
|
p.ApplyCalled = true
|
|
p.ApplyInfo = info
|
|
p.ApplyState = state
|
|
p.ApplyDiff = diff
|
|
p.Unlock()
|
|
|
|
if p.ApplyFn != nil {
|
|
return p.ApplyFn(info, state, diff)
|
|
}
|
|
|
|
return p.ApplyReturn.DeepCopy(), p.ApplyReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) Diff(
|
|
info *InstanceInfo,
|
|
state *InstanceState,
|
|
desired *ResourceConfig) (*InstanceDiff, error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.DiffCalled = true
|
|
p.DiffInfo = info
|
|
p.DiffState = state
|
|
p.DiffDesired = desired
|
|
if p.DiffFn != nil {
|
|
return p.DiffFn(info, state, desired)
|
|
}
|
|
|
|
return p.DiffReturn.DeepCopy(), p.DiffReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) Refresh(
|
|
info *InstanceInfo,
|
|
s *InstanceState) (*InstanceState, error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.RefreshCalled = true
|
|
p.RefreshInfo = info
|
|
p.RefreshState = s
|
|
|
|
if p.RefreshFn != nil {
|
|
return p.RefreshFn(info, s)
|
|
}
|
|
|
|
return p.RefreshReturn.DeepCopy(), p.RefreshReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) Resources() []ResourceType {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.ResourcesCalled = true
|
|
return p.ResourcesReturn
|
|
}
|
|
|
|
func (p *MockResourceProvider) ImportState(info *InstanceInfo, id string) ([]*InstanceState, error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.ImportStateCalled = true
|
|
p.ImportStateInfo = info
|
|
p.ImportStateID = id
|
|
if p.ImportStateFn != nil {
|
|
return p.ImportStateFn(info, id)
|
|
}
|
|
|
|
var result []*InstanceState
|
|
if p.ImportStateReturn != nil {
|
|
result = make([]*InstanceState, len(p.ImportStateReturn))
|
|
for i, v := range p.ImportStateReturn {
|
|
result[i] = v.DeepCopy()
|
|
}
|
|
}
|
|
|
|
return result, p.ImportStateReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) ValidateDataSource(t string, c *ResourceConfig) ([]string, []error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.ValidateDataSourceCalled = true
|
|
p.ValidateDataSourceType = t
|
|
p.ValidateDataSourceConfig = c
|
|
|
|
if p.ValidateDataSourceFn != nil {
|
|
return p.ValidateDataSourceFn(t, c)
|
|
}
|
|
|
|
return p.ValidateDataSourceReturnWarns, p.ValidateDataSourceReturnErrors
|
|
}
|
|
|
|
func (p *MockResourceProvider) ReadDataDiff(
|
|
info *InstanceInfo,
|
|
desired *ResourceConfig) (*InstanceDiff, error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.ReadDataDiffCalled = true
|
|
p.ReadDataDiffInfo = info
|
|
p.ReadDataDiffDesired = desired
|
|
if p.ReadDataDiffFn != nil {
|
|
return p.ReadDataDiffFn(info, desired)
|
|
}
|
|
|
|
return p.ReadDataDiffReturn.DeepCopy(), p.ReadDataDiffReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) ReadDataApply(
|
|
info *InstanceInfo,
|
|
d *InstanceDiff) (*InstanceState, error) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.ReadDataApplyCalled = true
|
|
p.ReadDataApplyInfo = info
|
|
p.ReadDataApplyDiff = d
|
|
|
|
if p.ReadDataApplyFn != nil {
|
|
return p.ReadDataApplyFn(info, d)
|
|
}
|
|
|
|
return p.ReadDataApplyReturn.DeepCopy(), p.ReadDataApplyReturnError
|
|
}
|
|
|
|
func (p *MockResourceProvider) DataSources() []DataSource {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
p.DataSourcesCalled = true
|
|
return p.DataSourcesReturn
|
|
}
|