Commit f8a261f2 authored by Anton Galitsyn's avatar Anton Galitsyn

use old naming

parent 685e730b
......@@ -103,7 +103,7 @@ func TestDependencyBuildCmd(t *testing.T) {
t.Fatal(err)
}
i, err := repo.NewChartRepositoryIndexFromFile(dbc.helmhome.CacheIndex("test"))
i, err := repo.LoadIndexFile(dbc.helmhome.CacheIndex("test"))
if err != nil {
t.Fatal(err)
}
......
......@@ -88,7 +88,7 @@ func TestDependencyUpdateCmd(t *testing.T) {
t.Fatal(err)
}
i, err := repo.NewChartRepositoryIndexFromFile(duc.helmhome.CacheIndex("test"))
i, err := repo.LoadIndexFile(duc.helmhome.CacheIndex("test"))
if err != nil {
t.Fatal(err)
}
......
......@@ -136,14 +136,14 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, *r
return nil, nil, fmt.Errorf("invalid chart URL format: %s", ref)
}
rf, err := repo.LoadRepositoryFile(c.HelmHome.RepositoryFile())
rf, err := repo.LoadRepositoriesFile(c.HelmHome.RepositoryFile())
if err != nil {
return nil, nil, err
}
var (
chartName string
rc *repo.ChartRepositoryConfig
rc *repo.Entry
)
if u.IsAbs() && len(u.Host) > 0 && len(u.Path) > 0 {
// If it has a scheme and host and path, it's a full URL
......@@ -178,7 +178,7 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, *r
}
// Next, we need to load the index, and actually look up the chart.
i, err := repo.NewChartRepositoryIndexFromFile(c.HelmHome.CacheIndex(r.Config.Name))
i, err := repo.LoadIndexFile(c.HelmHome.CacheIndex(r.Config.Name))
if err != nil {
return nil, nil, fmt.Errorf("no cached repo found. (try 'helm repo update'). %s", err)
}
......@@ -252,7 +252,7 @@ func isTar(filename string) bool {
return strings.ToLower(filepath.Ext(filename)) == ".tgz"
}
func pickChartRepositoryConfigByName(name string, cfgs []*repo.ChartRepositoryConfig) (*repo.ChartRepositoryConfig, error) {
func pickChartRepositoryConfigByName(name string, cfgs []*repo.Entry) (*repo.Entry, error) {
for _, rc := range cfgs {
if rc.Name == name {
if rc.URL == "" {
......@@ -264,7 +264,7 @@ func pickChartRepositoryConfigByName(name string, cfgs []*repo.ChartRepositoryCo
return nil, fmt.Errorf("repo %s not found", name)
}
func pickChartRepositoryConfigByURL(u string, cfgs []*repo.ChartRepositoryConfig) (*repo.ChartRepositoryConfig, error) {
func pickChartRepositoryConfigByURL(u string, cfgs []*repo.Entry) (*repo.Entry, error) {
for _, rc := range cfgs {
if rc.URL == u {
return rc, nil
......
......@@ -213,7 +213,7 @@ func (m *Manager) downloadAll(deps []*chartutil.Dependency) error {
// hasAllRepos ensures that all of the referenced deps are in the local repo cache.
func (m *Manager) hasAllRepos(deps []*chartutil.Dependency) error {
rf, err := repo.LoadRepositoryFile(m.HelmHome.RepositoryFile())
rf, err := repo.LoadRepositoriesFile(m.HelmHome.RepositoryFile())
if err != nil {
return err
}
......@@ -244,7 +244,7 @@ func (m *Manager) hasAllRepos(deps []*chartutil.Dependency) error {
// getRepoNames returns the repo names of the referenced deps which can be used to fetch the cahced index file.
func (m *Manager) getRepoNames(deps []*chartutil.Dependency) (map[string]string, error) {
rf, err := repo.LoadRepositoryFile(m.HelmHome.RepositoryFile())
rf, err := repo.LoadRepositoriesFile(m.HelmHome.RepositoryFile())
if err != nil {
return nil, err
}
......@@ -277,7 +277,7 @@ func (m *Manager) getRepoNames(deps []*chartutil.Dependency) (map[string]string,
// UpdateRepositories updates all of the local repos to the latest.
func (m *Manager) UpdateRepositories() error {
rf, err := repo.LoadRepositoryFile(m.HelmHome.RepositoryFile())
rf, err := repo.LoadRepositoriesFile(m.HelmHome.RepositoryFile())
if err != nil {
return err
}
......@@ -291,7 +291,7 @@ func (m *Manager) UpdateRepositories() error {
return nil
}
func (m *Manager) parallelRepoUpdate(repos []*repo.ChartRepositoryConfig) error {
func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) error {
out := m.Out
fmt.Fprintln(out, "Hang tight while we grab the latest from your chart repositories...")
var wg sync.WaitGroup
......@@ -409,7 +409,7 @@ func (m *Manager) loadChartRepositories() (map[string]*repo.ChartRepository, err
repoyaml := m.HelmHome.RepositoryFile()
// Load repositories.yaml file
rf, err := repo.LoadRepositoryFile(repoyaml)
rf, err := repo.LoadRepositoriesFile(repoyaml)
if err != nil {
return indices, fmt.Errorf("failed to load %s: %s", repoyaml, err)
}
......@@ -417,7 +417,7 @@ func (m *Manager) loadChartRepositories() (map[string]*repo.ChartRepository, err
for _, re := range rf.Repositories {
lname := re.Name
cacheindex := m.HelmHome.CacheIndex(lname)
index, err := repo.NewChartRepositoryIndexFromFile(cacheindex)
index, err := repo.LoadIndexFile(cacheindex)
if err != nil {
return indices, err
}
......
......@@ -254,12 +254,12 @@ func ensureTestHome(home helmpath.Home, t *testing.T) error {
repoFile := home.RepositoryFile()
if fi, err := os.Stat(repoFile); err != nil {
rf := repo.NewRepositoryFile()
rf.Add(&repo.ChartRepositoryConfig{
rf := repo.NewRepoFile()
rf.Add(&repo.Entry{
Name: "charts",
URL: "http://example.com/foo",
Cache: "charts-index.yaml",
}, &repo.ChartRepositoryConfig{
}, &repo.Entry{
Name: "local",
URL: "http://localhost.com:7743/foo",
Cache: "local-index.yaml",
......@@ -270,7 +270,7 @@ func ensureTestHome(home helmpath.Home, t *testing.T) error {
} else if fi.IsDir() {
return fmt.Errorf("%s must be a file, not a directory", repoFile)
}
if r, err := repo.LoadRepositoryFile(repoFile); err == repo.ErrRepoOutOfDate {
if r, err := repo.LoadRepositoriesFile(repoFile); err == repo.ErrRepoOutOfDate {
t.Log("Updating repository file format...")
if err := r.WriteFile(repoFile, 0644); err != nil {
return err
......@@ -279,7 +279,7 @@ func ensureTestHome(home helmpath.Home, t *testing.T) error {
localRepoIndexFile := home.LocalRepository(localRepoIndexFilePath)
if fi, err := os.Stat(localRepoIndexFile); err != nil {
i := repo.NewChartRepositoryIndex()
i := repo.NewIndexFile()
if err := i.WriteFile(localRepoIndexFile, 0644); err != nil {
return err
}
......
......@@ -179,7 +179,7 @@ func ensureDefaultRepos(home helmpath.Home, out io.Writer) error {
repoFile := home.RepositoryFile()
if fi, err := os.Stat(repoFile); err != nil {
fmt.Fprintf(out, "Creating %s \n", repoFile)
f := repo.NewRepositoryFile()
f := repo.NewRepoFile()
sr, err := initStableRepo(home.CacheIndex(stableRepository))
if err != nil {
return err
......@@ -199,8 +199,8 @@ func ensureDefaultRepos(home helmpath.Home, out io.Writer) error {
return nil
}
func initStableRepo(cacheFile string) (*repo.ChartRepositoryConfig, error) {
c := repo.ChartRepositoryConfig{
func initStableRepo(cacheFile string) (*repo.Entry, error) {
c := repo.Entry{
Name: stableRepository,
URL: stableRepositoryURL,
Cache: cacheFile,
......@@ -217,9 +217,9 @@ func initStableRepo(cacheFile string) (*repo.ChartRepositoryConfig, error) {
return &c, nil
}
func initLocalRepo(indexFile, cacheFile string) (*repo.ChartRepositoryConfig, error) {
func initLocalRepo(indexFile, cacheFile string) (*repo.Entry, error) {
if fi, err := os.Stat(indexFile); err != nil {
i := repo.NewChartRepositoryIndex()
i := repo.NewIndexFile()
if err := i.WriteFile(indexFile, 0644); err != nil {
return nil, err
}
......@@ -230,7 +230,7 @@ func initLocalRepo(indexFile, cacheFile string) (*repo.ChartRepositoryConfig, er
return nil, fmt.Errorf("%s must be a file, not a directory", indexFile)
}
return &repo.ChartRepositoryConfig{
return &repo.Entry{
Name: localRepository,
URL: localRepositoryURL,
Cache: cacheFile,
......@@ -238,7 +238,7 @@ func initLocalRepo(indexFile, cacheFile string) (*repo.ChartRepositoryConfig, er
}
func ensureRepoFileFormat(file string, out io.Writer) error {
r, err := repo.LoadRepositoryFile(file)
r, err := repo.LoadRepositoriesFile(file)
if err == repo.ErrRepoOutOfDate {
fmt.Fprintln(out, "Updating repository file format...")
if err := r.WriteFile(file, 0644); err != nil {
......
......@@ -78,7 +78,7 @@ func (a *repoAddCmd) run() error {
}
func addRepository(name, url string, home helmpath.Home, certFile, keyFile, caFile string, noUpdate bool) error {
f, err := repo.LoadRepositoryFile(home.RepositoryFile())
f, err := repo.LoadRepositoriesFile(home.RepositoryFile())
if err != nil {
return err
}
......@@ -88,7 +88,7 @@ func addRepository(name, url string, home helmpath.Home, certFile, keyFile, caFi
}
cif := home.CacheIndex(name)
c := repo.ChartRepositoryConfig{
c := repo.Entry{
Name: name,
Cache: cif,
URL: url,
......
......@@ -84,7 +84,7 @@ func TestRepoAdd(t *testing.T) {
t.Error(err)
}
f, err := repo.LoadRepositoryFile(hh.RepositoryFile())
f, err := repo.LoadRepositoriesFile(hh.RepositoryFile())
if err != nil {
t.Error(err)
}
......
......@@ -83,12 +83,12 @@ func (i *repoIndexCmd) run() error {
func index(dir, url, mergeTo string) error {
out := filepath.Join(dir, "index.yaml")
i, err := repo.NewChartRepositoryIndexFromDirectory(dir, url)
i, err := repo.IndexDirectory(dir, url)
if err != nil {
return err
}
if mergeTo != "" {
i2, err := repo.NewChartRepositoryIndexFromFile(mergeTo)
i2, err := repo.LoadIndexFile(mergeTo)
if err != nil {
return fmt.Errorf("Merge failed: %s", err)
}
......
......@@ -53,7 +53,7 @@ func TestRepoIndexCmd(t *testing.T) {
destIndex := filepath.Join(dir, "index.yaml")
index, err := repo.NewChartRepositoryIndexFromFile(destIndex)
index, err := repo.LoadIndexFile(destIndex)
if err != nil {
t.Fatal(err)
}
......@@ -94,7 +94,7 @@ func TestRepoIndexCmd(t *testing.T) {
t.Error(err)
}
index, err = repo.NewChartRepositoryIndexFromFile(destIndex)
index, err = repo.LoadIndexFile(destIndex)
if err != nil {
t.Fatal(err)
}
......
......@@ -51,7 +51,7 @@ func newRepoListCmd(out io.Writer) *cobra.Command {
}
func (a *repoListCmd) run() error {
f, err := repo.LoadRepositoryFile(a.home.RepositoryFile())
f, err := repo.LoadRepositoriesFile(a.home.RepositoryFile())
if err != nil {
return err
}
......
......@@ -62,7 +62,7 @@ func (r *repoRemoveCmd) run() error {
func removeRepoLine(out io.Writer, name string, home helmpath.Home) error {
repoFile := home.RepositoryFile()
r, err := repo.LoadRepositoryFile(repoFile)
r, err := repo.LoadRepositoriesFile(repoFile)
if err != nil {
return err
}
......
......@@ -69,7 +69,7 @@ func TestRepoRemove(t *testing.T) {
t.Errorf("Error cache file was not removed for repository %s", testName)
}
f, err := repo.LoadRepositoryFile(hh.RepositoryFile())
f, err := repo.LoadRepositoriesFile(hh.RepositoryFile())
if err != nil {
t.Error(err)
}
......
......@@ -65,7 +65,7 @@ func newRepoUpdateCmd(out io.Writer) *cobra.Command {
}
func (u *repoUpdateCmd) run() error {
f, err := repo.LoadRepositoryFile(u.home.RepositoryFile())
f, err := repo.LoadRepositoriesFile(u.home.RepositoryFile())
if err != nil {
return err
}
......
......@@ -80,7 +80,7 @@ func TestUpdateCharts(t *testing.T) {
t.Fatal(err)
}
r, err := repo.NewChartRepository(&repo.ChartRepositoryConfig{
r, err := repo.NewChartRepository(&repo.Entry{
Name: "charts",
URL: ts.URL(),
Cache: hh.CacheIndex("charts"),
......
......@@ -60,7 +60,7 @@ func (r *Resolver) Resolve(reqs *chartutil.Requirements, repoNames map[string]st
return nil, fmt.Errorf("dependency %q has an invalid version/constraint format: %s", d.Name, err)
}
repoIndex, err := repo.NewChartRepositoryIndexFromFile(r.helmhome.CacheIndex(repoNames[d.Name]))
repoIndex, err := repo.LoadIndexFile(r.helmhome.CacheIndex(repoNames[d.Name]))
if err != nil {
return nil, fmt.Errorf("no cached repo found. (try 'helm repo update'). %s", err)
}
......
......@@ -110,7 +110,7 @@ func (s *searchCmd) formatSearchResults(res []*search.Result) string {
func (s *searchCmd) buildIndex() (*search.Index, error) {
// Load the repositories.yaml
rf, err := repo.LoadRepositoryFile(s.helmhome.RepositoryFile())
rf, err := repo.LoadRepositoriesFile(s.helmhome.RepositoryFile())
if err != nil {
return nil, err
}
......@@ -119,7 +119,7 @@ func (s *searchCmd) buildIndex() (*search.Index, error) {
for _, re := range rf.Repositories {
n := re.Name
f := s.helmhome.CacheIndex(n)
ind, err := repo.NewChartRepositoryIndexFromFile(f)
ind, err := repo.LoadIndexFile(f)
if err != nil {
fmt.Fprintf(s.out, "WARNING: Repo %q is corrupt or missing. Try 'helm repo update'.", n)
continue
......
......@@ -61,7 +61,7 @@ func NewIndex() *Index {
const verSep = "$$"
// AddRepo adds a repository index to the search index.
func (i *Index) AddRepo(rname string, ind *repo.ChartRepositoryIndex, all bool) {
func (i *Index) AddRepo(rname string, ind *repo.IndexFile, all bool) {
for name, ref := range ind.Entries {
if len(ref) == 0 {
// Skip chart names that have zero releases.
......
......@@ -95,8 +95,8 @@ var indexfileEntries = map[string]repo.ChartVersions{
func loadTestIndex(t *testing.T, all bool) *Index {
i := NewIndex()
i.AddRepo("testing", &repo.ChartRepositoryIndex{Entries: indexfileEntries}, all)
i.AddRepo("ztesting", &repo.ChartRepositoryIndex{Entries: map[string]repo.ChartVersions{
i.AddRepo("testing", &repo.IndexFile{Entries: indexfileEntries}, all)
i.AddRepo("ztesting", &repo.IndexFile{Entries: map[string]repo.ChartVersions{
"pinta": {
{
URLs: []string{"http://example.com/charts/pinta-2.0.0.tgz"},
......
......@@ -32,8 +32,8 @@ import (
"k8s.io/helm/pkg/urlutil"
)
// ChartRepositoryConfig represents a collection of parameters for chart repository
type ChartRepositoryConfig struct {
// Entry represents a collection of parameters for chart repository
type Entry struct {
Name string `json:"name"`
Cache string `json:"cache"`
URL string `json:"url"`
......@@ -44,18 +44,19 @@ type ChartRepositoryConfig struct {
// ChartRepository represents a chart repository
type ChartRepository struct {
Config *ChartRepositoryConfig
Config *Entry
ChartPaths []string
IndexFile *ChartRepositoryIndex
IndexFile *IndexFile
Client *http.Client
}
// Getter is an interface to support GET to the specified URL.
type Getter interface {
Get(url string) (*http.Response, error)
}
// NewChartRepository constructs ChartRepository
func NewChartRepository(cfg *ChartRepositoryConfig) (*ChartRepository, error) {
func NewChartRepository(cfg *Entry) (*ChartRepository, error) {
var client *http.Client
if cfg.CertFile != "" && cfg.KeyFile != "" && cfg.CAFile != "" {
tlsConf, err := tlsutil.NewClientTLS(cfg.CertFile, cfg.KeyFile, cfg.CAFile)
......@@ -81,11 +82,12 @@ func NewChartRepository(cfg *ChartRepositoryConfig) (*ChartRepository, error) {
return &ChartRepository{
Config: cfg,
IndexFile: NewChartRepositoryIndex(),
IndexFile: NewIndexFile(),
Client: client,
}, nil
}
// Get issues a GET using configured client to the specified URL.
func (r *ChartRepository) Get(url string) (*http.Response, error) {
resp, err := r.Client.Get(url)
if err != nil {
......@@ -112,7 +114,7 @@ func (r *ChartRepository) Load() error {
filepath.Walk(r.Config.Name, func(path string, f os.FileInfo, err error) error {
if !f.IsDir() {
if strings.Contains(f.Name(), "-index.yaml") {
i, err := NewChartRepositoryIndexFromFile(path)
i, err := LoadIndexFile(path)
if err != nil {
return nil
}
......
......@@ -32,7 +32,7 @@ const (
)
func TestLoadChartRepository(t *testing.T) {
r, err := NewChartRepository(&ChartRepositoryConfig{
r, err := NewChartRepository(&Entry{
Name: testRepository,
URL: testURL,
})
......@@ -64,7 +64,7 @@ func TestLoadChartRepository(t *testing.T) {
}
func TestIndex(t *testing.T) {
r, err := NewChartRepository(&ChartRepositoryConfig{
r, err := NewChartRepository(&Entry{
Name: testRepository,
URL: testURL,
})
......@@ -82,7 +82,7 @@ func TestIndex(t *testing.T) {
}
tempIndexPath := filepath.Join(testRepository, indexPath)
actual, err := NewChartRepositoryIndexFromFile(tempIndexPath)
actual, err := LoadIndexFile(tempIndexPath)
defer os.Remove(tempIndexPath) // clean up
if err != nil {
t.Errorf("Error loading index file %v", err)
......@@ -94,14 +94,14 @@ func TestIndex(t *testing.T) {
if err != nil {
t.Errorf("Error performing re-index: %s\n", err)
}
second, err := NewChartRepositoryIndexFromFile(tempIndexPath)
second, err := LoadIndexFile(tempIndexPath)
if err != nil {
t.Errorf("Error re-loading index file %v", err)
}
verifyIndex(t, second)
}
func verifyIndex(t *testing.T, actual *ChartRepositoryIndex) {
func verifyIndex(t *testing.T, actual *IndexFile) {
var empty time.Time
if actual.Generated == empty {
t.Errorf("Generated should be greater than 0: %s", actual.Generated)
......
......@@ -74,35 +74,17 @@ func (c ChartVersions) Less(a, b int) bool {
return i.LessThan(j)
}
// ChartRepositoryIndex represents the index file in a chart repository
type ChartRepositoryIndex struct {
// IndexFile represents the index file in a chart repository
type IndexFile struct {
APIVersion string `json:"apiVersion"`
Generated time.Time `json:"generated"`
Entries map[string]ChartVersions `json:"entries"`
PublicKeys []string `json:"publicKeys,omitempty"`
}
// ChartVersion represents a chart entry in the ChartRepositoryIndex
type ChartVersion struct {
*chart.Metadata
URLs []string `json:"urls"`
Created time.Time `json:"created,omitempty"`
Removed bool `json:"removed,omitempty"`
Digest string `json:"digest,omitempty"`
}
// unversionedEntry represents a deprecated pre-Alpha.5 format.
//
// This will be removed prior to v2.0.0
type unversionedEntry struct {
Checksum string `json:"checksum"`
URL string `json:"url"`
Chartfile *chart.Metadata `json:"chartfile"`
}
// NewChartRepositoryIndex initializes an index.
func NewChartRepositoryIndex() *ChartRepositoryIndex {
return &ChartRepositoryIndex{
// NewIndexFile initializes an index.
func NewIndexFile() *IndexFile {
return &IndexFile{
APIVersion: APIVersionV1,
Generated: time.Now(),
Entries: map[string]ChartVersions{},
......@@ -110,8 +92,8 @@ func NewChartRepositoryIndex() *ChartRepositoryIndex {
}
}
// NewChartRepositoryIndexFromFile takes a file at the given path and returns an ChartRepositoryIndex object
func NewChartRepositoryIndexFromFile(path string) (*ChartRepositoryIndex, error) {
// LoadIndexFile takes a file at the given path and returns an IndexFile object
func LoadIndexFile(path string) (*IndexFile, error) {
b, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
......@@ -119,89 +101,9 @@ func NewChartRepositoryIndexFromFile(path string) (*ChartRepositoryIndex, error)
return loadIndex(b)
}
// NewChartRepositoryIndexFromDirectory reads a (flat) directory and generates an index.
//
// It indexes only charts that have been packaged (*.tgz).
//
// The index returned will be in an unsorted state
func NewChartRepositoryIndexFromDirectory(dir, baseURL string) (*ChartRepositoryIndex, error) {
archives, err := filepath.Glob(filepath.Join(dir, "*.tgz"))
if err != nil {
return nil, err
}
index := NewChartRepositoryIndex()
for _, arch := range archives {
fname := filepath.Base(arch)
c, err := chartutil.Load(arch)
if err != nil {
// Assume this is not a chart.
continue
}
hash, err := provenance.DigestFile(arch)
if err != nil {
return index, err
}
index.Add(c.Metadata, fname, baseURL, hash)
}
return index, nil
}
// loadIndex loads an index file and does minimal validity checking.
//
// This will fail if API Version is not set (ErrNoAPIVersion) or if the unmarshal fails.
func loadIndex(data []byte) (*ChartRepositoryIndex, error) {
i := &ChartRepositoryIndex{}
if err := yaml.Unmarshal(data, i); err != nil {
return i, err
}
if i.APIVersion == "" {
// When we leave Beta, we should remove legacy support and just
// return this error:
//return i, ErrNoAPIVersion
return loadUnversionedIndex(data)
}
return i, nil
}
// loadUnversionedIndex loads a pre-Alpha.5 index.yaml file.
//
// This format is deprecated. This function will be removed prior to v2.0.0.
func loadUnversionedIndex(data []byte) (*ChartRepositoryIndex, error) {
fmt.Fprintln(os.Stderr, "WARNING: Deprecated index file format. Try 'helm repo update'")
i := map[string]unversionedEntry{}
// This gets around an error in the YAML parser. Instead of parsing as YAML,
// we convert to JSON, and then decode again.
var err error
data, err = yaml.YAMLToJSON(data)
if err != nil {
return nil, err
}
if err := json.Unmarshal(data, &i); err != nil {
return nil, err
}
if len(i) == 0 {
return nil, ErrNoAPIVersion
}
ni := NewChartRepositoryIndex()
for n, item := range i {
if item.Chartfile == nil || item.Chartfile.Name == "" {
parts := strings.Split(n, "-")
ver := ""
if len(parts) > 1 {
ver = strings.TrimSuffix(parts[1], ".tgz")
}
item.Chartfile = &chart.Metadata{Name: parts[0], Version: ver}
}
ni.Add(item.Chartfile, item.URL, "", item.Checksum)
}
return ni, nil
}
// Add adds a file to the index
// This can leave the index in an unsorted state
func (i ChartRepositoryIndex) Add(md *chart.Metadata, filename, baseURL, digest string) {
func (i IndexFile) Add(md *chart.Metadata, filename, baseURL, digest string) {
u := filename
if baseURL != "" {
var err error
......@@ -225,7 +127,7 @@ func (i ChartRepositoryIndex) Add(md *chart.Metadata, filename, baseURL, digest
}
// Has returns true if the index has an entry for a chart with the given name and exact version.
func (i ChartRepositoryIndex) Has(name, version string) bool {
func (i IndexFile) Has(name, version string) bool {
_, err := i.Get(name, version)
return err == nil
}
......@@ -236,7 +138,7 @@ func (i ChartRepositoryIndex) Has(name, version string) bool {
// the most recent release for every version is in the 0th slot in the
// Entries.ChartVersions array. That way, tooling can predict the newest
// version without needing to parse SemVers.
func (i ChartRepositoryIndex) SortEntries() {
func (i IndexFile) SortEntries() {
for _, versions := range i.Entries {
sort.Sort(sort.Reverse(versions))
}
......@@ -245,7 +147,7 @@ func (i ChartRepositoryIndex) SortEntries() {
// Get returns the ChartVersion for the given name.
//
// If version is empty, this will return the chart with the highest version.
func (i ChartRepositoryIndex) Get(name, version string) (*ChartVersion, error) {
func (i IndexFile) Get(name, version string) (*ChartVersion, error) {
vs, ok := i.Entries[name]
if !ok {
return nil, ErrNoChartName
......@@ -268,7 +170,7 @@ func (i ChartRepositoryIndex) Get(name, version string) (*ChartVersion, error) {
// WriteFile writes an index file to the given destination path.
//
// The mode on the file is set to 'mode'.
func (i ChartRepositoryIndex) WriteFile(dest string, mode os.FileMode) error {
func (i IndexFile) WriteFile(dest string, mode os.FileMode) error {
b, err := yaml.Marshal(i)
if err != nil {
return err
......@@ -284,7 +186,7 @@ func (i ChartRepositoryIndex) WriteFile(dest string, mode os.FileMode) error {
// In all other cases, the existing record is preserved.
//
// This can leave the index in an unsorted state
func (i *ChartRepositoryIndex) Merge(f *ChartRepositoryIndex) {
func (i *IndexFile) Merge(f *IndexFile) {
for _, cvs := range f.Entries {
for _, cv := range cvs {
if !i.Has(cv.Name, cv.Version) {
......@@ -294,3 +196,103 @@ func (i *ChartRepositoryIndex) Merge(f *ChartRepositoryIndex) {
}
}
}
// Need both JSON and YAML annotations until we get rid of gopkg.in/yaml.v2
// ChartVersion represents a chart entry in the IndexFile
type ChartVersion struct {
*chart.Metadata
URLs []string `json:"urls"`
Created time.Time `json:"created,omitempty"`
Removed bool `json:"removed,omitempty"`
Digest string `json:"digest,omitempty"`
}
// IndexDirectory reads a (flat) directory and generates an index.
//
// It indexes only charts that have been packaged (*.tgz).
//
// The index returned will be in an unsorted state
func IndexDirectory(dir, baseURL string) (*IndexFile, error) {
archives, err := filepath.Glob(filepath.Join(dir, "*.tgz"))
if err != nil {
return nil, err
}
index := NewIndexFile()
for _, arch := range archives {
fname := filepath.Base(arch)
c, err := chartutil.Load(arch)
if err != nil {
// Assume this is not a chart.
continue
}
hash, err := provenance.DigestFile(arch)
if err != nil {
return index, err
}
index.Add(c.Metadata, fname, baseURL, hash)
}
return index, nil
}
// loadIndex loads an index file and does minimal validity checking.
//
// This will fail if API Version is not set (ErrNoAPIVersion) or if the unmarshal fails.
func loadIndex(data []byte) (*IndexFile, error) {
i := &IndexFile{}
if err := yaml.Unmarshal(data, i); err != nil {
return i, err
}
if i.APIVersion == "" {
// When we leave Beta, we should remove legacy support and just
// return this error:
//return i, ErrNoAPIVersion
return loadUnversionedIndex(data)
}
return i, nil
}
// unversionedEntry represents a deprecated pre-Alpha.5 format.
//
// This will be removed prior to v2.0.0
type unversionedEntry struct {
Checksum string `json:"checksum"`
URL string `json:"url"`
Chartfile *chart.Metadata `json:"chartfile"`
}
// loadUnversionedIndex loads a pre-Alpha.5 index.yaml file.
//
// This format is deprecated. This function will be removed prior to v2.0.0.
func loadUnversionedIndex(data []byte) (*IndexFile, error) {
fmt.Fprintln(os.Stderr, "WARNING: Deprecated index file format. Try 'helm repo update'")
i := map[string]unversionedEntry{}
// This gets around an error in the YAML parser. Instead of parsing as YAML,
// we convert to JSON, and then decode again.
var err error
data, err = yaml.YAMLToJSON(data)
if err != nil {
return nil, err
}
if err := json.Unmarshal(data, &i); err != nil {
return nil, err
}
if len(i) == 0 {
return nil, ErrNoAPIVersion
}
ni := NewIndexFile()
for n, item := range i {
if item.Chartfile == nil || item.Chartfile.Name == "" {
parts := strings.Split(n, "-")
ver := ""
if len(parts) > 1 {
ver = strings.TrimSuffix(parts[1], ".tgz")
}
item.Chartfile = &chart.Metadata{Name: parts[0], Version: ver}
}
ni.Add(item.Chartfile, item.URL, "", item.Checksum)
}
return ni, nil
}
......@@ -33,7 +33,7 @@ const (
)
func TestIndexFile(t *testing.T) {
i := NewChartRepositoryIndex()
i := NewIndexFile()
i.Add(&chart.Metadata{Name: "clipper", Version: "0.1.0"}, "clipper-0.1.0.tgz", "http://example.com/charts", "sha256:1234567890")
i.Add(&chart.Metadata{Name: "cutter", Version: "0.1.1"}, "cutter-0.1.1.tgz", "http://example.com/charts", "sha256:1234567890abc")
i.Add(&chart.Metadata{Name: "cutter", Version: "0.1.0"}, "cutter-0.1.0.tgz", "http://example.com/charts", "sha256:1234567890abc")
......@@ -75,7 +75,7 @@ func TestLoadIndex(t *testing.T) {
}
func TestLoadIndexFile(t *testing.T) {
i, err := NewChartRepositoryIndexFromFile(testfile)
i, err := LoadIndexFile(testfile)
if err != nil {
t.Fatal(err)
}
......@@ -83,13 +83,13 @@ func TestLoadIndexFile(t *testing.T) {
}
func TestMerge(t *testing.T) {
ind1 := NewChartRepositoryIndex()
ind1 := NewIndexFile()
ind1.Add(&chart.Metadata{
Name: "dreadnought",
Version: "0.1.0",
}, "dreadnought-0.1.0.tgz", "http://example.com", "aaaa")
ind2 := NewChartRepositoryIndex()
ind2 := NewIndexFile()
ind2.Add(&chart.Metadata{
Name: "dreadnought",
Version: "0.2.0",
......@@ -133,7 +133,7 @@ func TestDownloadIndexFile(t *testing.T) {
defer os.RemoveAll(dirName)
indexFilePath := filepath.Join(dirName, testRepo+"-index.yaml")
r, err := NewChartRepository(&ChartRepositoryConfig{
r, err := NewChartRepository(&Entry{
Name: testRepo,
URL: srv.URL,
Cache: indexFilePath,
......@@ -164,7 +164,7 @@ func TestDownloadIndexFile(t *testing.T) {
verifyLocalIndex(t, i)
}
func verifyLocalIndex(t *testing.T, i *ChartRepositoryIndex) {
func verifyLocalIndex(t *testing.T, i *IndexFile) {
numEntries := len(i.Entries)
if numEntries != 2 {
t.Errorf("Expected 2 entries in index file but got %d", numEntries)
......@@ -264,7 +264,7 @@ func verifyLocalIndex(t *testing.T, i *ChartRepositoryIndex) {
func TestIndexDirectory(t *testing.T) {
dir := "testdata/repository"
index, err := NewChartRepositoryIndexFromDirectory(dir, "http://localhost:8080")
index, err := IndexDirectory(dir, "http://localhost:8080")
if err != nil {
t.Fatal(err)
}
......@@ -314,7 +314,7 @@ func TestLoadUnversionedIndex(t *testing.T) {
}
func TestIndexAdd(t *testing.T) {
i := NewChartRepositoryIndex()
i := NewIndexFile()
i.Add(&chart.Metadata{Name: "clipper", Version: "0.1.0"}, "clipper-0.1.0.tgz", "http://example.com/charts", "sha256:1234567890")
if i.Entries["clipper"][0].URLs[0] != "http://example.com/charts/clipper-0.1.0.tgz" {
......
......@@ -82,7 +82,7 @@ func (s *RepositoryServer) htmlIndex(w http.ResponseWriter, r *http.Request) {
t := htemplate.Must(htemplate.New("index.html").Parse(indexHTMLTemplate))
// load index
lrp := filepath.Join(s.RepoPath, "index.yaml")
i, err := NewChartRepositoryIndexFromFile(lrp)
i, err := LoadIndexFile(lrp)
if err != nil {
http.Error(w, err.Error(), 500)
return
......@@ -107,7 +107,7 @@ func AddChartToLocalRepo(ch *chart.Chart, path string) error {
// Reindex adds an entry to the index file at the given path
func Reindex(ch *chart.Chart, path string) error {
name := ch.Metadata.Name + "-" + ch.Metadata.Version
y, err := NewChartRepositoryIndexFromFile(path)
y, err := LoadIndexFile(path)
if err != nil {
return err
}
......
......@@ -30,35 +30,35 @@ import (
// is fixable.
var ErrRepoOutOfDate = errors.New("repository file is out of date")
// RepositoryFile represents the repositories.yaml file in $HELM_HOME
type RepositoryFile struct {
// RepoFile represents the repositories.yaml file in $HELM_HOME
type RepoFile struct {
APIVersion string `json:"apiVersion"`
Generated time.Time `json:"generated"`
Repositories []*ChartRepositoryConfig `json:"repositories"`
Repositories []*Entry `json:"repositories"`
}
// NewRepositoryFile generates an empty repositories file.
// NewRepoFile generates an empty repositories file.
//
// Generated and APIVersion are automatically set.
func NewRepositoryFile() *RepositoryFile {
return &RepositoryFile{
func NewRepoFile() *RepoFile {
return &RepoFile{
APIVersion: APIVersionV1,
Generated: time.Now(),
Repositories: []*ChartRepositoryConfig{},
Repositories: []*Entry{},
}
}
// LoadRepositoryFile takes a file at the given path and returns a RepositoryFile object
// LoadRepositoriesFile takes a file at the given path and returns a RepoFile object
//
// If this returns ErrRepoOutOfDate, it also returns a recovered RepositoryFile that
// If this returns ErrRepoOutOfDate, it also returns a recovered RepoFile that
// can be saved as a replacement to the out of date file.
func LoadRepositoryFile(path string) (*RepositoryFile, error) {
func LoadRepositoriesFile(path string) (*RepoFile, error) {
b, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
r := &RepositoryFile{}
r := &RepoFile{}
err = yaml.Unmarshal(b, r)
if err != nil {
return nil, err
......@@ -70,9 +70,9 @@ func LoadRepositoryFile(path string) (*RepositoryFile, error) {
if err = yaml.Unmarshal(b, &m); err != nil {
return nil, err
}
r := NewRepositoryFile()
r := NewRepoFile()
for k, v := range m {
r.Add(&ChartRepositoryConfig{
r.Add(&Entry{
Name: k,
URL: v,
Cache: fmt.Sprintf("%s-index.yaml", k),
......@@ -85,13 +85,13 @@ func LoadRepositoryFile(path string) (*RepositoryFile, error) {
}
// Add adds one or more repo entries to a repo file.
func (r *RepositoryFile) Add(re ...*ChartRepositoryConfig) {
func (r *RepoFile) Add(re ...*Entry) {
r.Repositories = append(r.Repositories, re...)
}
// Update attempts to replace one or more repo entries in a repo file. If an
// entry with the same name doesn't exist in the repo file it will add it.
func (r *RepositoryFile) Update(re ...*ChartRepositoryConfig) {
func (r *RepoFile) Update(re ...*Entry) {
for _, target := range re {
found := false
for j, repo := range r.Repositories {
......@@ -108,7 +108,7 @@ func (r *RepositoryFile) Update(re ...*ChartRepositoryConfig) {
}
// Has returns true if the given name is already a repository name.
func (r *RepositoryFile) Has(name string) bool {
func (r *RepoFile) Has(name string) bool {
for _, rf := range r.Repositories {
if rf.Name == name {
return true
......@@ -118,8 +118,8 @@ func (r *RepositoryFile) Has(name string) bool {
}
// Remove removes the entry from the list of repositories.
func (r *RepositoryFile) Remove(name string) bool {
cp := []*ChartRepositoryConfig{}
func (r *RepoFile) Remove(name string) bool {
cp := []*Entry{}
found := false
for _, rf := range r.Repositories {
if rf.Name == name {
......@@ -133,7 +133,7 @@ func (r *RepositoryFile) Remove(name string) bool {
}
// WriteFile writes a repositories file to the given path.
func (r *RepositoryFile) WriteFile(path string, perm os.FileMode) error {
func (r *RepoFile) WriteFile(path string, perm os.FileMode) error {
data, err := yaml.Marshal(r)
if err != nil {
return err
......
......@@ -21,14 +21,14 @@ import "testing"
const testRepositoriesFile = "testdata/repositories.yaml"
func TestRepoFile(t *testing.T) {
rf := NewRepositoryFile()
rf := NewRepoFile()
rf.Add(
&ChartRepositoryConfig{
&Entry{
Name: "stable",
URL: "https://example.com/stable/charts",
Cache: "stable-index.yaml",
},
&ChartRepositoryConfig{
&Entry{
Name: "incubator",
URL: "https://example.com/incubator",
Cache: "incubator-index.yaml",
......@@ -59,21 +59,21 @@ func TestRepoFile(t *testing.T) {
}
func TestNewRepositoriesFile(t *testing.T) {
expects := NewRepositoryFile()
expects := NewRepoFile()
expects.Add(
&ChartRepositoryConfig{
&Entry{
Name: "stable",
URL: "https://example.com/stable/charts",
Cache: "stable-index.yaml",
},
&ChartRepositoryConfig{
&Entry{
Name: "incubator",
URL: "https://example.com/incubator",
Cache: "incubator-index.yaml",
},
)
repofile, err := LoadRepositoryFile(testRepositoriesFile)
repofile, err := LoadRepositoriesFile(testRepositoriesFile)
if err != nil {
t.Errorf("%q could not be loaded: %s", testRepositoriesFile, err)
}
......@@ -97,7 +97,7 @@ func TestNewRepositoriesFile(t *testing.T) {
}
func TestNewPreV1RepositoriesFile(t *testing.T) {
r, err := LoadRepositoryFile("testdata/old-repositories.yaml")
r, err := LoadRepositoriesFile("testdata/old-repositories.yaml")
if err != nil && err != ErrRepoOutOfDate {
t.Fatal(err)
}
......
......@@ -114,7 +114,7 @@ func (s *Server) CopyCharts(origin string) ([]string, error) {
// CreateIndex will read docroot and generate an index.yaml file.
func (s *Server) CreateIndex() error {
// generate the index
index, err := repo.NewChartRepositoryIndexFromDirectory(s.docroot, s.URL())
index, err := repo.IndexDirectory(s.docroot, s.URL())
if err != nil {
return err
}
......@@ -160,8 +160,8 @@ func (s *Server) LinkIndices() error {
// setTestingRepository sets up a testing repository.yaml with only the given name/URL.
func setTestingRepository(home helmpath.Home, name, url string) error {
r := repo.NewRepositoryFile()
r.Add(&repo.ChartRepositoryConfig{
r := repo.NewRepoFile()
r.Add(&repo.Entry{
Name: name,
URL: url,
Cache: home.CacheIndex(name),
......
......@@ -77,7 +77,7 @@ func TestServer(t *testing.T) {
return
}
m := repo.NewChartRepositoryIndex()
m := repo.NewIndexFile()
if err := yaml.Unmarshal(data, m); err != nil {
t.Error(err)
return
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment