Skip to content

Commit d769106

Browse files
authored
Provider keyed instance refactor (opentofu#2875)
Signed-off-by: Larry Bordowitz <laurence.bordowitz@gmail.com>
1 parent 3bdd007 commit d769106

3 files changed

Lines changed: 51 additions & 49 deletions

File tree

internal/states/statefile/version3_upgrade.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,12 @@ func upgradeStateV3ToV4(old *stateV3) (*stateV4, error) {
176176
}
177177

178178
rs = &resourceStateV4{
179-
Module: moduleAddr.String(),
180-
Mode: modeStr,
181-
Type: resAddr.Type,
182-
Name: resAddr.Name,
183-
Instances: []instanceObjectStateV4{},
184-
ProviderConfig: providerAddr.LegacyString(),
179+
Module: moduleAddr.String(),
180+
Mode: modeStr,
181+
Type: resAddr.Type,
182+
Name: resAddr.Name,
183+
Instances: []instanceObjectStateV4{},
184+
ProviderInstance: providerAddr.LegacyString(),
185185
}
186186
resourceStates[resAddr.String()] = rs
187187
}

internal/states/statefile/version4.go

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,16 @@ func prepareStateV4(sV4 *stateV4) (*File, tfdiags.Diagnostics) {
9292

9393
var providerAddr addrs.AbsProviderConfig
9494
var addrDiags tfdiags.Diagnostics
95-
if rsV4.ProviderConfig != "" {
96-
providerAddr, addrDiags = addrs.ParseAbsProviderConfigStr(rsV4.ProviderConfig)
95+
if rsV4.ProviderInstance != "" {
96+
providerAddr, addrDiags = addrs.ParseAbsProviderConfigStr(rsV4.ProviderInstance)
9797
if addrDiags.HasErrors() {
9898
// If ParseAbsProviderConfigStr returns an error, the state may have
9999
// been written before Provider FQNs were introduced and the
100-
// AbsProviderConfig string format will need normalization. If so,
100+
// AbsProviderInstance string format will need normalization. If so,
101101
// we treat it like a legacy provider (namespace "-") and let the
102102
// provider installer handle detecting the FQN.
103103
var legacyAddrDiags tfdiags.Diagnostics
104-
providerAddr, legacyAddrDiags = addrs.ParseLegacyAbsProviderConfigStr(rsV4.ProviderConfig)
104+
providerAddr, legacyAddrDiags = addrs.ParseLegacyAbsProviderConfigStr(rsV4.ProviderInstance)
105105
if legacyAddrDiags.HasErrors() {
106106
// Neither parse formats are valid, let's report the original error
107107
diags = diags.Append(addrDiags)
@@ -151,15 +151,15 @@ func prepareStateV4(sV4 *stateV4) (*File, tfdiags.Diagnostics) {
151151
key = addrs.NoKey
152152
}
153153

154-
if isV4.ProviderConfig != "" && rsV4.ProviderConfig != "" {
154+
if isV4.ProviderInstance != "" && rsV4.ProviderInstance != "" {
155155
diags = diags.Append(tfdiags.Sourceless(
156156
tfdiags.Warning,
157157
"Provider field conflict in state",
158-
fmt.Sprintf("Resource %s has a provider address %s, as well as instance %s with provider address %s.", rAddr.Absolute(moduleAddr), rsV4.ProviderConfig, key, isV4.ProviderConfig),
158+
fmt.Sprintf("Resource %s has a provider address %s, as well as instance %s with provider address %s.", rAddr.Absolute(moduleAddr), rsV4.ProviderInstance, key, isV4.ProviderInstance),
159159
))
160160
}
161161

162-
if isV4.ProviderConfig == "" && rsV4.ProviderConfig == "" {
162+
if isV4.ProviderInstance == "" && rsV4.ProviderInstance == "" {
163163
diags = diags.Append(tfdiags.Sourceless(
164164
tfdiags.Error,
165165
"Provider field missing state",
@@ -169,8 +169,8 @@ func prepareStateV4(sV4 *stateV4) (*File, tfdiags.Diagnostics) {
169169

170170
instanceProvider := providerAddr
171171
instanceProviderKey := addrs.NoKey
172-
if isV4.ProviderConfig != "" {
173-
instanceProvider, instanceProviderKey, addrDiags = addrs.ParseAbsProviderConfigInstanceStr(isV4.ProviderConfig)
172+
if isV4.ProviderInstance != "" {
173+
instanceProvider, instanceProviderKey, addrDiags = addrs.ParseAbsProviderConfigInstanceStr(isV4.ProviderInstance)
174174
diags = diags.Append(addrDiags)
175175
instanceProviders = append(instanceProviders, instanceProvider)
176176
}
@@ -443,18 +443,18 @@ func writeStateV4(file *File, w io.Writer, enc encryption.StateEncryption) tfdia
443443
}
444444
}
445445

446-
var providerConfig string
446+
var providerInstance string
447447
if !hasProviderInstanceKeys {
448-
providerConfig = rs.ProviderConfig.String()
448+
providerInstance = rs.ProviderConfig.String()
449449
}
450450

451451
sV4.Resources = append(sV4.Resources, resourceStateV4{
452-
Module: moduleAddr.String(),
453-
Mode: mode,
454-
Type: resourceAddr.Type,
455-
Name: resourceAddr.Name,
456-
ProviderConfig: providerConfig,
457-
Instances: []instanceObjectStateV4{},
452+
Module: moduleAddr.String(),
453+
Mode: mode,
454+
Type: resourceAddr.Type,
455+
Name: resourceAddr.Name,
456+
ProviderInstance: providerInstance,
457+
Instances: []instanceObjectStateV4{},
458458
})
459459
rsV4 := &(sV4.Resources[len(sV4.Resources)-1])
460460

@@ -554,9 +554,9 @@ func appendInstanceObjectStateV4(rs *states.Resource, is *states.ResourceInstanc
554554
}
555555
}
556556

557-
var providerConfig string
557+
var providerInstance string
558558
if hasProviderInstanceKeys {
559-
providerConfig = rs.ProviderConfig.InstanceString(is.ProviderKey)
559+
providerInstance = rs.ProviderConfig.InstanceString(is.ProviderKey)
560560
}
561561

562562
// Extract paths from path value marks
@@ -573,7 +573,7 @@ func appendInstanceObjectStateV4(rs *states.Resource, is *states.ResourceInstanc
573573
IndexKey: rawKey,
574574
Deposed: string(deposed),
575575
Status: status,
576-
ProviderConfig: providerConfig,
576+
ProviderInstance: providerInstance,
577577
SchemaVersion: obj.SchemaVersion,
578578
AttributesFlat: obj.AttrsFlat,
579579
AttributesRaw: obj.AttrsJSON,
@@ -770,23 +770,23 @@ type outputStateV4 struct {
770770
Deprecated string `json:"deprecated,omitempty"`
771771
}
772772

773-
// Note: the ProviderConfig field is only set on either the resource or the resource instance object
773+
// Note: the ProviderInstance field is only set on either the resource or the resource instance object
774774
// It should never be set on both
775775
type resourceStateV4 struct {
776-
Module string `json:"module,omitempty"`
777-
Mode string `json:"mode"`
778-
Type string `json:"type"`
779-
Name string `json:"name"`
780-
EachMode string `json:"each,omitempty"`
781-
ProviderConfig string `json:"provider,omitempty"`
782-
Instances []instanceObjectStateV4 `json:"instances"`
776+
Module string `json:"module,omitempty"`
777+
Mode string `json:"mode"`
778+
Type string `json:"type"`
779+
Name string `json:"name"`
780+
EachMode string `json:"each,omitempty"`
781+
ProviderInstance string `json:"provider,omitempty"`
782+
Instances []instanceObjectStateV4 `json:"instances"`
783783
}
784784

785785
type instanceObjectStateV4 struct {
786-
IndexKey interface{} `json:"index_key,omitempty"`
787-
Status string `json:"status,omitempty"`
788-
Deposed string `json:"deposed,omitempty"`
789-
ProviderConfig string `json:"provider,omitempty"`
786+
IndexKey interface{} `json:"index_key,omitempty"`
787+
Status string `json:"status,omitempty"`
788+
Deposed string `json:"deposed,omitempty"`
789+
ProviderInstance string `json:"provider,omitempty"`
790790

791791
SchemaVersion uint64 `json:"schema_version"`
792792
AttributesRaw json.RawMessage `json:"attributes,omitempty"`

internal/tofu/eval_context_builtin.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,18 +128,18 @@ func (c *BuiltinEvalContext) Input() UIInput {
128128
return c.InputValue
129129
}
130130

131-
func (c *BuiltinEvalContext) InitProvider(addr addrs.AbsProviderConfig, providerKey addrs.InstanceKey) (providers.Interface, error) {
131+
func (c *BuiltinEvalContext) InitProvider(addr addrs.AbsProviderConfig, providerInstanceKey addrs.InstanceKey) (providers.Interface, error) {
132132
c.ProviderLock.Lock()
133133
defer c.ProviderLock.Unlock()
134134

135-
key := addr.String()
135+
providerAddrKey := addr.String()
136136

137-
if c.ProviderCache[key] == nil {
138-
c.ProviderCache[key] = make(map[addrs.InstanceKey]providers.Interface)
137+
if c.ProviderCache[providerAddrKey] == nil {
138+
c.ProviderCache[providerAddrKey] = make(map[addrs.InstanceKey]providers.Interface)
139139
}
140140

141141
// If we have already initialized, it is an error
142-
if _, ok := c.ProviderCache[key][providerKey]; ok {
142+
if _, ok := c.ProviderCache[providerAddrKey][providerInstanceKey]; ok {
143143
return nil, fmt.Errorf("%s is already initialized", addr)
144144
}
145145

@@ -164,8 +164,8 @@ func (c *BuiltinEvalContext) InitProvider(addr addrs.AbsProviderConfig, provider
164164
}
165165
}
166166

167-
log.Printf("[TRACE] BuiltinEvalContext: Initialized %q%s provider for %s", addr.String(), providerKey, addr)
168-
c.ProviderCache[key][providerKey] = p
167+
log.Printf("[TRACE] BuiltinEvalContext: Initialized %q%s provider for %s", addr.String(), providerInstanceKey, addr)
168+
c.ProviderCache[providerAddrKey][providerInstanceKey] = p
169169

170170
return p, nil
171171
}
@@ -174,7 +174,9 @@ func (c *BuiltinEvalContext) Provider(addr addrs.AbsProviderConfig, key addrs.In
174174
c.ProviderLock.Lock()
175175
defer c.ProviderLock.Unlock()
176176

177-
pm, ok := c.ProviderCache[addr.String()]
177+
providerAddrKey := addr.String()
178+
179+
pm, ok := c.ProviderCache[providerAddrKey]
178180
if !ok {
179181
return nil
180182
}
@@ -192,16 +194,16 @@ func (c *BuiltinEvalContext) CloseProvider(addr addrs.AbsProviderConfig) error {
192194

193195
var diags tfdiags.Diagnostics
194196

195-
key := addr.String()
196-
providerMap := c.ProviderCache[key]
197+
providerAddrKey := addr.String()
198+
providerMap := c.ProviderCache[providerAddrKey]
197199
if providerMap != nil {
198200
for _, provider := range providerMap {
199201
err := provider.Close(context.TODO())
200202
if err != nil {
201203
diags = diags.Append(err)
202204
}
203205
}
204-
delete(c.ProviderCache, key)
206+
delete(c.ProviderCache, providerAddrKey)
205207
}
206208
if diags.HasErrors() {
207209
return diags.Err()

0 commit comments

Comments
 (0)