@@ -157,6 +157,12 @@ type Provider struct {
157
157
// resourceConfigurators is a map holding resource configurators where key
158
158
// is Terraform resource name.
159
159
resourceConfigurators map [string ]ResourceConfiguratorChain
160
+
161
+ // schemaTraversers is a chain of schema traversers to be used with
162
+ // this Provider configuration. Schema traversers can be used to inspect or
163
+ // modify the Provider configuration based on the underlying Terraform
164
+ // resource schemas.
165
+ schemaTraversers []traverser.SchemaTraverser
160
166
}
161
167
162
168
// ReferenceInjector injects cross-resource references across the resources
@@ -259,19 +265,32 @@ func WithFeaturesPackage(s string) ProviderOption {
259
265
}
260
266
}
261
267
268
+ // WithMainTemplate configures the provider family main module file's path.
269
+ // This template file will be used to generate the main modules of the
270
+ // family's members.
262
271
func WithMainTemplate (template string ) ProviderOption {
263
272
return func (p * Provider ) {
264
273
p .MainTemplate = template
265
274
}
266
275
}
267
276
277
+ // WithSchemaTraversers configures a chain of schema traversers to be used with
278
+ // this Provider configuration. Schema traversers can be used to inspect or
279
+ // modify the Provider configuration based on the underlying Terraform
280
+ // resource schemas.
281
+ func WithSchemaTraversers (traversers ... traverser.SchemaTraverser ) ProviderOption {
282
+ return func (p * Provider ) {
283
+ p .schemaTraversers = traversers
284
+ }
285
+ }
286
+
268
287
// NewProvider builds and returns a new Provider from provider
269
288
// tfjson schema, that is generated using Terraform CLI with:
270
289
// `terraform providers schema --json`
271
290
func NewProvider (schema []byte , prefix string , modulePath string , metadata []byte , opts ... ProviderOption ) * Provider { //nolint:gocyclo
272
291
ps := tfjson.ProviderSchemas {}
273
292
if err := ps .UnmarshalJSON (schema ); err != nil {
274
- panic (err )
293
+ panic (errors . Wrap ( err , "failed to unmarshal the Terraform JSON schema" ) )
275
294
}
276
295
if len (ps .Schemas ) != 1 {
277
296
panic (fmt .Sprintf ("there should exactly be 1 provider schema but there are %d" , len (ps .Schemas )))
@@ -354,11 +373,9 @@ func NewProvider(schema []byte, prefix string, modulePath string, metadata []byt
354
373
p .Resources [name ].useTerraformPluginSDKClient = isTerraformPluginSDK
355
374
p .Resources [name ].useTerraformPluginFrameworkClient = isPluginFrameworkResource
356
375
// traverse the Terraform resource schema to initialize the upjet Resource
357
- // configuration using:
358
- // - listEmbedder: This traverser marks lists of length at most 1
359
- // (singleton lists) as embedded objects.
360
- if err := traverser .Traverse (terraformResource , listEmbedder {r : p .Resources [name ]}); err != nil {
361
- panic (err )
376
+ // configurations
377
+ if err := traverser .Traverse (terraformResource , p .schemaTraversers ... ); err != nil {
378
+ panic (errors .Wrap (err , "failed to execute the Terraform schema traverser chain" ))
362
379
}
363
380
}
364
381
for i , refInjector := range p .refInjectors {
0 commit comments