From 595aa3de0f0a76dc0ade4af139459e37a56a1910 Mon Sep 17 00:00:00 2001 From: stephybun Date: Tue, 25 Nov 2025 19:00:17 +0100 Subject: [PATCH] Backport GenerateResourceConfig fix to v1.14 (#37896) * marshal state and set in the proto req for generate resource config * set state in the proto req for generate resource config in plugin6 * add GRPC tests for GenerateResourceConfig * changelog --- .changes/v1.14/BUG FIXES-20251114-090620.yaml | 5 +++ internal/plugin/grpc_provider.go | 8 ++++- internal/plugin/grpc_provider_test.go | 33 +++++++++++++++++++ internal/plugin6/grpc_provider.go | 8 ++++- internal/plugin6/grpc_provider_test.go | 33 +++++++++++++++++++ 5 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 .changes/v1.14/BUG FIXES-20251114-090620.yaml diff --git a/.changes/v1.14/BUG FIXES-20251114-090620.yaml b/.changes/v1.14/BUG FIXES-20251114-090620.yaml new file mode 100644 index 0000000000..75a6129f68 --- /dev/null +++ b/.changes/v1.14/BUG FIXES-20251114-090620.yaml @@ -0,0 +1,5 @@ +kind: BUG FIXES +body: Set state information in the proto request for the `GenerateResourceConfig` RPC +time: 2025-11-14T09:06:20.057751+01:00 +custom: + Issue: "37896" diff --git a/internal/plugin/grpc_provider.go b/internal/plugin/grpc_provider.go index 9874b1abdf..76454de22a 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 34017d7244..757cc9f49a 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 b01aca3f99..9c263d7ae0 100644 --- a/internal/plugin6/grpc_provider.go +++ b/internal/plugin6/grpc_provider.go @@ -934,9 +934,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 44fb722dcf..6c9e1798c3 100644 --- a/internal/plugin6/grpc_provider_test.go +++ b/internal/plugin6/grpc_provider_test.go @@ -2556,3 +2556,36 @@ func TestGRPCProvider_DeleteState(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) +}