From cf6004fa80ffe7e29811c7e2ab91d17c91a9fa29 Mon Sep 17 00:00:00 2001 From: Tom Proctor Date: Tue, 19 Apr 2022 20:51:11 +0100 Subject: [PATCH] Upgrade hashicorp/consul-template dependency (#15092) * Includes sprig template functions * Includes improvements to writeTo template function * Add sprig functions test, improve failure message --- changelog/15092.txt | 3 ++ command/agent/config/config_test.go | 8 ++-- command/agent/template/template_test.go | 50 ++++++++++++++++++++++--- go.mod | 2 +- go.sum | 9 ++--- 5 files changed, 56 insertions(+), 16 deletions(-) create mode 100644 changelog/15092.txt diff --git a/changelog/15092.txt b/changelog/15092.txt new file mode 100644 index 0000000000..968d6ba5ae --- /dev/null +++ b/changelog/15092.txt @@ -0,0 +1,3 @@ +```release-note:improvement +agent: Upgrade hashicorp/consul-template version for sprig template functions and improved writeTo function +``` diff --git a/command/agent/config/config_test.go b/command/agent/config/config_test.go index 27c48d1afe..2bb8844bac 100644 --- a/command/agent/config/config_test.go +++ b/command/agent/config/config_test.go @@ -675,7 +675,7 @@ func TestLoadConfigFile_Template(t *testing.T) { expectedTemplates: []*ctconfig.TemplateConfig{ { Backup: pointerutil.BoolPtr(true), - Command: pointerutil.StringPtr("restart service foo"), + Command: []string{"restart service foo"}, CommandTimeout: pointerutil.TimeDurationPtr("60s"), Contents: pointerutil.StringPtr("{{ keyOrDefault \"service/redis/maxconns@east-aws\" \"5\" }}"), CreateDestDirs: pointerutil.BoolPtr(true), @@ -701,7 +701,7 @@ func TestLoadConfigFile_Template(t *testing.T) { Destination: pointerutil.StringPtr("/path/on/disk/where/template/will/render.txt"), ErrMissingKey: pointerutil.BoolPtr(false), CreateDestDirs: pointerutil.BoolPtr(true), - Command: pointerutil.StringPtr("restart service foo"), + Command: []string{"restart service foo"}, Perms: pointerutil.FileModePtr(0o600), }, { @@ -786,7 +786,7 @@ func TestLoadConfigFile_Template_NoSinks(t *testing.T) { expectedTemplates: []*ctconfig.TemplateConfig{ { Backup: pointerutil.BoolPtr(true), - Command: pointerutil.StringPtr("restart service foo"), + Command: []string{"restart service foo"}, CommandTimeout: pointerutil.TimeDurationPtr("60s"), Contents: pointerutil.StringPtr("{{ keyOrDefault \"service/redis/maxconns@east-aws\" \"5\" }}"), CreateDestDirs: pointerutil.BoolPtr(true), @@ -812,7 +812,7 @@ func TestLoadConfigFile_Template_NoSinks(t *testing.T) { Destination: pointerutil.StringPtr("/path/on/disk/where/template/will/render.txt"), ErrMissingKey: pointerutil.BoolPtr(false), CreateDestDirs: pointerutil.BoolPtr(true), - Command: pointerutil.StringPtr("restart service foo"), + Command: []string{"restart service foo"}, Perms: pointerutil.FileModePtr(0o600), }, { diff --git a/command/agent/template/template_test.go b/command/agent/template/template_test.go index 77f166affc..25999945f9 100644 --- a/command/agent/template/template_test.go +++ b/command/agent/template/template_test.go @@ -7,6 +7,7 @@ import ( "net/http" "net/http/httptest" "os" + "strings" "testing" "time" @@ -229,6 +230,7 @@ func TestServerRun(t *testing.T) { testCases := map[string]struct { templateMap map[string]*templateTest + expectedValues *secretRender expectError bool exitOnRetryFailure bool }{ @@ -318,6 +320,22 @@ func TestServerRun(t *testing.T) { expectError: true, exitOnRetryFailure: true, }, + "with sprig functions": { + templateMap: map[string]*templateTest{ + "render_01": { + template: &ctconfig.TemplateConfig{ + Contents: pointerutil.StringPtr(templateContentsWithSprigFunctions), + }, + }, + }, + expectedValues: &secretRender{ + Username: "APPUSER", + Password: "passphrase", + Version: "3", + }, + expectError: false, + exitOnRetryFailure: true, + }, } for name, tc := range testCases { @@ -379,13 +397,15 @@ func TestServerRun(t *testing.T) { // verify test file exists and has the content we're looking for var fileCount int + var errs []string for _, template := range templatesToRender { if template.Destination == nil { t.Fatal("nil template destination") } content, err := os.ReadFile(*template.Destination) if err != nil { - t.Fatal(err) + errs = append(errs, err.Error()) + continue } fileCount++ @@ -393,12 +413,22 @@ func TestServerRun(t *testing.T) { if err := json.Unmarshal(content, &secret); err != nil { t.Fatal(err) } - if secret.Username != "appuser" || secret.Password != "password" || secret.Version != "3" { - t.Fatalf("secret didn't match: %#v", secret) + var expectedValues secretRender + if tc.expectedValues != nil { + expectedValues = *tc.expectedValues + } else { + expectedValues = secretRender{ + Username: "appuser", + Password: "password", + Version: "3", + } + } + if secret != expectedValues { + t.Fatalf("secret didn't match, expected: %#v, got: %#v", expectedValues, secret) } } - if fileCount != len(templatesToRender) { - t.Fatalf("mismatch file to template: (%d) / (%d)", fileCount, len(templatesToRender)) + if len(errs) != 0 { + t.Fatalf("Failed to find the expected files. Expected %d, got %d\n\t%s", len(templatesToRender), fileCount, strings.Join(errs, "\n\t")) } }) } @@ -529,3 +559,13 @@ var templateContentsPermDenied = ` } {{ end }} ` + +var templateContentsWithSprigFunctions = ` +{{ with secret "kv/myapp/config"}} +{ +{{ if .Data.data.username}}"username":"{{ .Data.data.username | sprig_upper }}",{{ end }} +{{ if .Data.data.password }}"password":"{{ .Data.data.password | sprig_replace "word" "phrase" }}",{{ end }} +{{ if .Data.metadata.version}}"version":"{{ .Data.metadata.version }}"{{ end }} +} +{{ end }} +` diff --git a/go.mod b/go.mod index 14c4a97dce..85d828712e 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/google/go-github v17.0.0+incompatible github.com/google/go-metrics-stackdriver v0.2.0 github.com/hashicorp/cap v0.1.1 - github.com/hashicorp/consul-template v0.27.2-0.20211014231529-4ff55381f1c4 + github.com/hashicorp/consul-template v0.28.1-0.20220415203157-ebf2f3dfe745 github.com/hashicorp/consul/api v1.12.0 github.com/hashicorp/errwrap v1.1.0 github.com/hashicorp/go-cleanhttp v0.5.2 diff --git a/go.sum b/go.sum index 5d8bc12f79..80825a278d 100644 --- a/go.sum +++ b/go.sum @@ -638,8 +638,6 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gocql/gocql v0.0.0-20210401103645-80ab1e13e309 h1:8MHuCGYDXh0skFrLumkCMlt9C29hxhqNx39+Haemeqw= -github.com/gocql/gocql v0.0.0-20210401103645-80ab1e13e309/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/gocql/gocql v1.0.0 h1:UnbTERpP72VZ/viKE1Q1gPtmLvyTZTvuAstvSRydw/c= github.com/gocql/gocql v1.0.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= @@ -702,7 +700,6 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -804,8 +801,8 @@ github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/cap v0.1.1 h1:GjO4+9+H0wv/89YoEsxeVc2jIizL19r5v5l2lpaH8Kg= github.com/hashicorp/cap v0.1.1/go.mod h1:VfBvK2ULRyqsuqAnjgZl7HJ7/CGMC7ro4H5eXiZuun8= -github.com/hashicorp/consul-template v0.27.2-0.20211014231529-4ff55381f1c4 h1:Heoq6IaSKwqOzAJMDg33LRu0GmNxVswQkIcREBFQD2E= -github.com/hashicorp/consul-template v0.27.2-0.20211014231529-4ff55381f1c4/go.mod h1:cAi5bOqno7Ao5sFHu7O80wMOPnqcF5ADrTApWU4Lqx4= +github.com/hashicorp/consul-template v0.28.1-0.20220415203157-ebf2f3dfe745 h1:91lxOf6Uo92mXbCR7s9IcHk2iqOngdZrqsvH4gZHqcs= +github.com/hashicorp/consul-template v0.28.1-0.20220415203157-ebf2f3dfe745/go.mod h1:324C5f8AHp6JqhyfZcX4JsguFdNkKIpZvjZyeCf5W4w= github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= @@ -1012,6 +1009,7 @@ github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKe github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 h1:xixZ2bWeofWV68J+x6AzmKuVM/JWCQwkWm6GW/MUR6I= github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huaweicloud/golangsdk v0.0.0-20200304081349-45ec0797f2a4/go.mod h1:WQBcHRNX9shz3928lWEvstQJtAtYI7ks6XlgtRT9Tcw= @@ -1144,7 +1142,6 @@ github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:A github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=