Skip to content

Commit d419eaa

Browse files
authored
helper/schema: Update to protocol version 5.4 and enable GetProviderSchemaOptional server capability (#1235)
Reference: #1234
1 parent 80fb516 commit d419eaa

File tree

5 files changed

+181
-21
lines changed

5 files changed

+181
-21
lines changed

Diff for: .changes/unreleased/FEATURES-20230825-093431.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
kind: FEATURES
2+
body: 'helper/schema: Upgrade to protocol version 5.4, which can significantly reduce
3+
memory usage with Terraform 1.6 and later when a configuration includes multiple
4+
instances of the same provider'
5+
time: 2023-08-25T09:34:31.204603-04:00
6+
custom:
7+
Issue: "1234"

Diff for: go.mod

+6-6
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ require (
77
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320
88
github.com/hashicorp/go-hclog v1.5.0
99
github.com/hashicorp/go-multierror v1.1.1
10-
github.com/hashicorp/go-plugin v1.4.10
10+
github.com/hashicorp/go-plugin v1.5.1
1111
github.com/hashicorp/go-uuid v1.0.3
1212
github.com/hashicorp/go-version v1.6.0
1313
github.com/hashicorp/hc-install v0.6.0
1414
github.com/hashicorp/hcl/v2 v2.18.0
1515
github.com/hashicorp/logutils v1.0.0
1616
github.com/hashicorp/terraform-exec v0.19.0
1717
github.com/hashicorp/terraform-json v0.17.1
18-
github.com/hashicorp/terraform-plugin-go v0.18.0
18+
github.com/hashicorp/terraform-plugin-go v0.19.0
1919
github.com/hashicorp/terraform-plugin-log v0.9.0
2020
github.com/mitchellh/copystructure v1.2.0
2121
github.com/mitchellh/go-testing-interface v1.14.1
@@ -35,7 +35,7 @@ require (
3535
github.com/hashicorp/errwrap v1.0.0 // indirect
3636
github.com/hashicorp/go-checkpoint v0.5.0 // indirect
3737
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
38-
github.com/hashicorp/terraform-registry-address v0.2.1 // indirect
38+
github.com/hashicorp/terraform-registry-address v0.2.2 // indirect
3939
github.com/hashicorp/terraform-svchost v0.1.1 // indirect
4040
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect
4141
github.com/kylelemons/godebug v1.1.0 // indirect
@@ -47,11 +47,11 @@ require (
4747
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
4848
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
4949
golang.org/x/mod v0.12.0 // indirect
50-
golang.org/x/net v0.12.0 // indirect
50+
golang.org/x/net v0.13.0 // indirect
5151
golang.org/x/sys v0.12.0 // indirect
5252
golang.org/x/text v0.13.0 // indirect
5353
google.golang.org/appengine v1.6.7 // indirect
54-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
55-
google.golang.org/grpc v1.56.1 // indirect
54+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect
55+
google.golang.org/grpc v1.57.0 // indirect
5656
google.golang.org/protobuf v1.31.0 // indirect
5757
)

Diff for: go.sum

+14-13
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki
88
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
99
github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY=
1010
github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4=
11+
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
1112
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
1213
github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
1314
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
@@ -44,8 +45,8 @@ github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+
4445
github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
4546
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
4647
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
47-
github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk=
48-
github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0=
48+
github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k=
49+
github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4=
4950
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
5051
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
5152
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
@@ -61,18 +62,18 @@ github.com/hashicorp/terraform-exec v0.19.0 h1:FpqZ6n50Tk95mItTSS9BjeOVUb4eg81Sp
6162
github.com/hashicorp/terraform-exec v0.19.0/go.mod h1:tbxUpe3JKruE9Cuf65mycSIT8KiNPZ0FkuTE3H4urQg=
6263
github.com/hashicorp/terraform-json v0.17.1 h1:eMfvh/uWggKmY7Pmb3T85u86E2EQg6EQHgyRwf3RkyA=
6364
github.com/hashicorp/terraform-json v0.17.1/go.mod h1:Huy6zt6euxaY9knPAFKjUITn8QxUFIe9VuSzb4zn/0o=
64-
github.com/hashicorp/terraform-plugin-go v0.18.0 h1:IwTkOS9cOW1ehLd/rG0y+u/TGLK9y6fGoBjXVUquzpE=
65-
github.com/hashicorp/terraform-plugin-go v0.18.0/go.mod h1:l7VK+2u5Kf2y+A+742GX0ouLut3gttudmvMgN0PA74Y=
65+
github.com/hashicorp/terraform-plugin-go v0.19.0 h1:BuZx/6Cp+lkmiG0cOBk6Zps0Cb2tmqQpDM3iAtnhDQU=
66+
github.com/hashicorp/terraform-plugin-go v0.19.0/go.mod h1:EhRSkEPNoylLQntYsk5KrDHTZJh9HQoumZXbOGOXmec=
6667
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=
6768
github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow=
68-
github.com/hashicorp/terraform-registry-address v0.2.1 h1:QuTf6oJ1+WSflJw6WYOHhLgwUiQ0FrROpHPYFtwTYWM=
69-
github.com/hashicorp/terraform-registry-address v0.2.1/go.mod h1:BSE9fIFzp0qWsJUUyGquo4ldV9k2n+psif6NYkBRS3Y=
69+
github.com/hashicorp/terraform-registry-address v0.2.2 h1:lPQBg403El8PPicg/qONZJDC6YlgCVbWDtNmmZKtBno=
70+
github.com/hashicorp/terraform-registry-address v0.2.2/go.mod h1:LtwNbCihUoUZ3RYriyS2wF/lGPB6gF9ICLRtuDk7hSo=
7071
github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ=
7172
github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc=
7273
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ=
7374
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
7475
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
75-
github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE=
76+
github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c=
7677
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
7778
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
7879
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -137,8 +138,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
137138
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
138139
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
139140
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
140-
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
141-
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
141+
golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY=
142+
golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
142143
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
143144
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
144145
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -184,10 +185,10 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
184185
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
185186
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
186187
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
187-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
188-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
189-
google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ=
190-
google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
188+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM=
189+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
190+
google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw=
191+
google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
191192
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
192193
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
193194
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=

Diff for: helper/schema/grpc_provider.go

+35-2
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,47 @@ func (s *GRPCProviderServer) StopContext(ctx context.Context) context.Context {
6767
return stoppable
6868
}
6969

70+
func (s *GRPCProviderServer) serverCapabilities() *tfprotov5.ServerCapabilities {
71+
return &tfprotov5.ServerCapabilities{
72+
GetProviderSchemaOptional: true,
73+
}
74+
}
75+
76+
func (s *GRPCProviderServer) GetMetadata(ctx context.Context, req *tfprotov5.GetMetadataRequest) (*tfprotov5.GetMetadataResponse, error) {
77+
ctx = logging.InitContext(ctx)
78+
79+
logging.HelperSchemaTrace(ctx, "Getting provider metadata")
80+
81+
resp := &tfprotov5.GetMetadataResponse{
82+
DataSources: make([]tfprotov5.DataSourceMetadata, 0, len(s.provider.DataSourcesMap)),
83+
Resources: make([]tfprotov5.ResourceMetadata, 0, len(s.provider.ResourcesMap)),
84+
ServerCapabilities: s.serverCapabilities(),
85+
}
86+
87+
for typeName := range s.provider.DataSourcesMap {
88+
resp.DataSources = append(resp.DataSources, tfprotov5.DataSourceMetadata{
89+
TypeName: typeName,
90+
})
91+
}
92+
93+
for typeName := range s.provider.ResourcesMap {
94+
resp.Resources = append(resp.Resources, tfprotov5.ResourceMetadata{
95+
TypeName: typeName,
96+
})
97+
}
98+
99+
return resp, nil
100+
}
101+
70102
func (s *GRPCProviderServer) GetProviderSchema(ctx context.Context, req *tfprotov5.GetProviderSchemaRequest) (*tfprotov5.GetProviderSchemaResponse, error) {
71103
ctx = logging.InitContext(ctx)
72104

73105
logging.HelperSchemaTrace(ctx, "Getting provider schema")
74106

75107
resp := &tfprotov5.GetProviderSchemaResponse{
76-
ResourceSchemas: make(map[string]*tfprotov5.Schema),
77-
DataSourceSchemas: make(map[string]*tfprotov5.Schema),
108+
DataSourceSchemas: make(map[string]*tfprotov5.Schema, len(s.provider.DataSourcesMap)),
109+
ResourceSchemas: make(map[string]*tfprotov5.Schema, len(s.provider.ResourcesMap)),
110+
ServerCapabilities: s.serverCapabilities(),
78111
}
79112

80113
resp.Provider = &tfprotov5.Schema{

Diff for: helper/schema/grpc_provider_test.go

+119
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"errors"
99
"fmt"
1010
"math/big"
11+
"sort"
1112
"strconv"
1213
"strings"
1314
"testing"
@@ -26,6 +27,124 @@ import (
2627
// The GRPCProviderServer will directly implement the go protobuf server
2728
var _ tfprotov5.ProviderServer = (*GRPCProviderServer)(nil)
2829

30+
func TestGRPCProviderServerGetMetadata(t *testing.T) {
31+
t.Parallel()
32+
33+
testCases := map[string]struct {
34+
Provider *Provider
35+
Expected *tfprotov5.GetMetadataResponse
36+
}{
37+
"datasources": {
38+
Provider: &Provider{
39+
DataSourcesMap: map[string]*Resource{
40+
"test_datasource1": nil, // implementation not necessary
41+
"test_datasource2": nil, // implementation not necessary
42+
},
43+
},
44+
Expected: &tfprotov5.GetMetadataResponse{
45+
DataSources: []tfprotov5.DataSourceMetadata{
46+
{
47+
TypeName: "test_datasource1",
48+
},
49+
{
50+
TypeName: "test_datasource2",
51+
},
52+
},
53+
Resources: []tfprotov5.ResourceMetadata{},
54+
ServerCapabilities: &tfprotov5.ServerCapabilities{
55+
GetProviderSchemaOptional: true,
56+
},
57+
},
58+
},
59+
"datasources and resources": {
60+
Provider: &Provider{
61+
DataSourcesMap: map[string]*Resource{
62+
"test_datasource1": nil, // implementation not necessary
63+
"test_datasource2": nil, // implementation not necessary
64+
},
65+
ResourcesMap: map[string]*Resource{
66+
"test_resource1": nil, // implementation not necessary
67+
"test_resource2": nil, // implementation not necessary
68+
},
69+
},
70+
Expected: &tfprotov5.GetMetadataResponse{
71+
DataSources: []tfprotov5.DataSourceMetadata{
72+
{
73+
TypeName: "test_datasource1",
74+
},
75+
{
76+
TypeName: "test_datasource2",
77+
},
78+
},
79+
Resources: []tfprotov5.ResourceMetadata{
80+
{
81+
TypeName: "test_resource1",
82+
},
83+
{
84+
TypeName: "test_resource2",
85+
},
86+
},
87+
ServerCapabilities: &tfprotov5.ServerCapabilities{
88+
GetProviderSchemaOptional: true,
89+
},
90+
},
91+
},
92+
"resources": {
93+
Provider: &Provider{
94+
ResourcesMap: map[string]*Resource{
95+
"test_resource1": nil, // implementation not necessary
96+
"test_resource2": nil, // implementation not necessary
97+
},
98+
},
99+
Expected: &tfprotov5.GetMetadataResponse{
100+
DataSources: []tfprotov5.DataSourceMetadata{},
101+
Resources: []tfprotov5.ResourceMetadata{
102+
{
103+
TypeName: "test_resource1",
104+
},
105+
{
106+
TypeName: "test_resource2",
107+
},
108+
},
109+
ServerCapabilities: &tfprotov5.ServerCapabilities{
110+
GetProviderSchemaOptional: true,
111+
},
112+
},
113+
},
114+
}
115+
116+
for name, testCase := range testCases {
117+
name, testCase := name, testCase
118+
119+
t.Run(name, func(t *testing.T) {
120+
t.Parallel()
121+
122+
server := NewGRPCProviderServer(testCase.Provider)
123+
124+
testReq := &tfprotov5.GetMetadataRequest{}
125+
126+
resp, err := server.GetMetadata(context.Background(), testReq)
127+
128+
if err != nil {
129+
t.Fatalf("unexpected gRPC error: %s", err)
130+
}
131+
132+
// Prevent false positives with random map access in testing
133+
sort.Slice(resp.DataSources, func(i int, j int) bool {
134+
return resp.DataSources[i].TypeName < resp.DataSources[j].TypeName
135+
})
136+
137+
sort.Slice(resp.Resources, func(i int, j int) bool {
138+
return resp.Resources[i].TypeName < resp.Resources[j].TypeName
139+
})
140+
141+
if diff := cmp.Diff(resp, testCase.Expected); diff != "" {
142+
t.Errorf("unexpected response difference: %s", diff)
143+
}
144+
})
145+
}
146+
}
147+
29148
func TestUpgradeState_jsonState(t *testing.T) {
30149
r := &Resource{
31150
SchemaVersion: 2,

0 commit comments

Comments
 (0)