diff --git a/pkg/components/util/template.go b/internal/template/template.go similarity index 78% rename from pkg/components/util/template.go rename to internal/template/template.go index d9d54c182..de3d6bae2 100644 --- a/pkg/components/util/template.go +++ b/internal/template/template.go @@ -12,16 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -package util +// Package template contains the utility functions that help in rendering +// the go templates. +package template import ( "bytes" "text/template" ) -// RenderTemplate applies a parsed template to the specified data object +// Render 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) { +func Render(tmpl string, obj interface{}) (string, error) { t, err := template.New("render").Parse(tmpl) if err != nil { return "", err 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) + } +} 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/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") }