feat: add insecure support for oci repo (#921)
* feat: add insecure support for oci repo Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
parent
67ab08ab5e
commit
cfa89d4040
|
|
@ -2445,7 +2445,7 @@ func (helm *mockHelmExec) ChartPull(chart string, path string, flags ...string)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (helm *mockHelmExec) ChartExport(chart string, path string, flags ...string) error {
|
func (helm *mockHelmExec) ChartExport(chart string, path string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2476,7 +2476,7 @@ func (helm *mockHelmExec) AddRepo(name, repository, cafile, certfile, keyfile, u
|
||||||
func (helm *mockHelmExec) UpdateRepo() error {
|
func (helm *mockHelmExec) UpdateRepo() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (helm *mockHelmExec) RegistryLogin(name string, username string, password string) error {
|
func (helm *mockHelmExec) RegistryLogin(name, username, password, caFile, certFile, keyFile string, skipTLSVerify bool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (helm *mockHelmExec) SyncRelease(context helmexec.HelmContext, name, chart string, flags ...string) error {
|
func (helm *mockHelmExec) SyncRelease(context helmexec.HelmContext, name, chart string, flags ...string) error {
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@ func (helm *Helm) AddRepo(name, repository, cafile, certfile, keyfile, username,
|
||||||
func (helm *Helm) UpdateRepo() error {
|
func (helm *Helm) UpdateRepo() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (helm *Helm) RegistryLogin(name string, username string, password string) error {
|
func (helm *Helm) RegistryLogin(name, username, password, caFile, certFile, keyFile string, skipTLSVerify bool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (helm *Helm) SyncRelease(context helmexec.HelmContext, name, chart string, flags ...string) error {
|
func (helm *Helm) SyncRelease(context helmexec.HelmContext, name, chart string, flags ...string) error {
|
||||||
|
|
@ -198,7 +198,7 @@ func (helm *Helm) TemplateRelease(name, chart string, flags ...string) error {
|
||||||
func (helm *Helm) ChartPull(chart string, path string, flags ...string) error {
|
func (helm *Helm) ChartPull(chart string, path string, flags ...string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (helm *Helm) ChartExport(chart string, path string, flags ...string) error {
|
func (helm *Helm) ChartExport(chart string, path string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (helm *Helm) IsHelm3() bool {
|
func (helm *Helm) IsHelm3() bool {
|
||||||
|
|
|
||||||
|
|
@ -205,18 +205,37 @@ func (helm *execer) UpdateRepo() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (helm *execer) RegistryLogin(repository string, username string, password string) error {
|
func (helm *execer) RegistryLogin(repository, username, password, caFile, certFile, keyFile string, skipTLSVerify bool) error {
|
||||||
helm.logger.Info("Logging in to registry")
|
if username == "" || password == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer := bytes.Buffer{}
|
||||||
args := []string{
|
args := []string{
|
||||||
"registry",
|
"registry",
|
||||||
"login",
|
"login",
|
||||||
repository,
|
repository,
|
||||||
"--username",
|
|
||||||
username,
|
|
||||||
"--password-stdin",
|
|
||||||
}
|
}
|
||||||
buffer := bytes.Buffer{}
|
helmVersionConstraint, _ := semver.NewConstraint(">= 3.12.0")
|
||||||
|
if helmVersionConstraint.Check(helm.version) {
|
||||||
|
// in the 3.12.0 version, the registry login support --key-file --cert-file and --ca-file
|
||||||
|
// https://github.com/helm/helm/releases/tag/v3.12.0
|
||||||
|
if certFile != "" && keyFile != "" {
|
||||||
|
args = append(args, "--cert-file", certFile, "--key-file", keyFile)
|
||||||
|
}
|
||||||
|
if caFile != "" {
|
||||||
|
args = append(args, "--ca-file", caFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if skipTLSVerify {
|
||||||
|
args = append(args, "--insecure")
|
||||||
|
}
|
||||||
|
|
||||||
|
args = append(args, "--username", username, "--password-stdin", password)
|
||||||
buffer.Write([]byte(fmt.Sprintf("%s\n", password)))
|
buffer.Write([]byte(fmt.Sprintf("%s\n", password)))
|
||||||
|
|
||||||
|
helm.logger.Info("Logging in to registry")
|
||||||
out, err := helm.execStdIn(args, map[string]string{"HELM_EXPERIMENTAL_OCI": "1"}, &buffer)
|
out, err := helm.execStdIn(args, map[string]string{"HELM_EXPERIMENTAL_OCI": "1"}, &buffer)
|
||||||
helm.info(out)
|
helm.info(out)
|
||||||
return err
|
return err
|
||||||
|
|
@ -468,15 +487,16 @@ func (helm *execer) ChartPull(chart string, path string, flags ...string) error
|
||||||
// https://github.com/helm/helm/releases/tag/v3.7.0
|
// https://github.com/helm/helm/releases/tag/v3.7.0
|
||||||
ociChartURL, ociChartTag := resolveOciChart(chart)
|
ociChartURL, ociChartTag := resolveOciChart(chart)
|
||||||
helmArgs = []string{"pull", ociChartURL, "--version", ociChartTag, "--destination", path, "--untar"}
|
helmArgs = []string{"pull", ociChartURL, "--version", ociChartTag, "--destination", path, "--untar"}
|
||||||
|
helmArgs = append(helmArgs, flags...)
|
||||||
} else {
|
} else {
|
||||||
helmArgs = []string{"chart", "pull", chart}
|
helmArgs = []string{"chart", "pull", chart}
|
||||||
}
|
}
|
||||||
out, err := helm.exec(append(helmArgs, flags...), map[string]string{"HELM_EXPERIMENTAL_OCI": "1"}, nil)
|
out, err := helm.exec(helmArgs, map[string]string{"HELM_EXPERIMENTAL_OCI": "1"}, nil)
|
||||||
helm.info(out)
|
helm.info(out)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (helm *execer) ChartExport(chart string, path string, flags ...string) error {
|
func (helm *execer) ChartExport(chart string, path string) error {
|
||||||
helmVersionConstraint, _ := semver.NewConstraint(">= 3.7.0")
|
helmVersionConstraint, _ := semver.NewConstraint(">= 3.7.0")
|
||||||
if helmVersionConstraint.Check(helm.version) {
|
if helmVersionConstraint.Check(helm.version) {
|
||||||
// in the 3.7.0 version, the chart export has been removed
|
// in the 3.7.0 version, the chart export has been removed
|
||||||
|
|
@ -486,7 +506,8 @@ func (helm *execer) ChartExport(chart string, path string, flags ...string) erro
|
||||||
var helmArgs []string
|
var helmArgs []string
|
||||||
helm.logger.Infof("Exporting %v", chart)
|
helm.logger.Infof("Exporting %v", chart)
|
||||||
helmArgs = []string{"chart", "export", chart, "--destination", path}
|
helmArgs = []string{"chart", "export", chart, "--destination", path}
|
||||||
out, err := helm.exec(append(helmArgs, flags...), map[string]string{"HELM_EXPERIMENTAL_OCI": "1"}, nil)
|
// no extra flags for before v3.7.0, details in helm chart export --help
|
||||||
|
out, err := helm.exec(helmArgs, map[string]string{"HELM_EXPERIMENTAL_OCI": "1"}, nil)
|
||||||
helm.info(out)
|
helm.info(out)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -755,7 +755,7 @@ func Test_ChartPull(t *testing.T) {
|
||||||
chartPath: "path1",
|
chartPath: "path1",
|
||||||
chartFlags: []string{"--untar", "--untardir", "/tmp/dir"},
|
chartFlags: []string{"--untar", "--untardir", "/tmp/dir"},
|
||||||
listResult: `Pulling chart
|
listResult: `Pulling chart
|
||||||
exec: helm --kube-context dev chart pull chart --untar --untardir /tmp/dir
|
exec: helm --kube-context dev chart pull chart
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -802,7 +802,6 @@ func Test_ChartExport(t *testing.T) {
|
||||||
helmVersion string
|
helmVersion string
|
||||||
chartName string
|
chartName string
|
||||||
chartPath string
|
chartPath string
|
||||||
chartFlags []string
|
|
||||||
listResult string
|
listResult string
|
||||||
expectedError string
|
expectedError string
|
||||||
}{
|
}{
|
||||||
|
|
@ -812,9 +811,8 @@ func Test_ChartExport(t *testing.T) {
|
||||||
helmVersion: "v3.6.0",
|
helmVersion: "v3.6.0",
|
||||||
chartName: "chart",
|
chartName: "chart",
|
||||||
chartPath: "path1",
|
chartPath: "path1",
|
||||||
chartFlags: []string{"--untar", "--untardir", "/tmp/dir"},
|
|
||||||
listResult: `Exporting chart
|
listResult: `Exporting chart
|
||||||
exec: helm --kube-context dev chart export chart --destination path1 --untar --untardir /tmp/dir
|
exec: helm --kube-context dev chart export chart --destination path1
|
||||||
`,
|
`,
|
||||||
expectedError: "",
|
expectedError: "",
|
||||||
},
|
},
|
||||||
|
|
@ -830,7 +828,7 @@ exec: helm --kube-context dev chart export chart --destination path1 --untar --u
|
||||||
kubeContext: "dev",
|
kubeContext: "dev",
|
||||||
runner: &mockRunner{},
|
runner: &mockRunner{},
|
||||||
}
|
}
|
||||||
err := helm.ChartExport(tt.chartName, tt.chartPath, tt.chartFlags...)
|
err := helm.ChartExport(tt.chartName, tt.chartPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ type Interface interface {
|
||||||
|
|
||||||
AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials, skipTLSVerify bool) error
|
AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials, skipTLSVerify bool) error
|
||||||
UpdateRepo() error
|
UpdateRepo() error
|
||||||
RegistryLogin(name string, username string, password string) error
|
RegistryLogin(name, username, password, caFile, certFile, keyFile string, skipTLSVerify bool) error
|
||||||
BuildDeps(name, chart string, flags ...string) error
|
BuildDeps(name, chart string, flags ...string) error
|
||||||
UpdateDeps(chart string) error
|
UpdateDeps(chart string) error
|
||||||
SyncRelease(context HelmContext, name, chart string, flags ...string) error
|
SyncRelease(context HelmContext, name, chart string, flags ...string) error
|
||||||
|
|
@ -26,7 +26,7 @@ type Interface interface {
|
||||||
TemplateRelease(name, chart string, flags ...string) error
|
TemplateRelease(name, chart string, flags ...string) error
|
||||||
Fetch(chart string, flags ...string) error
|
Fetch(chart string, flags ...string) error
|
||||||
ChartPull(chart string, path string, flags ...string) error
|
ChartPull(chart string, path string, flags ...string) error
|
||||||
ChartExport(chart string, path string, flags ...string) error
|
ChartExport(chart string, path string) error
|
||||||
Lint(name, chart string, flags ...string) error
|
Lint(name, chart string, flags ...string) error
|
||||||
ReleaseStatus(context HelmContext, name string, flags ...string) error
|
ReleaseStatus(context HelmContext, name string, flags ...string) error
|
||||||
DeleteRelease(context HelmContext, name string, flags ...string) error
|
DeleteRelease(context HelmContext, name string, flags ...string) error
|
||||||
|
|
|
||||||
|
|
@ -501,7 +501,7 @@ type RepoUpdater interface {
|
||||||
IsHelm3() bool
|
IsHelm3() bool
|
||||||
AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials, skipTLSVerify bool) error
|
AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials, skipTLSVerify bool) error
|
||||||
UpdateRepo() error
|
UpdateRepo() error
|
||||||
RegistryLogin(name string, username string, password string) error
|
RegistryLogin(name, username, password, caFile, certFile, keyFile string, skipTLSVerify bool) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *HelmState) SyncRepos(helm RepoUpdater, shouldSkip map[string]bool) ([]string, error) {
|
func (st *HelmState) SyncRepos(helm RepoUpdater, shouldSkip map[string]bool) ([]string, error) {
|
||||||
|
|
@ -514,9 +514,7 @@ func (st *HelmState) SyncRepos(helm RepoUpdater, shouldSkip map[string]bool) ([]
|
||||||
username, password := gatherUsernamePassword(repo.Name, repo.Username, repo.Password)
|
username, password := gatherUsernamePassword(repo.Name, repo.Username, repo.Password)
|
||||||
var err error
|
var err error
|
||||||
if repo.OCI {
|
if repo.OCI {
|
||||||
if username != "" && password != "" {
|
err = helm.RegistryLogin(repo.URL, username, password, repo.CaFile, repo.CertFile, repo.KeyFile, repo.SkipTLSVerify)
|
||||||
err = helm.RegistryLogin(repo.URL, username, password)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
err = helm.AddRepo(repo.Name, repo.URL, repo.CaFile, repo.CertFile, repo.KeyFile, username, password, repo.Managed, repo.PassCredentials, repo.SkipTLSVerify)
|
err = helm.AddRepo(repo.Name, repo.URL, repo.CaFile, repo.CertFile, repo.KeyFile, username, password, repo.Managed, repo.PassCredentials, repo.SkipTLSVerify)
|
||||||
}
|
}
|
||||||
|
|
@ -3481,10 +3479,25 @@ func (st *HelmState) getOCIChart(release *ReleaseSpec, tempDir string, helm helm
|
||||||
if st.fs.DirectoryExistsAt(chartPath) {
|
if st.fs.DirectoryExistsAt(chartPath) {
|
||||||
st.logger.Debugf("chart already exists at %s", chartPath)
|
st.logger.Debugf("chart already exists at %s", chartPath)
|
||||||
} else {
|
} else {
|
||||||
err := helm.ChartPull(qualifiedChartName, chartPath)
|
flags := []string{}
|
||||||
|
repo, _ := st.GetRepositoryAndNameFromChartName(release.Chart)
|
||||||
|
if repo != nil {
|
||||||
|
if repo.CaFile != "" {
|
||||||
|
flags = append(flags, "--ca-file", repo.CaFile)
|
||||||
|
}
|
||||||
|
if repo.CertFile != "" && repo.KeyFile != "" {
|
||||||
|
flags = append(flags, "--cert-file", repo.CertFile, "--key-file", repo.KeyFile)
|
||||||
|
}
|
||||||
|
if repo.SkipTLSVerify {
|
||||||
|
flags = append(flags, "--insecure-skip-tls-verify")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err := helm.ChartPull(qualifiedChartName, chartPath, flags...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = helm.ChartExport(qualifiedChartName, chartPath)
|
err = helm.ChartExport(qualifiedChartName, chartPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ func (helm *noCallHelmExec) ChartPull(chart string, path string, flags ...string
|
||||||
helm.doPanic()
|
helm.doPanic()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (helm *noCallHelmExec) ChartExport(chart string, path string, flags ...string) error {
|
func (helm *noCallHelmExec) ChartExport(chart string, path string) error {
|
||||||
helm.doPanic()
|
helm.doPanic()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -85,7 +85,7 @@ func (helm *noCallHelmExec) UpdateRepo() error {
|
||||||
helm.doPanic()
|
helm.doPanic()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (helm *noCallHelmExec) RegistryLogin(name string, username string, password string) error {
|
func (helm *noCallHelmExec) RegistryLogin(name, username, password, caFile, certFile, keyFile string, skipTLSVerify bool) error {
|
||||||
helm.doPanic()
|
helm.doPanic()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue