initialize empty diff in apply
While the schema Diff fucntion returns a nil diff when creating an empty (except for id) resource, the Apply function expects the diff to be initialized and ampty.
This commit is contained in:
parent
0b8c38207a
commit
caf74a218d
|
@ -502,7 +502,14 @@ func (s *GRPCProviderServer) ApplyResourceChange(_ context.Context, req *proto.A
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if diff == nil {
|
||||||
|
diff = &terraform.InstanceDiff{
|
||||||
|
Attributes: make(map[string]*terraform.ResourceAttrDiff),
|
||||||
|
Meta: make(map[string]interface{}),
|
||||||
|
}
|
||||||
|
}
|
||||||
diff.Meta = private
|
diff.Meta = private
|
||||||
|
|
||||||
newInstanceState, err := s.provider.Apply(info, priorState, diff)
|
newInstanceState, err := s.provider.Apply(info, priorState, diff)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
resp.Diagnostics = convert.AppendProtoDiag(resp.Diagnostics, err)
|
resp.Diagnostics = convert.AppendProtoDiag(resp.Diagnostics, err)
|
||||||
|
|
|
@ -357,3 +357,71 @@ func TestPlanResourceChange(t *testing.T) {
|
||||||
t.Fatal(cmp.Diff(proposedVal, plannedStateVal, valueComparer))
|
t.Fatal(cmp.Diff(proposedVal, plannedStateVal, valueComparer))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApplyResourceChange(t *testing.T) {
|
||||||
|
r := &schema.Resource{
|
||||||
|
SchemaVersion: 4,
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
"foo": {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Create: func(rd *schema.ResourceData, _ interface{}) error {
|
||||||
|
rd.SetId("bar")
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
server := &GRPCProviderServer{
|
||||||
|
provider: &schema.Provider{
|
||||||
|
ResourcesMap: map[string]*schema.Resource{
|
||||||
|
"test": r,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
schema := r.CoreConfigSchema()
|
||||||
|
priorState, err := msgpack.Marshal(cty.NullVal(schema.ImpliedType()), schema.ImpliedType())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// A propsed state with only the ID unknown will produce a nil diff, and
|
||||||
|
// should return the propsed state value.
|
||||||
|
plannedVal, err := schema.CoerceValue(cty.ObjectVal(map[string]cty.Value{
|
||||||
|
"id": cty.UnknownVal(cty.String),
|
||||||
|
}))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
plannedState, err := msgpack.Marshal(plannedVal, schema.ImpliedType())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
testReq := &proto.ApplyResourceChange_Request{
|
||||||
|
TypeName: "test",
|
||||||
|
PriorState: &proto.DynamicValue{
|
||||||
|
Msgpack: priorState,
|
||||||
|
},
|
||||||
|
PlannedState: &proto.DynamicValue{
|
||||||
|
Msgpack: plannedState,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := server.ApplyResourceChange(context.Background(), testReq)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
newStateVal, err := msgpack.Unmarshal(resp.NewState.Msgpack, schema.ImpliedType())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
id := newStateVal.GetAttr("id").AsString()
|
||||||
|
if id != "bar" {
|
||||||
|
t.Fatalf("incorrect final state: %#v\n", newStateVal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue