add repo and tag fields for clarity

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>
pull/5279/head
Josh Dolitsky 7 years ago
parent f34a876dd4
commit 0f627ddcc7

@ -137,7 +137,7 @@ func (cache *filesystemCache) ChartToLayers(ch *chart.Chart) ([]ocispec.Descript
} }
func (cache *filesystemCache) LoadReference(ref *Reference) ([]ocispec.Descriptor, error) { func (cache *filesystemCache) LoadReference(ref *Reference) ([]ocispec.Descriptor, error) {
tagDir := filepath.Join(cache.rootDir, "refs", escape(ref.Locator), "tags", tagOrDefault(ref.Object)) tagDir := filepath.Join(cache.rootDir, "refs", escape(ref.Repo), "tags", tagOrDefault(ref.Tag))
// add meta layer // add meta layer
metaJSONRaw, err := getSymlinkDestContent(filepath.Join(tagDir, "meta")) metaJSONRaw, err := getSymlinkDestContent(filepath.Join(tagDir, "meta"))
@ -165,8 +165,8 @@ func (cache *filesystemCache) LoadReference(ref *Reference) ([]ocispec.Descripto
} }
func (cache *filesystemCache) StoreReference(ref *Reference, layers []ocispec.Descriptor) (bool, error) { func (cache *filesystemCache) StoreReference(ref *Reference, layers []ocispec.Descriptor) (bool, error) {
tag := tagOrDefault(ref.Object) tag := tagOrDefault(ref.Tag)
tagDir := mkdir(filepath.Join(cache.rootDir, "refs", escape(ref.Locator), "tags", tag)) tagDir := mkdir(filepath.Join(cache.rootDir, "refs", escape(ref.Repo), "tags", tag))
// Retrieve just the meta and content layers // Retrieve just the meta and content layers
metaLayer, contentLayer, err := extractLayers(layers) metaLayer, contentLayer, err := extractLayers(layers)
@ -239,7 +239,7 @@ func (cache *filesystemCache) StoreReference(ref *Reference, layers []ocispec.De
} }
func (cache *filesystemCache) DeleteReference(ref *Reference) error { func (cache *filesystemCache) DeleteReference(ref *Reference) error {
tagDir := filepath.Join(cache.rootDir, "refs", escape(ref.Locator), "tags", tagOrDefault(ref.Object)) tagDir := filepath.Join(cache.rootDir, "refs", escape(ref.Repo), "tags", tagOrDefault(ref.Tag))
if _, err := os.Stat(tagDir); os.IsNotExist(err) { if _, err := os.Stat(tagDir); os.IsNotExist(err) {
return errors.New("ref not found") return errors.New("ref not found")
} }
@ -427,10 +427,10 @@ func getRefsSorted(refsRootDir string) ([][]interface{}, error) {
tagDir := filepath.Dir(path) tagDir := filepath.Dir(path)
// Determine the ref // Determine the ref
locator := unescape(strings.TrimLeft( repo := unescape(strings.TrimLeft(
strings.TrimPrefix(filepath.Dir(filepath.Dir(tagDir)), refsRootDir), "/\\")) strings.TrimPrefix(filepath.Dir(filepath.Dir(tagDir)), refsRootDir), "/\\"))
object := filepath.Base(tagDir) tag := filepath.Base(tagDir)
ref := fmt.Sprintf("%s:%s", locator, object) ref := fmt.Sprintf("%s:%s", repo, tag)
// Init hashmap entry if does not exist // Init hashmap entry if does not exist
if _, ok := refsMap[ref]; !ok { if _, ok := refsMap[ref]; !ok {

@ -60,7 +60,7 @@ func NewClient(options *ClientOptions) *Client {
// PushChart uploads a chart to a registry // PushChart uploads a chart to a registry
func (c *Client) PushChart(ref *Reference) error { func (c *Client) PushChart(ref *Reference) error {
c.setDefaultTag(ref) c.setDefaultTag(ref)
fmt.Fprintf(c.out, "The push refers to repository [%s]\n", ref.Locator) fmt.Fprintf(c.out, "The push refers to repository [%s]\n", ref.Repo)
layers, err := c.cache.LoadReference(ref) layers, err := c.cache.LoadReference(ref)
if err != nil { if err != nil {
return err return err
@ -74,14 +74,14 @@ func (c *Client) PushChart(ref *Reference) error {
totalSize += layer.Size totalSize += layer.Size
} }
fmt.Fprintf(c.out, fmt.Fprintf(c.out,
"%s: pushed to remote (%d layers, %s total)\n", ref.Object, len(layers), byteCountBinary(totalSize)) "%s: pushed to remote (%d layers, %s total)\n", ref.Tag, len(layers), byteCountBinary(totalSize))
return nil return nil
} }
// PullChart downloads a chart from a registry // PullChart downloads a chart from a registry
func (c *Client) PullChart(ref *Reference) error { func (c *Client) PullChart(ref *Reference) error {
c.setDefaultTag(ref) c.setDefaultTag(ref)
fmt.Fprintf(c.out, "%s: Pulling from %s\n", ref.Object, ref.Locator) fmt.Fprintf(c.out, "%s: Pulling from %s\n", ref.Tag, ref.Repo)
layers, err := oras.Pull(context.Background(), c.resolver, ref.String(), c.cache.store, KnownMediaTypes()...) layers, err := oras.Pull(context.Background(), c.resolver, ref.String(), c.cache.store, KnownMediaTypes()...)
if err != nil { if err != nil {
return err return err
@ -91,9 +91,9 @@ func (c *Client) PullChart(ref *Reference) error {
return err return err
} }
if !exists { if !exists {
fmt.Fprintf(c.out, "Status: Downloaded newer chart for %s:%s\n", ref.Locator, ref.Object) fmt.Fprintf(c.out, "Status: Downloaded newer chart for %s:%s\n", ref.Repo, ref.Tag)
} else { } else {
fmt.Fprintf(c.out, "Status: Chart is up to date for %s:%s\n", ref.Locator, ref.Object) fmt.Fprintf(c.out, "Status: Chart is up to date for %s:%s\n", ref.Repo, ref.Tag)
} }
return nil return nil
} }
@ -109,7 +109,7 @@ func (c *Client) SaveChart(ch *chart.Chart, ref *Reference) error {
if err != nil { if err != nil {
return err return err
} }
fmt.Fprintf(c.out, "%s: saved\n", ref.Object) fmt.Fprintf(c.out, "%s: saved\n", ref.Tag)
return nil return nil
} }
@ -131,7 +131,7 @@ func (c *Client) RemoveChart(ref *Reference) error {
if err != nil { if err != nil {
return err return err
} }
fmt.Fprintf(c.out, "%s: removed\n", ref.Object) fmt.Fprintf(c.out, "%s: removed\n", ref.Tag)
return err return err
} }
@ -152,8 +152,8 @@ func (c *Client) PrintChartTable() error {
} }
func (c *Client) setDefaultTag(ref *Reference) { func (c *Client) setDefaultTag(ref *Reference) {
if ref.Object == "" { if ref.Tag == "" {
ref.Object = HelmChartDefaultTag ref.Tag = HelmChartDefaultTag
fmt.Fprintf(c.out, "Using default tag: %s\n", HelmChartDefaultTag) fmt.Fprintf(c.out, "Using default tag: %s\n", HelmChartDefaultTag)
} }
} }

@ -33,6 +33,8 @@ type (
// Reference defines the main components of a reference specification // Reference defines the main components of a reference specification
Reference struct { Reference struct {
*reference.Spec *reference.Spec
Tag string
Repo string
} }
) )
@ -44,8 +46,8 @@ func ParseReference(s string) (*Reference, error) {
} }
// convert to our custom type and make necessary mods // convert to our custom type and make necessary mods
ref := Reference{&spec} ref := Reference{Spec: &spec}
ref.fix() ref.setExtraFields()
// ensure the reference is valid // ensure the reference is valid
err = ref.validate() err = ref.validate()
@ -56,33 +58,35 @@ func ParseReference(s string) (*Reference, error) {
return &ref, nil return &ref, nil
} }
// fix modifies and augments a ref that may not have been parsed properly // setExtraFields adds the Rpeo and Tag fields to a Reference
func (ref *Reference) fix() { func (ref *Reference) setExtraFields() {
ref.Tag = ref.Object
ref.Repo = ref.Locator
ref.fixNoTag() ref.fixNoTag()
ref.fixNoLocator() ref.fixNoRepo()
} }
// fixNoTag is a fix for ref strings such as "mychart:1.0.0", which result in missing tag // fixNoTag is a fix for ref strings such as "mychart:1.0.0", which result in missing tag
func (ref *Reference) fixNoTag() { func (ref *Reference) fixNoTag() {
if ref.Object == "" { if ref.Tag == "" {
parts := strings.Split(ref.Locator, ":") parts := strings.Split(ref.Repo, ":")
numParts := len(parts) numParts := len(parts)
if 0 < numParts { if 0 < numParts {
lastIndex := numParts - 1 lastIndex := numParts - 1
lastPart := parts[lastIndex] lastPart := parts[lastIndex]
if !strings.Contains(lastPart, "/") { if !strings.Contains(lastPart, "/") {
ref.Locator = strings.Join(parts[:lastIndex], ":") ref.Repo = strings.Join(parts[:lastIndex], ":")
ref.Object = lastPart ref.Tag = lastPart
} }
} }
} }
} }
// fixNoLocator is a fix for ref strings such as "mychart", which have the locator swapped with tag // fixNoRepo is a fix for ref strings such as "mychart", which have the repo swapped with tag
func (ref *Reference) fixNoLocator() { func (ref *Reference) fixNoRepo() {
if ref.Locator == "" { if ref.Repo == "" {
ref.Locator = ref.Object ref.Repo = ref.Tag
ref.Object = "" ref.Tag = ""
} }
} }
@ -94,10 +98,10 @@ func (ref *Reference) validate() error {
// validateColons verifies the ref only contains one colon max // validateColons verifies the ref only contains one colon max
// (or two, there might be a port number specified i.e. :5000) // (or two, there might be a port number specified i.e. :5000)
func (ref *Reference) validateColons() error { func (ref *Reference) validateColons() error {
if strings.Contains(ref.Object, ":") { if strings.Contains(ref.Tag, ":") {
return tooManyColonsError return tooManyColonsError
} }
locParts := strings.Split(ref.Locator, ":") locParts := strings.Split(ref.Repo, ":")
locLastIndex := len(locParts) - 1 locLastIndex := len(locParts) - 1
if 1 < locLastIndex { if 1 < locLastIndex {
return tooManyColonsError return tooManyColonsError

@ -42,48 +42,48 @@ func TestReference(t *testing.T) {
s = "mychart" s = "mychart"
ref, err := ParseReference(s) ref, err := ParseReference(s)
is.NoError(err) is.NoError(err)
is.Equal("mychart", ref.Locator) is.Equal("mychart", ref.Repo)
is.Equal("", ref.Object) is.Equal("", ref.Tag)
s = "mychart:1.5.0" s = "mychart:1.5.0"
ref, err = ParseReference(s) ref, err = ParseReference(s)
is.NoError(err) is.NoError(err)
is.Equal("mychart", ref.Locator) is.Equal("mychart", ref.Repo)
is.Equal("1.5.0", ref.Object) is.Equal("1.5.0", ref.Tag)
s = "myrepo/mychart" s = "myrepo/mychart"
ref, err = ParseReference(s) ref, err = ParseReference(s)
is.NoError(err) is.NoError(err)
is.Equal("myrepo/mychart", ref.Locator) is.Equal("myrepo/mychart", ref.Repo)
is.Equal("", ref.Object) is.Equal("", ref.Tag)
s = "myrepo/mychart:1.5.0" s = "myrepo/mychart:1.5.0"
ref, err = ParseReference(s) ref, err = ParseReference(s)
is.NoError(err) is.NoError(err)
is.Equal("myrepo/mychart", ref.Locator) is.Equal("myrepo/mychart", ref.Repo)
is.Equal("1.5.0", ref.Object) is.Equal("1.5.0", ref.Tag)
s = "mychart:5001:1.5.0" s = "mychart:5001:1.5.0"
ref, err = ParseReference(s) ref, err = ParseReference(s)
is.NoError(err) is.NoError(err)
is.Equal("mychart:5001", ref.Locator) is.Equal("mychart:5001", ref.Repo)
is.Equal("1.5.0", ref.Object) is.Equal("1.5.0", ref.Tag)
s = "myrepo:5001/mychart:1.5.0" s = "myrepo:5001/mychart:1.5.0"
ref, err = ParseReference(s) ref, err = ParseReference(s)
is.NoError(err) is.NoError(err)
is.Equal("myrepo:5001/mychart", ref.Locator) is.Equal("myrepo:5001/mychart", ref.Repo)
is.Equal("1.5.0", ref.Object) is.Equal("1.5.0", ref.Tag)
s = "localhost:5000/mychart:latest" s = "localhost:5000/mychart:latest"
ref, err = ParseReference(s) ref, err = ParseReference(s)
is.NoError(err) is.NoError(err)
is.Equal("localhost:5000/mychart", ref.Locator) is.Equal("localhost:5000/mychart", ref.Repo)
is.Equal("latest", ref.Object) is.Equal("latest", ref.Tag)
s = "my.host.com/my/nested/repo:1.2.3" s = "my.host.com/my/nested/repo:1.2.3"
ref, err = ParseReference(s) ref, err = ParseReference(s)
is.NoError(err) is.NoError(err)
is.Equal("my.host.com/my/nested/repo", ref.Locator) is.Equal("my.host.com/my/nested/repo", ref.Repo)
is.Equal("1.2.3", ref.Object) is.Equal("1.2.3", ref.Tag)
} }

Loading…
Cancel
Save