Skip to content

Commit f4bd57c

Browse files
committed
feat(codegen): Add support for terraform lists/queries
1 parent caa895f commit f4bd57c

12 files changed

Lines changed: 475 additions & 104 deletions

File tree

assets/terraform/internal/manager/entry_import.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type SDKImportableEntryService[E EntryObject, L EntryLocation, IL ImportLocation
1818
Delete(context.Context, L, []IL, ...string) error
1919
ImportToLocations(context.Context, L, []IL, string) error
2020
UnimportFromLocations(context.Context, L, []IL, []string) error
21+
ListWithXpath(context.Context, string, string, string, string) ([]E, error)
2122
}
2223

2324
type ImportableEntryObjectManager[E EntryObject, L EntryLocation, IL ImportLocation, IS SDKImportableEntryService[E, L, IL]] struct {
@@ -38,8 +39,22 @@ func NewImportableEntryObjectManager[E EntryObject, L EntryLocation, IL ImportLo
3839
}
3940
}
4041

41-
func (o *ImportableEntryObjectManager[E, L, IL, IS]) ReadMany(ctx context.Context, location L, entries []E) ([]E, error) {
42-
return nil, &Error{err: ErrInternal, message: "called ReadMany on an importable singular resource"}
42+
func (o *ImportableEntryObjectManager[E, L, IL, IS]) ReadMany(ctx context.Context, location L, components []string) ([]E, error) {
43+
xpath, err := location.XpathWithComponents(o.client.Versioning(), append(components, util.AsEntryXpath(""))...)
44+
if err != nil {
45+
return nil, err
46+
}
47+
48+
existing, err := o.service.ListWithXpath(ctx, util.AsXpath(xpath), "get", "", "")
49+
if err != nil {
50+
if sdkerrors.IsObjectNotFound(err) {
51+
return nil, ErrObjectNotFound
52+
} else {
53+
return nil, &Error{err: err, message: "Failed to read entries from the server"}
54+
}
55+
}
56+
57+
return existing, nil
4358
}
4459

4560
func (o *ImportableEntryObjectManager[E, L, IL, IS]) Read(ctx context.Context, location L, components []string, name string) (E, error) {

pkg/commands/codegen/codegen.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ func (c *Command) Execute() error {
7676
var dataSourceList []string
7777
var ephemeralResourceList []string
7878
var actionsList []string
79+
var listResourceList []string
7980
specMetadata := make(map[string]properties.TerraformProviderSpecMetadata)
8081

8182
for _, specPath := range c.specs {
@@ -138,6 +139,7 @@ func (c *Command) Execute() error {
138139
dataSourceList = append(dataSourceList, data.DataSources...)
139140
ephemeralResourceList = append(ephemeralResourceList, data.EphemeralResources...)
140141
actionsList = append(actionsList, data.Actions...)
142+
listResourceList = append(listResourceList, data.ListResources...)
141143

142144
for k, v := range data.SpecMetadata {
143145
specMetadata[k] = v
@@ -168,6 +170,7 @@ func (c *Command) Execute() error {
168170
dataSourceList = append(dataSourceList, data.DataSources...)
169171
ephemeralResourceList = append(ephemeralResourceList, data.EphemeralResources...)
170172
actionsList = append(actionsList, data.Actions...)
173+
listResourceList = append(listResourceList, data.ListResources...)
171174

172175
for k, v := range data.SpecMetadata {
173176
specMetadata[k] = v
@@ -190,6 +193,7 @@ func (c *Command) Execute() error {
190193
newProviderObject.DataSources = append(newProviderObject.DataSources, dataSourceList...)
191194
newProviderObject.Resources = append(newProviderObject.Resources, resourceList...)
192195
newProviderObject.EphemeralResources = append(newProviderObject.EphemeralResources, ephemeralResourceList...)
196+
newProviderObject.ListResources = append(newProviderObject.ListResources, listResourceList...)
193197
newProviderObject.Actions = append(newProviderObject.Actions, actionsList...)
194198
newProviderObject.SpecMetadata = specMetadata
195199

pkg/generate/generator.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ func (c *Creator) RenderTemplate() error {
6060

6161
type TerraformProviderFileData struct {
6262
EphemeralResources []string
63+
ListResources []string
6364
Resources []string
6465
DataSources []string
6566
Actions []string
@@ -90,6 +91,12 @@ func (c *Creator) RenderTerraformProviderFile(spec *properties.Normalization, ty
9091
return nil, err
9192
}
9293

94+
if !*spec.TerraformProviderConfig.SkipListResource && (typ == properties.ResourceEntry || typ == properties.ResourceUuid) {
95+
if err := tfp.GenerateTerraformListResource(typ, spec, terraformProvider); err != nil {
96+
return nil, err
97+
}
98+
}
99+
93100
if spec.TerraformProviderConfig.Action {
94101
if err := tfp.GenerateTerraformAction(spec, terraformProvider); err != nil {
95102
return nil, err
@@ -126,6 +133,7 @@ func (c *Creator) RenderTerraformProviderFile(spec *properties.Normalization, ty
126133
EphemeralResources: terraformProvider.EphemeralResources,
127134
Actions: terraformProvider.Actions,
128135
SpecMetadata: terraformProvider.SpecMetadata,
136+
ListResources: terraformProvider.ListResources,
129137
}
130138
return data, nil
131139
}

pkg/properties/normalized.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ type TerraformProviderConfig struct {
8383
Ephemeral bool `json:"ephemeral" yaml:"ephemeral"`
8484
Action bool `json:"action" yaml:"action"`
8585
SkipResource bool `json:"skip_resource" yaml:"skip_resource"`
86+
SkipListResource *bool `json:"skip_list_resource", yaml:"skip_list_resource"`
8687
SkipDatasource bool `json:"skip_datasource" yaml:"skip_datasource"`
8788
SkipDatasourceListing bool `json:"skip_datasource_listing" yaml:"skip_datasource_listing"`
8889
ResourceType TerraformResourceType `json:"resource_type" yaml:"resource_type"`
@@ -719,6 +720,7 @@ func schemaToSpec(object object.Object) (*Normalization, error) {
719720
Ephemeral: object.TerraformConfig.Epheneral,
720721
Action: object.TerraformConfig.Action,
721722
SkipResource: object.TerraformConfig.SkipResource,
723+
SkipListResource: object.TerraformConfig.SkipListResource,
722724
SkipDatasource: object.TerraformConfig.SkipDatasource,
723725
SkipDatasourceListing: object.TerraformConfig.SkipdatasourceListing,
724726
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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type TerraformConfig struct {
4242
SkipResource bool `yaml:"skip_resource"`
4343
SkipDatasource bool `yaml:"skip_datasource"`
4444
SkipdatasourceListing bool `yaml:"skip_datasource_listing"`
45+
SkipListResource *bool `yaml:"skip_list_resource"`
4546
ResourceType TerraformResourceType `yaml:"resource_type"`
4647
XmlNode *string `yaml:"xml_node"`
4748
CustomFunctions map[string]bool `yaml:"custom_functions"`
@@ -166,6 +167,11 @@ func (o *Object) UnmarshalYAML(n *yaml.Node) error {
166167
return fmt.Errorf("failed to unmarshal yaml spec: plural_type must be list for uuid resource types")
167168
}
168169

170+
if obj.TerraformConfig.SkipListResource == nil {
171+
skipListResource := true
172+
obj.TerraformConfig.SkipListResource = &skipListResource
173+
}
174+
169175
return nil
170176
}
171177

0 commit comments

Comments
 (0)