Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions pkg/generate/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,6 @@ func (c *Creator) createFullFilePath(templateName string) string {
}

// listOfTemplates returns a list of templates defined in TemplatesDir.
// Excludes templates in the "partials" subdirectory as those are meant to be
// called from within other templates, not processed independently.
func (c *Creator) listOfTemplates() ([]string, error) {
var files []string
err := filepath.WalkDir(c.TemplatesDir, func(path string, entry os.DirEntry, err error) error {
Expand Down
2 changes: 2 additions & 0 deletions pkg/properties/normalized.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ type TerraformProviderConfig struct {
Action bool `json:"action" yaml:"action"`
CustomValidation bool `json:"custom_validation" yaml:"custom_validation"`
SkipResource bool `json:"skip_resource" yaml:"skip_resource"`
SkipListResource *bool `json:"skip_list_resource" yaml:"skip_list_resource"`
SkipDatasource bool `json:"skip_datasource" yaml:"skip_datasource"`
SkipDatasourceListing bool `json:"skip_datasource_listing" yaml:"skip_datasource_listing"`
ResourceType TerraformResourceType `json:"resource_type" yaml:"resource_type"`
Expand Down Expand Up @@ -702,6 +703,7 @@ func schemaToSpec(object object.Object) (*Normalization, error) {
Action: object.TerraformConfig.Action,
CustomValidation: object.TerraformConfig.CustomValidation,
SkipResource: object.TerraformConfig.SkipResource,
SkipListResource: object.TerraformConfig.SkipListResource,
SkipDatasource: object.TerraformConfig.SkipDatasource,
SkipDatasourceListing: object.TerraformConfig.SkipdatasourceListing,
ResourceType: TerraformResourceType(object.TerraformConfig.ResourceType),
Expand Down
5 changes: 5 additions & 0 deletions pkg/properties/provider_file.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ func (o TerraformNameProvider) IdentityModelStructName() string {
return fmt.Sprintf("%sIdentityModel", o.ResourceStructName)
}

func (o TerraformNameProvider) ListResourceStructName() string {
return fmt.Sprintf("%sListResource", o.StructName)
}

type TerraformSpecFlags uint

const (
Expand All @@ -91,6 +95,7 @@ type TerraformProviderFile struct {
DataSources []string
Resources []string
EphemeralResources []string
ListResources []string
Actions []string
SpecMetadata map[string]TerraformProviderSpecMetadata
Code *strings.Builder
Expand Down
2 changes: 2 additions & 0 deletions pkg/properties/resourcetype.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ type SchemaType string
const (
SchemaResource SchemaType = "resource"
SchemaEphemeralResource SchemaType = "ephemeral-resource"
SchemaListResource SchemaType = "list-resource"
SchemaAction SchemaType = "action"
SchemaDataSource SchemaType = "datasource"
SchemaCommon SchemaType = "common"
SchemaProvider SchemaType = "provider"
SchemaCustom SchemaType = "custom"
)
1 change: 1 addition & 0 deletions pkg/schema/object/object.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ type TerraformConfig struct {
SkipResource bool `yaml:"skip_resource"`
SkipDatasource bool `yaml:"skip_datasource"`
SkipdatasourceListing bool `yaml:"skip_datasource_listing"`
SkipListResource *bool `yaml:"skip_list_resource"`
ResourceType TerraformResourceType `yaml:"resource_type"`
XmlNode *string `yaml:"xml_node"`
CustomFunctions map[string]bool `yaml:"custom_functions"`
Expand Down
2 changes: 1 addition & 1 deletion pkg/translate/terraform_provider/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func renderSpecsForParams(names *NameProvider, schemaTyp properties.SchemaType,
structPrefix = names.DataSourceStructName
case properties.SchemaResource, properties.SchemaEphemeralResource:
structPrefix = names.ResourceStructName
case properties.SchemaCommon, properties.SchemaProvider, properties.SchemaAction:
case properties.SchemaListResource, properties.SchemaCommon, properties.SchemaProvider, properties.SchemaAction, properties.SchemaCustom:
panic(fmt.Sprintf("invalid schema type: %s", schemaTyp))
}

Expand Down
10 changes: 5 additions & 5 deletions pkg/translate/terraform_provider/crud_operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func ResourceCreateFunction(resourceTyp properties.ResourceType, names *NameProv
return RendeCreateUpdateMovementRequired(state, entries)
},
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
return RenderLocationsStateToPango(names, paramSpec, source, dest)
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
},
}

Expand Down Expand Up @@ -151,7 +151,7 @@ func DataSourceReadFunction(resourceTyp properties.ResourceType, names *NameProv
return RenderLocationsPangoToState(names, paramSpec, source, dest)
},
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
return RenderLocationsStateToPango(names, paramSpec, source, dest)
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
},
}

Expand Down Expand Up @@ -219,7 +219,7 @@ func ResourceReadFunction(resourceTyp properties.ResourceType, names *NameProvid
return RenderLocationsPangoToState(names, paramSpec, source, dest)
},
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
return RenderLocationsStateToPango(names, paramSpec, source, dest)
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
},
}

Expand Down Expand Up @@ -281,7 +281,7 @@ func ResourceUpdateFunction(resourceTyp properties.ResourceType, names *NameProv
return RendeCreateUpdateMovementRequired(state, entries)
},
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
return RenderLocationsStateToPango(names, paramSpec, source, dest)
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
},
"RenderLocationsPangoToState": func(source string, dest string) (string, error) {
return RenderLocationsPangoToState(names, paramSpec, source, dest)
Expand Down Expand Up @@ -345,7 +345,7 @@ func ResourceDeleteFunction(resourceTyp properties.ResourceType, names *NameProv
return RenderImportLocationAssignment(names, paramSpec, source, dest)
},
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
return RenderLocationsStateToPango(names, paramSpec, source, dest)
return RenderLocationsStateToPango(names, paramSpec, source, dest, "resp.Diagnostics")
},
}

Expand Down
51 changes: 50 additions & 1 deletion pkg/translate/terraform_provider/entity_generators.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,15 @@ func (g *GenerateTerraformProvider) GenerateTerraformResource(resourceTyp proper
"RenderXpathComponentsGetter": func() (string, error) {
return RenderXpathComponentsGetter(names.ResourceStructName, spec)
},
"RenderMainStruct": func() (string, error) {
return RenderMainStruct(resourceTyp, schemaTyp, names, spec)
},
"RenderConfigureFunc": func() (string, error) {
return RenderConfigureFunc(resourceTyp, schemaTyp, names, spec)
},
"RenderModelStructs": func() (string, error) {
return RenderModelStructs(resourceTyp, schemaTyp, names, spec)
},
"ResourceCreateFunction": func(structName string, serviceName string) (string, error) {
return ResourceCreateFunction(resourceTyp, names, serviceName, spec, terraformProvider, names.PackageName)
},
Expand Down Expand Up @@ -265,6 +274,37 @@ func (g *GenerateTerraformProvider) GenerateTerraformResource(resourceTyp proper
return nil
}

// GenerateTerraformListResource generates a Terraform list resource template.
func (o *GenerateTerraformProvider) GenerateTerraformListResource(resourceTyp properties.ResourceType, spec *properties.Normalization, provider *properties.TerraformProviderFile) error {
provider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/list", "")
provider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/list/schema", "listschema")

names := NewNameProvider(spec, resourceTyp)

funcMap := template.FuncMap{
"structName": func() string { return names.StructName },
"metaName": func() string { return names.MetaName },

"RenderModelStructs": func() (string, error) {
return RenderModelStructs(resourceTyp, properties.SchemaListResource, names, spec)
},
"RenderMainStruct": func() (string, error) {
return RenderMainStruct(resourceTyp, properties.SchemaListResource, names, spec)
},
"RenderConfigureFunc": func() (string, error) {
return RenderConfigureFunc(resourceTyp, properties.SchemaListResource, names, spec)
},
"RenderSchema": func() (string, error) {
return RenderSchema(resourceTyp, properties.SchemaListResource, names, spec, provider.ImportManager)
},
"RenderListFunc": func() (string, error) {
return RenderListFunc(resourceTyp, properties.SchemaListResource, names, spec, provider.ImportManager)
},
}

return o.generateTerraformEntityTemplate(resourceTyp, properties.SchemaListResource, names, spec, provider, "resource/list_resource.tmpl", funcMap)
}

// GenerateTerraformAction generates a Terraform action template.
func (o *GenerateTerraformProvider) GenerateTerraformAction(spec *properties.Normalization, provider *properties.TerraformProviderFile) error {
provider.ImportManager.AddStandardImport("context", "")
Expand All @@ -288,7 +328,7 @@ func (o *GenerateTerraformProvider) GenerateTerraformAction(spec *properties.Nor
"metaName": func() string { return names.MetaName },
"HasCustomValidation": func() bool { return spec.TerraformProviderConfig.CustomValidation },

"RenderStructs": func() (string, error) { return RenderStructs(resourceTyp, properties.SchemaAction, names, spec) },
"RenderModelStructs": func() (string, error) { return RenderModelStructs(resourceTyp, properties.SchemaAction, names, spec) },
"RenderSchema": func() (string, error) {
return RenderSchema(resourceTyp, properties.SchemaAction, names, spec, provider.ImportManager)
},
Expand Down Expand Up @@ -387,6 +427,15 @@ func (g *GenerateTerraformProvider) GenerateTerraformDataSource(resourceTyp prop
"RenderDataSourceSchema": func() (string, error) {
return RenderDataSourceSchema(resourceTyp, names, spec, terraformProvider.ImportManager)
},
"RenderMainStruct": func() (string, error) {
return RenderMainStruct(resourceTyp, properties.SchemaDataSource, names, spec)
},
"RenderConfigureFunc": func() (string, error) {
return RenderConfigureFunc(resourceTyp, properties.SchemaDataSource, names, spec)
},
"RenderModelStructs": func() (string, error) {
return RenderModelStructs(resourceTyp, properties.SchemaDataSource, names, spec)
},
}
err := g.generateTerraformEntityTemplate(resourceTyp, properties.SchemaDataSource, names, spec, terraformProvider, "datasource/datasource.tmpl", funcMap)
if err != nil {
Expand Down
93 changes: 91 additions & 2 deletions pkg/translate/terraform_provider/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"
"text/template"

"github.com/paloaltonetworks/pan-os-codegen/pkg/imports"
"github.com/paloaltonetworks/pan-os-codegen/pkg/properties"
)

Expand Down Expand Up @@ -80,9 +81,11 @@ func (g *GenerateTerraformProvider) appendResourceType(spec *properties.Normaliz
case properties.SchemaEphemeralResource:
flags |= properties.TerraformSpecEphemeralResource
terraformProvider.EphemeralResources = append(terraformProvider.EphemeralResources, names.ResourceStructName)
case properties.SchemaListResource:
terraformProvider.ListResources = append(terraformProvider.ListResources, names.ListResourceStructName())
case properties.SchemaAction:
terraformProvider.Actions = append(terraformProvider.Actions, names.ActionStructName())
case properties.SchemaProvider, properties.SchemaCommon:
case properties.SchemaProvider, properties.SchemaCommon, properties.SchemaCustom:
default:
panic(fmt.Sprintf("unsupported schemaTyp: '%s'", schemaTyp))
}
Expand Down Expand Up @@ -117,13 +120,15 @@ func (g *GenerateTerraformProvider) generateTerraformEntityTemplate(resourceTyp
resourceType = "Resource"
case properties.SchemaEphemeralResource:
resourceType = "EphemeralResource"
case properties.SchemaListResource:
resourceType = "ListResource"
case properties.SchemaCommon:
resourceType = "Common"
case properties.SchemaProvider:
resourceType = "ProviderFile"
case properties.SchemaAction:
resourceType = "Action"
default:
case properties.SchemaCustom:
panic(fmt.Sprintf("unsupported schemaTyp: '%+v'", schemaTyp))
}

Expand All @@ -134,3 +139,87 @@ func (g *GenerateTerraformProvider) generateTerraformEntityTemplate(resourceTyp
}
return g.executeTemplate(template, spec, terraformProvider, resourceTyp, schemaTyp, names)
}

func renderMainAndConfigureTmpls(tmpl string, resourceTyp properties.ResourceType, schemaTyp properties.SchemaType, names *NameProvider, spec *properties.Normalization) (string, error) {
type context struct {
BareStructName string
StructName string
PackageName string
SDKName string
IsCustom bool
IsImportableEntry bool
IsEntry bool
IsUuid bool
IsConfig bool
}

data := context{}

switch resourceTyp {
case properties.ResourceConfig:
data.IsConfig = true
case properties.ResourceCustom:
data.IsCustom = true
case properties.ResourceEntry, properties.ResourceEntryPlural:
if len(spec.Imports.Variants) > 0 {
data.IsImportableEntry = true
} else {
data.IsEntry = true
}
case properties.ResourceUuid, properties.ResourceUuidPlural:
data.IsUuid = true
}

data.BareStructName = names.StructName
data.SDKName = names.PackageName

switch schemaTyp {
case properties.SchemaListResource:
data.StructName = names.ListResourceStructName()
case properties.SchemaDataSource:
data.StructName = names.DataSourceStructName
case properties.SchemaResource, properties.SchemaEphemeralResource:
data.StructName = names.ResourceStructName
case properties.SchemaAction, properties.SchemaCommon, properties.SchemaProvider, properties.SchemaCustom:
}

if spec.TerraformProviderConfig.Ephemeral {
data.PackageName = "ephemeral"
} else {
data.PackageName = "resource"
}

return processTemplate(tmpl, "render-main-and-configure-tmpls", data, commonFuncMap)
}

func RenderMainStruct(resourceTyp properties.ResourceType, schemaTyp properties.SchemaType, names *NameProvider, spec *properties.Normalization) (string, error) {
return renderMainAndConfigureTmpls("common/structure.tmpl", resourceTyp, schemaTyp, names, spec)
}

func RenderConfigureFunc(resourceTyp properties.ResourceType, schemaTyp properties.SchemaType, names *NameProvider, spec *properties.Normalization) (string, error) {
return renderMainAndConfigureTmpls("common/configure_func.tmpl", resourceTyp, schemaTyp, names, spec)
}

func RenderListFunc(resourceTyp properties.ResourceType, schemaTyp properties.SchemaType, names *NameProvider, spec *properties.Normalization, manager *imports.Manager) (string, error) {
type context struct {
StructName string
IdentityModel string
ResourceStructName string
SDKName string
}

data := context{
StructName: names.ListResourceStructName(),
IdentityModel: fmt.Sprintf("%sIdentityModel", names.ResourceStructName),
ResourceStructName: names.ResourceStructName,
SDKName: names.PackageName,
}

funcMap := template.FuncMap{
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
return RenderLocationsStateToPango(names, spec, source, dest, "diags")
},
}

return processTemplate("resource/list_func.tmpl", "render-list-func", data, funcMap)
}
4 changes: 3 additions & 1 deletion pkg/translate/terraform_provider/location.go
Original file line number Diff line number Diff line change
Expand Up @@ -358,18 +358,20 @@ func RenderLocationsPangoToState(names *NameProvider, spec *properties.Normaliza
}

// RenderLocationsStateToPango generates code to convert Terraform state to Pango locations.
func RenderLocationsStateToPango(names *NameProvider, spec *properties.Normalization, source string, dest string) (string, error) {
func RenderLocationsStateToPango(names *NameProvider, spec *properties.Normalization, source string, dest string, diags string) (string, error) {
type context struct {
TerraformStructName string
Source string
Dest string
Diags string
Locations []locationCtx
}
data := context{
TerraformStructName: fmt.Sprintf("%sLocation", names.StructName),
Locations: renderLocationsGetContext(names, spec),
Source: source,
Dest: dest,
Diags: diags,
}
return processTemplate("location/state_to_pango.tmpl", "render-locations-state-to-pango", data, commonFuncMap)
}
Expand Down
2 changes: 2 additions & 0 deletions pkg/translate/terraform_provider/provider_generators.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ func (g *GenerateTerraformProvider) GenerateTerraformProvider(terraformProvider
terraformProvider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/function", "")
terraformProvider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/provider", "")
terraformProvider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/action", "")
terraformProvider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/list", "")
terraformProvider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/provider/schema", "")
terraformProvider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/resource", "")
terraformProvider.ImportManager.AddHashicorpImport("github.com/hashicorp/terraform-plugin-framework/ephemeral", "")
Expand All @@ -45,6 +46,7 @@ func (g *GenerateTerraformProvider) GenerateTerraformProvider(terraformProvider
"RenderImports": func() (string, error) { return terraformProvider.ImportManager.RenderImports() },
"DataSources": func() []string { return terraformProvider.DataSources },
"EphemeralResources": func() []string { return terraformProvider.EphemeralResources },
"ListResources": func() []string { return terraformProvider.ListResources },
"Resources": func() []string { return terraformProvider.Resources },
"Actions": func() []string { return terraformProvider.Actions },
"RenderResourceFuncMap": func() (string, error) { return RenderResourceFuncMap(terraformProvider.SpecMetadata) },
Expand Down
Loading