Skip to content

Commit 032cd5f

Browse files
authored
Fix version in resource identity upgrade request (#36940)
1 parent 2c12602 commit 032cd5f

File tree

2 files changed

+96
-1
lines changed

2 files changed

+96
-1
lines changed

internal/terraform/context_refresh_test.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,3 +1691,98 @@ resource "test_resource" "foo" {
16911691
t.Fatalf("invalid state\nexpected: %s\ngot: %s\n", expected, jsonState)
16921692
}
16931693
}
1694+
1695+
func TestContext2Refresh_identityUpgradeJSON(t *testing.T) {
1696+
m := testModule(t, "refresh-schema-upgrade")
1697+
p := testProvider("test")
1698+
p.GetProviderSchemaResponse = getProviderSchemaResponseFromProviderSchema(&providerSchema{
1699+
ResourceTypes: map[string]*configschema.Block{
1700+
"test_thing": {
1701+
Attributes: map[string]*configschema.Attribute{
1702+
"id": {
1703+
Type: cty.String,
1704+
Optional: true,
1705+
},
1706+
},
1707+
},
1708+
},
1709+
IdentityTypes: map[string]*configschema.Object{
1710+
"test_thing": {
1711+
Attributes: map[string]*configschema.Attribute{
1712+
"name": {
1713+
Type: cty.String,
1714+
Required: true,
1715+
},
1716+
},
1717+
Nesting: configschema.NestingSingle,
1718+
},
1719+
},
1720+
IdentityTypeSchemaVersions: map[string]uint64{
1721+
"test_thing": 5,
1722+
},
1723+
})
1724+
p.UpgradeResourceIdentityResponse = &providers.UpgradeResourceIdentityResponse{
1725+
UpgradedIdentity: cty.ObjectVal(map[string]cty.Value{
1726+
"name": cty.StringVal("foo"),
1727+
}),
1728+
}
1729+
1730+
s := states.BuildState(func(s *states.SyncState) {
1731+
s.SetResourceInstanceCurrent(
1732+
addrs.Resource{
1733+
Mode: addrs.ManagedResourceMode,
1734+
Type: "test_thing",
1735+
Name: "bar",
1736+
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
1737+
&states.ResourceInstanceObjectSrc{
1738+
Status: states.ObjectReady,
1739+
SchemaVersion: 0,
1740+
AttrsJSON: []byte(`{"id":"foo"}`),
1741+
IdentitySchemaVersion: 3,
1742+
IdentityJSON: []byte(`{"id":"foo"}`),
1743+
},
1744+
addrs.AbsProviderConfig{
1745+
Provider: addrs.NewDefaultProvider("test"),
1746+
Module: addrs.RootModule,
1747+
},
1748+
)
1749+
})
1750+
1751+
ctx := testContext2(t, &ContextOpts{
1752+
Providers: map[addrs.Provider]providers.Factory{
1753+
addrs.NewDefaultProvider("test"): testProviderFuncFixed(p),
1754+
},
1755+
})
1756+
1757+
state, diags := ctx.Refresh(m, s, &PlanOpts{Mode: plans.NormalMode})
1758+
if diags.HasErrors() {
1759+
t.Fatal(diags.Err())
1760+
}
1761+
1762+
{
1763+
got := p.UpgradeResourceIdentityRequest
1764+
want := providers.UpgradeResourceIdentityRequest{
1765+
TypeName: "test_thing",
1766+
Version: 3,
1767+
RawIdentityJSON: []byte(`{"id":"foo"}`),
1768+
}
1769+
if !cmp.Equal(got, want) {
1770+
t.Errorf("wrong identity upgrade request\n%s", cmp.Diff(want, got))
1771+
}
1772+
}
1773+
1774+
addr := mustResourceInstanceAddr("test_thing.bar")
1775+
res := state.ResourceInstance(addr)
1776+
if res == nil {
1777+
t.Fatalf("no resource in state for %s", addr)
1778+
}
1779+
1780+
expectedIdentity := `{"name":"foo"}`
1781+
if string(res.Current.IdentityJSON) != expectedIdentity {
1782+
t.Fatalf("identity not updated in state\nexpected: %s\ngot: %s", expectedIdentity, res.Current.IdentityJSON)
1783+
}
1784+
expectedVersion := uint64(5)
1785+
if res.Current.IdentitySchemaVersion != expectedVersion {
1786+
t.Fatalf("identity schema version not updated in state\nexpected: %d\ngot: %d", expectedVersion, res.Current.IdentitySchemaVersion)
1787+
}
1788+
}

internal/terraform/upgrade_resource_state.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ func upgradeResourceIdentity(addr addrs.AbsResourceInstance, provider providers.
182182
// to all protobuf target languages so in practice we use int64
183183
// on the wire. In future we will change all of our internal
184184
// representations to int64 too.
185-
Version: int64(src.SchemaVersion),
185+
Version: int64(src.IdentitySchemaVersion),
186186
RawIdentityJSON: src.IdentityJSON,
187187
}
188188

0 commit comments

Comments
 (0)