From dea3d93c24136ce3d2fb399b426f4028f3885943 Mon Sep 17 00:00:00 2001 From: Kalman Speier Date: Wed, 11 Dec 2024 11:05:04 +0100 Subject: [PATCH] add append feature to stacks --- Makefile | 2 +- internal/exec/tf/tfexec.go | 33 ++++++++++++++------------------- internal/parser/js/js.go | 8 ++++++++ internal/schema/stack.go | 12 +++++++----- stacks/dev.stack.js | 6 ++---- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/Makefile b/Makefile index 1d537f3..c342321 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=v0.2.0 +VERSION=v0.2.1 tag: @git tag -a ${VERSION} -m "version ${VERSION}" && git push origin ${VERSION} diff --git a/internal/exec/tf/tfexec.go b/internal/exec/tf/tfexec.go index 6d5ecfe..fce623a 100644 --- a/internal/exec/tf/tfexec.go +++ b/internal/exec/tf/tfexec.go @@ -139,6 +139,8 @@ func (e *executor) Output(component *schema.Component) (map[string]*schema.Outpu return output, nil } +// utils + func prepareProvision(component *schema.Component, generateBackend bool) (string, error) { varsfile := fmt.Sprintf(varsFileFmt, component.Stack.Name, component.Name) err := writeJSON(component.Inputs, component.Path, varsfile) @@ -147,13 +149,13 @@ func prepareProvision(component *schema.Component, generateBackend bool) (string } if generateBackend { - err := writeBackend(component) + err := writeBackendJSON(component) if err != nil { return "", err } } - err = writeProviders(component) + err = writeProvidersTF(component) if err != nil { return "", err } @@ -161,7 +163,7 @@ func prepareProvision(component *schema.Component, generateBackend bool) (string return varsfile, nil } -func writeBackend(component *schema.Component) error { +func writeBackendJSON(component *schema.Component) error { backend := map[string]interface{}{ "terraform": map[string]interface{}{ "backend": map[string]interface{}{ @@ -178,14 +180,10 @@ func writeBackend(component *schema.Component) error { return nil } -func writeProviderConfig(i int, pc map[string]interface{}) (string, []string) { +func writeProviderConfig(i int, pc map[string]interface{}) string { sb := strings.Builder{} - data := []string{} + for k, v := range pc { - if strings.HasPrefix(k, "data_") { - data = append(data, fmt.Sprintf("%s", v)) - continue - } if k == "alias" && i > 2 { continue } @@ -193,7 +191,7 @@ func writeProviderConfig(i int, pc map[string]interface{}) (string, []string) { sb.WriteString(strings.Repeat(" ", i)) sb.WriteString(fmt.Sprintf("%s {", k)) sb.WriteString("\n") - pc, _ := writeProviderConfig(i+2, m) + pc := writeProviderConfig(i+2, m) sb.WriteString(pc) sb.WriteString(strings.Repeat(" ", i)) sb.WriteString("}\n") @@ -211,33 +209,30 @@ func writeProviderConfig(i int, pc map[string]interface{}) (string, []string) { } sb.WriteString("\n") } - return sb.String(), data + + return sb.String() } -func writeProviders(component *schema.Component) error { +func writeProvidersTF(component *schema.Component) error { if len(component.Providers) == 0 { return nil } - var data []string sb := strings.Builder{} for k, v := range component.Providers { sb.WriteString(fmt.Sprintf(`provider "%s" {`, k)) if m, ok := v.(map[string]interface{}); ok { - pc, pd := writeProviderConfig(2, m) + pc := writeProviderConfig(2, m) if len(pc) > 0 { sb.WriteString("\n") sb.WriteString(pc) } - if len(pd) > 0 { - data = append(data, pd...) - } } sb.WriteString("}\n\n") } - for _, d := range data { - sb.WriteString(d) + for _, line := range component.Stack.Appends["providers"] { + sb.WriteString(line) sb.WriteString("\n") } diff --git a/internal/parser/js/js.go b/internal/parser/js/js.go index dec07fe..9210db2 100644 --- a/internal/parser/js/js.go +++ b/internal/parser/js/js.go @@ -50,6 +50,7 @@ func (vm *jsinterpreter) Parse(path string) (*schema.Stack, error) { vm.rt.Set("stack", vm.registerStack(stack)) vm.rt.Set("backend", vm.registerBackend(stack)) vm.rt.Set("component", vm.registerComponent(stack)) + vm.rt.Set("append", vm.registerAppend(stack)) src := result.OutputFiles[0].Contents _, err := vm.rt.RunString(string(src)) @@ -138,6 +139,13 @@ func (vm *jsinterpreter) registerComponent(stack *schema.Stack) func(string, str } } +func (vm *jsinterpreter) registerAppend(stack *schema.Stack) func(string, []string) { + return func(t string, lines []string) { + log.Debug("register append", "type", t, "lines", lines, "stack", stack.Name) + stack.Appends[t] = lines + } +} + func (vm *jsinterpreter) getProxy(get func(property string) any) goja.Proxy { obj := vm.rt.NewObject() return vm.rt.NewProxy(obj, &goja.ProxyTrapConfig{ diff --git a/internal/schema/stack.go b/internal/schema/stack.go index 46f7b07..af9b761 100644 --- a/internal/schema/stack.go +++ b/internal/schema/stack.go @@ -15,11 +15,12 @@ const ( type ( Stack struct { - Path string `json:"path"` - Type string `json:"type"` - Name string `json:"name"` - Backend Backend `json:"backend"` - Components []*Component `json:"components"` + Path string `json:"path"` + Type string `json:"type"` + Name string `json:"name"` + Backend Backend `json:"backend"` + Components []*Component `json:"components"` + Appends map[string][]string `json:"appends"` } Stacks struct { @@ -32,6 +33,7 @@ func NewStack(path string, t string) *Stack { Path: path, Type: t, Components: make([]*Component, 0), + Appends: make(map[string][]string, 0), } } diff --git a/stacks/dev.stack.js b/stacks/dev.stack.js index 5cb3f03..6645286 100644 --- a/stacks/dev.stack.js +++ b/stacks/dev.stack.js @@ -29,9 +29,7 @@ const gke = component('gke', 'test/modules/gke', { } }) -const google = { - data_client_config: `data "google_client_config" "default" {}` -} +append('providers', [`data "google_client_config" "default" {}`]) const k8s = { // alias: 'main', @@ -46,7 +44,7 @@ const helm = { const metsrv = component('metsrv', 'test/modules/kubernetes', { providers: { - google: google, + // google: {}, kubernetes: k8s, helm: helm }