Skip to content

Commit bd9c094

Browse files
committed
Make singleton-list-to-embedded-object API conversion optional
Signed-off-by: Alper Rifat Ulucinar <ulucinar@users.noreply.github.com>
1 parent d078959 commit bd9c094

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

pkg/config/provider.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,12 @@ type Provider struct {
157157
// resourceConfigurators is a map holding resource configurators where key
158158
// is Terraform resource name.
159159
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
160166
}
161167

162168
// ReferenceInjector injects cross-resource references across the resources
@@ -259,19 +265,32 @@ func WithFeaturesPackage(s string) ProviderOption {
259265
}
260266
}
261267

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.
262271
func WithMainTemplate(template string) ProviderOption {
263272
return func(p *Provider) {
264273
p.MainTemplate = template
265274
}
266275
}
267276

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+
268287
// NewProvider builds and returns a new Provider from provider
269288
// tfjson schema, that is generated using Terraform CLI with:
270289
// `terraform providers schema --json`
271290
func NewProvider(schema []byte, prefix string, modulePath string, metadata []byte, opts ...ProviderOption) *Provider { //nolint:gocyclo
272291
ps := tfjson.ProviderSchemas{}
273292
if err := ps.UnmarshalJSON(schema); err != nil {
274-
panic(err)
293+
panic(errors.Wrap(err, "failed to unmarshal the Terraform JSON schema"))
275294
}
276295
if len(ps.Schemas) != 1 {
277296
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
354373
p.Resources[name].useTerraformPluginSDKClient = isTerraformPluginSDK
355374
p.Resources[name].useTerraformPluginFrameworkClient = isPluginFrameworkResource
356375
// 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"))
362379
}
363380
}
364381
for i, refInjector := range p.refInjectors {

pkg/schema/traverser/traverse.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ var _ Element = &ResourceNode{}
2424
// If any of the visitors in the chain reports an error,
2525
// it stops the traversal.
2626
func Traverse(tfResource *schema.Resource, visitors ...SchemaTraverser) error {
27+
if len(visitors) == 0 {
28+
return nil
29+
}
2730
return traverse(tfResource, Node{}, visitors...)
2831
}
2932

0 commit comments

Comments
 (0)