From 5ceeb6db8195845cbebf7bf51bc722bf37e29e3a Mon Sep 17 00:00:00 2001 From: Simon Davis Date: Fri, 13 Sep 2024 08:24:54 -0700 Subject: [PATCH 1/2] prototype of metadata generation --- internal/provider/generators/resource/main.go | 49 ++++++++++++++++++- internal/provider/generators/schema/main.go | 37 ++++++++------ .../provider/generators/schema/resource.tmpl | 2 +- internal/provider/schemas.go | 2 +- 4 files changed, 70 insertions(+), 20 deletions(-) diff --git a/internal/provider/generators/resource/main.go b/internal/provider/generators/resource/main.go index 0d9a946a4..359b6fb99 100644 --- a/internal/provider/generators/resource/main.go +++ b/internal/provider/generators/resource/main.go @@ -8,10 +8,12 @@ package main import ( _ "embed" + "encoding/json" "flag" "fmt" "os" + "github.com/hashicorp/terraform-provider-awscc/internal/naming" "github.com/hashicorp/terraform-provider-awscc/internal/provider/generators/common" "github.com/hashicorp/terraform-provider-awscc/internal/provider/generators/shared" ) @@ -47,10 +49,11 @@ func main() { schemaFilename := args[0] acctestsFilename := args[1] + metadataFilename := args[2] g := NewGenerator() - if err := g.Generate(destinationPackage, schemaFilename, acctestsFilename); err != nil { + if err := g.Generate(destinationPackage, schemaFilename, acctestsFilename, metadataFilename); err != nil { g.Fatalf("error generating Terraform %s resource: %s", *tfResourceType, err) } } @@ -70,7 +73,7 @@ func NewGenerator() *Generator { } // Generate generates the resource's type factory into the specified file. -func (g *Generator) Generate(packageName, schemaFilename, acctestsFilename string) error { +func (g *Generator) Generate(packageName, schemaFilename, acctestsFilename, metadataFilename string) error { g.Infof("generating Terraform resource code for %[1]q from %[2]q into %[3]q and %[4]q", g.tfResourceType, g.cfTypeSchemaFile, schemaFilename, acctestsFilename) templateData, err := shared.GenerateTemplateData(g.UI(), g.cfTypeSchemaFile, shared.ResourceType, g.tfResourceType, packageName) @@ -107,6 +110,48 @@ func (g *Generator) Generate(packageName, schemaFilename, acctestsFilename strin return err } + d = g.NewGoFileDestination(metadataFilename) + + if err := d.CreateDirectories(); err != nil { + return err + } + + schemaJson, err := os.ReadFile(*cfTypeSchemaFile) + if err != nil { + return err + } + + t := struct { + TypeName string `json:"typeName"` + }{} + err = json.Unmarshal(schemaJson, &t) + if err != nil { + return err + } + + _, service, _, err := naming.ParseCloudFormationTypeName(t.TypeName) + + if err != nil { + return err + } + + metadata := make(map[string]string) + metadata["cloudformationName"] = t.TypeName + metadata["service"] = service + + jsonData, err := json.Marshal(metadata) + + if err != nil { + return err + } + + if err := d.WriteBytes(jsonData); err != nil { + return err + } + + if err := d.Write(); err != nil { + return err + } return nil } diff --git a/internal/provider/generators/schema/main.go b/internal/provider/generators/schema/main.go index 6f8f0c45f..b0e7e6fea 100644 --- a/internal/provider/generators/schema/main.go +++ b/internal/provider/generators/schema/main.go @@ -55,6 +55,7 @@ type ResourceSchema struct { var ( configFile = flag.String("config", "", "configuration file; required") generatedCodeRoot = flag.String("generated-code-root", "", "directory root for generated resource code") + templatesRoot = flag.String("templates-root", "", "directory root for generated template content;required") importPathRoot = flag.String("import-path-root", "", "import path root for generated resource code; required") packageName = flag.String("package", "", "override package name for generated code") ) @@ -92,10 +93,10 @@ func main() { generatedCodeRootDirectoryName = *generatedCodeRoot } - os.Exit(run(destinationPackage, generatedCodeRootDirectoryName, resourcesFilename, singularDatasourcesFilename, pluralDatasourcesFilename, importExamplesFilename)) + os.Exit(run(destinationPackage, generatedCodeRootDirectoryName, resourcesFilename, singularDatasourcesFilename, pluralDatasourcesFilename, importExamplesFilename, *templatesRoot)) } -func run(destinationPackage, generatedCodeRootDirectoryName, resourcesFilename, singularDatasourcesFilename, pluralDatasourcesFilename, importExamplesFilename string) int { +func run(destinationPackage, generatedCodeRootDirectoryName, resourcesFilename, singularDatasourcesFilename, pluralDatasourcesFilename, importExamplesFilename, templatesRoot string) int { g := NewGenerator() ctx := context.TODO() cfg, err := config.LoadDefaultConfig(ctx) @@ -140,7 +141,7 @@ func run(destinationPackage, generatedCodeRootDirectoryName, resourcesFilename, return 1 } - if err := g.GenerateResources(destinationPackage, resourcesFilename, generatedCodeRootDirectoryName, *importPathRoot, resources); err != nil { + if err := g.GenerateResources(destinationPackage, resourcesFilename, generatedCodeRootDirectoryName, *importPathRoot, resources, templatesRoot); err != nil { g.Errorf("error generating Terraform resource generation instructions: %s", err) return 1 } @@ -292,12 +293,13 @@ func (d *Downloader) Schemas() ([]*ResourceData, *DataSources, error) { } resources = append(resources, &ResourceData{ - CloudFormationTypeSchemaFile: cfResourceSchemaFilename, - GeneratedAccTestsFileName: res + "_resource_gen_test", // e.g. "log_group_resource_gen_test" - GeneratedCodeFileName: res + "_resource_gen", // e.g. "log_group_resource_gen" - GeneratedCodePackageName: svc, // e.g. "logs" - GeneratedCodePathSuffix: fmt.Sprintf("%s/%s", org, svc), // e.g. "aws/logs" - TerraformResourceType: tfResourceTypeName, + CloudFormationTypeSchemaFile: cfResourceSchemaFilename, + GeneratedAccTestsFileName: res + "_resource_gen_test", // e.g. "log_group_resource_gen_test" + GeneratedCodeFileName: res + "_resource_gen", // e.g. "log_group_resource_gen" + GeneratedTemplateMetadataFileName: res + "_metadata_gen", // e.g. "log_group_resource_gen" + GeneratedCodePackageName: svc, // e.g. "logs" + GeneratedCodePathSuffix: fmt.Sprintf("%s/%s", org, svc), // e.g. "aws/logs" + TerraformResourceType: tfResourceTypeName, }) } @@ -386,12 +388,13 @@ func (d *Downloader) infof(format string, a ...interface{}) { } type ResourceData struct { - CloudFormationTypeSchemaFile string - GeneratedAccTestsFileName string - GeneratedCodeFileName string - GeneratedCodePackageName string - GeneratedCodePathSuffix string - TerraformResourceType string + CloudFormationTypeSchemaFile string + GeneratedAccTestsFileName string + GeneratedTemplateMetadataFileName string + GeneratedCodeFileName string + GeneratedCodePackageName string + GeneratedCodePathSuffix string + TerraformResourceType string } type DataSourceData struct { @@ -424,7 +427,7 @@ func NewGenerator() *Generator { } } -func (g *Generator) GenerateResources(packageName, filename, generatedCodeRootDirectoryName, importPathRoot string, resources []*ResourceData) error { +func (g *Generator) GenerateResources(packageName, filename, generatedCodeRootDirectoryName, importPathRoot string, resources []*ResourceData, templatesRoot string) error { g.Infof("generating Terraform resource generation instructions into %q", filename) importPaths := make(map[string]struct{}) // Set of strings. @@ -449,6 +452,7 @@ func (g *Generator) GenerateResources(packageName, filename, generatedCodeRootDi ImportPathSuffixes: importPathSuffixes, PackageName: packageName, Resources: resources, + TemplatesRoot: templatesRoot + "/resources", } d := g.NewGoFileDestination(filename) @@ -570,6 +574,7 @@ type TemplateData struct { ImportPathSuffixes []string PackageName string Resources []*ResourceData + TemplatesRoot string } type ImportTemplateData struct { diff --git a/internal/provider/generators/schema/resource.tmpl b/internal/provider/generators/schema/resource.tmpl index 142f33648..fbe643e0d 100644 --- a/internal/provider/generators/schema/resource.tmpl +++ b/internal/provider/generators/schema/resource.tmpl @@ -4,7 +4,7 @@ // Code generated by generators/schema/main.go; DO NOT EDIT. {{- range .Resources }} -//go:generate go run generators/resource/main.go -resource {{ .TerraformResourceType }} -cfschema {{ .CloudFormationTypeSchemaFile }} -package {{ .GeneratedCodePackageName }} -- {{ $.GeneratedCodeRootDirectoryName }}/{{ .GeneratedCodePathSuffix }}/{{ .GeneratedCodeFileName }}.go {{ $.GeneratedCodeRootDirectoryName }}/{{ .GeneratedCodePathSuffix }}/{{ .GeneratedAccTestsFileName }}.go +//go:generate go run generators/resource/main.go -resource {{ .TerraformResourceType }} -cfschema {{ .CloudFormationTypeSchemaFile }} -package {{ .GeneratedCodePackageName }} -- {{ $.GeneratedCodeRootDirectoryName }}/{{ .GeneratedCodePathSuffix }}/{{ .GeneratedCodeFileName }}.go {{ $.GeneratedCodeRootDirectoryName }}/{{ .GeneratedCodePathSuffix }}/{{ .GeneratedAccTestsFileName }}.go {{ $.TemplatesRoot }}/{{ .GeneratedCodePackageName}}_{{ .GeneratedTemplateMetadataFileName }}.json {{- end }} package {{ .PackageName }} diff --git a/internal/provider/schemas.go b/internal/provider/schemas.go index a4cb36a5d..61ee7afd1 100644 --- a/internal/provider/schemas.go +++ b/internal/provider/schemas.go @@ -1,6 +1,6 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 -//go:generate go run generators/schema/main.go -config all_schemas.hcl -generated-code-root .. -import-path-root github.com/hashicorp/terraform-provider-awscc/internal -- resources.go singular_data_sources.go plural_data_sources.go import_examples_gen.json +//go:generate go run generators/schema/main.go -config all_schemas.hcl -generated-code-root .. -import-path-root github.com/hashicorp/terraform-provider-awscc/internal -templates-root ../../templates -- resources.go singular_data_sources.go plural_data_sources.go import_examples_gen.json package provider From e19efabff5570b99558637391708cafb678088a1 Mon Sep 17 00:00:00 2001 From: Simon Davis Date: Wed, 18 Sep 2024 13:50:00 -0700 Subject: [PATCH 2/2] Update internal/provider/generators/schema/main.go Co-authored-by: Jared Baker --- internal/provider/generators/schema/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/provider/generators/schema/main.go b/internal/provider/generators/schema/main.go index b0e7e6fea..b5780a030 100644 --- a/internal/provider/generators/schema/main.go +++ b/internal/provider/generators/schema/main.go @@ -296,7 +296,7 @@ func (d *Downloader) Schemas() ([]*ResourceData, *DataSources, error) { CloudFormationTypeSchemaFile: cfResourceSchemaFilename, GeneratedAccTestsFileName: res + "_resource_gen_test", // e.g. "log_group_resource_gen_test" GeneratedCodeFileName: res + "_resource_gen", // e.g. "log_group_resource_gen" - GeneratedTemplateMetadataFileName: res + "_metadata_gen", // e.g. "log_group_resource_gen" + GeneratedTemplateMetadataFileName: res + "_metadata_gen", // e.g. "log_group_metadata_gen" GeneratedCodePackageName: svc, // e.g. "logs" GeneratedCodePathSuffix: fmt.Sprintf("%s/%s", org, svc), // e.g. "aws/logs" TerraformResourceType: tfResourceTypeName,