From 4e88b8b355699e64b72eafe66a0f702d9d91d880 Mon Sep 17 00:00:00 2001 From: Imran Pochi Date: Tue, 5 May 2020 14:27:22 +0530 Subject: [PATCH 1/2] refactor: internal package for helper functions. Adding a new internal package for utility and helper functions that need not be exposed outside. Currently there are lot of util packages in the codebase. Having an internal package helps in consolidating all such helper functions in this internal package rather than having separate util package/files in different places in the codebase. The first function that is to be added is RenderTemplate which renders provided go template. Adds unit tests for the same. Signed-off-by: Imran Pochi --- internal/template/template.go | 36 +++++++++++++++++++ internal/template/template_test.go | 57 ++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 internal/template/template.go create mode 100644 internal/template/template_test.go diff --git a/internal/template/template.go b/internal/template/template.go new file mode 100644 index 000000000..de3d6bae2 --- /dev/null +++ b/internal/template/template.go @@ -0,0 +1,36 @@ +// Copyright 2020 The Lokomotive Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package template contains the utility functions that help in rendering +// the go templates. +package template + +import ( + "bytes" + "text/template" +) + +// Render applies a parsed template to the specified data object +// and returns the output as string or an error. +func Render(tmpl string, obj interface{}) (string, error) { + t, err := template.New("render").Parse(tmpl) + if err != nil { + return "", err + } + var buf bytes.Buffer + if err = t.Execute(&buf, obj); err != nil { + return "", err + } + return buf.String(), nil +} diff --git a/internal/template/template_test.go b/internal/template/template_test.go new file mode 100644 index 000000000..7979077ed --- /dev/null +++ b/internal/template/template_test.go @@ -0,0 +1,57 @@ +// Copyright 2020 The Lokomotive Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package template_test + +import ( + "testing" + + "github.com/kinvolk/lokomotive/internal/template" +) + +type testRenderer struct { + Test string +} + +func TestRenderSuccess(t *testing.T) { + tmpl := `Rendered template is: {{ .Test }}` + expected := "Rendered template is: Success" + + tr := &testRenderer{Test: "Success"} + + output, err := template.Render(tmpl, tr) + if err != nil { + t.Fatalf("error rendering template not expected, got: %q", err) + } + + if output != expected { + t.Fatalf("expected: %s, got: %s", expected, output) + } +} + +func TestRenderFail(t *testing.T) { + tmpl := `Rendered template is: {{ .UnknownField }}` + expected := "Rendered template is: Success" + + tr := &testRenderer{Test: "Fail"} + + output, err := template.Render(tmpl, tr) + if err == nil { + t.Fatalf("expected error in rendering template") + } + + if output != "" { + t.Fatalf("expected: %s, got: %s", expected, output) + } +} From f0f21f383e8e6ddfe43ef5ecd065da7ea66ea0e0 Mon Sep 17 00:00:00 2001 From: Imran Pochi Date: Mon, 4 May 2020 13:58:33 +0530 Subject: [PATCH 2/2] refactor: remove template.go from components/util package. Since RenderTemplate function is now part of the `internal` package, this caused duplication. Hence the file `template.go` is removed from the codebase. Also we update the references to `util.RenderTemplate` to now refer to the correct package and function. Signed-off-by: Imran Pochi --- pkg/backend/local/local.go | 4 +-- pkg/backend/s3/s3.go | 4 +-- pkg/components/cert-manager/component.go | 3 +- .../cluster-autoscaler/component.go | 3 +- pkg/components/contour/component.go | 5 +-- pkg/components/dex/component.go | 8 ++--- pkg/components/external-dns/component.go | 6 ++-- pkg/components/metallb/component.go | 10 +++--- pkg/components/metrics-server/component.go | 3 +- pkg/components/openebs-operator/component.go | 3 +- .../prometheus-operator/component.go | 3 +- pkg/components/rook-ceph/component.go | 6 ++-- pkg/components/rook/component.go | 4 ++- pkg/components/util/template.go | 34 ------------------- pkg/components/velero/velero.go | 3 +- 15 files changed, 40 insertions(+), 59 deletions(-) delete mode 100644 pkg/components/util/template.go diff --git a/pkg/backend/local/local.go b/pkg/backend/local/local.go index 94f483ede..4f494fd90 100644 --- a/pkg/backend/local/local.go +++ b/pkg/backend/local/local.go @@ -18,8 +18,8 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/gohcl" + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/backend" - "github.com/kinvolk/lokomotive/pkg/components/util" ) type local struct { @@ -45,7 +45,7 @@ func NewLocalBackend() *local { // Render renders the Go template with local backend configuration. func (l *local) Render() (string, error) { - return util.RenderTemplate(backendConfigTmpl, l) + return template.Render(backendConfigTmpl, l) } // Validate validates the local backend configuration. diff --git a/pkg/backend/s3/s3.go b/pkg/backend/s3/s3.go index 825fd82b4..a0dc2f92d 100644 --- a/pkg/backend/s3/s3.go +++ b/pkg/backend/s3/s3.go @@ -21,8 +21,8 @@ import ( "github.com/hashicorp/hcl/v2/gohcl" "github.com/pkg/errors" + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/backend" - "github.com/kinvolk/lokomotive/pkg/components/util" ) type s3 struct { @@ -52,7 +52,7 @@ func NewS3Backend() *s3 { // Render renders the Go template with s3 backend configuration. func (s *s3) Render() (string, error) { - return util.RenderTemplate(backendConfigTmpl, s) + return template.Render(backendConfigTmpl, s) } // Validate validates the s3 backend configuration. diff --git a/pkg/components/cert-manager/component.go b/pkg/components/cert-manager/component.go index 44f073e63..9411c10e8 100644 --- a/pkg/components/cert-manager/component.go +++ b/pkg/components/cert-manager/component.go @@ -21,6 +21,7 @@ import ( "github.com/hashicorp/hcl/v2/gohcl" "github.com/pkg/errors" + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" ) @@ -79,7 +80,7 @@ func (c *component) RenderManifests() (map[string]string, error) { return nil, errors.Wrap(err, "load chart from assets") } - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := template.Render(chartValuesTmpl, c) if err != nil { return nil, errors.Wrap(err, "render chart values template") } diff --git a/pkg/components/cluster-autoscaler/component.go b/pkg/components/cluster-autoscaler/component.go index fd239c3d1..7723c6afc 100644 --- a/pkg/components/cluster-autoscaler/component.go +++ b/pkg/components/cluster-autoscaler/component.go @@ -26,6 +26,7 @@ import ( "github.com/packethost/packngo" "github.com/pkg/errors" + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" ) @@ -323,7 +324,7 @@ func (c *component) RenderManifests() (map[string]string, error) { c.Packet.AuthToken = base64.StdEncoding.EncodeToString([]byte(os.Getenv("PACKET_AUTH_TOKEN"))) } - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := template.Render(chartValuesTmpl, c) if err != nil { return nil, errors.Wrap(err, "render chart values template") } diff --git a/pkg/components/contour/component.go b/pkg/components/contour/component.go index 76c0dc8ab..eaf4941e9 100644 --- a/pkg/components/contour/component.go +++ b/pkg/components/contour/component.go @@ -19,9 +19,10 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/gohcl" - "github.com/kinvolk/lokomotive/pkg/components/util" + internaltemplate "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" + "github.com/kinvolk/lokomotive/pkg/components/util" ) const ( @@ -101,7 +102,7 @@ func (c *component) RenderManifests() (map[string]string, error) { return nil, fmt.Errorf("failed to marshal node affinity: %w", err) } - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := internaltemplate.Render(chartValuesTmpl, c) if err != nil { return nil, fmt.Errorf("rendering values template failed: %w", err) } diff --git a/pkg/components/dex/component.go b/pkg/components/dex/component.go index 72a33ac69..b3b24e6f8 100644 --- a/pkg/components/dex/component.go +++ b/pkg/components/dex/component.go @@ -25,8 +25,8 @@ import ( "github.com/hashicorp/hcl/v2/gohcl" "github.com/pkg/errors" + internaltemplate "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" - "github.com/kinvolk/lokomotive/pkg/components/util" ) const name = "dex" @@ -310,17 +310,17 @@ func (c *component) RenderManifests() (map[string]string, error) { } c.StaticClientsRaw = staticClients - configMap, err := util.RenderTemplate(configMapTmpl, c) + configMap, err := internaltemplate.Render(configMapTmpl, c) if err != nil { return nil, errors.Wrap(err, "execute template failed") } - ingressBuf, err := util.RenderTemplate(ingressTmpl, c) + ingressBuf, err := internaltemplate.Render(ingressTmpl, c) if err != nil { return nil, errors.Wrap(err, "execute template failed") } - deployment, err := util.RenderTemplate(deploymentTmpl, c) + deployment, err := internaltemplate.Render(deploymentTmpl, c) if err != nil { return nil, errors.Wrap(err, "execute template failed") } diff --git a/pkg/components/external-dns/component.go b/pkg/components/external-dns/component.go index 7f5290d6e..683c543c9 100644 --- a/pkg/components/external-dns/component.go +++ b/pkg/components/external-dns/component.go @@ -20,9 +20,11 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/gohcl" + "github.com/pkg/errors" + + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" - "github.com/pkg/errors" ) const name = "external-dns" @@ -128,7 +130,7 @@ func (c *component) RenderManifests() (map[string]string, error) { c.AwsConfig.SecretAccessKey = secretAccessKey } - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := template.Render(chartValuesTmpl, c) if err != nil { return nil, errors.Wrap(err, "render chart values template") } diff --git a/pkg/components/metallb/component.go b/pkg/components/metallb/component.go index c01dd1cac..bc7e505b1 100644 --- a/pkg/components/metallb/component.go +++ b/pkg/components/metallb/component.go @@ -17,9 +17,11 @@ package metallb import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/gohcl" + "github.com/pkg/errors" + + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" - "github.com/pkg/errors" ) const name = "metallb" @@ -85,17 +87,17 @@ func (c *component) RenderManifests() (map[string]string, error) { } c.ControllerTolerationsJSON = t - controllerStr, err := util.RenderTemplate(deploymentController, c) + controllerStr, err := template.Render(deploymentController, c) if err != nil { return nil, errors.Wrap(err, "render template failed") } - speakerStr, err := util.RenderTemplate(daemonsetSpeaker, c) + speakerStr, err := template.Render(daemonsetSpeaker, c) if err != nil { return nil, errors.Wrap(err, "render template failed") } - configMapStr, err := util.RenderTemplate(configMap, c) + configMapStr, err := template.Render(configMap, c) if err != nil { return nil, errors.Wrap(err, "rendering ConfigMap template failed") } diff --git a/pkg/components/metrics-server/component.go b/pkg/components/metrics-server/component.go index 609f938f9..a0ef246e8 100644 --- a/pkg/components/metrics-server/component.go +++ b/pkg/components/metrics-server/component.go @@ -21,6 +21,7 @@ import ( "github.com/hashicorp/hcl/v2/gohcl" "github.com/pkg/errors" + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" ) @@ -75,7 +76,7 @@ func (c *component) RenderManifests() (map[string]string, error) { return nil, errors.Wrap(err, "load chart from assets") } - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := template.Render(chartValuesTmpl, c) if err != nil { return nil, errors.Wrap(err, "render chart values template") } diff --git a/pkg/components/openebs-operator/component.go b/pkg/components/openebs-operator/component.go index 0845aad60..99d0eb07a 100644 --- a/pkg/components/openebs-operator/component.go +++ b/pkg/components/openebs-operator/component.go @@ -20,6 +20,7 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/gohcl" + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" ) @@ -101,7 +102,7 @@ func (c *component) RenderManifests() (map[string]string, error) { return nil, fmt.Errorf("load chart from assets: %w", err) } - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := template.Render(chartValuesTmpl, c) if err != nil { return nil, fmt.Errorf("render chart values template: %w", err) } diff --git a/pkg/components/prometheus-operator/component.go b/pkg/components/prometheus-operator/component.go index 748baf94e..08e37148b 100644 --- a/pkg/components/prometheus-operator/component.go +++ b/pkg/components/prometheus-operator/component.go @@ -21,6 +21,7 @@ import ( "github.com/hashicorp/hcl/v2/gohcl" "github.com/pkg/errors" + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/types" "github.com/kinvolk/lokomotive/pkg/components/util" @@ -149,7 +150,7 @@ func (c *component) RenderManifests() (map[string]string, error) { return nil, errors.Wrap(err, "load chart from assets") } - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := template.Render(chartValuesTmpl, c) if err != nil { return nil, errors.Wrap(err, "render chart values template") } diff --git a/pkg/components/rook-ceph/component.go b/pkg/components/rook-ceph/component.go index 34710f698..e40344be7 100644 --- a/pkg/components/rook-ceph/component.go +++ b/pkg/components/rook-ceph/component.go @@ -19,9 +19,11 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/gohcl" + "github.com/pkg/errors" + + internaltemplate "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" - "github.com/pkg/errors" ) const name = "rook-ceph" @@ -74,7 +76,7 @@ func (c *component) RenderManifests() (map[string]string, error) { // Parse template with values for k, v := range template { - rendered, err := util.RenderTemplate(v, c) + rendered, err := internaltemplate.Render(v, c) if err != nil { return nil, fmt.Errorf("template rendering failed for %q: %w", k, err) } diff --git a/pkg/components/rook/component.go b/pkg/components/rook/component.go index 97c25d083..338e42fc6 100644 --- a/pkg/components/rook/component.go +++ b/pkg/components/rook/component.go @@ -19,6 +19,8 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/gohcl" + + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" ) @@ -75,7 +77,7 @@ func (c *component) RenderManifests() (map[string]string, error) { c.RookNodeAffinity = convertNodeSelector(c.NodeSelector) - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := template.Render(chartValuesTmpl, c) if err != nil { return nil, fmt.Errorf("rendering values template failed: %w", err) } diff --git a/pkg/components/util/template.go b/pkg/components/util/template.go deleted file mode 100644 index d9d54c182..000000000 --- a/pkg/components/util/template.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2020 The Lokomotive Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package util - -import ( - "bytes" - "text/template" -) - -// RenderTemplate applies a parsed template to the specified data object -// and returns the output as string or an error. -func RenderTemplate(tmpl string, obj interface{}) (string, error) { - t, err := template.New("render").Parse(tmpl) - if err != nil { - return "", err - } - var buf bytes.Buffer - if err = t.Execute(&buf, obj); err != nil { - return "", err - } - return buf.String(), nil -} diff --git a/pkg/components/velero/velero.go b/pkg/components/velero/velero.go index 2e9739a33..52a0cc2d9 100644 --- a/pkg/components/velero/velero.go +++ b/pkg/components/velero/velero.go @@ -22,6 +22,7 @@ import ( "github.com/hashicorp/hcl/v2/gohcl" "github.com/pkg/errors" + "github.com/kinvolk/lokomotive/internal/template" "github.com/kinvolk/lokomotive/pkg/components" "github.com/kinvolk/lokomotive/pkg/components/util" "github.com/kinvolk/lokomotive/pkg/components/velero/azure" @@ -152,7 +153,7 @@ func (c *component) RenderManifests() (map[string]string, error) { return nil, errors.Wrap(err, "load chart from assets") } - values, err := util.RenderTemplate(chartValuesTmpl, c) + values, err := template.Render(chartValuesTmpl, c) if err != nil { return nil, errors.Wrap(err, "render chart values template") }