Skip to content

Commit 8943c79

Browse files
committed
diagnostics must be checked on all schema calls
We can no longer be assured that the particular instance of a provider we are using has had GetProviderSchema called. Always check the diagnostics even if we're fetching a cached response.
1 parent 2f32007 commit 8943c79

2 files changed

Lines changed: 132 additions & 64 deletions

File tree

‎internal/plugin/grpc_provider.go‎

Lines changed: 66 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package plugin
33
import (
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
6969
func (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

118114
func (p *GRPCProvider) GetProviderSchema() (resp providers.GetProviderSchemaResponse) {
@@ -201,7 +197,12 @@ func (p *GRPCProvider) ValidateProviderConfig(r providers.ValidateProviderConfig
201197

202198
func (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
227228
func (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
252257
func (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 {
333342
func (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
378392
func (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)
444463
func (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
538567
func (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

Comments
 (0)