Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Proposal] Prototype of metadata generation to improve docs #2024

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
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
49 changes: 47 additions & 2 deletions internal/provider/generators/resource/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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)
}
}
Expand All @@ -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)
Expand Down Expand Up @@ -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
}

Expand Down
37 changes: 21 additions & 16 deletions internal/provider/generators/schema/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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_metadata_gen"
GeneratedCodePackageName: svc, // e.g. "logs"
GeneratedCodePathSuffix: fmt.Sprintf("%s/%s", org, svc), // e.g. "aws/logs"
TerraformResourceType: tfResourceTypeName,
})
}

Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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.
Expand All @@ -449,6 +452,7 @@ func (g *Generator) GenerateResources(packageName, filename, generatedCodeRootDi
ImportPathSuffixes: importPathSuffixes,
PackageName: packageName,
Resources: resources,
TemplatesRoot: templatesRoot + "/resources",
}

d := g.NewGoFileDestination(filename)
Expand Down Expand Up @@ -570,6 +574,7 @@ type TemplateData struct {
ImportPathSuffixes []string
PackageName string
Resources []*ResourceData
TemplatesRoot string
}

type ImportTemplateData struct {
Expand Down
2 changes: 1 addition & 1 deletion internal/provider/generators/schema/resource.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}
Expand Down
2 changes: 1 addition & 1 deletion internal/provider/schemas.go
Original file line number Diff line number Diff line change
@@ -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
Loading