Skip to content

Commit c8d1dc3

Browse files
authored
tfsdk: Introduce new ProviderServer functions, deprecate existing (#294)
Reference: #22 Provider developers have a few reasons to directly need a tfprotov6.ProviderServer implementation: - When implementing acceptance testing with terraform-plugin-sdk helper/resource. - When using terraform-plugin-mux tf6muxserver.NewMuxServer(). - When using terraform-plugin-mux tf6to5server.DowngradeServer(). The current `NewProtocol6Server(Provider)` function enables these use cases, however the implementation is less than ergonomic for provider developers as a wrapping function is required in all cases: ```go // helper/resource acceptance testing resource.TestCase{ ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){ "example": func() (tfprotov6.ProviderServer, error) { return tfsdk.NewProtocol6Server(New()), nil }, }, // ... } // tf6muxserver.NewMuxServer() providers := []func() tfprotov6.ProviderServer{ func() tfprotov6.ProviderServer { return tfsdk.NewProtocol6Server(provider1.New()) }, func() tfprotov6.ProviderServer { return tfsdk.NewProtocol6Server(provider2.New()) }, } muxServer, err := tf6muxserver.NewMuxServer(ctx, providers...) // tf6to5server.DowngradeServer() downgradeServer, err := tf6to5server.DowngradeServer(ctx, func() tfprotov6.ProviderServer { return tfsdk.NewProtocol6Server(provider.New()) }) ``` The new functions simplify these implementations and get provider developers closer to not directly importing terraform-plugin-go (with a few other targeted changes, such as type aliases), e.g. ```go // helper/resource acceptance testing resource.TestCase{ ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){ "example": tfsdk.NewProtocol6ProviderServerWithError(New()), }, // ... } // tf6muxserver.NewMuxServer() providers := []func() tfprotov6.ProviderServer{ tfsdk.NewProtocol6ProviderServer(provider1.New()), tfsdk.NewProtocol6ProviderServer(provider2.New()), } muxServer, err := tf6muxserver.NewMuxServer(ctx, providers...) // tf6to5server.DowngradeServer() downgradeServer, err := tf6to5server.DowngradeServer(ctx, tfsdk.NewProtocol6ProviderServer(provider.New())) ``` This change prefers deprecation over straight replacement to give some lead time for various documentation updates across multiple projects. The naming is less than ideal, however it feels necessary to remain generic instead of picking any particular details related to their current usage (e.g. "NewTestServer") as this can/will change over time. The "Protocol6" naming is important should a new major protocol version 7 be released, which this framework must support.
1 parent 180d63e commit c8d1dc3

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

.changelog/pending.txt

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:note
2+
tfsdk: The `NewProtocol6Server()` function has been deprecated in preference of `NewProtocol6ProviderServer()` and `NewProtocol6ProviderServerWithError()` functions, which will simplify muxing and testing implementations. The `NewProtocol6Server()` function will be removed in an upcoming minor release before v1.0.0.
3+
```
4+
5+
```release-note:enhancement
6+
tfsdk: Added `NewProtocol6ProviderServer()` function, which can be directly used with terraform-plugin-go and terraform-plugin-mux.
7+
```
8+
9+
```release-note:enhancement
10+
tfsdk: Added `NewProtocol6ProviderServerWithError()` function, which can be directly used with terraform-plugin-sdk acceptance testing.
11+
```

tfsdk/serve.go

+27
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,39 @@ type ServeOpts struct {
3838

3939
// NewProtocol6Server returns a tfprotov6.ProviderServer implementation based
4040
// on the passed Provider implementation.
41+
//
42+
// Deprecated: Use NewProtocol6ProviderServer instead. This will be removed
43+
// in an upcoming minor version before v1.0.0.
4144
func NewProtocol6Server(p Provider) tfprotov6.ProviderServer {
4245
return &server{
4346
p: p,
4447
}
4548
}
4649

50+
// Returns a protocol version 6 ProviderServer implementation based on the
51+
// given Provider and suitable for usage with the terraform-plugin-go
52+
// tf6server.Serve() function and various terraform-plugin-mux functions.
53+
func NewProtocol6ProviderServer(p Provider) func() tfprotov6.ProviderServer {
54+
return func() tfprotov6.ProviderServer {
55+
return &server{
56+
p: p,
57+
}
58+
}
59+
}
60+
61+
// Returns a protocol version 6 ProviderServer implementation based on the
62+
// given Provider and suitable for usage with the terraform-plugin-sdk
63+
// acceptance testing helper/resource.TestCase.ProtoV6ProviderFactories.
64+
//
65+
// The error return is not currently used, but it may be in the future.
66+
func NewProtocol6ProviderServerWithError(p Provider) (func() tfprotov6.ProviderServer, error) {
67+
return func() tfprotov6.ProviderServer {
68+
return &server{
69+
p: p,
70+
}
71+
}, nil
72+
}
73+
4774
// Serve serves a provider, blocking until the context is canceled.
4875
func Serve(ctx context.Context, providerFunc func() Provider, opts ServeOpts) error {
4976
var tf6serverOpts []tf6server.ServeOpt

tfsdk/serve_test.go

+33
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,39 @@ import (
1616
"github.com/hashicorp/terraform-plugin-go/tftypes"
1717
)
1818

19+
func TestNewProtocol6ProviderServer(t *testing.T) {
20+
provider := &testServeProvider{}
21+
22+
providerServerFunc := NewProtocol6ProviderServer(provider)
23+
providerServer := providerServerFunc()
24+
25+
// Simple verification
26+
_, err := providerServer.GetProviderSchema(context.Background(), &tfprotov6.GetProviderSchemaRequest{})
27+
28+
if err != nil {
29+
t.Fatalf("unexpected error calling ProviderServer: %s", err)
30+
}
31+
}
32+
33+
func TestNewProtocol6ProviderServerWithError(t *testing.T) {
34+
provider := &testServeProvider{}
35+
36+
providerServerFunc, err := NewProtocol6ProviderServerWithError(provider)
37+
38+
if err != nil {
39+
t.Fatalf("unexpected error creating ProviderServer: %s", err)
40+
}
41+
42+
providerServer := providerServerFunc()
43+
44+
// Simple verification
45+
_, err = providerServer.GetProviderSchema(context.Background(), &tfprotov6.GetProviderSchemaRequest{})
46+
47+
if err != nil {
48+
t.Fatalf("unexpected error calling ProviderServer: %s", err)
49+
}
50+
}
51+
1952
func TestServerCancelInFlightContexts(t *testing.T) {
2053
t.Parallel()
2154

0 commit comments

Comments
 (0)