test: also allow mock_data and mock_resource blocks to generate data during planning (#36317)

pull/36313/head
Liam Cervante 1 year ago committed by GitHub
parent e5d4a51ee4
commit 408f323efa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -221,7 +221,7 @@ func TestTest_Runs(t *testing.T) {
code: 0, code: 0,
}, },
"mocking": { "mocking": {
expectedOut: []string{"9 passed, 0 failed."}, expectedOut: []string{"10 passed, 0 failed."},
code: 0, code: 0,
}, },
"mocking-invalid": { "mocking-invalid": {

@ -0,0 +1,6 @@
mock_resource "test_resource" {
override_during = plan
defaults = {
id = "aaaa"
}
}

@ -0,0 +1,47 @@
mock_provider "test" {
alias = "primary"
source ="./tests/mocks"
}
mock_provider "test" {
alias = "secondary"
mock_resource "test_resource" {
override_during = plan
defaults = {
id = "bbbb"
}
}
}
variables {
instances = 1
child_instances = 1
}
run "test" {
command = plan
assert {
condition = test_resource.primary[0].id == "aaaa"
error_message = "did not apply mocks"
}
assert {
condition = module.child[0].primary[0].id == "aaaa"
error_message = "did not apply mocks"
}
assert {
condition = test_resource.secondary[0].id == "bbbb"
error_message = "wrongly applied mocks"
}
assert {
condition = module.child[0].secondary[0].id == "bbbb"
error_message = "wrongly applied mocks"
}
}

@ -308,7 +308,7 @@ func TestBuildConfig_WithMockDataSources(t *testing.T) {
cfg, diags := BuildConfig(mod, nil, MockDataLoaderFunc(func(provider *Provider) (*MockData, hcl.Diagnostics) { cfg, diags := BuildConfig(mod, nil, MockDataLoaderFunc(func(provider *Provider) (*MockData, hcl.Diagnostics) {
sourcePath := filepath.Join("testdata/valid-modules/with-mock-sources", provider.MockDataExternalSource) sourcePath := filepath.Join("testdata/valid-modules/with-mock-sources", provider.MockDataExternalSource)
return parser.LoadMockDataDir(sourcePath, hcl.Range{}) return parser.LoadMockDataDir(sourcePath, provider.MockDataDuringPlan, hcl.Range{})
})) }))
assertNoDiagnostics(t, diags) assertNoDiagnostics(t, diags)
if cfg == nil { if cfg == nil {
@ -339,7 +339,7 @@ func TestBuildConfig_WithMockDataSourcesInline(t *testing.T) {
cfg, diags := BuildConfig(mod, nil, MockDataLoaderFunc(func(provider *Provider) (*MockData, hcl.Diagnostics) { cfg, diags := BuildConfig(mod, nil, MockDataLoaderFunc(func(provider *Provider) (*MockData, hcl.Diagnostics) {
sourcePath := filepath.Join("testdata/valid-modules/with-mock-sources-inline", provider.MockDataExternalSource) sourcePath := filepath.Join("testdata/valid-modules/with-mock-sources-inline", provider.MockDataExternalSource)
return parser.LoadMockDataDir(sourcePath, hcl.Range{}) return parser.LoadMockDataDir(sourcePath, provider.MockDataDuringPlan, hcl.Range{})
})) }))
assertNoDiagnostics(t, diags) assertNoDiagnostics(t, diags)
if cfg == nil { if cfg == nil {

@ -58,7 +58,7 @@ func (l *Loader) LoadExternalMockData(provider *configs.Provider) (*configs.Mock
} }
// Otherwise, just hand this off to the parser to handle. // Otherwise, just hand this off to the parser to handle.
return l.parser.LoadMockDataDir(provider.MockDataExternalSource, provider.DeclRange) return l.parser.LoadMockDataDir(provider.MockDataExternalSource, provider.MockDataDuringPlan, provider.DeclRange)
} }
// moduleWalkerLoad is a configs.ModuleWalkerFunc for loading modules that // moduleWalkerLoad is a configs.ModuleWalkerFunc for loading modules that

@ -60,8 +60,12 @@ func decodeMockProviderBlock(block *hcl.Block) (*Provider, hcl.Diagnostics) {
} }
} }
useForPlan, useForPlanDiags := useForPlan(content, false)
diags = append(diags, useForPlanDiags...)
provider.MockDataDuringPlan = useForPlan
var dataDiags hcl.Diagnostics var dataDiags hcl.Diagnostics
provider.MockData, dataDiags = decodeMockDataBody(config, MockProviderOverrideSource) provider.MockData, dataDiags = decodeMockDataBody(config, useForPlan, MockProviderOverrideSource)
diags = append(diags, dataDiags...) diags = append(diags, dataDiags...)
if attr, exists := content.Attributes["source"]; exists { if attr, exists := content.Attributes["source"]; exists {
@ -72,23 +76,25 @@ func decodeMockProviderBlock(block *hcl.Block) (*Provider, hcl.Diagnostics) {
return provider, diags return provider, diags
} }
func extractOverrideDuring(content *hcl.BodyContent) (*string, hcl.Diagnostics) { func useForPlan(content *hcl.BodyContent, def bool) (bool, hcl.Diagnostics) {
var diags hcl.Diagnostics var diags hcl.Diagnostics
if attr, exists := content.Attributes[overrideDuringCommand]; exists { if attr, exists := content.Attributes[overrideDuringCommand]; exists {
overrideComputedStr := hcl.ExprAsKeyword(attr.Expr) switch hcl.ExprAsKeyword(attr.Expr) {
if overrideComputedStr != "plan" && overrideComputedStr != "apply" { case "plan":
return true, diags
case "apply":
return false, diags
default:
diags = diags.Append(&hcl.Diagnostic{ diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError, Severity: hcl.DiagError,
Summary: fmt.Sprintf("Invalid %s value", overrideDuringCommand), Summary: fmt.Sprintf("Invalid %s value", overrideDuringCommand),
Detail: fmt.Sprintf("The %s attribute must be a value of plan or apply.", overrideDuringCommand), Detail: fmt.Sprintf("The %s attribute must be a value of plan or apply.", overrideDuringCommand),
Subject: attr.Range.Ptr(), Subject: attr.Range.Ptr(),
}) })
return def, diags
} }
return &overrideComputedStr, diags
} }
return def, diags
return nil, diags
} }
// MockData packages up all the available mock and override data available to // MockData packages up all the available mock and override data available to
@ -97,10 +103,6 @@ type MockData struct {
MockResources map[string]*MockResource MockResources map[string]*MockResource
MockDataSources map[string]*MockResource MockDataSources map[string]*MockResource
Overrides addrs.Map[addrs.Targetable, *Override] Overrides addrs.Map[addrs.Targetable, *Override]
// UseForPlan returns true if the provider-level setting for overrideComputed
// is true, meaning that computed values can be overridden with the mocked values during planning.
UseForPlan bool
} }
// Merge will merge the target MockData object into the current MockData. // Merge will merge the target MockData object into the current MockData.
@ -180,6 +182,10 @@ type MockResource struct {
Defaults cty.Value Defaults cty.Value
// UseForPlan is true if the values should be computed during the planning
// phase.
UseForPlan bool
Range hcl.Range Range hcl.Range
TypeRange hcl.Range TypeRange hcl.Range
DefaultsRange hcl.Range DefaultsRange hcl.Range
@ -202,12 +208,9 @@ type Override struct {
Target *addrs.Target Target *addrs.Target
Values cty.Value Values cty.Value
// By default, overridden computed values are ignored during planning, // UseForPlan is true if the values should be computed during the planning
// and the computed values are set to unknown to simulate the behavior // phase.
// of a real plan. This attribute indicates that the computed values UseForPlan bool
// should be overridden with the values specified in the override block,
// even when planning.
useForPlan *bool
// Source tells us where this Override was defined. // Source tells us where this Override was defined.
Source OverrideSource Source OverrideSource
@ -218,33 +221,22 @@ type Override struct {
ValuesRange hcl.Range ValuesRange hcl.Range
} }
// UseForPlan returns true if the computed values in the target func decodeMockDataBody(body hcl.Body, useForPlanDefault bool, source OverrideSource) (*MockData, hcl.Diagnostics) {
// resource can be overridden with the values specified in the override block.
func (o *Override) UseForPlan() bool {
return o.useForPlan != nil && *o.useForPlan
}
func decodeMockDataBody(body hcl.Body, source OverrideSource) (*MockData, hcl.Diagnostics) {
var diags hcl.Diagnostics var diags hcl.Diagnostics
content, contentDiags := body.Content(mockDataSchema) content, contentDiags := body.Content(mockDataSchema)
diags = append(diags, contentDiags...) diags = append(diags, contentDiags...)
// provider-level setting for overrideComputed
providerOverrideComputed, valueDiags := extractOverrideDuring(content)
diags = append(diags, valueDiags...)
useForPlan := providerOverrideComputed != nil && *providerOverrideComputed == "plan"
data := &MockData{ data := &MockData{
MockResources: make(map[string]*MockResource), MockResources: make(map[string]*MockResource),
MockDataSources: make(map[string]*MockResource), MockDataSources: make(map[string]*MockResource),
Overrides: addrs.MakeMap[addrs.Targetable, *Override](), Overrides: addrs.MakeMap[addrs.Targetable, *Override](),
UseForPlan: useForPlan,
} }
for _, block := range content.Blocks { for _, block := range content.Blocks {
switch block.Type { switch block.Type {
case "mock_resource", "mock_data": case "mock_resource", "mock_data":
resource, resourceDiags := decodeMockResourceBlock(block) resource, resourceDiags := decodeMockResourceBlock(block, useForPlanDefault)
diags = append(diags, resourceDiags...) diags = append(diags, resourceDiags...)
if resource != nil { if resource != nil {
@ -274,7 +266,7 @@ func decodeMockDataBody(body hcl.Body, source OverrideSource) (*MockData, hcl.Di
} }
} }
case "override_resource": case "override_resource":
override, overrideDiags := decodeOverrideResourceBlock(block, source) override, overrideDiags := decodeOverrideResourceBlock(block, useForPlanDefault, source)
diags = append(diags, overrideDiags...) diags = append(diags, overrideDiags...)
if override != nil && override.Target != nil { if override != nil && override.Target != nil {
@ -291,7 +283,7 @@ func decodeMockDataBody(body hcl.Body, source OverrideSource) (*MockData, hcl.Di
data.Overrides.Put(subject, override) data.Overrides.Put(subject, override)
} }
case "override_data": case "override_data":
override, overrideDiags := decodeOverrideDataBlock(block, source) override, overrideDiags := decodeOverrideDataBlock(block, useForPlanDefault, source)
diags = append(diags, overrideDiags...) diags = append(diags, overrideDiags...)
if override != nil && override.Target != nil { if override != nil && override.Target != nil {
@ -310,19 +302,10 @@ func decodeMockDataBody(body hcl.Body, source OverrideSource) (*MockData, hcl.Di
} }
} }
for _, elem := range data.Overrides.Elements() {
// use the provider-level setting if there is none set for this override
useForPlan := providerOverrideComputed != nil && *providerOverrideComputed == "plan"
if elem.Value.useForPlan == nil {
elem.Value.useForPlan = &useForPlan
}
data.Overrides.Put(elem.Key, elem.Value)
}
return data, diags return data, diags
} }
func decodeMockResourceBlock(block *hcl.Block) (*MockResource, hcl.Diagnostics) { func decodeMockResourceBlock(block *hcl.Block, useForPlanDefault bool) (*MockResource, hcl.Diagnostics) {
var diags hcl.Diagnostics var diags hcl.Diagnostics
content, contentDiags := block.Body.Content(mockResourceSchema) content, contentDiags := block.Body.Content(mockResourceSchema)
@ -352,11 +335,15 @@ func decodeMockResourceBlock(block *hcl.Block) (*MockResource, hcl.Diagnostics)
resource.Defaults = cty.NilVal resource.Defaults = cty.NilVal
} }
useForPlan, useForPlanDiags := useForPlan(content, useForPlanDefault)
diags = append(diags, useForPlanDiags...)
resource.UseForPlan = useForPlan
return resource, diags return resource, diags
} }
func decodeOverrideModuleBlock(block *hcl.Block, source OverrideSource) (*Override, hcl.Diagnostics) { func decodeOverrideModuleBlock(block *hcl.Block, useForPlanDefault bool, source OverrideSource) (*Override, hcl.Diagnostics) {
override, diags := decodeOverrideBlock(block, "outputs", "override_module", source) override, diags := decodeOverrideBlock(block, "outputs", "override_module", useForPlanDefault, source)
if override.Target != nil { if override.Target != nil {
switch override.Target.Subject.AddrType() { switch override.Target.Subject.AddrType() {
@ -376,8 +363,8 @@ func decodeOverrideModuleBlock(block *hcl.Block, source OverrideSource) (*Overri
return override, diags return override, diags
} }
func decodeOverrideResourceBlock(block *hcl.Block, source OverrideSource) (*Override, hcl.Diagnostics) { func decodeOverrideResourceBlock(block *hcl.Block, useForPlanDefault bool, source OverrideSource) (*Override, hcl.Diagnostics) {
override, diags := decodeOverrideBlock(block, "values", "override_resource", source) override, diags := decodeOverrideBlock(block, "values", "override_resource", useForPlanDefault, source)
if override.Target != nil { if override.Target != nil {
var mode addrs.ResourceMode var mode addrs.ResourceMode
@ -413,8 +400,8 @@ func decodeOverrideResourceBlock(block *hcl.Block, source OverrideSource) (*Over
return override, diags return override, diags
} }
func decodeOverrideDataBlock(block *hcl.Block, source OverrideSource) (*Override, hcl.Diagnostics) { func decodeOverrideDataBlock(block *hcl.Block, useForPlanDefault bool, source OverrideSource) (*Override, hcl.Diagnostics) {
override, diags := decodeOverrideBlock(block, "values", "override_data", source) override, diags := decodeOverrideBlock(block, "values", "override_data", useForPlanDefault, source)
if override.Target != nil { if override.Target != nil {
var mode addrs.ResourceMode var mode addrs.ResourceMode
@ -450,7 +437,7 @@ func decodeOverrideDataBlock(block *hcl.Block, source OverrideSource) (*Override
return override, diags return override, diags
} }
func decodeOverrideBlock(block *hcl.Block, attributeName string, blockName string, source OverrideSource) (*Override, hcl.Diagnostics) { func decodeOverrideBlock(block *hcl.Block, attributeName string, blockName string, useForPlanDefault bool, source OverrideSource) (*Override, hcl.Diagnostics) {
var diags hcl.Diagnostics var diags hcl.Diagnostics
content, contentDiags := block.Body.Content(&hcl.BodySchema{ content, contentDiags := block.Body.Content(&hcl.BodySchema{
@ -498,13 +485,9 @@ func decodeOverrideBlock(block *hcl.Block, attributeName string, blockName strin
override.Values = cty.EmptyObjectVal override.Values = cty.EmptyObjectVal
} }
// Override computed values during planning if override_during is plan. useForPlan, useForPlanDiags := useForPlan(content, useForPlanDefault)
overrideComputedStr, valueDiags := extractOverrideDuring(content) diags = append(diags, useForPlanDiags...)
diags = append(diags, valueDiags...) override.UseForPlan = useForPlan
if overrideComputedStr != nil {
useForPlan := *overrideComputedStr == "plan"
override.useForPlan = &useForPlan
}
if !override.Values.Type().IsObjectType() { if !override.Values.Type().IsObjectType() {
@ -535,13 +518,13 @@ var mockProviderSchema = &hcl.BodySchema{
{ {
Name: "source", Name: "source",
}, },
{
Name: overrideDuringCommand,
},
}, },
} }
var mockDataSchema = &hcl.BodySchema{ var mockDataSchema = &hcl.BodySchema{
Attributes: []hcl.AttributeSchema{
{Name: overrideDuringCommand},
},
Blocks: []hcl.BlockHeaderSchema{ Blocks: []hcl.BlockHeaderSchema{
{Type: "mock_resource", LabelNames: []string{"type"}}, {Type: "mock_resource", LabelNames: []string{"type"}},
{Type: "mock_data", LabelNames: []string{"type"}}, {Type: "mock_data", LabelNames: []string{"type"}},
@ -553,5 +536,6 @@ var mockDataSchema = &hcl.BodySchema{
var mockResourceSchema = &hcl.BodySchema{ var mockResourceSchema = &hcl.BodySchema{
Attributes: []hcl.AttributeSchema{ Attributes: []hcl.AttributeSchema{
{Name: "defaults"}, {Name: "defaults"},
{Name: overrideDuringCommand},
}, },
} }

@ -53,13 +53,13 @@ func (p *Parser) LoadTestFile(path string) (*TestFile, hcl.Diagnostics) {
// //
// It references the same LoadHCLFile as LoadConfigFile, so inherits the same // It references the same LoadHCLFile as LoadConfigFile, so inherits the same
// syntax selection behaviours. // syntax selection behaviours.
func (p *Parser) LoadMockDataFile(path string) (*MockData, hcl.Diagnostics) { func (p *Parser) LoadMockDataFile(path string, useForPlanDefault bool) (*MockData, hcl.Diagnostics) {
body, diags := p.LoadHCLFile(path) body, diags := p.LoadHCLFile(path)
if body == nil { if body == nil {
return nil, diags return nil, diags
} }
data, dataDiags := decodeMockDataBody(body, MockDataFileOverrideSource) data, dataDiags := decodeMockDataBody(body, useForPlanDefault, MockDataFileOverrideSource)
diags = append(diags, dataDiags...) diags = append(diags, dataDiags...)
return data, diags return data, diags
} }

@ -78,7 +78,7 @@ func (p *Parser) LoadConfigDirWithTests(path string, testDirectory string) (*Mod
return mod, diags return mod, diags
} }
func (p *Parser) LoadMockDataDir(dir string, source hcl.Range) (*MockData, hcl.Diagnostics) { func (p *Parser) LoadMockDataDir(dir string, useForPlanDefault bool, source hcl.Range) (*MockData, hcl.Diagnostics) {
var diags hcl.Diagnostics var diags hcl.Diagnostics
infos, err := p.fs.ReadDir(dir) infos, err := p.fs.ReadDir(dir)
@ -113,7 +113,7 @@ func (p *Parser) LoadMockDataDir(dir string, source hcl.Range) (*MockData, hcl.D
var data *MockData var data *MockData
for _, file := range files { for _, file := range files {
current, currentDiags := p.LoadMockDataFile(file) current, currentDiags := p.LoadMockDataFile(file, useForPlanDefault)
diags = append(diags, currentDiags...) diags = append(diags, currentDiags...)
if data != nil { if data != nil {
diags = append(diags, data.Merge(current, false)...) diags = append(diags, data.Merge(current, false)...)

@ -38,9 +38,12 @@ type Provider struct {
// Mock and MockData declare this provider as a "mock_provider", which means // Mock and MockData declare this provider as a "mock_provider", which means
// it should use the data in MockData instead of actually initialising the // it should use the data in MockData instead of actually initialising the
// provider. // provider. MockDataDuringPlan tells the provider that, by default, it
Mock bool // should generate values during the planning stage instead of waiting for
MockData *MockData // the apply stage.
Mock bool
MockDataDuringPlan bool
MockData *MockData
// MockDataExternalSource is a file path pointing to the external data // MockDataExternalSource is a file path pointing to the external data
// file for a mock provider. An empty string indicates all data should be // file for a mock provider. An empty string indicates all data should be

@ -369,7 +369,7 @@ func loadTestFile(body hcl.Body) (*TestFile, hcl.Diagnostics) {
tf.Providers[key] = provider tf.Providers[key] = provider
} }
case "override_resource": case "override_resource":
override, overrideDiags := decodeOverrideResourceBlock(block, TestFileOverrideSource) override, overrideDiags := decodeOverrideResourceBlock(block, false, TestFileOverrideSource)
diags = append(diags, overrideDiags...) diags = append(diags, overrideDiags...)
if override != nil && override.Target != nil { if override != nil && override.Target != nil {
@ -386,7 +386,7 @@ func loadTestFile(body hcl.Body) (*TestFile, hcl.Diagnostics) {
tf.Overrides.Put(subject, override) tf.Overrides.Put(subject, override)
} }
case "override_data": case "override_data":
override, overrideDiags := decodeOverrideDataBlock(block, TestFileOverrideSource) override, overrideDiags := decodeOverrideDataBlock(block, false, TestFileOverrideSource)
diags = append(diags, overrideDiags...) diags = append(diags, overrideDiags...)
if override != nil && override.Target != nil { if override != nil && override.Target != nil {
@ -403,7 +403,7 @@ func loadTestFile(body hcl.Body) (*TestFile, hcl.Diagnostics) {
tf.Overrides.Put(subject, override) tf.Overrides.Put(subject, override)
} }
case "override_module": case "override_module":
override, overrideDiags := decodeOverrideModuleBlock(block, TestFileOverrideSource) override, overrideDiags := decodeOverrideModuleBlock(block, false, TestFileOverrideSource)
diags = append(diags, overrideDiags...) diags = append(diags, overrideDiags...)
if override != nil && override.Target != nil { if override != nil && override.Target != nil {
@ -507,7 +507,7 @@ func decodeTestRunBlock(block *hcl.Block) (*TestRun, hcl.Diagnostics) {
r.Module = module r.Module = module
} }
case "override_resource": case "override_resource":
override, overrideDiags := decodeOverrideResourceBlock(block, RunBlockOverrideSource) override, overrideDiags := decodeOverrideResourceBlock(block, false, RunBlockOverrideSource)
diags = append(diags, overrideDiags...) diags = append(diags, overrideDiags...)
if override != nil && override.Target != nil { if override != nil && override.Target != nil {
@ -524,7 +524,7 @@ func decodeTestRunBlock(block *hcl.Block) (*TestRun, hcl.Diagnostics) {
r.Overrides.Put(subject, override) r.Overrides.Put(subject, override)
} }
case "override_data": case "override_data":
override, overrideDiags := decodeOverrideDataBlock(block, RunBlockOverrideSource) override, overrideDiags := decodeOverrideDataBlock(block, false, RunBlockOverrideSource)
diags = append(diags, overrideDiags...) diags = append(diags, overrideDiags...)
if override != nil && override.Target != nil { if override != nil && override.Target != nil {
@ -541,7 +541,7 @@ func decodeTestRunBlock(block *hcl.Block) (*TestRun, hcl.Diagnostics) {
r.Overrides.Put(subject, override) r.Overrides.Put(subject, override)
} }
case "override_module": case "override_module":
override, overrideDiags := decodeOverrideModuleBlock(block, RunBlockOverrideSource) override, overrideDiags := decodeOverrideModuleBlock(block, false, RunBlockOverrideSource)
diags = append(diags, overrideDiags...) diags = append(diags, overrideDiags...)
if override != nil && override.Target != nil { if override != nil && override.Target != nil {

@ -187,7 +187,7 @@ func (m *Mock) PlanResourceChange(request PlanResourceChangeRequest) PlanResourc
ComputedAsUnknown: true, ComputedAsUnknown: true,
} }
// if we are allowed to use the mock defaults for plan, we can populate the computed fields with the mock defaults. // if we are allowed to use the mock defaults for plan, we can populate the computed fields with the mock defaults.
if mockedResource, exists := m.Data.MockResources[request.TypeName]; exists && m.Data.UseForPlan { if mockedResource, exists := m.Data.MockResources[request.TypeName]; exists && mockedResource.UseForPlan {
replacement.Value = mockedResource.Defaults replacement.Value = mockedResource.Defaults
replacement.Range = mockedResource.DefaultsRange replacement.Range = mockedResource.DefaultsRange
replacement.ComputedAsUnknown = false replacement.ComputedAsUnknown = false

@ -917,7 +917,7 @@ func (n *NodeAbstractResourceInstance) plan(
override, overrideDiags := mocking.PlanComputedValuesForResource(proposedNewVal, &mocking.MockedData{ override, overrideDiags := mocking.PlanComputedValuesForResource(proposedNewVal, &mocking.MockedData{
Value: n.override.Values, Value: n.override.Values,
Range: n.override.Range, Range: n.override.Range,
ComputedAsUnknown: !n.override.UseForPlan(), ComputedAsUnknown: !n.override.UseForPlan,
}, schema) }, schema)
resp = providers.PlanResourceChangeResponse{ resp = providers.PlanResourceChangeResponse{
PlannedState: override, PlannedState: override,
@ -1109,7 +1109,7 @@ func (n *NodeAbstractResourceInstance) plan(
override, overrideDiags := mocking.PlanComputedValuesForResource(proposedNewVal, &mocking.MockedData{ override, overrideDiags := mocking.PlanComputedValuesForResource(proposedNewVal, &mocking.MockedData{
Value: n.override.Values, Value: n.override.Values,
Range: n.override.Range, Range: n.override.Range,
ComputedAsUnknown: !n.override.UseForPlan(), ComputedAsUnknown: !n.override.UseForPlan,
}, schema) }, schema)
resp = providers.PlanResourceChangeResponse{ resp = providers.PlanResourceChangeResponse{
PlannedState: override, PlannedState: override,

Loading…
Cancel
Save