diff --git a/internal/plugin/grpc_provider.go b/internal/plugin/grpc_provider.go index 3da172f78448..9afbce4a964b 100644 --- a/internal/plugin/grpc_provider.go +++ b/internal/plugin/grpc_provider.go @@ -940,9 +940,15 @@ func (p *GRPCProvider) GenerateResourceConfig(r providers.GenerateResourceConfig return resp } + mp, err := msgpack.Marshal(r.State, resSchema.Body.ImpliedType()) + if err != nil { + resp.Diagnostics = resp.Diagnostics.Append(err) + return resp + } + protoReq := &proto.GenerateResourceConfig_Request{ TypeName: r.TypeName, - State: nil, + State: &proto.DynamicValue{Msgpack: mp}, } protoResp, err := p.client.GenerateResourceConfig(p.ctx, protoReq) diff --git a/internal/plugin/grpc_provider_test.go b/internal/plugin/grpc_provider_test.go index 34017d724406..757cc9f49a48 100644 --- a/internal/plugin/grpc_provider_test.go +++ b/internal/plugin/grpc_provider_test.go @@ -2102,3 +2102,36 @@ func TestGRPCProvider_ListResource_Limit(t *testing.T) { t.Fatalf("Expected 2 events, got %d", len(results)) } } + +func TestGRPCProvider_GenerateResourceConfig(t *testing.T) { + client := mockProviderClient(t) + p := &GRPCProvider{ + client: client, + } + client.EXPECT().GenerateResourceConfig( + gomock.Any(), + gomock.Cond[any](func(x any) bool { + req := x.(*proto.GenerateResourceConfig_Request) + if req.TypeName != "resource" { + return false + } + if req.State == nil { + t.Log("GenerateResourceConfig state is nil") + return false + } + return true + }), + ).Return(&proto.GenerateResourceConfig_Response{ + Config: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa4attr\xa3bar"), + }, + }, nil) + resp := p.GenerateResourceConfig(providers.GenerateResourceConfigRequest{ + TypeName: "resource", + State: cty.ObjectVal(map[string]cty.Value{ + "computed": cty.StringVal("computed"), + "attr": cty.StringVal("foo"), + }), + }) + checkDiags(t, resp.Diagnostics) +} diff --git a/internal/plugin6/grpc_provider.go b/internal/plugin6/grpc_provider.go index 0339cefeeea2..cfe77265dd5d 100644 --- a/internal/plugin6/grpc_provider.go +++ b/internal/plugin6/grpc_provider.go @@ -945,9 +945,15 @@ func (p *GRPCProvider) GenerateResourceConfig(r providers.GenerateResourceConfig return resp } + mp, err := msgpack.Marshal(r.State, resSchema.Body.ImpliedType()) + if err != nil { + resp.Diagnostics = resp.Diagnostics.Append(err) + return resp + } + protoReq := &proto6.GenerateResourceConfig_Request{ TypeName: r.TypeName, - State: nil, + State: &proto6.DynamicValue{Msgpack: mp}, } protoResp, err := p.client.GenerateResourceConfig(p.ctx, protoReq) diff --git a/internal/plugin6/grpc_provider_test.go b/internal/plugin6/grpc_provider_test.go index 0ebd3c88c3e8..0cec32179507 100644 --- a/internal/plugin6/grpc_provider_test.go +++ b/internal/plugin6/grpc_provider_test.go @@ -3366,3 +3366,36 @@ func TestGRPCProvider_WriteStateBytes(t *testing.T) { } }) } + +func TestGRPCProvider_GenerateResourceConfig(t *testing.T) { + client := mockProviderClient(t) + p := &GRPCProvider{ + client: client, + } + client.EXPECT().GenerateResourceConfig( + gomock.Any(), + gomock.Cond[any](func(x any) bool { + req := x.(*proto.GenerateResourceConfig_Request) + if req.TypeName != "resource" { + return false + } + if req.State == nil { + t.Log("GenerateResourceConfig state is nil") + return false + } + return true + }), + ).Return(&proto.GenerateResourceConfig_Response{ + Config: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa4attr\xa3bar"), + }, + }, nil) + resp := p.GenerateResourceConfig(providers.GenerateResourceConfigRequest{ + TypeName: "resource", + State: cty.ObjectVal(map[string]cty.Value{ + "computed": cty.StringVal("computed"), + "attr": cty.StringVal("foo"), + }), + }) + checkDiags(t, resp.Diagnostics) +}