@@ -3,6 +3,7 @@ package plugin
33import (
44 "context"
55 "errors"
6+ "fmt"
67 "sync"
78
89 "github.com/zclconf/go-cty/cty"
@@ -11,6 +12,7 @@ import (
1112 "github.com/hashicorp/terraform/internal/logging"
1213 "github.com/hashicorp/terraform/internal/plugin/convert"
1314 "github.com/hashicorp/terraform/internal/providers"
15+ "github.com/hashicorp/terraform/internal/tfdiags"
1416 proto "github.com/hashicorp/terraform/internal/tfplugin5"
1517 ctyjson "github.com/zclconf/go-cty/cty/json"
1618 "github.com/zclconf/go-cty/cty/msgpack"
@@ -63,9 +65,7 @@ type GRPCProvider struct {
6365 schemas providers.GetProviderSchemaResponse
6466}
6567
66- // getSchema is used internally to get the saved provider schema. The schema
67- // should have already been fetched from the provider, but we have to
68- // synchronize access to avoid being called concurrently with GetSchema.
68+ // getSchema is used internally to get the cached provider schema
6969func (p * GRPCProvider ) getSchema () providers.GetProviderSchemaResponse {
7070 p .mu .Lock ()
7171 // unlock inline in case GetSchema needs to be called
@@ -75,44 +75,40 @@ func (p *GRPCProvider) getSchema() providers.GetProviderSchemaResponse {
7575 }
7676 p .mu .Unlock ()
7777
78- // the schema should have been fetched already, but give it another shot
79- // just in case things are being called out of order. This may happen for
80- // tests.
81- schemas := p .GetProviderSchema ()
82- if schemas .Diagnostics .HasErrors () {
83- panic (schemas .Diagnostics .Err ())
84- }
85-
86- return schemas
78+ return p .GetProviderSchema ()
8779}
8880
8981// getResourceSchema is a helper to extract the schema for a resource, and
9082// panics if the schema is not available.
91- func (p * GRPCProvider ) getResourceSchema (name string ) providers.Schema {
83+ func (p * GRPCProvider ) getResourceSchema (name string ) ( providers.Schema , tfdiags. Diagnostics ) {
9284 schema := p .getSchema ()
9385 resSchema , ok := schema .ResourceTypes [name ]
9486 if ! ok {
95- panic ( "unknown resource type " + name )
87+ schema . Diagnostics = schema . Diagnostics . Append ( fmt . Errorf ( "unknown resource type " + name ) )
9688 }
97- return resSchema
89+ return resSchema , schema . Diagnostics
9890}
9991
10092// gettDatasourceSchema is a helper to extract the schema for a datasource, and
10193// panics if that schema is not available.
102- func (p * GRPCProvider ) getDatasourceSchema (name string ) providers.Schema {
94+ func (p * GRPCProvider ) getDatasourceSchema (name string ) ( providers.Schema , tfdiags. Diagnostics ) {
10395 schema := p .getSchema ()
96+ if schema .Diagnostics .HasErrors () {
97+ return providers.Schema {}, schema .Diagnostics
98+ }
99+
104100 dataSchema , ok := schema .DataSources [name ]
105101 if ! ok {
106- panic ( "unknown data source " + name )
102+ schema . Diagnostics = schema . Diagnostics . Append ( fmt . Errorf ( "unknown data source " + name ) )
107103 }
108- return dataSchema
104+ return dataSchema , schema . Diagnostics
109105}
110106
111107// getProviderMetaSchema is a helper to extract the schema for the meta info
112108// defined for a provider,
113- func (p * GRPCProvider ) getProviderMetaSchema () providers.Schema {
109+ func (p * GRPCProvider ) getProviderMetaSchema () ( providers.Schema , tfdiags. Diagnostics ) {
114110 schema := p .getSchema ()
115- return schema .ProviderMeta
111+ return schema .ProviderMeta , schema . Diagnostics
116112}
117113
118114func (p * GRPCProvider ) GetProviderSchema () (resp providers.GetProviderSchemaResponse ) {
@@ -201,7 +197,12 @@ func (p *GRPCProvider) ValidateProviderConfig(r providers.ValidateProviderConfig
201197
202198func (p * GRPCProvider ) ValidateResourceConfig (r providers.ValidateResourceConfigRequest ) (resp providers.ValidateResourceConfigResponse ) {
203199 logger .Trace ("GRPCProvider: ValidateResourceConfig" )
204- resourceSchema := p .getResourceSchema (r .TypeName )
200+
201+ resourceSchema , diags := p .getResourceSchema (r .TypeName )
202+ if diags .HasErrors () {
203+ resp .Diagnostics = resp .Diagnostics .Append (diags )
204+ return resp
205+ }
205206
206207 mp , err := msgpack .Marshal (r .Config , resourceSchema .Block .ImpliedType ())
207208 if err != nil {
@@ -227,7 +228,11 @@ func (p *GRPCProvider) ValidateResourceConfig(r providers.ValidateResourceConfig
227228func (p * GRPCProvider ) ValidateDataResourceConfig (r providers.ValidateDataResourceConfigRequest ) (resp providers.ValidateDataResourceConfigResponse ) {
228229 logger .Trace ("GRPCProvider: ValidateDataResourceConfig" )
229230
230- dataSchema := p .getDatasourceSchema (r .TypeName )
231+ dataSchema , diags := p .getDatasourceSchema (r .TypeName )
232+ if diags .HasErrors () {
233+ resp .Diagnostics = resp .Diagnostics .Append (diags )
234+ return resp
235+ }
231236
232237 mp , err := msgpack .Marshal (r .Config , dataSchema .Block .ImpliedType ())
233238 if err != nil {
@@ -252,7 +257,11 @@ func (p *GRPCProvider) ValidateDataResourceConfig(r providers.ValidateDataResour
252257func (p * GRPCProvider ) UpgradeResourceState (r providers.UpgradeResourceStateRequest ) (resp providers.UpgradeResourceStateResponse ) {
253258 logger .Trace ("GRPCProvider: UpgradeResourceState" )
254259
255- resSchema := p .getResourceSchema (r .TypeName )
260+ resSchema , diags := p .getResourceSchema (r .TypeName )
261+ if diags .HasErrors () {
262+ resp .Diagnostics = resp .Diagnostics .Append (diags )
263+ return resp
264+ }
256265
257266 protoReq := & proto.UpgradeResourceState_Request {
258267 TypeName : r .TypeName ,
@@ -333,8 +342,13 @@ func (p *GRPCProvider) Stop() error {
333342func (p * GRPCProvider ) ReadResource (r providers.ReadResourceRequest ) (resp providers.ReadResourceResponse ) {
334343 logger .Trace ("GRPCProvider: ReadResource" )
335344
336- resSchema := p .getResourceSchema (r .TypeName )
337- metaSchema := p .getProviderMetaSchema ()
345+ resSchema , diags := p .getResourceSchema (r .TypeName )
346+ metaSchema , metaDiags := p .getProviderMetaSchema ()
347+ diags = diags .Append (metaDiags )
348+ if diags .HasErrors () {
349+ resp .Diagnostics = resp .Diagnostics .Append (diags )
350+ return resp
351+ }
338352
339353 mp , err := msgpack .Marshal (r .PriorState , resSchema .Block .ImpliedType ())
340354 if err != nil {
@@ -378,8 +392,13 @@ func (p *GRPCProvider) ReadResource(r providers.ReadResourceRequest) (resp provi
378392func (p * GRPCProvider ) PlanResourceChange (r providers.PlanResourceChangeRequest ) (resp providers.PlanResourceChangeResponse ) {
379393 logger .Trace ("GRPCProvider: PlanResourceChange" )
380394
381- resSchema := p .getResourceSchema (r .TypeName )
382- metaSchema := p .getProviderMetaSchema ()
395+ resSchema , diags := p .getResourceSchema (r .TypeName )
396+ metaSchema , metaDiags := p .getProviderMetaSchema ()
397+ diags = diags .Append (metaDiags )
398+ if diags .HasErrors () {
399+ resp .Diagnostics = resp .Diagnostics .Append (diags )
400+ return resp
401+ }
383402
384403 priorMP , err := msgpack .Marshal (r .PriorState , resSchema .Block .ImpliedType ())
385404 if err != nil {
@@ -444,8 +463,13 @@ func (p *GRPCProvider) PlanResourceChange(r providers.PlanResourceChangeRequest)
444463func (p * GRPCProvider ) ApplyResourceChange (r providers.ApplyResourceChangeRequest ) (resp providers.ApplyResourceChangeResponse ) {
445464 logger .Trace ("GRPCProvider: ApplyResourceChange" )
446465
447- resSchema := p .getResourceSchema (r .TypeName )
448- metaSchema := p .getProviderMetaSchema ()
466+ resSchema , diags := p .getResourceSchema (r .TypeName )
467+ metaSchema , metaDiags := p .getProviderMetaSchema ()
468+ diags = diags .Append (metaDiags )
469+ if diags .HasErrors () {
470+ resp .Diagnostics = resp .Diagnostics .Append (diags )
471+ return resp
472+ }
449473
450474 priorMP , err := msgpack .Marshal (r .PriorState , resSchema .Block .ImpliedType ())
451475 if err != nil {
@@ -522,7 +546,12 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques
522546 Private : imported .Private ,
523547 }
524548
525- resSchema := p .getResourceSchema (resource .TypeName )
549+ resSchema , diags := p .getResourceSchema (resource .TypeName )
550+ if diags .HasErrors () {
551+ resp .Diagnostics = resp .Diagnostics .Append (diags )
552+ return resp
553+ }
554+
526555 state , err := decodeDynamicValue (imported .State , resSchema .Block .ImpliedType ())
527556 if err != nil {
528557 resp .Diagnostics = resp .Diagnostics .Append (err )
@@ -538,8 +567,13 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques
538567func (p * GRPCProvider ) ReadDataSource (r providers.ReadDataSourceRequest ) (resp providers.ReadDataSourceResponse ) {
539568 logger .Trace ("GRPCProvider: ReadDataSource" )
540569
541- dataSchema := p .getDatasourceSchema (r .TypeName )
542- metaSchema := p .getProviderMetaSchema ()
570+ dataSchema , diags := p .getDatasourceSchema (r .TypeName )
571+ metaSchema , metaDiags := p .getProviderMetaSchema ()
572+ diags = diags .Append (metaDiags )
573+ if diags .HasErrors () {
574+ resp .Diagnostics = resp .Diagnostics .Append (diags )
575+ return resp
576+ }
543577
544578 config , err := msgpack .Marshal (r .Config , dataSchema .Block .ImpliedType ())
545579 if err != nil {
0 commit comments