Skip to content

Commit 92180cc

Browse files
authored
providerserver: Update to protocol versions 5.4/6.4 and enable GetProviderSchemaOptional server capability (#829)
Reference: #828
1 parent 02a0af0 commit 92180cc

35 files changed

+1978
-61
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
kind: FEATURES
2+
body: 'providerserver: Upgrade to protocol versions 5.4 and 6.4, which can
3+
significantly reduce memory usage with Terraform 1.6 and later when a
4+
configuration includes multiple instances of the same provider'
5+
time: 2023-08-25T11:58:48.820178-04:00
6+
custom:
7+
Issue: "828"

go.mod

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ go 1.20
44

55
require (
66
github.com/google/go-cmp v0.5.9
7-
github.com/hashicorp/terraform-plugin-go v0.18.0
7+
github.com/hashicorp/terraform-plugin-go v0.19.0
88
github.com/hashicorp/terraform-plugin-log v0.9.0
99
)
1010

1111
require (
1212
github.com/fatih/color v1.13.0 // indirect
1313
github.com/golang/protobuf v1.5.3 // indirect
1414
github.com/hashicorp/go-hclog v1.5.0 // indirect
15-
github.com/hashicorp/go-plugin v1.4.10 // indirect
15+
github.com/hashicorp/go-plugin v1.5.1 // indirect
1616
github.com/hashicorp/go-uuid v1.0.3 // indirect
17-
github.com/hashicorp/terraform-registry-address v0.2.1 // indirect
17+
github.com/hashicorp/terraform-registry-address v0.2.2 // indirect
1818
github.com/hashicorp/terraform-svchost v0.1.1 // indirect
1919
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect
2020
github.com/mattn/go-colorable v0.1.12 // indirect
@@ -23,10 +23,10 @@ require (
2323
github.com/oklog/run v1.0.0 // indirect
2424
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
2525
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
26-
golang.org/x/net v0.11.0 // indirect
27-
golang.org/x/sys v0.9.0 // indirect
28-
golang.org/x/text v0.10.0 // indirect
29-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
30-
google.golang.org/grpc v1.56.1 // indirect
26+
golang.org/x/net v0.13.0 // indirect
27+
golang.org/x/sys v0.10.0 // indirect
28+
golang.org/x/text v0.11.0 // indirect
29+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect
30+
google.golang.org/grpc v1.57.0 // indirect
3131
google.golang.org/protobuf v1.31.0 // indirect
3232
)

go.sum

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
12
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
23
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
34
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -11,21 +12,21 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
1112
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
1213
github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c=
1314
github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
14-
github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk=
15-
github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0=
15+
github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k=
16+
github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4=
1617
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
1718
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
18-
github.com/hashicorp/terraform-plugin-go v0.18.0 h1:IwTkOS9cOW1ehLd/rG0y+u/TGLK9y6fGoBjXVUquzpE=
19-
github.com/hashicorp/terraform-plugin-go v0.18.0/go.mod h1:l7VK+2u5Kf2y+A+742GX0ouLut3gttudmvMgN0PA74Y=
19+
github.com/hashicorp/terraform-plugin-go v0.19.0 h1:BuZx/6Cp+lkmiG0cOBk6Zps0Cb2tmqQpDM3iAtnhDQU=
20+
github.com/hashicorp/terraform-plugin-go v0.19.0/go.mod h1:EhRSkEPNoylLQntYsk5KrDHTZJh9HQoumZXbOGOXmec=
2021
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=
2122
github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow=
22-
github.com/hashicorp/terraform-registry-address v0.2.1 h1:QuTf6oJ1+WSflJw6WYOHhLgwUiQ0FrROpHPYFtwTYWM=
23-
github.com/hashicorp/terraform-registry-address v0.2.1/go.mod h1:BSE9fIFzp0qWsJUUyGquo4ldV9k2n+psif6NYkBRS3Y=
23+
github.com/hashicorp/terraform-registry-address v0.2.2 h1:lPQBg403El8PPicg/qONZJDC6YlgCVbWDtNmmZKtBno=
24+
github.com/hashicorp/terraform-registry-address v0.2.2/go.mod h1:LtwNbCihUoUZ3RYriyS2wF/lGPB6gF9ICLRtuDk7hSo=
2425
github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ=
2526
github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc=
2627
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M=
2728
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
28-
github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE=
29+
github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c=
2930
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
3031
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
3132
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
@@ -46,22 +47,22 @@ github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9
4647
github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
4748
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
4849
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
49-
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
50-
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
50+
golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY=
51+
golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
5152
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5253
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5354
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
5455
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
5556
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
56-
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
57-
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
58-
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
59-
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
57+
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
58+
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
59+
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
60+
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
6061
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
61-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
62-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
63-
google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ=
64-
google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
62+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM=
63+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
64+
google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw=
65+
google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
6566
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
6667
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
6768
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=

internal/fromproto5/getmetadata.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package fromproto5
5+
6+
import (
7+
"context"
8+
9+
"github.com/hashicorp/terraform-plugin-framework/internal/fwserver"
10+
"github.com/hashicorp/terraform-plugin-go/tfprotov5"
11+
)
12+
13+
// GetMetadataRequest returns the *fwserver.GetMetadataRequest
14+
// equivalent of a *tfprotov5.GetMetadataRequest.
15+
func GetMetadataRequest(ctx context.Context, proto5 *tfprotov5.GetMetadataRequest) *fwserver.GetMetadataRequest {
16+
if proto5 == nil {
17+
return nil
18+
}
19+
20+
fw := &fwserver.GetMetadataRequest{}
21+
22+
return fw
23+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package fromproto5_test
5+
6+
import (
7+
"context"
8+
"testing"
9+
10+
"github.com/google/go-cmp/cmp"
11+
"github.com/hashicorp/terraform-plugin-framework/internal/fromproto5"
12+
"github.com/hashicorp/terraform-plugin-framework/internal/fwserver"
13+
"github.com/hashicorp/terraform-plugin-go/tfprotov5"
14+
)
15+
16+
func TestGetMetadataRequest(t *testing.T) {
17+
t.Parallel()
18+
19+
testCases := map[string]struct {
20+
input *tfprotov5.GetMetadataRequest
21+
expected *fwserver.GetMetadataRequest
22+
}{
23+
"nil": {
24+
input: nil,
25+
expected: nil,
26+
},
27+
"empty": {
28+
input: &tfprotov5.GetMetadataRequest{},
29+
expected: &fwserver.GetMetadataRequest{},
30+
},
31+
}
32+
33+
for name, testCase := range testCases {
34+
name, testCase := name, testCase
35+
36+
t.Run(name, func(t *testing.T) {
37+
t.Parallel()
38+
39+
got := fromproto5.GetMetadataRequest(context.Background(), testCase.input)
40+
41+
if diff := cmp.Diff(got, testCase.expected); diff != "" {
42+
t.Errorf("unexpected difference: %s", diff)
43+
}
44+
})
45+
}
46+
}

internal/fromproto6/getmetadata.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package fromproto6
5+
6+
import (
7+
"context"
8+
9+
"github.com/hashicorp/terraform-plugin-framework/internal/fwserver"
10+
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
11+
)
12+
13+
// GetMetadataRequest returns the *fwserver.GetMetadataRequest
14+
// equivalent of a *tfprotov6.GetMetadataRequest.
15+
func GetMetadataRequest(ctx context.Context, proto6 *tfprotov6.GetMetadataRequest) *fwserver.GetMetadataRequest {
16+
if proto6 == nil {
17+
return nil
18+
}
19+
20+
fw := &fwserver.GetMetadataRequest{}
21+
22+
return fw
23+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package fromproto6_test
5+
6+
import (
7+
"context"
8+
"testing"
9+
10+
"github.com/google/go-cmp/cmp"
11+
"github.com/hashicorp/terraform-plugin-framework/internal/fromproto6"
12+
"github.com/hashicorp/terraform-plugin-framework/internal/fwserver"
13+
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
14+
)
15+
16+
func TestGetMetadataRequest(t *testing.T) {
17+
t.Parallel()
18+
19+
testCases := map[string]struct {
20+
input *tfprotov6.GetMetadataRequest
21+
expected *fwserver.GetMetadataRequest
22+
}{
23+
"nil": {
24+
input: nil,
25+
expected: nil,
26+
},
27+
"empty": {
28+
input: &tfprotov6.GetMetadataRequest{},
29+
expected: &fwserver.GetMetadataRequest{},
30+
},
31+
}
32+
33+
for name, testCase := range testCases {
34+
name, testCase := name, testCase
35+
36+
t.Run(name, func(t *testing.T) {
37+
t.Parallel()
38+
39+
got := fromproto6.GetMetadataRequest(context.Background(), testCase.input)
40+
41+
if diff := cmp.Diff(got, testCase.expected); diff != "" {
42+
t.Errorf("unexpected difference: %s", diff)
43+
}
44+
})
45+
}
46+
}

internal/fwserver/server.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,22 @@ func (s *Server) DataSourceFuncs(ctx context.Context) (map[string]func() datasou
183183
return s.dataSourceFuncs, s.dataSourceTypesDiags
184184
}
185185

186+
// DataSourceMetadatas returns a slice of DataSourceMetadata for the GetMetadata
187+
// RPC.
188+
func (s *Server) DataSourceMetadatas(ctx context.Context) ([]DataSourceMetadata, diag.Diagnostics) {
189+
datasourceFuncs, diags := s.DataSourceFuncs(ctx)
190+
191+
datasourceMetadatas := make([]DataSourceMetadata, 0, len(datasourceFuncs))
192+
193+
for typeName := range datasourceFuncs {
194+
datasourceMetadatas = append(datasourceMetadatas, DataSourceMetadata{
195+
TypeName: typeName,
196+
})
197+
}
198+
199+
return datasourceMetadatas, diags
200+
}
201+
186202
// DataSourceSchema returns the DataSource Schema for the given type name and
187203
// caches the result for later DataSource operations.
188204
func (s *Server) DataSourceSchema(ctx context.Context, typeName string) (fwschema.Schema, diag.Diagnostics) {
@@ -401,6 +417,22 @@ func (s *Server) ResourceFuncs(ctx context.Context) (map[string]func() resource.
401417
return s.resourceFuncs, s.resourceTypesDiags
402418
}
403419

420+
// ResourceMetadatas returns a slice of ResourceMetadata for the GetMetadata
421+
// RPC.
422+
func (s *Server) ResourceMetadatas(ctx context.Context) ([]ResourceMetadata, diag.Diagnostics) {
423+
resourceFuncs, diags := s.ResourceFuncs(ctx)
424+
425+
resourceMetadatas := make([]ResourceMetadata, 0, len(resourceFuncs))
426+
427+
for typeName := range resourceFuncs {
428+
resourceMetadatas = append(resourceMetadatas, ResourceMetadata{
429+
TypeName: typeName,
430+
})
431+
}
432+
433+
return resourceMetadatas, diags
434+
}
435+
404436
// ResourceSchema returns the Resource Schema for the given type name and
405437
// caches the result for later Resource operations.
406438
func (s *Server) ResourceSchema(ctx context.Context, typeName string) (fwschema.Schema, diag.Diagnostics) {

internal/fwserver/server_capabilities.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,25 @@ package fwserver
88
// the toproto5 conversion logic will handle the appropriate filtering and the
99
// proto5server/fwserver logic will need to account for missing features.
1010
type ServerCapabilities struct {
11+
// GetProviderSchemaOptional signals that the provider does not require the
12+
// GetProviderSchema RPC before other RPCs.
13+
//
14+
// This should always be enabled in framework providers and requires
15+
// Terraform 1.6 or later.
16+
GetProviderSchemaOptional bool
17+
1118
// PlanDestroy signals that the provider is ready for the
1219
// PlanResourceChange RPC on resource destruction.
1320
//
1421
// This should always be enabled in framework providers and requires
1522
// Terraform 1.3 or later.
1623
PlanDestroy bool
1724
}
25+
26+
// ServerCapabilities returns the server capabilities.
27+
func (s *Server) ServerCapabilities() *ServerCapabilities {
28+
return &ServerCapabilities{
29+
GetProviderSchemaOptional: true,
30+
PlanDestroy: true,
31+
}
32+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package fwserver
5+
6+
import (
7+
"context"
8+
9+
"github.com/hashicorp/terraform-plugin-framework/diag"
10+
"github.com/hashicorp/terraform-plugin-framework/internal/logging"
11+
"github.com/hashicorp/terraform-plugin-framework/provider"
12+
)
13+
14+
// GetMetadataRequest is the framework server request for the
15+
// GetMetadata RPC.
16+
type GetMetadataRequest struct{}
17+
18+
// GetMetadataResponse is the framework server response for the
19+
// GetMetadata RPC.
20+
type GetMetadataResponse struct {
21+
DataSources []DataSourceMetadata
22+
Diagnostics diag.Diagnostics
23+
Resources []ResourceMetadata
24+
ServerCapabilities *ServerCapabilities
25+
}
26+
27+
// DataSourceMetadata is the framework server equivalent of the
28+
// tfprotov5.DataSourceMetadata and tfprotov6.DataSourceMetadata types.
29+
type DataSourceMetadata struct {
30+
// TypeName is the name of the data resource.
31+
TypeName string
32+
}
33+
34+
// ResourceMetadata is the framework server equivalent of the
35+
// tfprotov5.ResourceMetadata and tfprotov6.ResourceMetadata types.
36+
type ResourceMetadata struct {
37+
// TypeName is the name of the managed resource.
38+
TypeName string
39+
}
40+
41+
// GetMetadata implements the framework server GetMetadata RPC.
42+
func (s *Server) GetMetadata(ctx context.Context, req *GetMetadataRequest, resp *GetMetadataResponse) {
43+
resp.DataSources = []DataSourceMetadata{}
44+
resp.Resources = []ResourceMetadata{}
45+
resp.ServerCapabilities = s.ServerCapabilities()
46+
47+
metadataReq := provider.MetadataRequest{}
48+
metadataResp := provider.MetadataResponse{}
49+
50+
logging.FrameworkTrace(ctx, "Calling provider defined Provider Metadata")
51+
s.Provider.Metadata(ctx, metadataReq, &metadataResp)
52+
logging.FrameworkTrace(ctx, "Called provider defined Provider Metadata")
53+
54+
s.providerTypeName = metadataResp.TypeName
55+
56+
datasourceMetadatas, diags := s.DataSourceMetadatas(ctx)
57+
58+
resp.Diagnostics.Append(diags...)
59+
60+
resourceMetadatas, diags := s.ResourceMetadatas(ctx)
61+
62+
resp.Diagnostics.Append(diags...)
63+
64+
if resp.Diagnostics.HasError() {
65+
return
66+
}
67+
68+
resp.DataSources = datasourceMetadatas
69+
resp.Resources = resourceMetadatas
70+
}

0 commit comments

Comments
 (0)