update remote fetch logic
Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
		
							parent
							
								
									9c05f999e6
								
							
						
					
					
						commit
						ff48be2534
					
				|  | @ -251,6 +251,10 @@ releases: | ||||||
|     # Values files used for rendering the chart |     # Values files used for rendering the chart | ||||||
|     values: |     values: | ||||||
|       # Value files passed via --values |       # Value files passed via --values | ||||||
|  |       # `go-getter`-style URLs are supported. See https://helmfile.readthedocs.io/en/latest/#loading-remote-environment-values-files  | ||||||
|  |       - git::https://gitlab.com/org/repository-name.git@/config/values-remote.yaml?ref=main | ||||||
|  |       - https://raw.githubusercontent.com/helmfile/testdata/main/remote-values/value.yaml | ||||||
|  | 
 | ||||||
|       - vault.yaml |       - vault.yaml | ||||||
|       # Inline values, passed via a temporary values file and --values, so that it doesn't suffer from type issues like --set |       # Inline values, passed via a temporary values file and --values, so that it doesn't suffer from type issues like --set | ||||||
|       - address: https://vault.example.com |       - address: https://vault.example.com | ||||||
|  | @ -967,12 +971,13 @@ You can read more infos about the feature proposal [here](https://github.com/rob | ||||||
| 
 | 
 | ||||||
| ### Loading remote Environment values files | ### Loading remote Environment values files | ||||||
| 
 | 
 | ||||||
| Since Helmfile v0.118.8, you can use `go-getter`-style URLs to refer to remote values files: | Since Helmfile v0.118.8, you can use `go-getter`-style URLs to refer to remote values files. We use `@` to separate dir and the file path. This is a good idea borrowed from [helm-git](https://github.com/aslafy-z/helm-git) : | ||||||
| 
 | 
 | ||||||
| ```yaml | ```yaml | ||||||
| environments: | environments: | ||||||
|   cluster-azure-us-west: |   cluster-azure-us-west: | ||||||
|     values: |     values: | ||||||
|  |       - https://raw.githubusercontent.com/helmfile/testdata/main/remote-values/value.yaml # common http url | ||||||
|       - git::https://git.company.org/helmfiles/global/azure.yaml?ref=master |       - git::https://git.company.org/helmfiles/global/azure.yaml?ref=master | ||||||
|       - git::https://git.company.org/helmfiles/global/us-west.yaml?ref=master |       - git::https://git.company.org/helmfiles/global/us-west.yaml?ref=master | ||||||
|       - git::https://gitlab.com/org/repository-name.git@/config/config.test.yaml?ref=main # Public Gilab Repo |       - git::https://gitlab.com/org/repository-name.git@/config/config.test.yaml?ref=main # Public Gilab Repo | ||||||
|  |  | ||||||
|  | @ -198,7 +198,7 @@ func (r *Remote) Fetch(path string, cacheDirOpt ...string) (string, error) { | ||||||
| 	r.Logger.Debugf("remote> user: %s", u.User) | 	r.Logger.Debugf("remote> user: %s", u.User) | ||||||
| 	r.Logger.Debugf("remote> host: %s", u.Host) | 	r.Logger.Debugf("remote> host: %s", u.Host) | ||||||
| 	r.Logger.Debugf("remote> dir: %s", u.Dir) | 	r.Logger.Debugf("remote> dir: %s", u.Dir) | ||||||
| 	r.Logger.Debugf("remote> file: %s", u.File) | 	r.Logger.Debugf("remote> file: %s", file) | ||||||
| 
 | 
 | ||||||
| 	// This should be shared across variant commands, so that they can share cache for the shared imports
 | 	// This should be shared across variant commands, so that they can share cache for the shared imports
 | ||||||
| 	cacheBaseDir := "" | 	cacheBaseDir := "" | ||||||
|  | @ -237,24 +237,26 @@ func (r *Remote) Fetch(path string, cacheDirOpt ...string) (string, error) { | ||||||
| 		cacheDirPath = filepath.Join(r.Home, cacheKey, u.Dir) | 		cacheDirPath = filepath.Join(r.Home, cacheKey, u.Dir) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// origin is for judging whether target is file or directory
 | ||||||
|  | 	// e.g. os.CacheDir()/helmfile/https_github_com_cloudposse_helmfiles_git.ref=0.xx.0/origin
 | ||||||
|  | 	originDirOrFilePath := filepath.Join(cacheDirPath, "origin") | ||||||
|  | 
 | ||||||
| 	r.Logger.Debugf("remote> home: %s", r.Home) | 	r.Logger.Debugf("remote> home: %s", r.Home) | ||||||
| 	r.Logger.Debugf("remote> getter dest: %s", getterDst) | 	r.Logger.Debugf("remote> getter dest: %s", getterDst) | ||||||
| 	r.Logger.Debugf("remote> cached dir: %s", cacheDirPath) | 	r.Logger.Debugf("remote> cached dir: %s", cacheDirPath) | ||||||
| 
 | 
 | ||||||
| 	{ | 	if r.fs.FileExistsAt(cacheDirPath) { | ||||||
| 		if r.fs.FileExistsAt(cacheDirPath) { | 		return "", fmt.Errorf("%s is not directory. please remove it so that variant could use it for dependency caching", getterDst) | ||||||
| 			return "", fmt.Errorf("%s is not directory. please remove it so that variant could use it for dependency caching", getterDst) | 	} | ||||||
| 		} |  | ||||||
| 
 | 
 | ||||||
| 		if u.Getter == "normal" { | 	if u.Getter == "normal" { | ||||||
| 			cachedFilePath := filepath.Join(cacheDirPath, file) | 		cachedFilePath := filepath.Join(cacheDirPath, file) | ||||||
| 			ok, err := r.fs.FileExists(cachedFilePath) | 		ok, err := r.fs.FileExists(cachedFilePath) | ||||||
| 			if err == nil && ok { | 		if err == nil && ok { | ||||||
| 				cached = true |  | ||||||
| 			} |  | ||||||
| 		} else if r.fs.DirectoryExistsAt(cacheDirPath) { |  | ||||||
| 			cached = true | 			cached = true | ||||||
| 		} | 		} | ||||||
|  | 	} else if r.fs.DirectoryExistsAt(cacheDirPath) { | ||||||
|  | 		cached = true | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if !cached { | 	if !cached { | ||||||
|  | @ -296,7 +298,7 @@ func (r *Remote) Fetch(path string, cacheDirOpt ...string) (string, error) { | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return filepath.Join(cacheDirPath, file), nil | 	return filepath.Join(originDirOrFilePath, file), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Getter interface { | type Getter interface { | ||||||
|  | @ -318,13 +320,15 @@ type HttpGetter struct { | ||||||
| func (g *GoGetter) Get(wd, src, dst string) error { | func (g *GoGetter) Get(wd, src, dst string) error { | ||||||
| 	ctx := context.Background() | 	ctx := context.Background() | ||||||
| 
 | 
 | ||||||
|  | 	opts := []getter.ClientOption{} | ||||||
|  | 
 | ||||||
| 	get := &getter.Client{ | 	get := &getter.Client{ | ||||||
| 		Ctx:     ctx, | 		Ctx:     ctx, | ||||||
| 		Src:     src, | 		Src:     src, | ||||||
| 		Dst:     dst, | 		Dst:     dst, | ||||||
| 		Pwd:     wd, | 		Pwd:     wd, | ||||||
| 		Mode:    getter.ClientModeDir, | 		Mode:    getter.ClientModeAny, | ||||||
| 		Options: []getter.ClientOption{}, | 		Options: opts, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	g.Logger.Debugf("client: %+v", *get) | 	g.Logger.Debugf("client: %+v", *get) | ||||||
|  |  | ||||||
|  | @ -7,7 +7,9 @@ import ( | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	"github.com/google/go-cmp/cmp" | 	"github.com/google/go-cmp/cmp" | ||||||
|  | 	"github.com/stretchr/testify/require" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/helmfile/helmfile/pkg/filesystem" | ||||||
| 	"github.com/helmfile/helmfile/pkg/helmexec" | 	"github.com/helmfile/helmfile/pkg/helmexec" | ||||||
| 	"github.com/helmfile/helmfile/pkg/testhelper" | 	"github.com/helmfile/helmfile/pkg/testhelper" | ||||||
| ) | ) | ||||||
|  | @ -17,7 +19,7 @@ func TestRemote_HttpsGitHub(t *testing.T) { | ||||||
| 		CacheDir(): "", | 		CacheDir(): "", | ||||||
| 	} | 	} | ||||||
| 	cachefs := map[string]string{ | 	cachefs := map[string]string{ | ||||||
| 		filepath.Join(CacheDir(), "https_github_com_cloudposse_helmfiles_git.ref=0.40.0/releases/kiam.yaml"): "foo: bar", | 		filepath.Join(CacheDir(), "https_github_com_cloudposse_helmfiles_git.ref=0.40.0/origin/releases/kiam.yaml"): "foo: bar", | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	testcases := []struct { | 	testcases := []struct { | ||||||
|  | @ -45,6 +47,8 @@ func TestRemote_HttpsGitHub(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 				hit = false | 				hit = false | ||||||
| 
 | 
 | ||||||
|  | 				testfs.AddFiles(cachefs) | ||||||
|  | 
 | ||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -70,7 +74,7 @@ func TestRemote_HttpsGitHub(t *testing.T) { | ||||||
| 				t.Fatalf("unexpected error: %v", err) | 				t.Fatalf("unexpected error: %v", err) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			expectedFile := filepath.Join(CacheDir(), "https_github_com_cloudposse_helmfiles_git.ref=0.40.0/releases/kiam.yaml") | 			expectedFile := filepath.Join(CacheDir(), "https_github_com_cloudposse_helmfiles_git.ref=0.40.0/origin/releases/kiam.yaml") | ||||||
| 			if file != expectedFile { | 			if file != expectedFile { | ||||||
| 				t.Errorf("unexpected file located: %s vs expected: %s", file, expectedFile) | 				t.Errorf("unexpected file located: %s vs expected: %s", file, expectedFile) | ||||||
| 			} | 			} | ||||||
|  | @ -90,7 +94,7 @@ func TestRemote_SShGitHub(t *testing.T) { | ||||||
| 		CacheDir(): "", | 		CacheDir(): "", | ||||||
| 	} | 	} | ||||||
| 	cachefs := map[string]string{ | 	cachefs := map[string]string{ | ||||||
| 		filepath.Join(CacheDir(), "ssh_github_com_helmfile_helmfiles_git.ref=0.40.0/releases/kiam.yaml"): "foo: bar", | 		filepath.Join(CacheDir(), "ssh_github_com_cloudposse_helmfiles_git.ref=0.40.0/origin/releases/kiam.yaml"): "foo: bar", | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	testcases := []struct { | 	testcases := []struct { | ||||||
|  | @ -118,6 +122,8 @@ func TestRemote_SShGitHub(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 				hit = false | 				hit = false | ||||||
| 
 | 
 | ||||||
|  | 				testfs.AddFiles(cachefs) | ||||||
|  | 
 | ||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -137,7 +143,7 @@ func TestRemote_SShGitHub(t *testing.T) { | ||||||
| 				t.Fatalf("unexpected error: %v", err) | 				t.Fatalf("unexpected error: %v", err) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			expectedFile := filepath.Join(CacheDir(), "ssh_github_com_helmfile_helmfiles_git.ref=0.40.0/releases/kiam.yaml") | 			expectedFile := filepath.Join(CacheDir(), "ssh_github_com_cloudposse_helmfiles_git.ref=0.40.0/origin/releases/kiam.yaml") | ||||||
| 			if file != expectedFile { | 			if file != expectedFile { | ||||||
| 				t.Errorf("unexpected file located: %s vs expected: %s", file, expectedFile) | 				t.Errorf("unexpected file located: %s vs expected: %s", file, expectedFile) | ||||||
| 			} | 			} | ||||||
|  | @ -157,7 +163,7 @@ func TestRemote_SShGitHub_WithSshKey(t *testing.T) { | ||||||
| 		CacheDir(): "", | 		CacheDir(): "", | ||||||
| 	} | 	} | ||||||
| 	cachefs := map[string]string{ | 	cachefs := map[string]string{ | ||||||
| 		filepath.Join(CacheDir(), "ssh_github_com_helmfile_helmfiles_git.ref=0.40.0_sshkey=redacted/releases/kiam.yaml"): "foo: bar", | 		filepath.Join(CacheDir(), "ssh_github_com_cloudposse_helmfiles_git.ref=0.40.0_sshkey=redacted/origin/releases/kiam.yaml"): "foo: bar", | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	testcases := []struct { | 	testcases := []struct { | ||||||
|  | @ -185,6 +191,8 @@ func TestRemote_SShGitHub_WithSshKey(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 				hit = false | 				hit = false | ||||||
| 
 | 
 | ||||||
|  | 				testfs.AddFiles(cachefs) | ||||||
|  | 
 | ||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -204,7 +212,7 @@ func TestRemote_SShGitHub_WithSshKey(t *testing.T) { | ||||||
| 				t.Fatalf("unexpected error: %v", err) | 				t.Fatalf("unexpected error: %v", err) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			expectedFile := filepath.Join(CacheDir(), "ssh_github_com_helmfile_helmfiles_git.ref=0.40.0_sshkey=redacted/releases/kiam.yaml") | 			expectedFile := filepath.Join(CacheDir(), "ssh_github_com_cloudposse_helmfiles_git.ref=0.40.0_sshkey=redacted/origin/releases/kiam.yaml") | ||||||
| 			if file != expectedFile { | 			if file != expectedFile { | ||||||
| 				t.Errorf("unexpected file located: %s vs expected: %s", file, expectedFile) | 				t.Errorf("unexpected file located: %s vs expected: %s", file, expectedFile) | ||||||
| 			} | 			} | ||||||
|  | @ -297,6 +305,7 @@ func TestParse(t *testing.T) { | ||||||
| 		dir    string | 		dir    string | ||||||
| 		file   string | 		file   string | ||||||
| 		query  string | 		query  string | ||||||
|  | 		user   string | ||||||
| 		err    string | 		err    string | ||||||
| 	}{ | 	}{ | ||||||
| 		{ | 		{ | ||||||
|  | @ -312,6 +321,24 @@ func TestParse(t *testing.T) { | ||||||
| 			dir:    "/stakater/Forecastle.git", | 			dir:    "/stakater/Forecastle.git", | ||||||
| 			file:   "deployments/kubernetes/chart/forecastle", | 			file:   "deployments/kubernetes/chart/forecastle", | ||||||
| 			query:  "ref=v1.0.54", | 			query:  "ref=v1.0.54", | ||||||
|  | 			user:   "user:password", | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:   "remote path with full args", | ||||||
|  | 			input:  "git::https://user:password@github.com/stakater/Forecastle.git@deployments/kubernetes/chart/forecastle?ref=v1.0.54", | ||||||
|  | 			getter: "git", | ||||||
|  | 			scheme: "https", | ||||||
|  | 			dir:    "/stakater/Forecastle.git", | ||||||
|  | 			file:   "deployments/kubernetes/chart/forecastle", | ||||||
|  | 			query:  "ref=v1.0.54", | ||||||
|  | 			user:   "user:password", | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:   "remote path with no file", | ||||||
|  | 			input:  "git::https://github.com/stakater/Forecastle.git", | ||||||
|  | 			getter: "git", | ||||||
|  | 			scheme: "https", | ||||||
|  | 			dir:    "/stakater/Forecastle.git", | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:   "s3 scheme", | 			name:   "s3 scheme", | ||||||
|  | @ -391,13 +418,14 @@ func TestParse(t *testing.T) { | ||||||
| 				t.Fatalf("Unexpected error:\n%s", diff) | 				t.Fatalf("Unexpected error:\n%s", diff) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			var getter, scheme, dir, file, query string | 			var getter, scheme, dir, file, query, user string | ||||||
| 			if src != nil { | 			if src != nil { | ||||||
| 				getter = src.Getter | 				getter = src.Getter | ||||||
| 				scheme = src.Scheme | 				scheme = src.Scheme | ||||||
| 				dir = src.Dir | 				dir = src.Dir | ||||||
| 				file = src.File | 				file = src.File | ||||||
| 				query = src.RawQuery | 				query = src.RawQuery | ||||||
|  | 				user = src.User | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if diff := cmp.Diff(tt.getter, getter); diff != "" { | 			if diff := cmp.Diff(tt.getter, getter); diff != "" { | ||||||
|  | @ -419,6 +447,9 @@ func TestParse(t *testing.T) { | ||||||
| 			if diff := cmp.Diff(tt.query, query); diff != "" { | 			if diff := cmp.Diff(tt.query, query); diff != "" { | ||||||
| 				t.Fatalf("Unexpected query:\n%s", diff) | 				t.Fatalf("Unexpected query:\n%s", diff) | ||||||
| 			} | 			} | ||||||
|  | 			if diff := cmp.Diff(tt.user, user); diff != "" { | ||||||
|  | 				t.Fatalf("Unexpected user:\n%s", diff) | ||||||
|  | 			} | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -436,7 +467,7 @@ func TestRemote_Fetch(t *testing.T) { | ||||||
| 		CacheDir(): "", | 		CacheDir(): "", | ||||||
| 	} | 	} | ||||||
| 	cachefs := map[string]string{ | 	cachefs := map[string]string{ | ||||||
| 		filepath.Join(CacheDir(), "https_github_com_helmfile_helmfile_git.ref=v0.151.0/README.md"): "foo: bar", | 		filepath.Join(CacheDir(), "https_github_com_helmfile_helmfile_git.ref=v0.151.0/origin/README.md"): "foo: bar", | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	testcases := []struct { | 	testcases := []struct { | ||||||
|  | @ -467,6 +498,8 @@ func TestRemote_Fetch(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 				hit = false | 				hit = false | ||||||
| 
 | 
 | ||||||
|  | 				testfs.AddFiles(cachefs) | ||||||
|  | 
 | ||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -486,7 +519,7 @@ func TestRemote_Fetch(t *testing.T) { | ||||||
| 				t.Fatalf("unexpected error: %v", err) | 				t.Fatalf("unexpected error: %v", err) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			expectedFile := filepath.Join(CacheDir(), "https_github_com_helmfile_helmfile_git.ref=v0.151.0/README.md") | 			expectedFile := filepath.Join(CacheDir(), "https_github_com_helmfile_helmfile_git.ref=v0.151.0/origin/README.md") | ||||||
| 			if file != expectedFile { | 			if file != expectedFile { | ||||||
| 				t.Errorf("unexpected file located: %s vs expected: %s", file, expectedFile) | 				t.Errorf("unexpected file located: %s vs expected: %s", file, expectedFile) | ||||||
| 			} | 			} | ||||||
|  | @ -500,3 +533,53 @@ func TestRemote_Fetch(t *testing.T) { | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func TestRemote_CommonHttpUrl(t *testing.T) { | ||||||
|  | 	testcases := []struct { | ||||||
|  | 		name   string | ||||||
|  | 		input  string | ||||||
|  | 		rpath  string | ||||||
|  | 		errStr string | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			name:  "common git url", | ||||||
|  | 			input: "git::https://github.com/helmfile/helmfile.git?ref=v0.153.1", | ||||||
|  | 			rpath: filepath.Join(CacheDir(), "https_github_com_helmfile_helmfile_git.ref=v0.153.1/origin"), | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:  "common git url with exist subpath", | ||||||
|  | 			input: "git::https://github.com/dragonflyoss/helm-charts.git@charts?ref=dragonfly-1.0.2", | ||||||
|  | 			rpath: filepath.Join(CacheDir(), "https_github_com_dragonflyoss_helm-charts_git.ref=dragonfly-1.0.2/origin/charts"), | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:  "common git url with no-exist subpath", | ||||||
|  | 			input: "git::https://github.com/dragonflyoss/helm-charts.git@no-existcharts?ref=dragonfly-1.0.2", | ||||||
|  | 			rpath: filepath.Join(CacheDir(), "https_github_com_dragonflyoss_helm-charts_git.ref=dragonfly-1.0.2/origin/no-existcharts"), | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:  "common http url", | ||||||
|  | 			input: "https://raw.githubusercontent.com/helmfile/testdata/main/remote-values/value.yaml", | ||||||
|  | 			rpath: filepath.Join(CacheDir(), "https_raw_githubusercontent_com_helmfile_testdata_main_remote-values_value_yaml/origin"), | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:   "common http no-exist url", | ||||||
|  | 			input:  "https://raw.githubusercontent.com/helmfile/testdata/main/remote-values/no-exist-value.yaml", | ||||||
|  | 			errStr: "get: bad response code: 404", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, tt := range testcases { | ||||||
|  | 		t.Run(tt.name, func(t *testing.T) { | ||||||
|  | 			remote := NewRemote(helmexec.NewLogger(io.Discard, "debug"), CacheDir(), filesystem.DefaultFileSystem()) | ||||||
|  | 
 | ||||||
|  | 			rPath, err := remote.Fetch(tt.input) | ||||||
|  | 			errStr := "" | ||||||
|  | 			if err != nil { | ||||||
|  | 				errStr = err.Error() | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			require.Equalf(t, tt.errStr, errStr, "unexpected error: %s", err) | ||||||
|  | 			require.Equalf(t, tt.rpath, rPath, "unexpected rpath: %s", rPath) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/helmfile/chartify" | 	"github.com/helmfile/chartify" | ||||||
| 
 | 
 | ||||||
|  | @ -134,6 +135,9 @@ func (st *HelmState) goGetterChart(chart, dir, cacheDir string, force bool) (str | ||||||
| 		chart = dir | 		chart = dir | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if strings.HasPrefix(chart, "oci://") { | ||||||
|  | 		return chart, nil | ||||||
|  | 	} | ||||||
| 	_, err := remote.Parse(chart) | 	_, err := remote.Parse(chart) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if force { | 		if force { | ||||||
|  |  | ||||||
|  | @ -42,7 +42,7 @@ func TestStorage_resolveFile(t *testing.T) { | ||||||
| 			wantErr:     false, | 			wantErr:     false, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name: "non existing file in repo produce skip", | 			name: "non existing file in repo produce non skip", | ||||||
| 			args: args{ | 			args: args{ | ||||||
| 				path:               "git::https://github.com/helmfile/helmfile.git@examples/values/non-existing-file.yaml?ref=v0.145.2", | 				path:               "git::https://github.com/helmfile/helmfile.git@examples/values/non-existing-file.yaml?ref=v0.145.2", | ||||||
| 				title:              "values", | 				title:              "values", | ||||||
|  | @ -107,7 +107,7 @@ func TestStorage_resolveFile(t *testing.T) { | ||||||
| 				title:              "values", | 				title:              "values", | ||||||
| 				missingFileHandler: &infoHandler, | 				missingFileHandler: &infoHandler, | ||||||
| 			}, | 			}, | ||||||
| 			wantFiles:   []string{fmt.Sprintf("%s/%s", cacheDir, "values/https_github_com_helmfile_helmfile_git.ref=v0.145.2/examples/values/replica-values.yaml")}, | 			wantFiles:   []string{fmt.Sprintf("%s/%s", cacheDir, "values/https_github_com_helmfile_helmfile_git.ref=v0.145.2/origin/examples/values/replica-values.yaml")}, | ||||||
| 			wantSkipped: false, | 			wantSkipped: false, | ||||||
| 			wantErr:     false, | 			wantErr:     false, | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|  | @ -22,16 +22,21 @@ type TestFs struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewTestFs(files map[string]string) *TestFs { | func NewTestFs(files map[string]string) *TestFs { | ||||||
| 	dirs := map[string]bool{} | 	fsDirs := map[string]bool{} | ||||||
| 	for abs := range files { | 	for abs := range files { | ||||||
| 		for d := filepath.ToSlash(filepath.Dir(abs)); !dirs[d]; d = filepath.ToSlash(filepath.Dir(d)) { | 		for d := filepath.ToSlash(filepath.Dir(abs)); !fsDirs[d]; d = filepath.ToSlash(filepath.Dir(d)) { | ||||||
| 			dirs[d] = true | 			fsDirs[d] = true | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	fsFiles := map[string]string{} | ||||||
|  | 
 | ||||||
|  | 	for abs, content := range files { | ||||||
|  | 		fsFiles[filepath.ToSlash(abs)] = content | ||||||
|  | 	} | ||||||
| 	return &TestFs{ | 	return &TestFs{ | ||||||
| 		Cwd:   "/path/to", | 		Cwd:   "/path/to", | ||||||
| 		dirs:  dirs, | 		dirs:  fsDirs, | ||||||
| 		files: files, | 		files: fsFiles, | ||||||
| 
 | 
 | ||||||
| 		successfulReads: []string{}, | 		successfulReads: []string{}, | ||||||
| 
 | 
 | ||||||
|  | @ -155,3 +160,20 @@ func (f *TestFs) Chdir(dir string) error { | ||||||
| 	} | 	} | ||||||
| 	return fmt.Errorf("unexpected chdir \"%s\"", dir) | 	return fmt.Errorf("unexpected chdir \"%s\"", dir) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (f *TestFs) AddFiles(files map[string]string) { | ||||||
|  | 	dirs := map[string]bool{} | ||||||
|  | 	for abs := range files { | ||||||
|  | 		for d := filepath.ToSlash(filepath.Dir(abs)); !dirs[d]; d = filepath.ToSlash(filepath.Dir(d)) { | ||||||
|  | 			dirs[d] = true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for k, v := range files { | ||||||
|  | 		f.files[k] = v | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for k, v := range dirs { | ||||||
|  | 		f.dirs[k] = v | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| localDockerRegistry: | localDockerRegistry: | ||||||
|   enabled: true |   enabled: true | ||||||
|   port: 5000 |   port: 5000 | ||||||
| chartifyTempDir: temp2 | chartifyTempDir: oci_chart_url_fetch | ||||||
| helmfileArgs: | helmfileArgs: | ||||||
| - fetch | - fetch | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue