diff --git a/cmd/root.go b/cmd/root.go index b9175f0090b0548028294839472eebb407f4344a..372f8875ea8647e2fa26b36e16b315929d4678e6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -59,8 +59,6 @@ const ( // environment or the -f flag. flagFile = "file" flagFileShort = "f" - - componentsExtCodeKey = "__ksonnet/components" ) var clientConfig clientcmd.ClientConfig @@ -372,16 +370,17 @@ func expandEnvCmdObjs(cmd *cobra.Command, envSpec *envSpec, cwd metadata.AbsPath return nil, err } - libPath, envLibPath := manager.LibPaths(*envSpec.env) + libPath, envLibPath, envComponentPath := manager.LibPaths(*envSpec.env) expander.FlagJpath = append([]string{string(libPath), string(envLibPath)}, expander.FlagJpath...) if !filesPresent { - fileNames, err = manager.ComponentPaths() + componentPaths, err := manager.ComponentPaths() if err != nil { return nil, err } - baseObjExtCode := fmt.Sprintf("%s=%s", componentsExtCodeKey, constructBaseObj(fileNames)) + baseObjExtCode := fmt.Sprintf("%s=%s", metadata.ComponentsExtCodeKey, constructBaseObj(componentPaths)) expander.ExtCodes = append([]string{baseObjExtCode}, expander.ExtCodes...) + fileNames = []string{string(envComponentPath)} } } diff --git a/metadata/environment.go b/metadata/environment.go index 8d1e8ef72114c60c7a190e6e1b75536fdbdb5112..850cbc3bfb384f44c773e190878b44d8018deca8 100644 --- a/metadata/environment.go +++ b/metadata/environment.go @@ -123,7 +123,7 @@ func (m *manager) createEnvironment(name, uri string, extensionsLibData, k8sLibD return err } - // Generate the base.libsonnet override file + // Generate the environment .jsonnet file overrideFileName := path.Base(name) + ".jsonnet" overrideData := m.generateOverrideData() log.Debugf("Generating '%s', length: %d", overrideFileName, len(overrideData)) @@ -350,9 +350,10 @@ func (m *manager) generateKsonnetLibData(spec ClusterSpec) ([]byte, []byte, []by 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(fmt.Sprintf("local k = import \"%s\";\n\n", extensionsLibFilename)) buf.WriteString("base + {\n") - buf.WriteString(" // Insert user-specified overrides here.\n") + buf.WriteString(" // Insert user-specified overrides here. For example if a component is named \"nginx-deployment\", you might have something like:\n") + buf.WriteString(" // \"nginx-deployment\"+: k.deployment.mixin.metadata.labels({foo: \"bar\"})\n") buf.WriteString("}\n") return buf.Bytes() } diff --git a/metadata/environment_test.go b/metadata/environment_test.go index d922b6fce1f50c2e09e0e628a54b05d1c69a739d..e4350417444bb9338d35d40217a2b8c906a27041 100644 --- a/metadata/environment_test.go +++ b/metadata/environment_test.go @@ -185,10 +185,11 @@ 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"; +local k = import "k.libsonnet"; base + { - // Insert user-specified overrides here. + // Insert user-specified overrides here. For example if a component is named "nginx-deployment", you might have something like: + // "nginx-deployment"+: k.deployment.mixin.metadata.labels({foo: "bar"}) } ` result := m.generateOverrideData() diff --git a/metadata/interface.go b/metadata/interface.go index afdb46dfefe106e48243a9a02a5819a77c01f42d..5c22265ecbdcda1b86777f9dd50db32916e5ce9e 100644 --- a/metadata/interface.go +++ b/metadata/interface.go @@ -43,7 +43,7 @@ type Manager interface { Root() AbsPath ComponentPaths() (AbsPaths, error) CreateComponent(name string, text string, templateType prototype.TemplateType) error - LibPaths(envName string) (libPath, envLibPath AbsPath) + LibPaths(envName string) (libPath, envLibPath, envComponentPath AbsPath) CreateEnvironment(name, uri string, spec ClusterSpec) error DeleteEnvironment(name string) error GetEnvironments() ([]*Environment, error) diff --git a/metadata/manager.go b/metadata/manager.go index 312014472196d42825f485f2bb166b6641c572c1..2792d4051854417282f48b97f2d434e07b43c6e1 100644 --- a/metadata/manager.go +++ b/metadata/manager.go @@ -40,6 +40,9 @@ const ( vendorDir = "vendor" baseLibsonnetFile = "base.libsonnet" + + // ComponentsExtCodeKey is the ExtCode key for component imports + ComponentsExtCodeKey = "__ksonnet/components" ) type manager struct { @@ -175,8 +178,9 @@ func (m *manager) CreateComponent(name string, text string, templateType prototy return afero.WriteFile(m.appFS, componentPath, []byte(text), defaultFilePermissions) } -func (m *manager) LibPaths(envName string) (libPath, envLibPath AbsPath) { - return m.libPath, appendToAbsPath(m.environmentsPath, envName, metadataDirName) +func (m *manager) LibPaths(envName string) (libPath, envLibPath, envComponentPath AbsPath) { + envPath := appendToAbsPath(m.environmentsPath, envName) + return m.libPath, appendToAbsPath(envPath, metadataDirName), appendToAbsPath(envPath, path.Base(envName)+".jsonnet") } func (m *manager) createAppDirTree() error { @@ -206,8 +210,7 @@ func (m *manager) createAppDirTree() error { } func genBaseLibsonnetContent() []byte { - // TODO replace with constant ref once #164 is merged - return []byte(`local components = std.extVar("__ksonnet/components"); + return []byte(`local components = std.extVar("` + ComponentsExtCodeKey + `"); components + { // Insert user-specified overrides here. } diff --git a/metadata/manager_test.go b/metadata/manager_test.go index 330778e8cf7fb5b2fe489c4320a2d1108816e6f7..c3f40ad2c73ba47220044bc07b0ac75ab4958a1a 100644 --- a/metadata/manager_test.go +++ b/metadata/manager_test.go @@ -215,15 +215,19 @@ func TestLibPaths(t *testing.T) { appName := "test-lib-paths" expectedLibPath := path.Join(appName, libDir) expectedEnvLibPath := path.Join(appName, environmentsDir, mockEnvName, metadataDirName) + expectedEnvComponentPath := path.Join(appName, environmentsDir, mockEnvName, path.Base(mockEnvName)+".jsonnet") m := mockEnvironments(t, appName) - libPath, envLibPath := m.LibPaths(mockEnvName) + libPath, envLibPath, envComponentPath := m.LibPaths(mockEnvName) if string(libPath) != expectedLibPath { t.Fatalf("Expected lib path to be:\n '%s'\n, got:\n '%s'", expectedLibPath, libPath) } if string(envLibPath) != expectedEnvLibPath { t.Fatalf("Expected environment lib path to be:\n '%s'\n, got:\n '%s'", expectedEnvLibPath, envLibPath) } + if string(envComponentPath) != expectedEnvComponentPath { + t.Fatalf("Expected environment component path to be:\n '%s'\n, got:\n '%s'", expectedEnvComponentPath, envComponentPath) + } } func TestFindFailure(t *testing.T) {