diff --git a/metadata/environment.go b/metadata/environment.go index d4e3a534ffcc4cb6d63e96b7b94fbc0fc40c426b..8d1e8ef72114c60c7a190e6e1b75536fdbdb5112 100644 --- a/metadata/environment.go +++ b/metadata/environment.go @@ -16,9 +16,11 @@ package metadata import ( + "bytes" "encoding/json" "fmt" "os" + "path" "path/filepath" "strings" @@ -121,6 +123,17 @@ func (m *manager) createEnvironment(name, uri string, extensionsLibData, k8sLibD return err } + // Generate the base.libsonnet override file + overrideFileName := path.Base(name) + ".jsonnet" + overrideData := m.generateOverrideData() + log.Debugf("Generating '%s', length: %d", overrideFileName, len(overrideData)) + overrideLibPath := appendToAbsPath(envPath, overrideFileName) + err = afero.WriteFile(m.appFS, string(overrideLibPath), overrideData, defaultFilePermissions) + if err != nil { + log.Debugf("Failed to write '%s'", overrideFileName) + return err + } + // Generate the environment spec file. envSpecData, err := generateSpecData(uri) if err != nil { @@ -334,6 +347,16 @@ func (m *manager) generateKsonnetLibData(spec ClusterSpec) ([]byte, []byte, []by return extensionsLibData, k8sLibData, text, err } +func (m *manager) generateOverrideData() []byte { + var buf bytes.Buffer + buf.WriteString(fmt.Sprintf("local base = import \"%s\";\n", m.baseLibsonnetPath)) + buf.WriteString(fmt.Sprintf("local k = import \"%s\";\n\n", path.Join(metadataDirName, extensionsLibFilename))) + buf.WriteString("base + {\n") + buf.WriteString(" // Insert user-specified overrides here.\n") + buf.WriteString("}\n") + return buf.Bytes() +} + func generateSpecData(uri string) ([]byte, error) { // Format the spec json and return; preface keys with 2 space idents. return json.MarshalIndent(EnvironmentSpec{URI: uri}, "", " ") diff --git a/metadata/environment_test.go b/metadata/environment_test.go index 2d9d2d73925cf48b3a4dcc1758662fabce4fe242..d922b6fce1f50c2e09e0e628a54b05d1c69a739d 100644 --- a/metadata/environment_test.go +++ b/metadata/environment_test.go @@ -180,3 +180,20 @@ func TestSetEnvironment(t *testing.T) { t.Fatalf("Expected set URI to be \"%s\", got:\n %s", set.URI, envSpec.URI) } } + +func TestGenerateOverrideData(t *testing.T) { + m := mockEnvironments(t, "test-gen-override-data") + + expected := `local base = import "test-gen-override-data/environments/base.libsonnet"; +local k = import ".metadata/k.libsonnet"; + +base + { + // Insert user-specified overrides here. +} +` + result := m.generateOverrideData() + + if string(result) != expected { + t.Fatalf("Expected to generate override file with data:\n%s\n,got:\n%s", expected, result) + } +}