Skip to content

Commit aa2a3d5

Browse files
kklimonda-clkklimonda
authored andcommitted
feat(codegen): Add support for terraform lists/queries
1 parent 487c424 commit aa2a3d5

30 files changed

Lines changed: 600 additions & 75 deletions

pkg/commands/codegen/codegen.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ func (c *Command) Execute() error {
7575
var resourceList []string
7676
var dataSourceList []string
7777
var ephemeralResourceList []string
78-
var actionsList []string
7978
specMetadata := make(map[string]properties.TerraformProviderSpecMetadata)
8079

8180
for _, specPath := range c.specs {
@@ -129,17 +128,16 @@ func (c *Command) Execute() error {
129128
}
130129

131130
terraformGenerator := generate.NewCreator(config.Output.TerraformProvider, c.templatePath, spec)
132-
data, err := terraformGenerator.RenderTerraformProviderFile(spec, resourceTyp)
131+
dataSources, resources, ephemeralResources, partialNames, err := terraformGenerator.RenderTerraformProviderFile(spec, resourceTyp)
133132
if err != nil {
134133
return fmt.Errorf("error rendering Terraform provider file for %s - %s", specPath, err)
135134
}
136135

137-
resourceList = append(resourceList, data.Resources...)
138-
dataSourceList = append(dataSourceList, data.DataSources...)
139-
ephemeralResourceList = append(ephemeralResourceList, data.EphemeralResources...)
140-
actionsList = append(actionsList, data.Actions...)
136+
resourceList = append(resourceList, resources...)
137+
dataSourceList = append(dataSourceList, dataSources...)
138+
ephemeralResourceList = append(ephemeralResourceList, ephemeralResources...)
141139

142-
for k, v := range data.SpecMetadata {
140+
for k, v := range partialNames {
143141
specMetadata[k] = v
144142
}
145143

@@ -159,17 +157,16 @@ func (c *Command) Execute() error {
159157
}
160158

161159
terraformGenerator := generate.NewCreator(config.Output.TerraformProvider, c.templatePath, spec)
162-
data, err := terraformGenerator.RenderTerraformProviderFile(spec, resourceTyp)
160+
dataSources, resources, ephemeralResources, partialNames, err := terraformGenerator.RenderTerraformProviderFile(spec, resourceTyp)
163161
if err != nil {
164162
return fmt.Errorf("error rendering Terraform provider file for %s - %s", specPath, err)
165163
}
166164

167-
resourceList = append(resourceList, data.Resources...)
168-
dataSourceList = append(dataSourceList, data.DataSources...)
169-
ephemeralResourceList = append(ephemeralResourceList, data.EphemeralResources...)
170-
actionsList = append(actionsList, data.Actions...)
165+
resourceList = append(resourceList, resources...)
166+
dataSourceList = append(dataSourceList, dataSources...)
167+
ephemeralResourceList = append(ephemeralResourceList, ephemeralResources...)
171168

172-
for k, v := range data.SpecMetadata {
169+
for k, v := range partialNames {
173170
specMetadata[k] = v
174171
}
175172
}
@@ -190,7 +187,6 @@ func (c *Command) Execute() error {
190187
newProviderObject.DataSources = append(newProviderObject.DataSources, dataSourceList...)
191188
newProviderObject.Resources = append(newProviderObject.Resources, resourceList...)
192189
newProviderObject.EphemeralResources = append(newProviderObject.EphemeralResources, ephemeralResourceList...)
193-
newProviderObject.Actions = append(newProviderObject.Actions, actionsList...)
194190
newProviderObject.SpecMetadata = specMetadata
195191

196192
terraformGenerator := generate.NewCreator(config.Output.TerraformProvider, c.templatePath, providerSpec)

pkg/generate/generator.go

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,8 @@ func (c *Creator) RenderTemplate() error {
5858
return nil
5959
}
6060

61-
type TerraformProviderFileData struct {
62-
EphemeralResources []string
63-
Resources []string
64-
DataSources []string
65-
Actions []string
66-
SpecMetadata map[string]properties.TerraformProviderSpecMetadata
67-
}
68-
6961
// RenderTerraformProviderFile generates a Go file for a Terraform provider based on the provided TerraformProviderFile and Normalization arguments.
70-
func (c *Creator) RenderTerraformProviderFile(spec *properties.Normalization, typ properties.ResourceType) (*TerraformProviderFileData, error) {
62+
func (c *Creator) RenderTerraformProviderFile(spec *properties.Normalization, typ properties.ResourceType) ([]string, []string, []string, map[string]properties.TerraformProviderSpecMetadata, error) {
7163
var name string
7264
switch typ {
7365
case properties.ResourceUuidPlural:
@@ -83,25 +75,19 @@ func (c *Creator) RenderTerraformProviderFile(spec *properties.Normalization, ty
8375
tfp := terraform_provider.GenerateTerraformProvider{}
8476

8577
if err := tfp.GenerateTerraformDataSource(typ, spec, terraformProvider); err != nil {
86-
return nil, err
78+
return nil, nil, nil, nil, err
8779
}
8880

8981
if err := tfp.GenerateTerraformResource(typ, spec, terraformProvider); err != nil {
90-
return nil, err
91-
}
92-
93-
if spec.TerraformProviderConfig.Action {
94-
if err := tfp.GenerateTerraformAction(spec, terraformProvider); err != nil {
95-
return nil, err
96-
}
82+
return nil, nil, nil, nil, err
9783
}
9884

9985
if err := tfp.GenerateCommonCode(typ, spec, terraformProvider); err != nil {
100-
return nil, err
86+
return nil, nil, nil, nil, err
10187
}
10288

10389
if err := tfp.GenerateTerraformProviderFile(typ, spec, terraformProvider); err != nil {
104-
return nil, err
90+
return nil, nil, nil, nil, err
10591
}
10692

10793
var filePath string
@@ -117,17 +103,10 @@ func (c *Creator) RenderTerraformProviderFile(spec *properties.Normalization, ty
117103
}
118104

119105
if err := c.writeFormattedContentToFile(filePath, terraformProvider.Code.String()); err != nil {
120-
return nil, err
106+
return nil, nil, nil, nil, err
121107
}
122108

123-
data := &TerraformProviderFileData{
124-
Resources: terraformProvider.Resources,
125-
DataSources: terraformProvider.DataSources,
126-
EphemeralResources: terraformProvider.EphemeralResources,
127-
Actions: terraformProvider.Actions,
128-
SpecMetadata: terraformProvider.SpecMetadata,
129-
}
130-
return data, nil
109+
return terraformProvider.DataSources, terraformProvider.Resources, terraformProvider.EphemeralResources, terraformProvider.SpecMetadata, nil
131110
}
132111

133112
// RenderTerraformProvider generates and writes a Terraform provider file.
@@ -224,8 +203,6 @@ func (c *Creator) createFullFilePath(templateName string) string {
224203
}
225204

226205
// listOfTemplates returns a list of templates defined in TemplatesDir.
227-
// Excludes templates in the "partials" subdirectory as those are meant to be
228-
// called from within other templates, not processed independently.
229206
func (c *Creator) listOfTemplates() ([]string, error) {
230207
var files []string
231208
err := filepath.WalkDir(c.TemplatesDir, func(path string, entry os.DirEntry, err error) error {

pkg/properties/normalized.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ type TerraformProviderConfig struct {
6565
Action bool `json:"action" yaml:"action"`
6666
CustomValidation bool `json:"custom_validation" yaml:"custom_validation"`
6767
SkipResource bool `json:"skip_resource" yaml:"skip_resource"`
68+
SkipListResource *bool `json:"skip_list_resource", yaml:"skip_list_resource"`
6869
SkipDatasource bool `json:"skip_datasource" yaml:"skip_datasource"`
6970
SkipDatasourceListing bool `json:"skip_datasource_listing" yaml:"skip_datasource_listing"`
7071
ResourceType TerraformResourceType `json:"resource_type" yaml:"resource_type"`
@@ -702,6 +703,7 @@ func schemaToSpec(object object.Object) (*Normalization, error) {
702703
Action: object.TerraformConfig.Action,
703704
CustomValidation: object.TerraformConfig.CustomValidation,
704705
SkipResource: object.TerraformConfig.SkipResource,
706+
SkipListResource: object.TerraformConfig.SkipListResource,
705707
SkipDatasource: object.TerraformConfig.SkipDatasource,
706708
SkipDatasourceListing: object.TerraformConfig.SkipdatasourceListing,
707709
ResourceType: TerraformResourceType(object.TerraformConfig.ResourceType),

pkg/properties/provider_file.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ func (o TerraformNameProvider) IdentityModelStructName() string {
6868
return fmt.Sprintf("%sIdentityModel", o.ResourceStructName)
6969
}
7070

71+
func (o TerraformNameProvider) ListResourceStructName() string {
72+
return fmt.Sprintf("%sListResource", o.StructName)
73+
}
74+
7175
type TerraformSpecFlags uint
7276

7377
const (
@@ -91,6 +95,7 @@ type TerraformProviderFile struct {
9195
DataSources []string
9296
Resources []string
9397
EphemeralResources []string
98+
ListResources []string
9499
Actions []string
95100
SpecMetadata map[string]TerraformProviderSpecMetadata
96101
Code *strings.Builder

pkg/properties/resourcetype.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ type SchemaType string
1616
const (
1717
SchemaResource SchemaType = "resource"
1818
SchemaEphemeralResource SchemaType = "ephemeral-resource"
19+
SchemaListResource SchemaType = "list-resource"
1920
SchemaAction SchemaType = "action"
2021
SchemaDataSource SchemaType = "datasource"
2122
SchemaCommon SchemaType = "common"
2223
SchemaProvider SchemaType = "provider"
24+
SchemaCustom SchemaType = "custom"
2325
)

pkg/schema/object/object.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type TerraformConfig struct {
4343
SkipResource bool `yaml:"skip_resource"`
4444
SkipDatasource bool `yaml:"skip_datasource"`
4545
SkipdatasourceListing bool `yaml:"skip_datasource_listing"`
46+
SkipListResource *bool `yaml:"skip_list_resource"`
4647
ResourceType TerraformResourceType `yaml:"resource_type"`
4748
XmlNode *string `yaml:"xml_node"`
4849
CustomFunctions map[string]bool `yaml:"custom_functions"`

pkg/translate/terraform_provider/crud_operations.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func ResourceCreateFunction(resourceTyp properties.ResourceType, names *NameProv
3535
return RendeCreateUpdateMovementRequired(state, entries)
3636
},
3737
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
38-
return RenderLocationsStateToPango(names, paramSpec, source, dest)
38+
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
3939
},
4040
}
4141

@@ -151,7 +151,7 @@ func DataSourceReadFunction(resourceTyp properties.ResourceType, names *NameProv
151151
return RenderLocationsPangoToState(names, paramSpec, source, dest)
152152
},
153153
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
154-
return RenderLocationsStateToPango(names, paramSpec, source, dest)
154+
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
155155
},
156156
}
157157

@@ -219,7 +219,7 @@ func ResourceReadFunction(resourceTyp properties.ResourceType, names *NameProvid
219219
return RenderLocationsPangoToState(names, paramSpec, source, dest)
220220
},
221221
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
222-
return RenderLocationsStateToPango(names, paramSpec, source, dest)
222+
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
223223
},
224224
}
225225

@@ -281,7 +281,7 @@ func ResourceUpdateFunction(resourceTyp properties.ResourceType, names *NameProv
281281
return RendeCreateUpdateMovementRequired(state, entries)
282282
},
283283
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
284-
return RenderLocationsStateToPango(names, paramSpec, source, dest)
284+
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
285285
},
286286
"RenderLocationsPangoToState": func(source string, dest string) (string, error) {
287287
return RenderLocationsPangoToState(names, paramSpec, source, dest)
@@ -345,7 +345,7 @@ func ResourceDeleteFunction(resourceTyp properties.ResourceType, names *NameProv
345345
return RenderImportLocationAssignment(names, paramSpec, source, dest)
346346
},
347347
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
348-
return RenderLocationsStateToPango(names, paramSpec, source, dest)
348+
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
349349
},
350350
}
351351

pkg/translate/terraform_provider/entity_generators.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,15 @@ func (g *GenerateTerraformProvider) GenerateTerraformResource(resourceTyp proper
9191
"RenderXpathComponentsGetter": func() (string, error) {
9292
return RenderXpathComponentsGetter(names.ResourceStructName, spec)
9393
},
94+
"RenderMainStruct": func() (string, error) {
95+
return RenderMainStruct(resourceTyp, schemaTyp, names, spec)
96+
},
97+
"RenderConfigureFunc": func() (string, error) {
98+
return RenderConfigureFunc(resourceTyp, schemaTyp, names, spec)
99+
},
100+
"RenderModelStructs": func() (string, error) {
101+
return RenderModelStructs(resourceTyp, schemaTyp, names, spec)
102+
},
94103
"ResourceCreateFunction": func(structName string, serviceName string) (string, error) {
95104
return ResourceCreateFunction(resourceTyp, names, serviceName, spec, terraformProvider, names.PackageName)
96105
},
@@ -265,6 +274,37 @@ func (g *GenerateTerraformProvider) GenerateTerraformResource(resourceTyp proper
265274
return nil
266275
}
267276

277+
// GenerateTerraformListResource generates a Terraform list resource template.
278+
func (o *GenerateTerraformProvider) GenerateTerraformListResource(resourceTyp properties.ResourceType, spec *properties.Normalization, provider *properties.TerraformProviderFile) error {
279+
provider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/list", "")
280+
provider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/list/schema", "listschema")
281+
282+
names := NewNameProvider(spec, resourceTyp)
283+
284+
funcMap := template.FuncMap{
285+
"structName": func() string { return names.StructName },
286+
"metaName": func() string { return names.MetaName },
287+
288+
"RenderModelStructs": func() (string, error) {
289+
return RenderModelStructs(resourceTyp, properties.SchemaListResource, names, spec)
290+
},
291+
"RenderMainStruct": func() (string, error) {
292+
return RenderMainStruct(resourceTyp, properties.SchemaListResource, names, spec)
293+
},
294+
"RenderConfigureFunc": func() (string, error) {
295+
return RenderConfigureFunc(resourceTyp, properties.SchemaListResource, names, spec)
296+
},
297+
"RenderSchema": func() (string, error) {
298+
return RenderSchema(resourceTyp, properties.SchemaListResource, names, spec, provider.ImportManager)
299+
},
300+
"RenderListFunc": func() (string, error) {
301+
return RenderListFunc(resourceTyp, properties.SchemaListResource, names, spec, provider.ImportManager)
302+
},
303+
}
304+
305+
return o.generateTerraformEntityTemplate(resourceTyp, properties.SchemaListResource, names, spec, provider, "resource/list_resource.tmpl", funcMap)
306+
}
307+
268308
// GenerateTerraformAction generates a Terraform action template.
269309
func (o *GenerateTerraformProvider) GenerateTerraformAction(spec *properties.Normalization, provider *properties.TerraformProviderFile) error {
270310
provider.ImportManager.AddStandardImport("context", "")
@@ -288,7 +328,7 @@ func (o *GenerateTerraformProvider) GenerateTerraformAction(spec *properties.Nor
288328
"metaName": func() string { return names.MetaName },
289329
"HasCustomValidation": func() bool { return spec.TerraformProviderConfig.CustomValidation },
290330

291-
"RenderStructs": func() (string, error) { return RenderStructs(resourceTyp, properties.SchemaAction, names, spec) },
331+
"RenderModelStructs": func() (string, error) { return RenderModelStructs(resourceTyp, properties.SchemaAction, names, spec) },
292332
"RenderSchema": func() (string, error) {
293333
return RenderSchema(resourceTyp, properties.SchemaAction, names, spec, provider.ImportManager)
294334
},
@@ -387,6 +427,15 @@ func (g *GenerateTerraformProvider) GenerateTerraformDataSource(resourceTyp prop
387427
"RenderDataSourceSchema": func() (string, error) {
388428
return RenderDataSourceSchema(resourceTyp, names, spec, terraformProvider.ImportManager)
389429
},
430+
"RenderMainStruct": func() (string, error) {
431+
return RenderMainStruct(resourceTyp, properties.SchemaDataSource, names, spec)
432+
},
433+
"RenderConfigureFunc": func() (string, error) {
434+
return RenderConfigureFunc(resourceTyp, properties.SchemaDataSource, names, spec)
435+
},
436+
"RenderModelStructs": func() (string, error) {
437+
return RenderModelStructs(resourceTyp, properties.SchemaDataSource, names, spec)
438+
},
390439
}
391440
err := g.generateTerraformEntityTemplate(resourceTyp, properties.SchemaDataSource, names, spec, terraformProvider, "datasource/datasource.tmpl", funcMap)
392441
if err != nil {

0 commit comments

Comments
 (0)