feat: pass-credentials to repo (#1899)
This adds the ability to include the --pass-credentials flag to the helm add repo command by: - Adding repo.passCredentials to the helmfile yaml - Changing state, helmexec, and app to include RepositorySpec.PassCredentials Resolves #1898 Co-authored-by: almed4 <alexandre.meddin@ingka.ikea.com>
This commit is contained in:
		
							parent
							
								
									c623730374
								
							
						
					
					
						commit
						46b17e2cdb
					
				|  | @ -62,6 +62,7 @@ repositories: | ||||||
|   username: optional_username |   username: optional_username | ||||||
|   password: optional_password |   password: optional_password | ||||||
|   oci: true |   oci: true | ||||||
|  |   passCredentials: true | ||||||
| # Advanced configuration: You can use a ca bundle to use an https repo | # Advanced configuration: You can use a ca bundle to use an https repo | ||||||
| # with a self-signed certificate | # with a self-signed certificate | ||||||
| - name: insecure | - name: insecure | ||||||
|  |  | ||||||
|  | @ -2519,7 +2519,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, cafile, certfile, keyfile, username, password string, managed string) error { | func (helm *mockHelmExec) AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials string) error { | ||||||
| 	helm.repos = append(helm.repos, mockRepo{Name: name}) | 	helm.repos = append(helm.repos, mockRepo{Name: name}) | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -48,7 +48,7 @@ func (helm *noCallHelmExec) SetHelmBinary(bin string) { | ||||||
| 	helm.doPanic() | 	helm.doPanic() | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| func (helm *noCallHelmExec) AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string) error { | func (helm *noCallHelmExec) AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials string) error { | ||||||
| 	helm.doPanic() | 	helm.doPanic() | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -84,8 +84,8 @@ func (helm *Helm) SetExtraArgs(args ...string) { | ||||||
| func (helm *Helm) SetHelmBinary(bin string) { | func (helm *Helm) SetHelmBinary(bin string) { | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| func (helm *Helm) AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string) error { | func (helm *Helm) AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials string) error { | ||||||
| 	helm.Repo = []string{name, repository, cafile, certfile, keyfile, username, password, managed} | 	helm.Repo = []string{name, repository, cafile, certfile, keyfile, username, password, managed, passCredentials} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| func (helm *Helm) UpdateRepo() error { | func (helm *Helm) UpdateRepo() error { | ||||||
|  |  | ||||||
|  | @ -108,7 +108,7 @@ func (helm *execer) SetHelmBinary(bin string) { | ||||||
| 	helm.helmBinary = bin | 	helm.helmBinary = bin | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (helm *execer) AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string) error { | func (helm *execer) AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials string) error { | ||||||
| 	var args []string | 	var args []string | ||||||
| 	var out []byte | 	var out []byte | ||||||
| 	var err error | 	var err error | ||||||
|  | @ -141,6 +141,9 @@ func (helm *execer) AddRepo(name, repository, cafile, certfile, keyfile, usernam | ||||||
| 		if username != "" && password != "" { | 		if username != "" && password != "" { | ||||||
| 			args = append(args, "--username", username, "--password", password) | 			args = append(args, "--username", username, "--password", password) | ||||||
| 		} | 		} | ||||||
|  | 		if passCredentials == "true" { | ||||||
|  | 			args = append(args, "--pass-credentials") | ||||||
|  | 		} | ||||||
| 		helm.logger.Infof("Adding repo %v %v", name, repository) | 		helm.logger.Infof("Adding repo %v %v", name, repository) | ||||||
| 		out, err = helm.exec(args, map[string]string{}) | 		out, err = helm.exec(args, map[string]string{}) | ||||||
| 	default: | 	default: | ||||||
|  |  | ||||||
|  | @ -89,7 +89,7 @@ func Test_AddRepo_Helm_3_3_2(t *testing.T) { | ||||||
| 		kubeContext: "dev", | 		kubeContext: "dev", | ||||||
| 		runner:      &mockRunner{}, | 		runner:      &mockRunner{}, | ||||||
| 	} | 	} | ||||||
| 	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 --kube-context dev repo add myRepo https://repo.example.com/ --force-update --cert-file cert.pem --key-file key.pem
 | exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --force-update --cert-file cert.pem --key-file key.pem
 | ||||||
| ` | ` | ||||||
|  | @ -102,7 +102,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 --kube-context dev repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem
 | exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem
 | ||||||
| ` | ` | ||||||
|  | @ -111,7 +111,7 @@ exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --cert-f | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	helm.AddRepo("myRepo", "https://repo.example.com/", "ca.crt", "", "", "", "", "") | 	helm.AddRepo("myRepo", "https://repo.example.com/", "ca.crt", "", "", "", "", "", "") | ||||||
| 	expected = `Adding repo myRepo https://repo.example.com/
 | 	expected = `Adding repo myRepo https://repo.example.com/
 | ||||||
| exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --ca-file ca.crt
 | exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --ca-file ca.crt
 | ||||||
| ` | ` | ||||||
|  | @ -120,7 +120,7 @@ exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --ca-fil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "", "", "") | 	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 --kube-context dev repo add myRepo https://repo.example.com/
 | exec: helm --kube-context dev repo add myRepo https://repo.example.com/
 | ||||||
| ` | ` | ||||||
|  | @ -129,7 +129,7 @@ exec: helm --kube-context dev repo add myRepo https://repo.example.com/ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	helm.AddRepo("acrRepo", "", "", "", "", "", "", "acr") | 	helm.AddRepo("acrRepo", "", "", "", "", "", "", "acr", "") | ||||||
| 	expected = `Adding repo acrRepo (acr) | 	expected = `Adding repo acrRepo (acr) | ||||||
| exec: az acr helm repo add --name acrRepo | exec: az acr helm repo add --name acrRepo | ||||||
| exec: az acr helm repo add --name acrRepo:  | exec: az acr helm repo add --name acrRepo:  | ||||||
|  | @ -139,7 +139,7 @@ exec: az acr helm repo add --name acrRepo: | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	helm.AddRepo("otherRepo", "", "", "", "", "", "", "unknown") | 	helm.AddRepo("otherRepo", "", "", "", "", "", "", "unknown", "") | ||||||
| 	expected = `ERROR: unknown type 'unknown' for repository otherRepo | 	expected = `ERROR: unknown type 'unknown' for repository otherRepo | ||||||
| ` | ` | ||||||
| 	if buffer.String() != expected { | 	if buffer.String() != expected { | ||||||
|  | @ -147,7 +147,7 @@ exec: az acr helm repo add --name acrRepo: | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	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 --kube-context dev repo add myRepo https://repo.example.com/ --username example_user --password example_password
 | exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --username example_user --password example_password
 | ||||||
| ` | ` | ||||||
|  | @ -156,13 +156,23 @@ exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --userna | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	helm.AddRepo("", "https://repo.example.com/", "", "", "", "", "", "") | 	helm.AddRepo("", "https://repo.example.com/", "", "", "", "", "", "", "") | ||||||
| 	expected = `empty field name | 	expected = `empty field name | ||||||
| 
 | 
 | ||||||
| ` | ` | ||||||
| 	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) | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	buffer.Reset() | ||||||
|  | 	helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "example_user", "example_password", "", "true") | ||||||
|  | 	expected = `Adding repo myRepo https://repo.example.com/
 | ||||||
|  | exec: helm --kube-context dev repo add myRepo https://repo.example.com/ --username example_user --password example_password --pass-credentials
 | ||||||
|  | ` | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.AddRepo()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Test_UpdateRepo(t *testing.T) { | func Test_UpdateRepo(t *testing.T) { | ||||||
|  | @ -506,7 +516,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) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ type Interface interface { | ||||||
| 	SetExtraArgs(args ...string) | 	SetExtraArgs(args ...string) | ||||||
| 	SetHelmBinary(bin string) | 	SetHelmBinary(bin string) | ||||||
| 
 | 
 | ||||||
| 	AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string) error | 	AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials string) error | ||||||
| 	UpdateRepo() error | 	UpdateRepo() error | ||||||
| 	RegistryLogin(name string, username string, password string) error | 	RegistryLogin(name string, username string, password string) error | ||||||
| 	BuildDeps(name, chart string) error | 	BuildDeps(name, chart string) error | ||||||
|  |  | ||||||
|  | @ -172,6 +172,7 @@ type RepositorySpec struct { | ||||||
| 	Password        string `yaml:"password,omitempty"` | 	Password        string `yaml:"password,omitempty"` | ||||||
| 	Managed         string `yaml:"managed,omitempty"` | 	Managed         string `yaml:"managed,omitempty"` | ||||||
| 	OCI             bool   `yaml:"oci,omitempty"` | 	OCI             bool   `yaml:"oci,omitempty"` | ||||||
|  | 	PassCredentials string `yaml:"passCredentials,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ReleaseSpec defines the structure of a helm release
 | // ReleaseSpec defines the structure of a helm release
 | ||||||
|  | @ -392,7 +393,7 @@ func (st *HelmState) ApplyOverrides(spec *ReleaseSpec) { | ||||||
| 
 | 
 | ||||||
| type RepoUpdater interface { | type RepoUpdater interface { | ||||||
| 	IsHelm3() bool | 	IsHelm3() bool | ||||||
| 	AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string) error | 	AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials string) error | ||||||
| 	UpdateRepo() error | 	UpdateRepo() error | ||||||
| 	RegistryLogin(name string, username string, password string) error | 	RegistryLogin(name string, username string, password string) error | ||||||
| } | } | ||||||
|  | @ -441,7 +442,7 @@ func (st *HelmState) SyncRepos(helm RepoUpdater, shouldSkip map[string]bool) ([] | ||||||
| 				err = helm.RegistryLogin(repo.URL, username, password) | 				err = helm.RegistryLogin(repo.URL, username, password) | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			err = helm.AddRepo(repo.Name, repo.URL, repo.CaFile, repo.CertFile, repo.KeyFile, repo.Username, repo.Password, repo.Managed) | 			err = helm.AddRepo(repo.Name, repo.URL, repo.CaFile, repo.CertFile, repo.KeyFile, repo.Username, repo.Password, repo.Managed, repo.PassCredentials) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  |  | ||||||
|  | @ -889,10 +889,11 @@ func TestHelmState_SyncRepos(t *testing.T) { | ||||||
| 					KeyFile:         "", | 					KeyFile:         "", | ||||||
| 					Username:        "", | 					Username:        "", | ||||||
| 					Password:        "", | 					Password:        "", | ||||||
|  | 					PassCredentials: "", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm: &exectest.Helm{}, | 			helm: &exectest.Helm{}, | ||||||
| 			want: []string{"name", "http://example.com/", "", "", "", "", "", ""}, | 			want: []string{"name", "http://example.com/", "", "", "", "", "", "", ""}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name: "ACR hosted repository", | 			name: "ACR hosted repository", | ||||||
|  | @ -903,7 +904,7 @@ func TestHelmState_SyncRepos(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm: &exectest.Helm{}, | 			helm: &exectest.Helm{}, | ||||||
| 			want: []string{"name", "", "", "", "", "", "", "acr"}, | 			want: []string{"name", "", "", "", "", "", "", "acr", ""}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name: "repository with cert and key", | 			name: "repository with cert and key", | ||||||
|  | @ -915,10 +916,11 @@ func TestHelmState_SyncRepos(t *testing.T) { | ||||||
| 					KeyFile:         "keyfile", | 					KeyFile:         "keyfile", | ||||||
| 					Username:        "", | 					Username:        "", | ||||||
| 					Password:        "", | 					Password:        "", | ||||||
|  | 					PassCredentials: "", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm: &exectest.Helm{}, | 			helm: &exectest.Helm{}, | ||||||
| 			want: []string{"name", "http://example.com/", "", "certfile", "keyfile", "", "", ""}, | 			want: []string{"name", "http://example.com/", "", "certfile", "keyfile", "", "", "", ""}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name: "repository with ca file", | 			name: "repository with ca file", | ||||||
|  | @ -929,10 +931,11 @@ func TestHelmState_SyncRepos(t *testing.T) { | ||||||
| 					CaFile:          "cafile", | 					CaFile:          "cafile", | ||||||
| 					Username:        "", | 					Username:        "", | ||||||
| 					Password:        "", | 					Password:        "", | ||||||
|  | 					PassCredentials: "", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm: &exectest.Helm{}, | 			helm: &exectest.Helm{}, | ||||||
| 			want: []string{"name", "http://example.com/", "cafile", "", "", "", "", ""}, | 			want: []string{"name", "http://example.com/", "cafile", "", "", "", "", "", ""}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name: "repository with username and password", | 			name: "repository with username and password", | ||||||
|  | @ -944,10 +947,27 @@ func TestHelmState_SyncRepos(t *testing.T) { | ||||||
| 					KeyFile:         "", | 					KeyFile:         "", | ||||||
| 					Username:        "example_user", | 					Username:        "example_user", | ||||||
| 					Password:        "example_password", | 					Password:        "example_password", | ||||||
|  | 					PassCredentials: "", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm: &exectest.Helm{}, | 			helm: &exectest.Helm{}, | ||||||
| 			want: []string{"name", "http://example.com/", "", "", "", "example_user", "example_password", ""}, | 			want: []string{"name", "http://example.com/", "", "", "", "example_user", "example_password", "", ""}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "repository with username and password and pass-credentials", | ||||||
|  | 			repos: []RepositorySpec{ | ||||||
|  | 				{ | ||||||
|  | 					Name:            "name", | ||||||
|  | 					URL:             "http://example.com/", | ||||||
|  | 					CertFile:        "", | ||||||
|  | 					KeyFile:         "", | ||||||
|  | 					Username:        "example_user", | ||||||
|  | 					Password:        "example_password", | ||||||
|  | 					PassCredentials: "true", | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			helm: &exectest.Helm{}, | ||||||
|  | 			want: []string{"name", "http://example.com/", "", "", "", "example_user", "example_password", "", "true"}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	for i := range tests { | 	for i := range tests { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue