From 511733f4d0648f58e3e2c433aa6cf3e74d0a86d6 Mon Sep 17 00:00:00 2001 From: Julien Duchesne Date: Mon, 27 May 2024 09:03:47 -0400 Subject: [PATCH] Code Generation: Do not generate `org_id` field when set to default --- pkg/generate/cloud.go | 2 +- pkg/generate/grafana.go | 11 ++++-- pkg/generate/postprocessing.go | 37 ++++++++++++++++--- .../dashboard-expected/localhost-resources.tf | 3 -- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/pkg/generate/cloud.go b/pkg/generate/cloud.go index 488dfe89e..bfbcd6dba 100644 --- a/pkg/generate/cloud.go +++ b/pkg/generate/cloud.go @@ -71,7 +71,7 @@ func generateCloudResources(ctx context.Context, cfg *Config) ([]stack, error) { } log.Println("Post-processing for cloud") - if err := stripDefaults(filepath.Join(cfg.OutputDir, "cloud-resources.tf"), map[string]string{}); err != nil { + if err := stripDefaults(filepath.Join(cfg.OutputDir, "cloud-resources.tf"), nil); err != nil { return nil, err } if err := wrapJSONFieldsInFunction(filepath.Join(cfg.OutputDir, "cloud-resources.tf")); err != nil { diff --git a/pkg/generate/grafana.go b/pkg/generate/grafana.go index f23865612..c516d0597 100644 --- a/pkg/generate/grafana.go +++ b/pkg/generate/grafana.go @@ -61,9 +61,14 @@ func generateGrafanaResources(ctx context.Context, auth, url, stackName string, } log.Printf("Post-processing for %s\n", stackName) - if err := stripDefaults(filepath.Join(outPath, stackName+"-resources.tf"), map[string]string{ - "org_id": " \"1\"", - }); err != nil { + stripDefaultsExtraFields := map[string]any{} + if singleOrg { + stripDefaultsExtraFields["org_id"] = true // Always remove org_id if single org + } else { + stripDefaultsExtraFields["org_id"] = `"1"` // Remove org_id if it's the default + } + + if err := stripDefaults(filepath.Join(outPath, stackName+"-resources.tf"), stripDefaultsExtraFields); err != nil { return err } if err := abstractDashboards(filepath.Join(outPath, stackName+"-resources.tf")); err != nil { diff --git a/pkg/generate/postprocessing.go b/pkg/generate/postprocessing.go index f48dace87..96299bbef 100644 --- a/pkg/generate/postprocessing.go +++ b/pkg/generate/postprocessing.go @@ -16,7 +16,7 @@ import ( "github.com/zclconf/go-cty/cty" ) -func stripDefaults(fpath string, extraFieldsToRemove map[string]string) error { +func stripDefaults(fpath string, extraFieldsToRemove map[string]any) error { file, err := readHCLFile(fpath) if err != nil { return err @@ -183,7 +183,7 @@ func readHCLFile(fpath string) (*hclwrite.File, error) { return file, nil } -func stripDefaultsFromBlock(block *hclwrite.Block, extraFieldsToRemove map[string]string) bool { +func stripDefaultsFromBlock(block *hclwrite.Block, extraFieldsToRemove map[string]any) bool { hasChanges := false for _, innblock := range block.Body().Blocks() { if s := stripDefaultsFromBlock(innblock, extraFieldsToRemove); s { @@ -211,10 +211,24 @@ func stripDefaultsFromBlock(block *hclwrite.Block, extraFieldsToRemove map[strin hasChanges = true } } - for key, value := range extraFieldsToRemove { - if name == key && string(attribute.Expr().BuildTokens(nil).Bytes()) == value { - if rm := block.Body().RemoveAttribute(name); rm != nil { - hasChanges = true + for key, valueToRemove := range extraFieldsToRemove { + if name == key { + toRemove := false + fieldValue := strings.TrimSpace(string(attribute.Expr().BuildTokens(nil).Bytes())) + fieldValue, err := extractJSONEncode(fieldValue) + if err != nil { + continue + } + + if v, ok := valueToRemove.(bool); ok && v { + toRemove = true + } else if v, ok := valueToRemove.(string); ok && v == fieldValue { + toRemove = true + } + if toRemove { + if rm := block.Body().RemoveAttribute(name); rm != nil { + hasChanges = true + } } } } @@ -268,3 +282,14 @@ func HCL2ValueFromConfigValue(v interface{}) cty.Value { panic(fmt.Errorf("can't convert %#v to cty.Value", v)) } } + +func extractJSONEncode(value string) (string, error) { + if !strings.HasPrefix(value, "jsonencode(") { + return "", nil + } + value = strings.TrimPrefix(value, "jsonencode(") + value = strings.TrimSuffix(value, ")") + + b, err := json.MarshalIndent(value, "", " ") + return string(b), err +} diff --git a/pkg/generate/testdata/generate/dashboard-expected/localhost-resources.tf b/pkg/generate/testdata/generate/dashboard-expected/localhost-resources.tf index f83125560..766b5ac02 100644 --- a/pkg/generate/testdata/generate/dashboard-expected/localhost-resources.tf +++ b/pkg/generate/testdata/generate/dashboard-expected/localhost-resources.tf @@ -9,13 +9,11 @@ resource "grafana_dashboard" "localhost_1_my-dashboard-uid" { uid = "my-dashboard-uid" }) folder = "my-folder-uid" - org_id = jsonencode(1) } # __generated__ by Terraform from "1:my-folder-uid" resource "grafana_folder" "localhost_1_my-folder-uid" { provider = grafana.localhost - org_id = jsonencode(1) title = "My Folder" uid = "my-folder-uid" } @@ -26,5 +24,4 @@ resource "grafana_notification_policy" "localhost_1_policy" { contact_point = "grafana-default-email" disable_provenance = true group_by = ["grafana_folder", "alertname"] - org_id = jsonencode(1) }