Skip to content

Commit cf2868d

Browse files
authored
internal/proto6server: Always use data source and resource caches, remove intermediate Provider field (#333)
Reference: #215 Reference: #299 This completes the migration to the cached data source and resource schema/type handling in the new `internal/fwserver` package. This also removes the previous `Provider` field so that implementation detail is now wholly within the `internal/fwserver` to remove any confusion.
1 parent 004e1b0 commit cf2868d

File tree

5 files changed

+48
-80
lines changed

5 files changed

+48
-80
lines changed

internal/proto6server/serve.go

+17-59
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ var _ tfprotov6.ProviderServer = &Server{}
2424
type Server struct {
2525
FrameworkServer fwserver.Server
2626

27-
// Provider will be migrated to FrameworkServer over time.
28-
Provider tfsdk.Provider
2927
contextCancels []context.CancelFunc
3028
contextCancelsMu sync.Mutex
3129
}
@@ -47,46 +45,6 @@ func (s *Server) cancelRegisteredContexts(_ context.Context) {
4745
s.contextCancels = nil
4846
}
4947

50-
func (s *Server) getResourceType(ctx context.Context, typ string) (tfsdk.ResourceType, diag.Diagnostics) {
51-
// TODO: Cache GetResources call in GetProviderSchema and reference cache instead
52-
// Reference: https://github.com/hashicorp/terraform-plugin-framework/issues/299
53-
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetResources")
54-
resourceTypes, diags := s.Provider.GetResources(ctx)
55-
logging.FrameworkDebug(ctx, "Called provider defined Provider GetResources")
56-
if diags.HasError() {
57-
return nil, diags
58-
}
59-
resourceType, ok := resourceTypes[typ]
60-
if !ok {
61-
diags.AddError(
62-
"Resource not found",
63-
fmt.Sprintf("No resource named %q is configured on the provider", typ),
64-
)
65-
return nil, diags
66-
}
67-
return resourceType, diags
68-
}
69-
70-
func (s *Server) getDataSourceType(ctx context.Context, typ string) (tfsdk.DataSourceType, diag.Diagnostics) {
71-
// TODO: Cache GetDataSources call in GetProviderSchema and reference cache instead
72-
// Reference: https://github.com/hashicorp/terraform-plugin-framework/issues/299
73-
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetDataSources")
74-
dataSourceTypes, diags := s.Provider.GetDataSources(ctx)
75-
logging.FrameworkDebug(ctx, "Called provider defined Provider GetDataSources")
76-
if diags.HasError() {
77-
return nil, diags
78-
}
79-
dataSourceType, ok := dataSourceTypes[typ]
80-
if !ok {
81-
diags.AddError(
82-
"Data source not found",
83-
fmt.Sprintf("No data source named %q is configured on the provider", typ),
84-
)
85-
return nil, diags
86-
}
87-
return dataSourceType, diags
88-
}
89-
9048
func (s *Server) GetProviderSchema(ctx context.Context, proto6Req *tfprotov6.GetProviderSchemaRequest) (*tfprotov6.GetProviderSchemaResponse, error) {
9149
ctx = s.registerContext(ctx)
9250
ctx = logging.InitContext(ctx)
@@ -223,7 +181,7 @@ func (s *Server) upgradeResourceState(ctx context.Context, req *tfprotov6.Upgrad
223181
return
224182
}
225183

226-
resourceType, diags := s.getResourceType(ctx, req.TypeName)
184+
resourceType, diags := s.FrameworkServer.ResourceType(ctx, req.TypeName)
227185

228186
resp.Diagnostics.Append(diags...)
229187

@@ -302,7 +260,7 @@ func (s *Server) upgradeResourceState(ctx context.Context, req *tfprotov6.Upgrad
302260
}
303261

304262
logging.FrameworkDebug(ctx, "Calling provider defined ResourceType NewResource")
305-
resource, diags := resourceType.NewResource(ctx, s.Provider)
263+
resource, diags := resourceType.NewResource(ctx, s.FrameworkServer.Provider)
306264
logging.FrameworkDebug(ctx, "Called provider defined ResourceType NewResource")
307265

308266
resp.Diagnostics.Append(diags...)
@@ -450,7 +408,7 @@ func (s *Server) ReadResource(ctx context.Context, req *tfprotov6.ReadResourceRe
450408
}
451409

452410
func (s *Server) readResource(ctx context.Context, req *tfprotov6.ReadResourceRequest, resp *readResourceResponse) {
453-
resourceType, diags := s.getResourceType(ctx, req.TypeName)
411+
resourceType, diags := s.FrameworkServer.ResourceType(ctx, req.TypeName)
454412
resp.Diagnostics.Append(diags...)
455413
if resp.Diagnostics.HasError() {
456414
return
@@ -463,7 +421,7 @@ func (s *Server) readResource(ctx context.Context, req *tfprotov6.ReadResourceRe
463421
return
464422
}
465423
logging.FrameworkDebug(ctx, "Calling provider defined ResourceType NewResource")
466-
resource, diags := resourceType.NewResource(ctx, s.Provider)
424+
resource, diags := resourceType.NewResource(ctx, s.FrameworkServer.Provider)
467425
logging.FrameworkDebug(ctx, "Called provider defined ResourceType NewResource")
468426
resp.Diagnostics.Append(diags...)
469427
if resp.Diagnostics.HasError() {
@@ -483,7 +441,7 @@ func (s *Server) readResource(ctx context.Context, req *tfprotov6.ReadResourceRe
483441
Schema: resourceSchema,
484442
},
485443
}
486-
if pm, ok := s.Provider.(tfsdk.ProviderWithProviderMeta); ok {
444+
if pm, ok := s.FrameworkServer.Provider.(tfsdk.ProviderWithProviderMeta); ok {
487445
logging.FrameworkTrace(ctx, "Provider implements ProviderWithProviderMeta")
488446
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetMetaSchema")
489447
pmSchema, diags := pm.GetMetaSchema(ctx)
@@ -599,7 +557,7 @@ func (s *Server) PlanResourceChange(ctx context.Context, req *tfprotov6.PlanReso
599557
func (s *Server) planResourceChange(ctx context.Context, req *tfprotov6.PlanResourceChangeRequest, resp *planResourceChangeResponse) {
600558
// get the type of resource, so we can get its schema and create an
601559
// instance
602-
resourceType, diags := s.getResourceType(ctx, req.TypeName)
560+
resourceType, diags := s.FrameworkServer.ResourceType(ctx, req.TypeName)
603561
resp.Diagnostics.Append(diags...)
604562
if resp.Diagnostics.HasError() {
605563
return
@@ -647,7 +605,7 @@ func (s *Server) planResourceChange(ctx context.Context, req *tfprotov6.PlanReso
647605
// create the resource instance, so we can call its methods and handle
648606
// the request
649607
logging.FrameworkDebug(ctx, "Calling provider defined ResourceType NewResource")
650-
resource, diags := resourceType.NewResource(ctx, s.Provider)
608+
resource, diags := resourceType.NewResource(ctx, s.FrameworkServer.Provider)
651609
logging.FrameworkDebug(ctx, "Called provider defined ResourceType NewResource")
652610
resp.Diagnostics.Append(diags...)
653611
if resp.Diagnostics.HasError() {
@@ -740,7 +698,7 @@ func (s *Server) planResourceChange(ctx context.Context, req *tfprotov6.PlanReso
740698
Raw: plan,
741699
},
742700
}
743-
if pm, ok := s.Provider.(tfsdk.ProviderWithProviderMeta); ok {
701+
if pm, ok := s.FrameworkServer.Provider.(tfsdk.ProviderWithProviderMeta); ok {
744702
logging.FrameworkTrace(ctx, "Provider implements ProviderWithProviderMeta")
745703
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetMetaSchema")
746704
pmSchema, diags := pm.GetMetaSchema(ctx)
@@ -811,7 +769,7 @@ func (s *Server) planResourceChange(ctx context.Context, req *tfprotov6.PlanReso
811769
Raw: plan,
812770
},
813771
}
814-
if pm, ok := s.Provider.(tfsdk.ProviderWithProviderMeta); ok {
772+
if pm, ok := s.FrameworkServer.Provider.(tfsdk.ProviderWithProviderMeta); ok {
815773
logging.FrameworkTrace(ctx, "Provider implements ProviderWithProviderMeta")
816774
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetMetaSchema")
817775
pmSchema, diags := pm.GetMetaSchema(ctx)
@@ -928,7 +886,7 @@ func (s *Server) ApplyResourceChange(ctx context.Context, req *tfprotov6.ApplyRe
928886
func (s *Server) applyResourceChange(ctx context.Context, req *tfprotov6.ApplyResourceChangeRequest, resp *applyResourceChangeResponse) {
929887
// get the type of resource, so we can get its schema and create an
930888
// instance
931-
resourceType, diags := s.getResourceType(ctx, req.TypeName)
889+
resourceType, diags := s.FrameworkServer.ResourceType(ctx, req.TypeName)
932890
resp.Diagnostics.Append(diags...)
933891
if resp.Diagnostics.HasError() {
934892
return
@@ -947,7 +905,7 @@ func (s *Server) applyResourceChange(ctx context.Context, req *tfprotov6.ApplyRe
947905
// create the resource instance, so we can call its methods and handle
948906
// the request
949907
logging.FrameworkDebug(ctx, "Calling provider defined ResourceType NewResource")
950-
resource, diags := resourceType.NewResource(ctx, s.Provider)
908+
resource, diags := resourceType.NewResource(ctx, s.FrameworkServer.Provider)
951909
logging.FrameworkDebug(ctx, "Called provider defined ResourceType NewResource")
952910
resp.Diagnostics.Append(diags...)
953911
if resp.Diagnostics.HasError() {
@@ -1020,7 +978,7 @@ func (s *Server) applyResourceChange(ctx context.Context, req *tfprotov6.ApplyRe
1020978
Raw: plan,
1021979
},
1022980
}
1023-
if pm, ok := s.Provider.(tfsdk.ProviderWithProviderMeta); ok {
981+
if pm, ok := s.FrameworkServer.Provider.(tfsdk.ProviderWithProviderMeta); ok {
1024982
logging.FrameworkTrace(ctx, "Provider implements ProviderWithProviderMeta")
1025983
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetMetaSchema")
1026984
pmSchema, diags := pm.GetMetaSchema(ctx)
@@ -1082,7 +1040,7 @@ func (s *Server) applyResourceChange(ctx context.Context, req *tfprotov6.ApplyRe
10821040
Raw: priorState,
10831041
},
10841042
}
1085-
if pm, ok := s.Provider.(tfsdk.ProviderWithProviderMeta); ok {
1043+
if pm, ok := s.FrameworkServer.Provider.(tfsdk.ProviderWithProviderMeta); ok {
10861044
logging.FrameworkTrace(ctx, "Provider implements ProviderWithProviderMeta")
10871045
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetMetaSchema")
10881046
pmSchema, diags := pm.GetMetaSchema(ctx)
@@ -1136,7 +1094,7 @@ func (s *Server) applyResourceChange(ctx context.Context, req *tfprotov6.ApplyRe
11361094
Raw: priorState,
11371095
},
11381096
}
1139-
if pm, ok := s.Provider.(tfsdk.ProviderWithProviderMeta); ok {
1097+
if pm, ok := s.FrameworkServer.Provider.(tfsdk.ProviderWithProviderMeta); ok {
11401098
logging.FrameworkTrace(ctx, "Provider implements ProviderWithProviderMeta")
11411099
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetMetaSchema")
11421100
pmSchema, diags := pm.GetMetaSchema(ctx)
@@ -1255,7 +1213,7 @@ func (s *Server) ReadDataSource(ctx context.Context, req *tfprotov6.ReadDataSour
12551213
}
12561214

12571215
func (s *Server) readDataSource(ctx context.Context, req *tfprotov6.ReadDataSourceRequest, resp *readDataSourceResponse) {
1258-
dataSourceType, diags := s.getDataSourceType(ctx, req.TypeName)
1216+
dataSourceType, diags := s.FrameworkServer.DataSourceType(ctx, req.TypeName)
12591217
resp.Diagnostics.Append(diags...)
12601218
if resp.Diagnostics.HasError() {
12611219
return
@@ -1268,7 +1226,7 @@ func (s *Server) readDataSource(ctx context.Context, req *tfprotov6.ReadDataSour
12681226
return
12691227
}
12701228
logging.FrameworkDebug(ctx, "Calling provider defined DataSourceType NewDataSource")
1271-
dataSource, diags := dataSourceType.NewDataSource(ctx, s.Provider)
1229+
dataSource, diags := dataSourceType.NewDataSource(ctx, s.FrameworkServer.Provider)
12721230
logging.FrameworkDebug(ctx, "Called provider defined DataSourceType NewDataSource")
12731231
resp.Diagnostics.Append(diags...)
12741232
if resp.Diagnostics.HasError() {
@@ -1288,7 +1246,7 @@ func (s *Server) readDataSource(ctx context.Context, req *tfprotov6.ReadDataSour
12881246
Schema: dataSourceSchema,
12891247
},
12901248
}
1291-
if pm, ok := s.Provider.(tfsdk.ProviderWithProviderMeta); ok {
1249+
if pm, ok := s.FrameworkServer.Provider.(tfsdk.ProviderWithProviderMeta); ok {
12921250
logging.FrameworkTrace(ctx, "Provider implements ProviderWithProviderMeta")
12931251
logging.FrameworkDebug(ctx, "Calling provider defined Provider GetMetaSchema")
12941252
pmSchema, diags := pm.GetMetaSchema(ctx)

internal/proto6server/serve_import.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func (r importResourceStateResponse) toTfprotov6(ctx context.Context) *tfprotov6
6767
}
6868

6969
func (s *Server) importResourceState(ctx context.Context, req *tfprotov6.ImportResourceStateRequest, resp *importResourceStateResponse) {
70-
resourceType, diags := s.getResourceType(ctx, req.TypeName)
70+
resourceType, diags := s.FrameworkServer.ResourceType(ctx, req.TypeName)
7171
resp.Diagnostics.Append(diags...)
7272

7373
if resp.Diagnostics.HasError() {
@@ -84,7 +84,7 @@ func (s *Server) importResourceState(ctx context.Context, req *tfprotov6.ImportR
8484
}
8585

8686
logging.FrameworkDebug(ctx, "Calling provider defined ResourceType NewResource")
87-
resource, diags := resourceType.NewResource(ctx, s.Provider)
87+
resource, diags := resourceType.NewResource(ctx, s.FrameworkServer.Provider)
8888
logging.FrameworkDebug(ctx, "Called provider defined ResourceType NewResource")
8989
resp.Diagnostics.Append(diags...)
9090

internal/proto6server/serve_import_test.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"testing"
66

77
"github.com/google/go-cmp/cmp"
8+
"github.com/hashicorp/terraform-plugin-framework/internal/fwserver"
89
"github.com/hashicorp/terraform-plugin-framework/tfsdk"
910
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
1011
"github.com/hashicorp/terraform-plugin-go/tftypes"
@@ -164,7 +165,9 @@ func TestServerImportResourceState(t *testing.T) {
164165
importStateFunc: tc.impl,
165166
}
166167
testServer := &Server{
167-
Provider: s,
168+
FrameworkServer: fwserver.Server{
169+
Provider: s,
170+
},
168171
}
169172

170173
got, err := testServer.ImportResourceState(context.Background(), tc.req)

internal/proto6server/serve_test.go

+25-15
Original file line numberDiff line numberDiff line change
@@ -1549,8 +1549,8 @@ func TestServerUpgradeResourceState(t *testing.T) {
15491549
Diagnostics: []*tfprotov6.Diagnostic{
15501550
{
15511551
Severity: tfprotov6.DiagnosticSeverityError,
1552-
Summary: "Resource not found",
1553-
Detail: "No resource named \"\" is configured on the provider",
1552+
Summary: "Resource Type Not Found",
1553+
Detail: "No resource type named \"\" was found in the provider.",
15541554
},
15551555
},
15561556
},
@@ -1605,8 +1605,8 @@ func TestServerUpgradeResourceState(t *testing.T) {
16051605
Diagnostics: []*tfprotov6.Diagnostic{
16061606
{
16071607
Severity: tfprotov6.DiagnosticSeverityError,
1608-
Summary: "Resource not found",
1609-
Detail: "No resource named \"unknown\" is configured on the provider",
1608+
Summary: "Resource Type Not Found",
1609+
Detail: "No resource type named \"unknown\" was found in the provider.",
16101610
},
16111611
},
16121612
},
@@ -1799,7 +1799,9 @@ func TestServerUpgradeResourceState(t *testing.T) {
17991799
ctx := context.Background()
18001800
testProvider := &testServeProvider{}
18011801
testServer := &Server{
1802-
Provider: testProvider,
1802+
FrameworkServer: fwserver.Server{
1803+
Provider: testProvider,
1804+
},
18031805
}
18041806

18051807
got, err := testServer.UpgradeResourceState(ctx, testCase.request)
@@ -2220,12 +2222,14 @@ func TestServerReadResource(t *testing.T) {
22202222
readResourceImpl: tc.impl,
22212223
}
22222224
testServer := &Server{
2223-
Provider: s,
2225+
FrameworkServer: fwserver.Server{
2226+
Provider: s,
2227+
},
22242228
}
22252229
var pmSchema tfsdk.Schema
22262230
if tc.providerMeta.Type() != nil {
22272231
sWithMeta := &testServeProviderWithMetaSchema{s}
2228-
testServer.Provider = sWithMeta
2232+
testServer.FrameworkServer.Provider = sWithMeta
22292233
schema, diags := sWithMeta.GetMetaSchema(context.Background())
22302234
if len(diags) > 0 {
22312235
t.Errorf("Unexpected diags: %+v", diags)
@@ -2234,7 +2238,7 @@ func TestServerReadResource(t *testing.T) {
22342238
pmSchema = schema
22352239
}
22362240

2237-
rt, diags := testServer.getResourceType(context.Background(), tc.resource)
2241+
rt, diags := testServer.FrameworkServer.ResourceType(context.Background(), tc.resource)
22382242
if len(diags) > 0 {
22392243
t.Errorf("Unexpected diags: %+v", diags)
22402244
return
@@ -4296,7 +4300,9 @@ func TestServerPlanResourceChange(t *testing.T) {
42964300
modifyPlanFunc: tc.modifyPlanFunc,
42974301
}
42984302
testServer := &Server{
4299-
Provider: s,
4303+
FrameworkServer: fwserver.Server{
4304+
Provider: s,
4305+
},
43004306
}
43014307

43024308
priorStateDV, err := tfprotov6.NewDynamicValue(tc.resourceType, tc.priorState)
@@ -5856,12 +5862,14 @@ func TestServerApplyResourceChange(t *testing.T) {
58565862
deleteFunc: tc.destroy,
58575863
}
58585864
testServer := &Server{
5859-
Provider: s,
5865+
FrameworkServer: fwserver.Server{
5866+
Provider: s,
5867+
},
58605868
}
58615869
var pmSchema tfsdk.Schema
58625870
if tc.providerMeta.Type() != nil {
58635871
sWithMeta := &testServeProviderWithMetaSchema{s}
5864-
testServer.Provider = sWithMeta
5872+
testServer.FrameworkServer.Provider = sWithMeta
58655873
schema, diags := sWithMeta.GetMetaSchema(context.Background())
58665874
if len(diags) > 0 {
58675875
t.Errorf("Unexpected diags: %+v", diags)
@@ -5870,7 +5878,7 @@ func TestServerApplyResourceChange(t *testing.T) {
58705878
pmSchema = schema
58715879
}
58725880

5873-
rt, diags := testServer.getResourceType(context.Background(), tc.resource)
5881+
rt, diags := testServer.FrameworkServer.ResourceType(context.Background(), tc.resource)
58745882
if len(diags) > 0 {
58755883
t.Errorf("Unexpected diags: %+v", diags)
58765884
return
@@ -6382,12 +6390,14 @@ func TestServerReadDataSource(t *testing.T) {
63826390
readDataSourceImpl: tc.impl,
63836391
}
63846392
testServer := &Server{
6385-
Provider: s,
6393+
FrameworkServer: fwserver.Server{
6394+
Provider: s,
6395+
},
63866396
}
63876397
var pmSchema tfsdk.Schema
63886398
if tc.providerMeta.Type() != nil {
63896399
sWithMeta := &testServeProviderWithMetaSchema{s}
6390-
testServer.Provider = sWithMeta
6400+
testServer.FrameworkServer.Provider = sWithMeta
63916401
schema, diags := sWithMeta.GetMetaSchema(context.Background())
63926402
if len(diags) > 0 {
63936403
t.Errorf("Unexpected diags: %+v", diags)
@@ -6396,7 +6406,7 @@ func TestServerReadDataSource(t *testing.T) {
63966406
pmSchema = schema
63976407
}
63986408

6399-
rt, diags := testServer.getDataSourceType(context.Background(), tc.dataSource)
6409+
rt, diags := testServer.FrameworkServer.DataSourceType(context.Background(), tc.dataSource)
64006410
if len(diags) > 0 {
64016411
t.Errorf("Unexpected diags: %+v", diags)
64026412
return

providerserver/providerserver.go

-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ func NewProtocol6(p tfsdk.Provider) func() tfprotov6.ProviderServer {
2121
FrameworkServer: fwserver.Server{
2222
Provider: p,
2323
},
24-
Provider: p,
2524
}
2625
}
2726
}
@@ -37,7 +36,6 @@ func NewProtocol6WithError(p tfsdk.Provider) func() (tfprotov6.ProviderServer, e
3736
FrameworkServer: fwserver.Server{
3837
Provider: p,
3938
},
40-
Provider: p,
4139
}, nil
4240
}
4341
}
@@ -65,7 +63,6 @@ func Serve(ctx context.Context, providerFunc func() tfsdk.Provider, opts ServeOp
6563
FrameworkServer: fwserver.Server{
6664
Provider: provider,
6765
},
68-
Provider: provider,
6966
}
7067
},
7168
tf6serverOpts...,

0 commit comments

Comments
 (0)