Support client certs when accessing remote repos (#47)

This is important for deployments where the chart repo is protected by client cert validation.

helmfile.yaml is extended to support `certFile` and `keyFile`:

```
 repositories:
   - name: roboll
     url: http://roboll.io/charts
    certFile: optional_client_cert
    keyFile: optional_client_key
```

Everything works the same if you don't provide values for them.

Regarding the implementation, the "helm repo add" command already supports the cert-file and key-file values, so we just have to pass them through.
This commit is contained in:
Greg Burton 2018-03-10 05:16:31 -08:00 committed by KUOKA Yusuke
parent e4961a8c34
commit 1ad426b338
4 changed files with 15 additions and 6 deletions

View File

@ -20,6 +20,8 @@ The default helmfile is `helmfile.yaml`:
repositories:
- name: roboll
url: http://roboll.io/charts
certFile: optional_client_cert
keyFile: optional_client_key
context: kube-context # kube-context (--kube-context)

View File

@ -30,8 +30,13 @@ func (helm *execer) SetExtraArgs(args ...string) {
helm.extra = args
}
func (helm *execer) AddRepo(name, repository string) error {
out, err := helm.exec("repo", "add", name, repository)
func (helm *execer) AddRepo(name, repository, certfile, keyfile string) error {
var args []string
args = append(args, "repo", "add", name, repository)
if certfile != "" && keyfile != "" {
args = append(args, "--cert-file", certfile, "--key-file", keyfile)
}
out, err := helm.exec(args...)
if helm.writer != nil {
helm.writer.Write(out)
}

View File

@ -3,7 +3,7 @@ package helmexec
type Interface interface {
SetExtraArgs(args ...string)
AddRepo(name, repository string) error
AddRepo(name, repository, certfile, keyfile string) error
UpdateRepo() error
SyncRelease(name, chart string, flags ...string) error

View File

@ -29,8 +29,10 @@ type HelmState struct {
}
type RepositorySpec struct {
Name string `yaml:"name"`
URL string `yaml:"url"`
Name string `yaml:"name"`
URL string `yaml:"url"`
CertFile string `yaml:"certFile"`
KeyFile string `yaml:"keyFile"`
}
type ReleaseSpec struct {
@ -127,7 +129,7 @@ func (state *HelmState) SyncRepos(helm helmexec.Interface) []error {
errs := []error{}
for _, repo := range state.Repositories {
if err := helm.AddRepo(repo.Name, repo.URL); err != nil {
if err := helm.AddRepo(repo.Name, repo.URL, repo.CertFile, repo.KeyFile); err != nil {
errs = append(errs, err)
}
}