2024-02-08 03:48:59 -06:00
|
|
|
// Copyright (c) The OpenTofu Authors
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
// Copyright (c) 2023 HashiCorp, Inc.
|
2023-05-02 10:33:06 -05:00
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
2023-09-20 07:16:53 -05:00
|
|
|
package tofu
|
2014-06-03 16:26:31 -05:00
|
|
|
|
|
|
|
import (
|
2023-09-20 06:35:35 -05:00
|
|
|
"github.com/opentofu/opentofu/internal/configs/configschema"
|
|
|
|
"github.com/opentofu/opentofu/internal/providers"
|
2018-05-24 14:53:34 -05:00
|
|
|
"github.com/zclconf/go-cty/cty"
|
2014-06-03 16:26:31 -05:00
|
|
|
)
|
|
|
|
|
2018-05-07 19:18:17 -05:00
|
|
|
// mockProviderWithConfigSchema is a test helper to concisely create a mock
|
|
|
|
// provider with the given schema for its own configuration.
|
2018-08-17 14:32:35 -05:00
|
|
|
func mockProviderWithConfigSchema(schema *configschema.Block) *MockProvider {
|
|
|
|
return &MockProvider{
|
2021-02-18 09:13:43 -06:00
|
|
|
GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
|
2021-01-11 14:45:50 -06:00
|
|
|
Provider: providers.Schema{Block: schema},
|
2018-05-07 19:18:17 -05:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// mockProviderWithResourceTypeSchema is a test helper to concisely create a mock
|
|
|
|
// provider with a schema containing a single resource type.
|
2018-08-17 14:32:35 -05:00
|
|
|
func mockProviderWithResourceTypeSchema(name string, schema *configschema.Block) *MockProvider {
|
|
|
|
return &MockProvider{
|
2021-02-18 09:13:43 -06:00
|
|
|
GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
|
2021-01-11 14:45:50 -06:00
|
|
|
Provider: providers.Schema{
|
|
|
|
Block: &configschema.Block{
|
|
|
|
Attributes: map[string]*configschema.Attribute{
|
|
|
|
"string": {
|
|
|
|
Type: cty.String,
|
|
|
|
Optional: true,
|
|
|
|
},
|
|
|
|
"list": {
|
|
|
|
Type: cty.List(cty.String),
|
|
|
|
Optional: true,
|
|
|
|
},
|
|
|
|
"root": {
|
|
|
|
Type: cty.Map(cty.String),
|
|
|
|
Optional: true,
|
|
|
|
},
|
2018-05-24 14:53:34 -05:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2021-01-11 14:45:50 -06:00
|
|
|
ResourceTypes: map[string]providers.Schema{
|
|
|
|
name: providers.Schema{Block: schema},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-17 14:32:35 -05:00
|
|
|
// simpleMockProvider returns a MockProvider that is pre-configured
|
2018-05-09 18:08:10 -05:00
|
|
|
// with schema for its own config, for a resource type called "test_object" and
|
|
|
|
// for a data source also called "test_object".
|
|
|
|
//
|
|
|
|
// All three schemas have the same content as returned by function
|
|
|
|
// simpleTestSchema.
|
|
|
|
//
|
|
|
|
// For most reasonable uses the returned provider must be registered in a
|
|
|
|
// componentFactory under the name "test". Use simpleMockComponentFactory
|
|
|
|
// to obtain a pre-configured componentFactory containing the result of
|
|
|
|
// this function along with simpleMockProvisioner, both registered as "test".
|
|
|
|
//
|
|
|
|
// The returned provider has no other behaviors by default, but the caller may
|
|
|
|
// modify it in order to stub any other required functionality, or modify
|
|
|
|
// the default schema stored in the field GetSchemaReturn. Each new call to
|
|
|
|
// simpleTestProvider produces entirely new instances of all of the nested
|
|
|
|
// objects so that callers can mutate without affecting mock objects.
|
2018-08-17 14:32:35 -05:00
|
|
|
func simpleMockProvider() *MockProvider {
|
|
|
|
return &MockProvider{
|
2021-02-18 09:13:43 -06:00
|
|
|
GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
|
2021-01-11 14:45:50 -06:00
|
|
|
Provider: providers.Schema{Block: simpleTestSchema()},
|
|
|
|
ResourceTypes: map[string]providers.Schema{
|
|
|
|
"test_object": providers.Schema{Block: simpleTestSchema()},
|
2018-08-17 14:32:35 -05:00
|
|
|
},
|
2021-01-11 14:45:50 -06:00
|
|
|
DataSources: map[string]providers.Schema{
|
|
|
|
"test_object": providers.Schema{Block: simpleTestSchema()},
|
2018-05-09 18:08:10 -05:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
2023-07-05 16:31:39 -05:00
|
|
|
|
|
|
|
// ProviderSchema is a helper to convert from the internal GetProviderSchemaResponse to
|
|
|
|
// a ProviderSchema.
|
|
|
|
func (p *MockProvider) ProviderSchema() *ProviderSchema {
|
|
|
|
resp := p.getProviderSchema()
|
|
|
|
|
|
|
|
schema := &ProviderSchema{
|
|
|
|
Provider: resp.Provider.Block,
|
|
|
|
ProviderMeta: resp.ProviderMeta.Block,
|
|
|
|
ResourceTypes: map[string]*configschema.Block{},
|
|
|
|
DataSources: map[string]*configschema.Block{},
|
|
|
|
ResourceTypeSchemaVersions: map[string]uint64{},
|
|
|
|
}
|
|
|
|
|
|
|
|
for resType, s := range resp.ResourceTypes {
|
|
|
|
schema.ResourceTypes[resType] = s.Block
|
|
|
|
schema.ResourceTypeSchemaVersions[resType] = uint64(s.Version)
|
|
|
|
}
|
|
|
|
|
|
|
|
for dataSource, s := range resp.DataSources {
|
|
|
|
schema.DataSources[dataSource] = s.Block
|
|
|
|
}
|
|
|
|
|
|
|
|
return schema
|
|
|
|
}
|
|
|
|
|
|
|
|
// the type was refactored out with all the functionality handled within the
|
|
|
|
// provider package, but we keep this here for a shim in existing tests.
|
|
|
|
type ProviderSchema struct {
|
|
|
|
Provider *configschema.Block
|
|
|
|
ProviderMeta *configschema.Block
|
|
|
|
ResourceTypes map[string]*configschema.Block
|
|
|
|
ResourceTypeSchemaVersions map[string]uint64
|
|
|
|
DataSources map[string]*configschema.Block
|
|
|
|
}
|
|
|
|
|
|
|
|
// getProviderSchemaResponseFromProviderSchema is a test helper to convert a
|
|
|
|
// ProviderSchema to a GetProviderSchemaResponse for use when building a mock provider.
|
|
|
|
func getProviderSchemaResponseFromProviderSchema(providerSchema *ProviderSchema) *providers.GetProviderSchemaResponse {
|
|
|
|
resp := &providers.GetProviderSchemaResponse{
|
|
|
|
Provider: providers.Schema{Block: providerSchema.Provider},
|
|
|
|
ProviderMeta: providers.Schema{Block: providerSchema.ProviderMeta},
|
|
|
|
ResourceTypes: map[string]providers.Schema{},
|
|
|
|
DataSources: map[string]providers.Schema{},
|
|
|
|
}
|
|
|
|
|
|
|
|
for name, schema := range providerSchema.ResourceTypes {
|
|
|
|
resp.ResourceTypes[name] = providers.Schema{
|
|
|
|
Block: schema,
|
|
|
|
Version: int64(providerSchema.ResourceTypeSchemaVersions[name]),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for name, schema := range providerSchema.DataSources {
|
|
|
|
resp.DataSources[name] = providers.Schema{Block: schema}
|
|
|
|
}
|
|
|
|
|
|
|
|
return resp
|
|
|
|
}
|