Fix version in resource identity upgrade request (#36940)

pull/36943/head
Daniel Banck 10 months ago committed by GitHub
parent 2c126026d8
commit 032cd5f442
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1691,3 +1691,98 @@ resource "test_resource" "foo" {
t.Fatalf("invalid state\nexpected: %s\ngot: %s\n", expected, jsonState)
}
}
func TestContext2Refresh_identityUpgradeJSON(t *testing.T) {
m := testModule(t, "refresh-schema-upgrade")
p := testProvider("test")
p.GetProviderSchemaResponse = getProviderSchemaResponseFromProviderSchema(&providerSchema{
ResourceTypes: map[string]*configschema.Block{
"test_thing": {
Attributes: map[string]*configschema.Attribute{
"id": {
Type: cty.String,
Optional: true,
},
},
},
},
IdentityTypes: map[string]*configschema.Object{
"test_thing": {
Attributes: map[string]*configschema.Attribute{
"name": {
Type: cty.String,
Required: true,
},
},
Nesting: configschema.NestingSingle,
},
},
IdentityTypeSchemaVersions: map[string]uint64{
"test_thing": 5,
},
})
p.UpgradeResourceIdentityResponse = &providers.UpgradeResourceIdentityResponse{
UpgradedIdentity: cty.ObjectVal(map[string]cty.Value{
"name": cty.StringVal("foo"),
}),
}
s := states.BuildState(func(s *states.SyncState) {
s.SetResourceInstanceCurrent(
addrs.Resource{
Mode: addrs.ManagedResourceMode,
Type: "test_thing",
Name: "bar",
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
&states.ResourceInstanceObjectSrc{
Status: states.ObjectReady,
SchemaVersion: 0,
AttrsJSON: []byte(`{"id":"foo"}`),
IdentitySchemaVersion: 3,
IdentityJSON: []byte(`{"id":"foo"}`),
},
addrs.AbsProviderConfig{
Provider: addrs.NewDefaultProvider("test"),
Module: addrs.RootModule,
},
)
})
ctx := testContext2(t, &ContextOpts{
Providers: map[addrs.Provider]providers.Factory{
addrs.NewDefaultProvider("test"): testProviderFuncFixed(p),
},
})
state, diags := ctx.Refresh(m, s, &PlanOpts{Mode: plans.NormalMode})
if diags.HasErrors() {
t.Fatal(diags.Err())
}
{
got := p.UpgradeResourceIdentityRequest
want := providers.UpgradeResourceIdentityRequest{
TypeName: "test_thing",
Version: 3,
RawIdentityJSON: []byte(`{"id":"foo"}`),
}
if !cmp.Equal(got, want) {
t.Errorf("wrong identity upgrade request\n%s", cmp.Diff(want, got))
}
}
addr := mustResourceInstanceAddr("test_thing.bar")
res := state.ResourceInstance(addr)
if res == nil {
t.Fatalf("no resource in state for %s", addr)
}
expectedIdentity := `{"name":"foo"}`
if string(res.Current.IdentityJSON) != expectedIdentity {
t.Fatalf("identity not updated in state\nexpected: %s\ngot: %s", expectedIdentity, res.Current.IdentityJSON)
}
expectedVersion := uint64(5)
if res.Current.IdentitySchemaVersion != expectedVersion {
t.Fatalf("identity schema version not updated in state\nexpected: %d\ngot: %d", expectedVersion, res.Current.IdentitySchemaVersion)
}
}

@ -182,7 +182,7 @@ func upgradeResourceIdentity(addr addrs.AbsResourceInstance, provider providers.
// to all protobuf target languages so in practice we use int64
// on the wire. In future we will change all of our internal
// representations to int64 too.
Version: int64(src.SchemaVersion),
Version: int64(src.IdentitySchemaVersion),
RawIdentityJSON: src.IdentityJSON,
}

Loading…
Cancel
Save