feat: `helm repo add --ca-file` via repositories definition (#856)
Resolves #855
This commit is contained in:
		
							parent
							
								
									ef63a05513
								
							
						
					
					
						commit
						216c228c0b
					
				| 
						 | 
					@ -61,6 +61,11 @@ repositories:
 | 
				
			||||||
  keyFile: optional_client_key
 | 
					  keyFile: optional_client_key
 | 
				
			||||||
  username: optional_username
 | 
					  username: optional_username
 | 
				
			||||||
  password: optional_password
 | 
					  password: optional_password
 | 
				
			||||||
 | 
					# Advanced configuration: You can use a ca bundle to use an https repo
 | 
				
			||||||
 | 
					# with a self-signed certificate
 | 
				
			||||||
 | 
					- name: insecure
 | 
				
			||||||
 | 
					   url: https://charts.my-insecure-domain.com
 | 
				
			||||||
 | 
					   caFile: optional_ca_crt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# context: kube-context # this directive is deprecated, please consider using helmDefaults.kubeContext
 | 
					# context: kube-context # this directive is deprecated, please consider using helmDefaults.kubeContext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1890,7 +1890,7 @@ func (helm *mockHelmExec) SetExtraArgs(args ...string) {
 | 
				
			||||||
func (helm *mockHelmExec) SetHelmBinary(bin string) {
 | 
					func (helm *mockHelmExec) SetHelmBinary(bin string) {
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (helm *mockHelmExec) AddRepo(name, repository, certfile, keyfile, username, password string) error {
 | 
					func (helm *mockHelmExec) AddRepo(name, repository, cafile, certfile, keyfile, username, password string) error {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (helm *mockHelmExec) UpdateRepo() error {
 | 
					func (helm *mockHelmExec) UpdateRepo() error {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,12 +68,15 @@ func (helm *execer) SetHelmBinary(bin string) {
 | 
				
			||||||
	helm.helmBinary = bin
 | 
						helm.helmBinary = bin
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (helm *execer) AddRepo(name, repository, certfile, keyfile, username, password string) error {
 | 
					func (helm *execer) AddRepo(name, repository, cafile, certfile, keyfile, username, password string) error {
 | 
				
			||||||
	var args []string
 | 
						var args []string
 | 
				
			||||||
	args = append(args, "repo", "add", name, repository)
 | 
						args = append(args, "repo", "add", name, repository)
 | 
				
			||||||
	if certfile != "" && keyfile != "" {
 | 
						if certfile != "" && keyfile != "" {
 | 
				
			||||||
		args = append(args, "--cert-file", certfile, "--key-file", keyfile)
 | 
							args = append(args, "--cert-file", certfile, "--key-file", keyfile)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if cafile != "" {
 | 
				
			||||||
 | 
							args = append(args, "--ca-file", cafile)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if username != "" && password != "" {
 | 
						if username != "" && password != "" {
 | 
				
			||||||
		args = append(args, "--username", username, "--password", password)
 | 
							args = append(args, "--username", username, "--password", password)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,7 +86,7 @@ func Test_AddRepo(t *testing.T) {
 | 
				
			||||||
	var buffer bytes.Buffer
 | 
						var buffer bytes.Buffer
 | 
				
			||||||
	logger := NewLogger(&buffer, "debug")
 | 
						logger := NewLogger(&buffer, "debug")
 | 
				
			||||||
	helm := MockExecer(logger, "dev")
 | 
						helm := MockExecer(logger, "dev")
 | 
				
			||||||
	helm.AddRepo("myRepo", "https://repo.example.com/", "cert.pem", "key.pem", "", "")
 | 
						helm.AddRepo("myRepo", "https://repo.example.com/", "", "cert.pem", "key.pem", "", "")
 | 
				
			||||||
	expected := `Adding repo myRepo https://repo.example.com/
 | 
						expected := `Adding repo myRepo https://repo.example.com/
 | 
				
			||||||
exec: helm repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem --kube-context dev
 | 
					exec: helm repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem --kube-context dev
 | 
				
			||||||
exec: helm repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem --kube-context dev: 
 | 
					exec: helm repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem --kube-context dev: 
 | 
				
			||||||
| 
						 | 
					@ -96,7 +96,17 @@ exec: helm repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buffer.Reset()
 | 
						buffer.Reset()
 | 
				
			||||||
	helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "")
 | 
						helm.AddRepo("myRepo", "https://repo.example.com/", "ca.crt", "", "", "", "")
 | 
				
			||||||
 | 
						expected = `Adding repo myRepo https://repo.example.com/
 | 
				
			||||||
 | 
					exec: helm repo add myRepo https://repo.example.com/ --ca-file ca.crt --kube-context dev
 | 
				
			||||||
 | 
					exec: helm repo add myRepo https://repo.example.com/ --ca-file ca.crt --kube-context dev: 
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
						if buffer.String() != expected {
 | 
				
			||||||
 | 
							t.Errorf("helmexec.AddRepo()\nactual = %v\nexpect = %v", buffer.String(), expected)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buffer.Reset()
 | 
				
			||||||
 | 
						helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "", "")
 | 
				
			||||||
	expected = `Adding repo myRepo https://repo.example.com/
 | 
						expected = `Adding repo myRepo https://repo.example.com/
 | 
				
			||||||
exec: helm repo add myRepo https://repo.example.com/ --kube-context dev
 | 
					exec: helm repo add myRepo https://repo.example.com/ --kube-context dev
 | 
				
			||||||
exec: helm repo add myRepo https://repo.example.com/ --kube-context dev: 
 | 
					exec: helm repo add myRepo https://repo.example.com/ --kube-context dev: 
 | 
				
			||||||
| 
						 | 
					@ -106,7 +116,7 @@ exec: helm repo add myRepo https://repo.example.com/ --kube-context dev:
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buffer.Reset()
 | 
						buffer.Reset()
 | 
				
			||||||
	helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "example_user", "example_password")
 | 
						helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "example_user", "example_password")
 | 
				
			||||||
	expected = `Adding repo myRepo https://repo.example.com/
 | 
						expected = `Adding repo myRepo https://repo.example.com/
 | 
				
			||||||
exec: helm repo add myRepo https://repo.example.com/ --username example_user --password example_password --kube-context dev
 | 
					exec: helm repo add myRepo https://repo.example.com/ --username example_user --password example_password --kube-context dev
 | 
				
			||||||
exec: helm repo add myRepo https://repo.example.com/ --username example_user --password example_password --kube-context dev: 
 | 
					exec: helm repo add myRepo https://repo.example.com/ --username example_user --password example_password --kube-context dev: 
 | 
				
			||||||
| 
						 | 
					@ -453,7 +463,7 @@ func Test_LogLevels(t *testing.T) {
 | 
				
			||||||
		buffer.Reset()
 | 
							buffer.Reset()
 | 
				
			||||||
		logger := NewLogger(&buffer, logLevel)
 | 
							logger := NewLogger(&buffer, logLevel)
 | 
				
			||||||
		helm := MockExecer(logger, "")
 | 
							helm := MockExecer(logger, "")
 | 
				
			||||||
		helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "example_user", "example_password")
 | 
							helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "example_user", "example_password")
 | 
				
			||||||
		if buffer.String() != expected {
 | 
							if buffer.String() != expected {
 | 
				
			||||||
			t.Errorf("helmexec.AddRepo()\nactual = %v\nexpect = %v", buffer.String(), expected)
 | 
								t.Errorf("helmexec.AddRepo()\nactual = %v\nexpect = %v", buffer.String(), expected)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@ type Interface interface {
 | 
				
			||||||
	SetExtraArgs(args ...string)
 | 
						SetExtraArgs(args ...string)
 | 
				
			||||||
	SetHelmBinary(bin string)
 | 
						SetHelmBinary(bin string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	AddRepo(name, repository, certfile, keyfile, username, password string) error
 | 
						AddRepo(name, repository, cafile, certfile, keyfile, username, password string) error
 | 
				
			||||||
	UpdateRepo() error
 | 
						UpdateRepo() error
 | 
				
			||||||
	BuildDeps(name, chart string) error
 | 
						BuildDeps(name, chart string) error
 | 
				
			||||||
	UpdateDeps(chart string) error
 | 
						UpdateDeps(chart string) error
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,6 +111,7 @@ type HelmSpec struct {
 | 
				
			||||||
type RepositorySpec struct {
 | 
					type RepositorySpec struct {
 | 
				
			||||||
	Name     string `yaml:"name,omitempty"`
 | 
						Name     string `yaml:"name,omitempty"`
 | 
				
			||||||
	URL      string `yaml:"url,omitempty"`
 | 
						URL      string `yaml:"url,omitempty"`
 | 
				
			||||||
 | 
						CaFile   string `yaml:"caFile,omitempty"`
 | 
				
			||||||
	CertFile string `yaml:"certFile,omitempty"`
 | 
						CertFile string `yaml:"certFile,omitempty"`
 | 
				
			||||||
	KeyFile  string `yaml:"keyFile,omitempty"`
 | 
						KeyFile  string `yaml:"keyFile,omitempty"`
 | 
				
			||||||
	Username string `yaml:"username,omitempty"`
 | 
						Username string `yaml:"username,omitempty"`
 | 
				
			||||||
| 
						 | 
					@ -218,7 +219,7 @@ func (st *HelmState) applyDefaultsTo(spec *ReleaseSpec) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RepoUpdater interface {
 | 
					type RepoUpdater interface {
 | 
				
			||||||
	AddRepo(name, repository, certfile, keyfile, username, password string) error
 | 
						AddRepo(name, repository, cafile, certfile, keyfile, username, password string) error
 | 
				
			||||||
	UpdateRepo() error
 | 
						UpdateRepo() error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,7 +228,7 @@ func (st *HelmState) SyncRepos(helm RepoUpdater) []error {
 | 
				
			||||||
	errs := []error{}
 | 
						errs := []error{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, repo := range st.Repositories {
 | 
						for _, repo := range st.Repositories {
 | 
				
			||||||
		if err := helm.AddRepo(repo.Name, repo.URL, repo.CertFile, repo.KeyFile, repo.Username, repo.Password); err != nil {
 | 
							if err := helm.AddRepo(repo.Name, repo.URL, repo.CaFile, repo.CertFile, repo.KeyFile, repo.Username, repo.Password); err != nil {
 | 
				
			||||||
			errs = append(errs, err)
 | 
								errs = append(errs, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -720,8 +720,8 @@ func (helm *mockHelmExec) SetExtraArgs(args ...string) {
 | 
				
			||||||
func (helm *mockHelmExec) SetHelmBinary(bin string) {
 | 
					func (helm *mockHelmExec) SetHelmBinary(bin string) {
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (helm *mockHelmExec) AddRepo(name, repository, certfile, keyfile, username, password string) error {
 | 
					func (helm *mockHelmExec) AddRepo(name, repository, cafile, certfile, keyfile, username, password string) error {
 | 
				
			||||||
	helm.repo = []string{name, repository, certfile, keyfile, username, password}
 | 
						helm.repo = []string{name, repository, cafile, certfile, keyfile, username, password}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (helm *mockHelmExec) UpdateRepo() error {
 | 
					func (helm *mockHelmExec) UpdateRepo() error {
 | 
				
			||||||
| 
						 | 
					@ -796,7 +796,7 @@ func TestHelmState_SyncRepos(t *testing.T) {
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			helm: &mockHelmExec{},
 | 
								helm: &mockHelmExec{},
 | 
				
			||||||
			want: []string{"name", "http://example.com/", "", "", "", ""},
 | 
								want: []string{"name", "http://example.com/", "", "", "", "", ""},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "repository with cert and key",
 | 
								name: "repository with cert and key",
 | 
				
			||||||
| 
						 | 
					@ -811,7 +811,21 @@ func TestHelmState_SyncRepos(t *testing.T) {
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			helm: &mockHelmExec{},
 | 
								helm: &mockHelmExec{},
 | 
				
			||||||
			want: []string{"name", "http://example.com/", "certfile", "keyfile", "", ""},
 | 
								want: []string{"name", "http://example.com/", "", "certfile", "keyfile", "", ""},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "repository with ca file",
 | 
				
			||||||
 | 
								repos: []RepositorySpec{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Name:     "name",
 | 
				
			||||||
 | 
										URL:      "http://example.com/",
 | 
				
			||||||
 | 
										CaFile:   "cafile",
 | 
				
			||||||
 | 
										Username: "",
 | 
				
			||||||
 | 
										Password: "",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								helm: &mockHelmExec{},
 | 
				
			||||||
 | 
								want: []string{"name", "http://example.com/", "cafile", "", "", "", ""},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "repository with username and password",
 | 
								name: "repository with username and password",
 | 
				
			||||||
| 
						 | 
					@ -826,7 +840,7 @@ func TestHelmState_SyncRepos(t *testing.T) {
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			helm: &mockHelmExec{},
 | 
								helm: &mockHelmExec{},
 | 
				
			||||||
			want: []string{"name", "http://example.com/", "", "", "example_user", "example_password"},
 | 
								want: []string{"name", "http://example.com/", "", "", "", "example_user", "example_password"},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for i := range tests {
 | 
						for i := range tests {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue