Skip to content

Commit 183e62b

Browse files
authored
list: implement list RPCs (#1521)
* bump terraform-plugin-go version and implement list RPCs * changelog
1 parent 24a3c3e commit 183e62b

File tree

5 files changed

+77
-24
lines changed

5 files changed

+77
-24
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kind: NOTES
2+
body: 'helper/schema: Update the provider server to handle the ListResource RPCs by returning an error since they are not supported by SDKv2.'
3+
time: 2025-09-16T09:38:48.104752+02:00
4+
custom:
5+
Issue: "1521"

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/hashicorp/logutils v1.0.0
1717
github.com/hashicorp/terraform-exec v0.23.1
1818
github.com/hashicorp/terraform-json v0.26.0
19-
github.com/hashicorp/terraform-plugin-go v0.28.0
19+
github.com/hashicorp/terraform-plugin-go v0.29.0-beta.1
2020
github.com/hashicorp/terraform-plugin-log v0.9.0
2121
github.com/mitchellh/copystructure v1.2.0
2222
github.com/mitchellh/go-testing-interface v1.14.1
@@ -38,7 +38,7 @@ require (
3838
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
3939
github.com/hashicorp/go-multierror v1.1.1 // indirect
4040
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
41-
github.com/hashicorp/terraform-registry-address v0.2.5 // indirect
41+
github.com/hashicorp/terraform-registry-address v0.3.0 // indirect
4242
github.com/hashicorp/terraform-svchost v0.1.1 // indirect
4343
github.com/hashicorp/yamux v0.1.1 // indirect
4444
github.com/kr/pretty v0.3.1 // indirect
@@ -58,8 +58,8 @@ require (
5858
golang.org/x/text v0.29.0 // indirect
5959
golang.org/x/tools v0.36.0 // indirect
6060
google.golang.org/appengine v1.6.8 // indirect
61-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect
62-
google.golang.org/grpc v1.72.1 // indirect
61+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect
62+
google.golang.org/grpc v1.74.2 // indirect
6363
google.golang.org/protobuf v1.36.6 // indirect
6464
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
6565
)

go.sum

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UN
3030
github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=
3131
github.com/go-git/go-git/v5 v5.14.0 h1:/MD3lCrGjCen5WfEAzKg00MJJffKhC8gzS80ycmCi60=
3232
github.com/go-git/go-git/v5 v5.14.0/go.mod h1:Z5Xhoia5PcWA3NF8vRLURn9E5FRhSl7dGj9ItW3Wk5k=
33-
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
34-
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
33+
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
34+
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
3535
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
3636
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
3737
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
@@ -81,12 +81,12 @@ github.com/hashicorp/terraform-exec v0.23.1 h1:diK5NSSDXDKqHEOIQefBMu9ny+FhzwlwV
8181
github.com/hashicorp/terraform-exec v0.23.1/go.mod h1:e4ZEg9BJDRaSalGm2z8vvrPONt0XWG0/tXpmzYTf+dM=
8282
github.com/hashicorp/terraform-json v0.26.0 h1:+BnJavhRH+oyNWPnfzrfQwVWCZBFMvjdiH2Vi38Udz4=
8383
github.com/hashicorp/terraform-json v0.26.0/go.mod h1:eyWCeC3nrZamyrKLFnrvwpc3LQPIJsx8hWHQ/nu2/v4=
84-
github.com/hashicorp/terraform-plugin-go v0.28.0 h1:zJmu2UDwhVN0J+J20RE5huiF3XXlTYVIleaevHZgKPA=
85-
github.com/hashicorp/terraform-plugin-go v0.28.0/go.mod h1:FDa2Bb3uumkTGSkTFpWSOwWJDwA7bf3vdP3ltLDTH6o=
84+
github.com/hashicorp/terraform-plugin-go v0.29.0-beta.1 h1:xeHlRQYev3iMXwX2W7+D1bSfLRBs9jojZXqE6hmNxMI=
85+
github.com/hashicorp/terraform-plugin-go v0.29.0-beta.1/go.mod h1:5pww/UULn9C2tItq6o5sbScEkJxBUt9X9kI4DkeRsIw=
8686
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=
8787
github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow=
88-
github.com/hashicorp/terraform-registry-address v0.2.5 h1:2GTftHqmUhVOeuu9CW3kwDkRe4pcBDq0uuK5VJngU1M=
89-
github.com/hashicorp/terraform-registry-address v0.2.5/go.mod h1:PpzXWINwB5kuVS5CA7m1+eO2f1jKb5ZDIxrOPfpnGkg=
88+
github.com/hashicorp/terraform-registry-address v0.3.0 h1:HMpK3nqaGFPS9VmgRXrJL/dzHNdheGVKk5k7VlFxzCo=
89+
github.com/hashicorp/terraform-registry-address v0.3.0/go.mod h1:jRGCMiLaY9zii3GLC7hqpSnwhfnCN5yzvY0hh4iCGbM=
9090
github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ=
9191
github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc=
9292
github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
@@ -158,16 +158,16 @@ github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6
158158
github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM=
159159
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
160160
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
161-
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
162-
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
163-
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
164-
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
165-
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
166-
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
167-
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
168-
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
169-
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
170-
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
161+
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
162+
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
163+
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
164+
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
165+
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
166+
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
167+
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
168+
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
169+
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
170+
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
171171
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
172172
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
173173
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
@@ -220,10 +220,10 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
220220
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
221221
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
222222
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
223-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4=
224-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ=
225-
google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA=
226-
google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
223+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE=
224+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
225+
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
226+
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
227227
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
228228
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
229229
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=

helper/schema/grpc_provider.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"encoding/json"
99
"fmt"
10+
"slices"
1011
"strconv"
1112
"strings"
1213
"sync"
@@ -196,6 +197,7 @@ func (s *GRPCProviderServer) GetMetadata(ctx context.Context, req *tfprotov5.Get
196197
DataSources: make([]tfprotov5.DataSourceMetadata, 0, len(s.provider.DataSourcesMap)),
197198
EphemeralResources: make([]tfprotov5.EphemeralResourceMetadata, 0),
198199
Functions: make([]tfprotov5.FunctionMetadata, 0),
200+
ListResources: make([]tfprotov5.ListResourceMetadata, 0),
199201
Resources: make([]tfprotov5.ResourceMetadata, 0, len(s.provider.ResourcesMap)),
200202
ServerCapabilities: s.serverCapabilities(),
201203
}
@@ -224,6 +226,7 @@ func (s *GRPCProviderServer) GetProviderSchema(ctx context.Context, req *tfproto
224226
DataSourceSchemas: make(map[string]*tfprotov5.Schema, len(s.provider.DataSourcesMap)),
225227
EphemeralResourceSchemas: make(map[string]*tfprotov5.Schema, 0),
226228
Functions: make(map[string]*tfprotov5.Function, 0),
229+
ListResourceSchemas: make(map[string]*tfprotov5.Schema, 0),
227230
ResourceSchemas: make(map[string]*tfprotov5.Schema, len(s.provider.ResourcesMap)),
228231
ServerCapabilities: s.serverCapabilities(),
229232
}
@@ -2020,6 +2023,48 @@ func (s *GRPCProviderServer) CloseEphemeralResource(ctx context.Context, req *tf
20202023
return resp, nil
20212024
}
20222025

2026+
func (s *GRPCProviderServer) ValidateListResourceConfig(ctx context.Context, req *tfprotov5.ValidateListResourceConfigRequest) (*tfprotov5.ValidateListResourceConfigResponse, error) {
2027+
ctx = logging.InitContext(ctx)
2028+
2029+
logging.HelperSchemaTrace(ctx, "Returning error for list resource validate")
2030+
2031+
resp := &tfprotov5.ValidateListResourceConfigResponse{
2032+
Diagnostics: []*tfprotov5.Diagnostic{
2033+
{
2034+
Severity: tfprotov5.DiagnosticSeverityError,
2035+
Summary: "Unknown List Resource Type",
2036+
Detail: fmt.Sprintf("The %q list resource type is not supported by this provider.", req.TypeName),
2037+
},
2038+
},
2039+
}
2040+
2041+
return resp, nil
2042+
}
2043+
2044+
func (s *GRPCProviderServer) ListResource(ctx context.Context, req *tfprotov5.ListResourceRequest) (*tfprotov5.ListResourceServerStream, error) {
2045+
ctx = logging.InitContext(ctx)
2046+
2047+
logging.HelperSchemaTrace(ctx, "Returning error for list resource list")
2048+
2049+
result := make([]tfprotov5.ListResourceResult, 0)
2050+
2051+
result = append(result, tfprotov5.ListResourceResult{
2052+
Diagnostics: []*tfprotov5.Diagnostic{
2053+
{
2054+
Severity: tfprotov5.DiagnosticSeverityError,
2055+
Summary: "Unknown List Resource Type",
2056+
Detail: fmt.Sprintf("The %q list resource type is not supported by this provider.", req.TypeName),
2057+
},
2058+
},
2059+
})
2060+
2061+
resp := &tfprotov5.ListResourceServerStream{
2062+
Results: slices.Values(result),
2063+
}
2064+
2065+
return resp, nil
2066+
}
2067+
20232068
func pathToAttributePath(path cty.Path) *tftypes.AttributePath {
20242069
var steps []tftypes.AttributePathStep
20252070

helper/schema/grpc_provider_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3762,6 +3762,7 @@ func TestGRPCProviderServerGetMetadata(t *testing.T) {
37623762
},
37633763
Functions: []tfprotov5.FunctionMetadata{},
37643764
EphemeralResources: []tfprotov5.EphemeralResourceMetadata{},
3765+
ListResources: []tfprotov5.ListResourceMetadata{},
37653766
Resources: []tfprotov5.ResourceMetadata{},
37663767
ServerCapabilities: &tfprotov5.ServerCapabilities{
37673768
GetProviderSchemaOptional: true,
@@ -3790,6 +3791,7 @@ func TestGRPCProviderServerGetMetadata(t *testing.T) {
37903791
},
37913792
Functions: []tfprotov5.FunctionMetadata{},
37923793
EphemeralResources: []tfprotov5.EphemeralResourceMetadata{},
3794+
ListResources: []tfprotov5.ListResourceMetadata{},
37933795
Resources: []tfprotov5.ResourceMetadata{
37943796
{
37953797
TypeName: "test_resource1",
@@ -3814,6 +3816,7 @@ func TestGRPCProviderServerGetMetadata(t *testing.T) {
38143816
DataSources: []tfprotov5.DataSourceMetadata{},
38153817
Functions: []tfprotov5.FunctionMetadata{},
38163818
EphemeralResources: []tfprotov5.EphemeralResourceMetadata{},
3819+
ListResources: []tfprotov5.ListResourceMetadata{},
38173820
Resources: []tfprotov5.ResourceMetadata{
38183821
{
38193822
TypeName: "test_resource1",

0 commit comments

Comments
 (0)