diff --git a/.changelog/pending.txt b/.changelog/pending.txt new file mode 100644 index 000000000..42599c81f --- /dev/null +++ b/.changelog/pending.txt @@ -0,0 +1,11 @@ +```release-note:note +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. +``` + +```release-note:enhancement +tfsdk: Added `NewProtocol6ProviderServer()` function, which can be directly used with terraform-plugin-go and terraform-plugin-mux. +``` + +```release-note:enhancement +tfsdk: Added `NewProtocol6ProviderServerWithError()` function, which can be directly used with terraform-plugin-sdk acceptance testing. +``` diff --git a/tfsdk/serve.go b/tfsdk/serve.go index bd5b7f084..13afbd5ed 100644 --- a/tfsdk/serve.go +++ b/tfsdk/serve.go @@ -38,12 +38,39 @@ type ServeOpts struct { // NewProtocol6Server returns a tfprotov6.ProviderServer implementation based // on the passed Provider implementation. +// +// Deprecated: Use NewProtocol6ProviderServer instead. This will be removed +// in an upcoming minor version before v1.0.0. func NewProtocol6Server(p Provider) tfprotov6.ProviderServer { return &server{ p: p, } } +// Returns a protocol version 6 ProviderServer implementation based on the +// given Provider and suitable for usage with the terraform-plugin-go +// tf6server.Serve() function and various terraform-plugin-mux functions. +func NewProtocol6ProviderServer(p Provider) func() tfprotov6.ProviderServer { + return func() tfprotov6.ProviderServer { + return &server{ + p: p, + } + } +} + +// Returns a protocol version 6 ProviderServer implementation based on the +// given Provider and suitable for usage with the terraform-plugin-sdk +// acceptance testing helper/resource.TestCase.ProtoV6ProviderFactories. +// +// The error return is not currently used, but it may be in the future. +func NewProtocol6ProviderServerWithError(p Provider) (func() tfprotov6.ProviderServer, error) { + return func() tfprotov6.ProviderServer { + return &server{ + p: p, + } + }, nil +} + // Serve serves a provider, blocking until the context is canceled. func Serve(ctx context.Context, providerFunc func() Provider, opts ServeOpts) error { var tf6serverOpts []tf6server.ServeOpt diff --git a/tfsdk/serve_test.go b/tfsdk/serve_test.go index 5368586a4..b5764a6b4 100644 --- a/tfsdk/serve_test.go +++ b/tfsdk/serve_test.go @@ -16,6 +16,39 @@ import ( "github.com/hashicorp/terraform-plugin-go/tftypes" ) +func TestNewProtocol6ProviderServer(t *testing.T) { + provider := &testServeProvider{} + + providerServerFunc := NewProtocol6ProviderServer(provider) + providerServer := providerServerFunc() + + // Simple verification + _, err := providerServer.GetProviderSchema(context.Background(), &tfprotov6.GetProviderSchemaRequest{}) + + if err != nil { + t.Fatalf("unexpected error calling ProviderServer: %s", err) + } +} + +func TestNewProtocol6ProviderServerWithError(t *testing.T) { + provider := &testServeProvider{} + + providerServerFunc, err := NewProtocol6ProviderServerWithError(provider) + + if err != nil { + t.Fatalf("unexpected error creating ProviderServer: %s", err) + } + + providerServer := providerServerFunc() + + // Simple verification + _, err = providerServer.GetProviderSchema(context.Background(), &tfprotov6.GetProviderSchemaRequest{}) + + if err != nil { + t.Fatalf("unexpected error calling ProviderServer: %s", err) + } +} + func TestServerCancelInFlightContexts(t *testing.T) { t.Parallel()