render environment variables in repository URLs (#78)
* unit test for template rendering * render env vars in repository urls
This commit is contained in:
parent
1af8743bb6
commit
813fd4bfc7
|
|
@ -134,7 +134,12 @@ func (state *HelmState) SyncRepos(helm helmexec.Interface) []error {
|
|||
errs := []error{}
|
||||
|
||||
for _, repo := range state.Repositories {
|
||||
if err := helm.AddRepo(repo.Name, repo.URL, repo.CertFile, repo.KeyFile); err != nil {
|
||||
url, err := renderTemplateString(repo.URL)
|
||||
if err != nil {
|
||||
errs = append(errs, err)
|
||||
continue
|
||||
}
|
||||
if err := helm.AddRepo(repo.Name, url, repo.CertFile, repo.KeyFile); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package state
|
||||
|
||||
import (
|
||||
"os"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
|
|
@ -222,6 +223,103 @@ func TestHelmState_applyDefaultsTo(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func Test_renderTemplateString(t *testing.T) {
|
||||
type args struct {
|
||||
s string
|
||||
envs map[string]string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "simple replacement",
|
||||
args: args{
|
||||
s: "{{ env \"HF_TEST_VAR\" }}",
|
||||
envs: map[string]string{
|
||||
"HF_TEST_VAR": "content",
|
||||
},
|
||||
},
|
||||
want: "content",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "two replacements",
|
||||
args: args{
|
||||
s: "{{ env \"HF_TEST_ALPHA\" }}{{ env \"HF_TEST_BETA\" }}",
|
||||
envs: map[string]string{
|
||||
"HF_TEST_ALPHA": "first",
|
||||
"HF_TEST_BETA": "second",
|
||||
},
|
||||
},
|
||||
want: "firstsecond",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "replacement and comment",
|
||||
args: args{
|
||||
s: "{{ env \"HF_TEST_ALPHA\" }}{{/* comment */}}",
|
||||
envs: map[string]string{
|
||||
"HF_TEST_ALPHA": "first",
|
||||
},
|
||||
},
|
||||
want: "first",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "global template function",
|
||||
args: args{
|
||||
s: "{{ env \"HF_TEST_ALPHA\" | len }}",
|
||||
envs: map[string]string{
|
||||
"HF_TEST_ALPHA": "abcdefg",
|
||||
},
|
||||
},
|
||||
want: "7",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "env var not set",
|
||||
args: args{
|
||||
s: "{{ env \"HF_TEST_NONE\" }}",
|
||||
envs: map[string]string{
|
||||
"HF_TEST_THIS": "first",
|
||||
},
|
||||
},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "undefined function",
|
||||
args: args{
|
||||
s: "{{ env foo }}",
|
||||
envs: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
for k, v := range tt.args.envs {
|
||||
err := os.Setenv(k, v)
|
||||
if err != nil {
|
||||
t.Error("renderTemplateString() could not set env var for testing")
|
||||
}
|
||||
}
|
||||
got, err := renderTemplateString(tt.args.s)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("renderTemplateString() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if got != tt.want {
|
||||
t.Errorf("renderTemplateString() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_isLocalChart(t *testing.T) {
|
||||
type args struct {
|
||||
chart string
|
||||
|
|
@ -332,6 +430,7 @@ func Test_normalizeChart(t *testing.T) {
|
|||
|
||||
type mockHelmExec struct {
|
||||
charts []string
|
||||
repo []string
|
||||
}
|
||||
|
||||
func (helm *mockHelmExec) UpdateDeps(chart string) error {
|
||||
|
|
@ -341,10 +440,12 @@ func (helm *mockHelmExec) UpdateDeps(chart string) error {
|
|||
helm.charts = append(helm.charts, chart)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (helm *mockHelmExec) SetExtraArgs(args ...string) {
|
||||
return
|
||||
}
|
||||
func (helm *mockHelmExec) AddRepo(name, repository, certfile, keyfile string) error {
|
||||
helm.repo = []string{name, repository, certfile, keyfile}
|
||||
return nil
|
||||
}
|
||||
func (helm *mockHelmExec) UpdateRepo() error {
|
||||
|
|
@ -363,6 +464,75 @@ func (helm *mockHelmExec) DecryptSecret(name string) (string, error) {
|
|||
return "", nil
|
||||
}
|
||||
|
||||
func TestHelmState_SyncRepos(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
repos []RepositorySpec
|
||||
helm *mockHelmExec
|
||||
envs map[string]string
|
||||
want []string
|
||||
}{
|
||||
{
|
||||
name: "normal repository",
|
||||
repos: []RepositorySpec{
|
||||
{
|
||||
Name: "name",
|
||||
URL: "http://example.com/",
|
||||
CertFile: "",
|
||||
KeyFile: "",
|
||||
},
|
||||
},
|
||||
helm: &mockHelmExec{},
|
||||
want: []string{"name", "http://example.com/", "", ""},
|
||||
},
|
||||
{
|
||||
name: "repository with cert and key",
|
||||
repos: []RepositorySpec{
|
||||
{
|
||||
Name: "name",
|
||||
URL: "http://example.com/",
|
||||
CertFile: "certfile",
|
||||
KeyFile: "keyfile",
|
||||
},
|
||||
},
|
||||
helm: &mockHelmExec{},
|
||||
want: []string{"name", "http://example.com/", "certfile", "keyfile"},
|
||||
},
|
||||
{
|
||||
name: "repository with env var url",
|
||||
repos: []RepositorySpec{
|
||||
{
|
||||
Name: "name",
|
||||
URL: "https://{{ env \"HF_TEST_GITHUB_TOKEN\"}}@raw.githubusercontent.com/u/r/b/",
|
||||
CertFile: "certfile",
|
||||
KeyFile: "keyfile",
|
||||
},
|
||||
},
|
||||
envs: map[string]string{
|
||||
"HF_TEST_GITHUB_TOKEN": "token",
|
||||
},
|
||||
helm: &mockHelmExec{},
|
||||
want: []string{"name", "https://token@raw.githubusercontent.com/u/r/b/", "certfile", "keyfile"},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
for k, v := range tt.envs {
|
||||
err := os.Setenv(k, v)
|
||||
if err != nil {
|
||||
t.Error("HelmState.SyncRepos() could not set env var for testing")
|
||||
}
|
||||
}
|
||||
state := &HelmState{
|
||||
Repositories: tt.repos,
|
||||
}
|
||||
if got := state.SyncRepos(tt.helm); !reflect.DeepEqual(tt.helm.repo, tt.want) {
|
||||
t.Errorf("HelmState.SyncRepos() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestHelmState_UpdateDeps(t *testing.T) {
|
||||
state := &HelmState{
|
||||
BaseChartPath: "/src",
|
||||
|
|
|
|||
Loading…
Reference in New Issue