-
Notifications
You must be signed in to change notification settings - Fork 251
/
Copy pathgrafana.go
91 lines (79 loc) · 2.85 KB
/
grafana.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package generate
import (
"context"
"path/filepath"
"strings"
"github.com/grafana/terraform-provider-grafana/v3/internal/resources/grafana"
"github.com/grafana/terraform-provider-grafana/v3/internal/resources/machinelearning"
"github.com/grafana/terraform-provider-grafana/v3/internal/resources/slo"
"github.com/grafana/terraform-provider-grafana/v3/internal/resources/syntheticmonitoring"
"github.com/grafana/terraform-provider-grafana/v3/pkg/provider"
"github.com/hashicorp/hcl/v2/hclwrite"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/zclconf/go-cty/cty"
)
// TODO: Refactor this sig
func generateGrafanaResources(ctx context.Context, auth, url, stackName string, genProvider bool, outPath, smURL, smToken string, includedResources []string) error {
generatedFilename := func(suffix string) string {
if stackName == "" {
return filepath.Join(outPath, suffix)
}
return filepath.Join(outPath, stackName+"-"+suffix)
}
if genProvider {
providerBlock := hclwrite.NewBlock("provider", []string{"grafana"})
providerBlock.Body().SetAttributeValue("url", cty.StringVal(url))
providerBlock.Body().SetAttributeValue("auth", cty.StringVal(auth))
if stackName != "" {
providerBlock.Body().SetAttributeValue("alias", cty.StringVal(stackName))
}
if err := writeBlocks(generatedFilename("provider.tf"), providerBlock); err != nil {
return err
}
}
singleOrg := !strings.Contains(auth, ":")
listerData := grafana.NewListerData(singleOrg)
// Generate resources
config := provider.ProviderConfig{
URL: types.StringValue(url),
Auth: types.StringValue(auth),
}
if smToken != "" {
config.SMAccessToken = types.StringValue(smToken)
}
if smURL != "" {
config.SMURL = types.StringValue(smURL)
}
if err := config.SetDefaults(); err != nil {
return err
}
client, err := provider.CreateClients(config)
if err != nil {
return err
}
resources := grafana.Resources
if strings.HasPrefix(stackName, "stack-") { // TODO: is cloud. Find a better way to detect this
resources = append(resources, slo.Resources...)
resources = append(resources, machinelearning.Resources...)
resources = append(resources, syntheticmonitoring.Resources...)
}
if err := generateImportBlocks(ctx, client, listerData, resources, outPath, stackName, includedResources); err != nil {
return err
}
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(generatedFilename("resources.tf"), stripDefaultsExtraFields); err != nil {
return err
}
if err := abstractDashboards(generatedFilename("resources.tf")); err != nil {
return err
}
if err := wrapJSONFieldsInFunction(generatedFilename("resources.tf")); err != nil {
return err
}
return nil
}