Upgrade k8s package verison (#5358)
* upgrade k8s package version Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io> * Script upgrade and code formatting. Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io> Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io>
This commit is contained in:
174
vendor/helm.sh/helm/v3/pkg/downloader/manager.go
vendored
174
vendor/helm.sh/helm/v3/pkg/downloader/manager.go
vendored
@@ -34,7 +34,6 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
"sigs.k8s.io/yaml"
|
||||
|
||||
"helm.sh/helm/v3/internal/experimental/registry"
|
||||
"helm.sh/helm/v3/internal/resolver"
|
||||
"helm.sh/helm/v3/internal/third_party/dep/fs"
|
||||
"helm.sh/helm/v3/internal/urlutil"
|
||||
@@ -43,6 +42,7 @@ import (
|
||||
"helm.sh/helm/v3/pkg/chartutil"
|
||||
"helm.sh/helm/v3/pkg/getter"
|
||||
"helm.sh/helm/v3/pkg/helmpath"
|
||||
"helm.sh/helm/v3/pkg/registry"
|
||||
"helm.sh/helm/v3/pkg/repo"
|
||||
)
|
||||
|
||||
@@ -232,7 +232,7 @@ func (m *Manager) loadChartDir() (*chart.Chart, error) {
|
||||
//
|
||||
// This returns a lock file, which has all of the dependencies normalized to a specific version.
|
||||
func (m *Manager) resolve(req []*chart.Dependency, repoNames map[string]string) (*chart.Lock, error) {
|
||||
res := resolver.New(m.ChartPath, m.RepositoryCache)
|
||||
res := resolver.New(m.ChartPath, m.RepositoryCache, m.RegistryClient)
|
||||
return res.Resolve(req, repoNames)
|
||||
}
|
||||
|
||||
@@ -249,22 +249,24 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
||||
destPath := filepath.Join(m.ChartPath, "charts")
|
||||
tmpPath := filepath.Join(m.ChartPath, "tmpcharts")
|
||||
|
||||
// Create 'charts' directory if it doesn't already exist.
|
||||
if fi, err := os.Stat(destPath); err != nil {
|
||||
// Check if 'charts' directory is not actally a directory. If it does not exist, create it.
|
||||
if fi, err := os.Stat(destPath); err == nil {
|
||||
if !fi.IsDir() {
|
||||
return errors.Errorf("%q is not a directory", destPath)
|
||||
}
|
||||
} else if os.IsNotExist(err) {
|
||||
if err := os.MkdirAll(destPath, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
} else if !fi.IsDir() {
|
||||
return errors.Errorf("%q is not a directory", destPath)
|
||||
} else {
|
||||
return fmt.Errorf("unable to retrieve file info for '%s': %v", destPath, err)
|
||||
}
|
||||
|
||||
if err := fs.RenameWithFallback(destPath, tmpPath); err != nil {
|
||||
return errors.Wrap(err, "unable to move current charts to tmp dir")
|
||||
}
|
||||
|
||||
if err := os.MkdirAll(destPath, 0755); err != nil {
|
||||
// Prepare tmpPath
|
||||
if err := os.MkdirAll(tmpPath, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
defer os.RemoveAll(tmpPath)
|
||||
|
||||
fmt.Fprintf(m.Out, "Saving %d charts\n", len(deps))
|
||||
var saveError error
|
||||
@@ -273,24 +275,25 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
||||
// No repository means the chart is in charts directory
|
||||
if dep.Repository == "" {
|
||||
fmt.Fprintf(m.Out, "Dependency %s did not declare a repository. Assuming it exists in the charts directory\n", dep.Name)
|
||||
chartPath := filepath.Join(tmpPath, dep.Name)
|
||||
// NOTE: we are only validating the local dependency conforms to the constraints. No copying to tmpPath is necessary.
|
||||
chartPath := filepath.Join(destPath, dep.Name)
|
||||
ch, err := loader.LoadDir(chartPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Unable to load chart: %v", err)
|
||||
return fmt.Errorf("unable to load chart '%s': %v", chartPath, err)
|
||||
}
|
||||
|
||||
constraint, err := semver.NewConstraint(dep.Version)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Dependency %s has an invalid version/constraint format: %s", dep.Name, err)
|
||||
return fmt.Errorf("dependency %s has an invalid version/constraint format: %s", dep.Name, err)
|
||||
}
|
||||
|
||||
v, err := semver.NewVersion(ch.Metadata.Version)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Invalid version %s for dependency %s: %s", dep.Version, dep.Name, err)
|
||||
return fmt.Errorf("invalid version %s for dependency %s: %s", dep.Version, dep.Name, err)
|
||||
}
|
||||
|
||||
if !constraint.Check(v) {
|
||||
saveError = fmt.Errorf("Dependency %s at version %s does not satisfy the constraint %s", dep.Name, ch.Metadata.Version, dep.Version)
|
||||
saveError = fmt.Errorf("dependency %s at version %s does not satisfy the constraint %s", dep.Name, ch.Metadata.Version, dep.Version)
|
||||
break
|
||||
}
|
||||
continue
|
||||
@@ -299,7 +302,7 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
||||
if m.Debug {
|
||||
fmt.Fprintf(m.Out, "Archiving %s from repo %s\n", dep.Name, dep.Repository)
|
||||
}
|
||||
ver, err := tarFromLocalDir(m.ChartPath, dep.Name, dep.Repository, dep.Version)
|
||||
ver, err := tarFromLocalDir(m.ChartPath, dep.Name, dep.Repository, dep.Version, tmpPath)
|
||||
if err != nil {
|
||||
saveError = err
|
||||
break
|
||||
@@ -329,6 +332,7 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
||||
Keyring: m.Keyring,
|
||||
RepositoryConfig: m.RepositoryConfig,
|
||||
RepositoryCache: m.RepositoryCache,
|
||||
RegistryClient: m.RegistryClient,
|
||||
Getters: m.Getters,
|
||||
Options: []getter.Option{
|
||||
getter.WithBasicAuth(username, password),
|
||||
@@ -339,12 +343,7 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
||||
}
|
||||
|
||||
version := ""
|
||||
if strings.HasPrefix(churl, "oci://") {
|
||||
if !resolver.FeatureGateOCI.IsEnabled() {
|
||||
return errors.Wrapf(resolver.FeatureGateOCI.Error(),
|
||||
"the repository %s is an OCI registry", churl)
|
||||
}
|
||||
|
||||
if registry.IsOCI(churl) {
|
||||
churl, version, err = parseOCIRef(churl)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "could not parse OCI reference")
|
||||
@@ -354,8 +353,7 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
||||
getter.WithTagName(version))
|
||||
}
|
||||
|
||||
_, _, err = dl.DownloadTo(churl, version, destPath)
|
||||
if err != nil {
|
||||
if _, _, err = dl.DownloadTo(churl, version, tmpPath); err != nil {
|
||||
saveError = errors.Wrapf(err, "could not download %s", churl)
|
||||
break
|
||||
}
|
||||
@@ -363,36 +361,14 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
||||
churls[churl] = struct{}{}
|
||||
}
|
||||
|
||||
// TODO: this should probably be refactored to be a []error, so we can capture and provide more information rather than "last error wins".
|
||||
if saveError == nil {
|
||||
fmt.Fprintln(m.Out, "Deleting outdated charts")
|
||||
for _, dep := range deps {
|
||||
// Chart from local charts directory stays in place
|
||||
if dep.Repository != "" {
|
||||
if err := m.safeDeleteDep(dep.Name, tmpPath); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
if err := move(tmpPath, destPath); err != nil {
|
||||
// now we can move all downloaded charts to destPath and delete outdated dependencies
|
||||
if err := m.safeMoveDeps(deps, tmpPath, destPath); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := os.RemoveAll(tmpPath); err != nil {
|
||||
return errors.Wrapf(err, "failed to remove %v", tmpPath)
|
||||
}
|
||||
} else {
|
||||
fmt.Fprintln(m.Out, "Save error occurred: ", saveError)
|
||||
fmt.Fprintln(m.Out, "Deleting newly downloaded charts, restoring pre-update state")
|
||||
for _, dep := range deps {
|
||||
if err := m.safeDeleteDep(dep.Name, destPath); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := os.RemoveAll(destPath); err != nil {
|
||||
return errors.Wrapf(err, "failed to remove %v", destPath)
|
||||
}
|
||||
if err := fs.RenameWithFallback(tmpPath, destPath); err != nil {
|
||||
return errors.Wrap(err, "unable to move current charts to tmp dir")
|
||||
}
|
||||
return saveError
|
||||
}
|
||||
return nil
|
||||
@@ -410,36 +386,76 @@ func parseOCIRef(chartRef string) (string, string, error) {
|
||||
return chartRef, tag, nil
|
||||
}
|
||||
|
||||
// safeDeleteDep deletes any versions of the given dependency in the given directory.
|
||||
// safeMoveDep moves all dependencies in the source and moves them into dest.
|
||||
//
|
||||
// It does this by first matching the file name to an expected pattern, then loading
|
||||
// the file to verify that it is a chart with the same name as the given name.
|
||||
// the file to verify that it is a chart.
|
||||
//
|
||||
// Because it requires tar file introspection, it is more intensive than a basic delete.
|
||||
// Any charts in dest that do not exist in source are removed (barring local dependencies)
|
||||
//
|
||||
// Because it requires tar file introspection, it is more intensive than a basic move.
|
||||
//
|
||||
// This will only return errors that should stop processing entirely. Other errors
|
||||
// will emit log messages or be ignored.
|
||||
func (m *Manager) safeDeleteDep(name, dir string) error {
|
||||
files, err := filepath.Glob(filepath.Join(dir, name+"-*.tgz"))
|
||||
func (m *Manager) safeMoveDeps(deps []*chart.Dependency, source, dest string) error {
|
||||
existsInSourceDirectory := map[string]bool{}
|
||||
isLocalDependency := map[string]bool{}
|
||||
sourceFiles, err := os.ReadDir(source)
|
||||
if err != nil {
|
||||
// Only for ErrBadPattern
|
||||
return err
|
||||
}
|
||||
for _, fname := range files {
|
||||
ch, err := loader.LoadFile(fname)
|
||||
if err != nil {
|
||||
fmt.Fprintf(m.Out, "Could not verify %s for deletion: %s (Skipping)", fname, err)
|
||||
// attempt to read destFiles; fail fast if we can't
|
||||
destFiles, err := os.ReadDir(dest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, dep := range deps {
|
||||
if dep.Repository == "" {
|
||||
isLocalDependency[dep.Name] = true
|
||||
}
|
||||
}
|
||||
|
||||
for _, file := range sourceFiles {
|
||||
if file.IsDir() {
|
||||
continue
|
||||
}
|
||||
if ch.Name() != name {
|
||||
// This is not the file you are looking for.
|
||||
filename := file.Name()
|
||||
sourcefile := filepath.Join(source, filename)
|
||||
destfile := filepath.Join(dest, filename)
|
||||
existsInSourceDirectory[filename] = true
|
||||
if _, err := loader.LoadFile(sourcefile); err != nil {
|
||||
fmt.Fprintf(m.Out, "Could not verify %s for moving: %s (Skipping)", sourcefile, err)
|
||||
continue
|
||||
}
|
||||
if err := os.Remove(fname); err != nil {
|
||||
fmt.Fprintf(m.Out, "Could not delete %s: %s (Skipping)", fname, err)
|
||||
// NOTE: no need to delete the dest; os.Rename replaces it.
|
||||
if err := fs.RenameWithFallback(sourcefile, destfile); err != nil {
|
||||
fmt.Fprintf(m.Out, "Unable to move %s to charts dir %s (Skipping)", sourcefile, err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Fprintln(m.Out, "Deleting outdated charts")
|
||||
// find all files that exist in dest that do not exist in source; delete them (outdated dependencies)
|
||||
for _, file := range destFiles {
|
||||
if !file.IsDir() && !existsInSourceDirectory[file.Name()] {
|
||||
fname := filepath.Join(dest, file.Name())
|
||||
ch, err := loader.LoadFile(fname)
|
||||
if err != nil {
|
||||
fmt.Fprintf(m.Out, "Could not verify %s for deletion: %s (Skipping)\n", fname, err)
|
||||
continue
|
||||
}
|
||||
// local dependency - skip
|
||||
if isLocalDependency[ch.Name()] {
|
||||
continue
|
||||
}
|
||||
if err := os.Remove(fname); err != nil {
|
||||
fmt.Fprintf(m.Out, "Could not delete %s: %s (Skipping)", fname, err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -457,7 +473,7 @@ func (m *Manager) hasAllRepos(deps []*chart.Dependency) error {
|
||||
Loop:
|
||||
for _, dd := range deps {
|
||||
// If repo is from local path or OCI, continue
|
||||
if strings.HasPrefix(dd.Repository, "file://") || strings.HasPrefix(dd.Repository, "oci://") {
|
||||
if strings.HasPrefix(dd.Repository, "file://") || registry.IsOCI(dd.Repository) {
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -558,8 +574,7 @@ func (m *Manager) resolveRepoNames(deps []*chart.Dependency) (map[string]string,
|
||||
missing := []string{}
|
||||
for _, dd := range deps {
|
||||
// Don't map the repository, we don't need to download chart from charts directory
|
||||
// When OCI is used there is no Helm repository
|
||||
if dd.Repository == "" || strings.HasPrefix(dd.Repository, "oci://") {
|
||||
if dd.Repository == "" {
|
||||
continue
|
||||
}
|
||||
// if dep chart is from local path, verify the path is valid
|
||||
@@ -575,7 +590,7 @@ func (m *Manager) resolveRepoNames(deps []*chart.Dependency) (map[string]string,
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.HasPrefix(dd.Repository, "oci://") {
|
||||
if registry.IsOCI(dd.Repository) {
|
||||
reposMap[dd.Name] = dd.Repository
|
||||
continue
|
||||
}
|
||||
@@ -689,7 +704,7 @@ func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) error {
|
||||
//
|
||||
// If it finds a URL that is "relative", it will prepend the repoURL.
|
||||
func (m *Manager) findChartURL(name, version, repoURL string, repos map[string]*repo.ChartRepository) (url, username, password string, insecureskiptlsverify, passcredentialsall bool, caFile, certFile, keyFile string, err error) {
|
||||
if strings.HasPrefix(repoURL, "oci://") {
|
||||
if registry.IsOCI(repoURL) {
|
||||
return fmt.Sprintf("%s/%s:%s", repoURL, name, version), "", "", false, false, "", "", "", nil
|
||||
}
|
||||
|
||||
@@ -783,6 +798,7 @@ func normalizeURL(baseURL, urlOrPath string) (string, error) {
|
||||
return urlOrPath, errors.Wrap(err, "base URL failed to parse")
|
||||
}
|
||||
|
||||
u2.RawPath = path.Join(u2.RawPath, urlOrPath)
|
||||
u2.Path = path.Join(u2.Path, urlOrPath)
|
||||
return u2.String(), nil
|
||||
}
|
||||
@@ -832,10 +848,8 @@ func writeLock(chartpath string, lock *chart.Lock, legacyLockfile bool) error {
|
||||
return ioutil.WriteFile(dest, data, 0644)
|
||||
}
|
||||
|
||||
// archive a dep chart from local directory and save it into charts/
|
||||
func tarFromLocalDir(chartpath, name, repo, version string) (string, error) {
|
||||
destPath := filepath.Join(chartpath, "charts")
|
||||
|
||||
// archive a dep chart from local directory and save it into destPath
|
||||
func tarFromLocalDir(chartpath, name, repo, version, destPath string) (string, error) {
|
||||
if !strings.HasPrefix(repo, "file://") {
|
||||
return "", errors.Errorf("wrong format: chart %s repository %s", name, repo)
|
||||
}
|
||||
@@ -868,20 +882,6 @@ func tarFromLocalDir(chartpath, name, repo, version string) (string, error) {
|
||||
return "", errors.Errorf("can't get a valid version for dependency %s", name)
|
||||
}
|
||||
|
||||
// move files from tmppath to destpath
|
||||
func move(tmpPath, destPath string) error {
|
||||
files, _ := ioutil.ReadDir(tmpPath)
|
||||
for _, file := range files {
|
||||
filename := file.Name()
|
||||
tmpfile := filepath.Join(tmpPath, filename)
|
||||
destfile := filepath.Join(destPath, filename)
|
||||
if err := fs.RenameWithFallback(tmpfile, destfile); err != nil {
|
||||
return errors.Wrap(err, "unable to move local charts to charts dir")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// The prefix to use for cache keys created by the manager for repo names
|
||||
const managerKeyPrefix = "helm-manager-"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user