Skip to content

Commit 359cf4d

Browse files
committed
add GenerateResourceConfig RPC to tf5server
1 parent c841d34 commit 359cf4d

File tree

8 files changed

+53
-26
lines changed

8 files changed

+53
-26
lines changed

internal/logging/context.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ func ActionContext(ctx context.Context, action string) context.Context {
109109
return ctx
110110
}
111111

112+
// GenerateResourceConfig injects the resource type into logger contexts.
113+
func GenerateResourceConfigContext(ctx context.Context, action string) context.Context {
114+
ctx = tfsdklog.SetField(ctx, KeyGenerateResourceConfigType, action)
115+
ctx = tfsdklog.SubsystemSetField(ctx, SubsystemProto, KeyGenerateResourceConfigType, action)
116+
ctx = tflog.SetField(ctx, KeyGenerateResourceConfigType, action)
117+
118+
return ctx
119+
}
120+
112121
// RpcContext injects the RPC name into logger contexts.
113122
func RpcContext(ctx context.Context, rpc string) context.Context {
114123
ctx = tfsdklog.SetField(ctx, KeyRPC, rpc)

internal/logging/keys.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ const (
6666
// The action being operated on
6767
KeyActionType = "tf_action_type"
6868

69+
// The type of resource being operated on
70+
KeyGenerateResourceConfigType = "tf_generate_resource_config_type"
71+
6972
// Path to protocol data file, such as "/tmp/example.json"
7073
KeyProtocolDataFile = "tf_proto_data_file"
7174

tfprotov5/generate_resource_config.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package tfprotov5
22

3-
import (
4-
"context"
5-
)
6-
73
// GenerateResourceConfigRequest is the request Terraform sends when it wants to generate configuration
84
// from a resource's state value.
95
type GenerateResourceConfigRequest struct {
@@ -26,8 +22,3 @@ type GenerateResourceConfigResponse struct {
2622
// Diagnostics report errors or warnings related to the creation of the config value.
2723
Diagnostics []*Diagnostic
2824
}
29-
30-
// GenerateResourceConfigServer is an interface containing the method to generate resource config.
31-
type GenerateResourceConfigServer interface {
32-
GenerateResourceConfig(context.Context, *GenerateResourceConfigRequest) (*GenerateResourceConfigResponse, error)
33-
}

tfprotov5/internal/toproto/generate_resource_config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"github.com/hashicorp/terraform-plugin-go/tfprotov5/internal/tfplugin5"
66
)
77

8-
func GenerateResourceConfigResponse(in *tfprotov5.GenerateResourceConfigResponse) *tfplugin5.GenerateResourceConfig_Response {
8+
func GenerateResourceConfig_Response(in *tfprotov5.GenerateResourceConfigResponse) *tfplugin5.GenerateResourceConfig_Response {
99
if in == nil {
1010
return nil
1111
}

tfprotov5/internal/toproto/generate_resource_config_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func TestGenerateResourceConfig_Response(t *testing.T) {
5959
t.Run(name, func(t *testing.T) {
6060
t.Parallel()
6161

62-
got := toproto.GenerateResourceConfigResponse(testCase.in)
62+
got := toproto.GenerateResourceConfig_Response(testCase.in)
6363

6464
// Protocol Buffers generated types must have unexported fields
6565
// ignored or cmp.Diff() will raise an error. This is easier than

tfprotov5/provider.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -109,21 +109,6 @@ type ProviderServerWithActions interface {
109109
ActionServer
110110
}
111111

112-
// ProviderServerWithGenerateResourceConfig is a temporary interface for servers
113-
// to implement the GenerateResourceConfig RPC.
114-
//
115-
// - GenerateResourceConfig
116-
//
117-
// Deprecated: This method will be moved into the
118-
// ProviderServer interface and this interface will be removed in a future
119-
// version.
120-
type ProviderServerWithGenerateResourceConfig interface {
121-
ProviderServer
122-
123-
// GenerateResourceConfigServer is an interface containing the method to generate resource config.
124-
GenerateResourceConfigServer
125-
}
126-
127112
// GetMetadataRequest represents a GetMetadata RPC request.
128113
type GetMetadataRequest struct{}
129114

tfprotov5/resource.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ type ResourceServer interface {
6969
// current version. It is the provider's responsibility to modify the
7070
// identity state to upgrade it to the latest state schema.
7171
UpgradeResourceIdentity(context.Context, *UpgradeResourceIdentityRequest) (*UpgradeResourceIdentityResponse, error)
72+
73+
// GenerateResourceConfig is called when Terraform wants to generate a resource
74+
// configuration for importing to a resource address that doesn't exist yet.
75+
// It is called during a plan when the -generate-config-out flag is provided.
76+
//
77+
// This functionality is only supported in Terraform 1.14 and later. The
78+
// provider must have enabled the GenerateResourceConfig server capability to
79+
// enable these requests.
80+
GenerateResourceConfig(context.Context, *GenerateResourceConfigRequest) (*GenerateResourceConfigResponse, error)
7281
}
7382

7483
// ValidateResourceTypeConfigRequest is the request Terraform sends when it

tfprotov5/tf5server/server.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,6 +1484,36 @@ func (s *server) InvokeAction(protoReq *tfplugin5.InvokeAction_Request, protoStr
14841484
return nil
14851485
}
14861486

1487+
func (s *server) GenerateResourceConfig(ctx context.Context, protoReq *tfplugin5.GenerateResourceConfig_Request) (protoResp *tfplugin5.GenerateResourceConfig_Response, err error) {
1488+
rpc := "GenerateResourceConfig"
1489+
ctx = s.loggingContext(ctx)
1490+
ctx = logging.RpcContext(ctx, rpc)
1491+
ctx = logging.GenerateResourceConfigContext(ctx, protoReq.TypeName)
1492+
ctx = s.stoppableContext(ctx)
1493+
logging.ProtocolTrace(ctx, "Received request")
1494+
defer logging.ProtocolTrace(ctx, "Served request")
1495+
1496+
req := fromproto.GenerateResourceConfigRequest(protoReq)
1497+
1498+
logging.ProtocolData(ctx, s.protocolDataDir, rpc, "Request", "State", req.State)
1499+
1500+
ctx = tf5serverlogging.DownstreamRequest(ctx)
1501+
1502+
resp, err := s.downstream.GenerateResourceConfig(ctx, req)
1503+
if err != nil {
1504+
logging.ProtocolError(ctx, "Error from downstream", map[string]any{logging.KeyError: err})
1505+
return nil, err
1506+
}
1507+
1508+
tf5serverlogging.DownstreamResponse(ctx, resp.Diagnostics)
1509+
1510+
logging.ProtocolData(ctx, s.protocolDataDir, rpc, "Response", "Config", resp.Config)
1511+
1512+
protoResp = toproto.GenerateResourceConfig_Response(resp)
1513+
1514+
return protoResp, nil
1515+
}
1516+
14871517
func invalidDeferredResponseDiag(reason tfprotov5.DeferredReason) *tfprotov5.Diagnostic {
14881518
return &tfprotov5.Diagnostic{
14891519
Severity: tfprotov5.DiagnosticSeverityError,

0 commit comments

Comments
 (0)