From 6d50338bd857fae28cd5cb6589dafad1f66d43d3 Mon Sep 17 00:00:00 2001 From: Duologic Date: Sun, 29 Nov 2020 00:34:25 +0100 Subject: [PATCH] add metadata.Namespace --- pkg/spec/depreciations_test.go | 2 +- pkg/spec/spec.go | 15 +++++++++------ pkg/spec/v1alpha1/environment.go | 5 +++-- pkg/tanka/parse.go | 19 ++++++++++++++++++- pkg/tanka/parse_test.go | 15 +++++++++------ 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/pkg/spec/depreciations_test.go b/pkg/spec/depreciations_test.go index 2644a0ff3..374afb602 100644 --- a/pkg/spec/depreciations_test.go +++ b/pkg/spec/depreciations_test.go @@ -26,7 +26,7 @@ func TestDeprecated(t *testing.T) { } `) - got, err := Parse(data) + got, err := Parse(data, "test") require.Equal(t, ErrDeprecated{ {old: "server", new: "spec.apiServer"}, {old: "team", new: "metadata.labels.team"}, diff --git a/pkg/spec/spec.go b/pkg/spec/spec.go index 93171e8b2..2d0185f82 100644 --- a/pkg/spec/spec.go +++ b/pkg/spec/spec.go @@ -20,7 +20,7 @@ const Specfile = "spec.json" // ParseDir parses the given environments `spec.json` into a `v1alpha1.Environment` // object with the name set to the directories name -func ParseDir(baseDir, name string) (*v1alpha1.Environment, error) { +func ParseDir(baseDir, path string) (*v1alpha1.Environment, error) { fi, err := os.Stat(baseDir) if err != nil { return nil, err @@ -33,23 +33,24 @@ func ParseDir(baseDir, name string) (*v1alpha1.Environment, error) { if err != nil { if os.IsNotExist(err) { c := v1alpha1.New() - c.Metadata.Name = name - return c, ErrNoSpec{name} + c.Metadata.Name = path // legacy behavior + c.Metadata.Namespace = path + return c, ErrNoSpec{path} } return nil, err } - c, err := Parse(data) + c, err := Parse(data, path) if c != nil { // set the name field - c.Metadata.Name = name + c.Metadata.Name = path // legacy behavior } return c, err } // Parse parses the json `data` into a `v1alpha1.Environment` object. -func Parse(data []byte) (*v1alpha1.Environment, error) { +func Parse(data []byte, path string) (*v1alpha1.Environment, error) { config := v1alpha1.New() if err := json.Unmarshal(data, config); err != nil { return nil, errors.Wrap(err, "parsing spec.json") @@ -64,6 +65,8 @@ func Parse(data []byte) (*v1alpha1.Environment, error) { config.Spec.APIServer = "https://" + config.Spec.APIServer } + config.Metadata.Namespace = path + return config, nil } diff --git a/pkg/spec/v1alpha1/environment.go b/pkg/spec/v1alpha1/environment.go index e6031ed0b..413676ed6 100644 --- a/pkg/spec/v1alpha1/environment.go +++ b/pkg/spec/v1alpha1/environment.go @@ -29,8 +29,9 @@ type Environment struct { // Metadata is meant for humans and not parsed type Metadata struct { - Name string `json:"name,omitempty"` - Labels map[string]string `json:"labels,omitempty"` + Name string `json:"name,omitempty"` + Namespace string `json:"namespace,omitempty"` + Labels map[string]string `json:"labels,omitempty"` } // Has and Get make Metadata a simple wrapper for labels.Labels to use our map in their querier diff --git a/pkg/tanka/parse.go b/pkg/tanka/parse.go index c79a85ea0..30808003e 100644 --- a/pkg/tanka/parse.go +++ b/pkg/tanka/parse.go @@ -184,7 +184,11 @@ func ParseEnv(path string, opts ParseOpts) (interface{}, *v1alpha1.Environment, if err != nil { return nil, nil, err } - env, err = spec.Parse(marshalled) + relpath, err := relativeEntrypoint(path) + if err != nil { + return nil, nil, err + } + env, err = spec.Parse(marshalled, relpath) if err != nil { return nil, nil, err } @@ -244,3 +248,16 @@ func extractEnvironments(data interface{}) (manifest.List, error) { // Extract only object of Kind: Environment return process.Filter(out, process.MustStrExps("Environment/.*")), nil } + +func relativeEntrypoint(path string) (string, error) { + entrypoint, err := jpath.Entrypoint(path) + if err != nil { + return "", err + } + _, _, rootDir, err := jpath.Resolve(entrypoint) + if err != nil { + return "", errors.Wrap(err, "resolving jpath") + } + + return filepath.Rel(rootDir, entrypoint) +} diff --git a/pkg/tanka/parse_test.go b/pkg/tanka/parse_test.go index 520a484d6..4145d2980 100644 --- a/pkg/tanka/parse_test.go +++ b/pkg/tanka/parse_test.go @@ -43,8 +43,9 @@ func TestEvalJsonnet(t *testing.T) { APIVersion: v1alpha1.New().APIVersion, Kind: v1alpha1.New().Kind, Metadata: v1alpha1.Metadata{ - Name: "cases/withspecjson", - Labels: v1alpha1.New().Metadata.Labels, + Name: "cases/withspecjson", + Namespace: "cases/withspecjson", + Labels: v1alpha1.New().Metadata.Labels, }, Spec: v1alpha1.Spec{ APIServer: "https://localhost", @@ -64,8 +65,9 @@ func TestEvalJsonnet(t *testing.T) { APIVersion: v1alpha1.New().APIVersion, Kind: v1alpha1.New().Kind, Metadata: v1alpha1.Metadata{ - Name: "cases/withspecjson", - Labels: v1alpha1.New().Metadata.Labels, + Name: "cases/withspecjson", + Namespace: "cases/withspecjson", + Labels: v1alpha1.New().Metadata.Labels, }, Spec: v1alpha1.Spec{ APIServer: "https://localhost", @@ -96,8 +98,9 @@ func TestEvalJsonnet(t *testing.T) { APIVersion: v1alpha1.New().APIVersion, Kind: v1alpha1.New().Kind, Metadata: v1alpha1.Metadata{ - Name: "withenv", - Labels: v1alpha1.New().Metadata.Labels, + Name: "withenv", + Namespace: "cases/withenv/main.jsonnet", + Labels: v1alpha1.New().Metadata.Labels, }, Spec: v1alpha1.Spec{ APIServer: "https://localhost",