Add own reference package wrapper

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi 2015-12-04 13:55:15 -08:00
Родитель f8140332c0
Коммит 2655954c2d
44 изменённых файлов: 278 добавлений и 234 удалений

Просмотреть файл

@ -13,7 +13,6 @@ import (
"runtime" "runtime"
"strings" "strings"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api" "github.com/docker/docker/api"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/builder/dockerignore" "github.com/docker/docker/builder/dockerignore"
@ -29,8 +28,8 @@ import (
"github.com/docker/docker/pkg/streamformatter" "github.com/docker/docker/pkg/streamformatter"
"github.com/docker/docker/pkg/ulimit" "github.com/docker/docker/pkg/ulimit"
"github.com/docker/docker/pkg/urlutil" "github.com/docker/docker/pkg/urlutil"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
tagpkg "github.com/docker/docker/tag"
"github.com/docker/docker/utils" "github.com/docker/docker/utils"
"github.com/docker/go-units" "github.com/docker/go-units"
) )
@ -532,11 +531,11 @@ func rewriteDockerfileFrom(dockerfileName string, translator func(reference.Name
digested := false digested := false
switch ref.(type) { switch ref.(type) {
case reference.Tagged: case reference.NamedTagged:
case reference.Digested: case reference.Canonical:
digested = true digested = true
default: default:
ref, err = reference.WithTag(ref, tagpkg.DefaultTag) ref, err = reference.WithTag(ref, reference.DefaultTag)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }

Просмотреть файл

@ -5,11 +5,11 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
Cli "github.com/docker/docker/cli" Cli "github.com/docker/docker/cli"
"github.com/docker/docker/opts" "github.com/docker/docker/opts"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
) )
@ -51,9 +51,9 @@ func (cli *DockerCli) CmdCommit(args ...string) error {
repositoryName = ref.Name() repositoryName = ref.Name()
switch x := ref.(type) { switch x := ref.(type) {
case reference.Digested: case reference.Canonical:
return errors.New("cannot commit to digest reference") return errors.New("cannot commit to digest reference")
case reference.Tagged: case reference.NamedTagged:
tag = x.Tag() tag = x.Tag()
} }
} }

Просмотреть файл

@ -5,14 +5,13 @@ import (
"io" "io"
"os" "os"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/client/lib" "github.com/docker/docker/api/client/lib"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
Cli "github.com/docker/docker/cli" Cli "github.com/docker/docker/cli"
"github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/jsonmessage"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
tagpkg "github.com/docker/docker/tag"
) )
func (cli *DockerCli) pullImage(image string) error { func (cli *DockerCli) pullImage(image string) error {
@ -27,13 +26,13 @@ func (cli *DockerCli) pullImageCustomOut(image string, out io.Writer) error {
var tag string var tag string
switch x := ref.(type) { switch x := ref.(type) {
case reference.Digested: case reference.Canonical:
tag = x.Digest().String() tag = x.Digest().String()
case reference.Tagged: case reference.NamedTagged:
tag = x.Tag() tag = x.Tag()
default: default:
// pull only the image tagged 'latest' if no tag was specified // pull only the image tagged 'latest' if no tag was specified
tag = tagpkg.DefaultTag tag = reference.DefaultTag
} }
// Resolve the Repository name from fqn to RepositoryInfo // Resolve the Repository name from fqn to RepositoryInfo
@ -99,13 +98,13 @@ func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runc
return nil, err return nil, err
} }
isDigested := false isCanonical := false
switch ref.(type) { switch ref.(type) {
case reference.Tagged: case reference.NamedTagged:
case reference.Digested: case reference.Canonical:
isDigested = true isCanonical = true
default: default:
ref, err = reference.WithTag(ref, tagpkg.DefaultTag) ref, err = reference.WithTag(ref, reference.DefaultTag)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -113,7 +112,7 @@ func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runc
var trustedRef reference.Canonical var trustedRef reference.Canonical
if isTrusted() && !isDigested { if isTrusted() && !isCanonical {
var err error var err error
trustedRef, err = cli.trustedReference(ref.(reference.NamedTagged)) trustedRef, err = cli.trustedReference(ref.(reference.NamedTagged))
if err != nil { if err != nil {
@ -133,7 +132,7 @@ func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runc
if err = cli.pullImageCustomOut(config.Image, cli.err); err != nil { if err = cli.pullImageCustomOut(config.Image, cli.err); err != nil {
return nil, err return nil, err
} }
if trustedRef != nil && !isDigested { if trustedRef != nil && !isCanonical {
if err := cli.tagTrusted(trustedRef, ref.(reference.NamedTagged)); err != nil { if err := cli.tagTrusted(trustedRef, ref.(reference.NamedTagged)); err != nil {
return nil, err return nil, err
} }

Просмотреть файл

@ -6,13 +6,13 @@ import (
"text/tabwriter" "text/tabwriter"
"time" "time"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
Cli "github.com/docker/docker/cli" Cli "github.com/docker/docker/cli"
"github.com/docker/docker/opts" "github.com/docker/docker/opts"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/reference"
"github.com/docker/go-units" "github.com/docker/go-units"
) )
@ -98,9 +98,9 @@ func (cli *DockerCli) CmdImages(args ...string) error {
repo = ref.Name() repo = ref.Name()
switch x := ref.(type) { switch x := ref.(type) {
case reference.Digested: case reference.Canonical:
digest = x.Digest().String() digest = x.Digest().String()
case reference.Tagged: case reference.NamedTagged:
tag = x.Tag() tag = x.Tag()
} }
} }

Просмотреть файл

@ -5,13 +5,13 @@ import (
"io" "io"
"os" "os"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
Cli "github.com/docker/docker/cli" Cli "github.com/docker/docker/cli"
"github.com/docker/docker/opts" "github.com/docker/docker/opts"
"github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/jsonmessage"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/urlutil" "github.com/docker/docker/pkg/urlutil"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
) )

Просмотреть файл

@ -4,14 +4,13 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/client/lib" "github.com/docker/docker/api/client/lib"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
Cli "github.com/docker/docker/cli" Cli "github.com/docker/docker/cli"
"github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/jsonmessage"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
tagpkg "github.com/docker/docker/tag"
) )
var errTagCantBeUsed = errors.New("tag can't be used with --all-tags/-a") var errTagCantBeUsed = errors.New("tag can't be used with --all-tags/-a")
@ -35,19 +34,19 @@ func (cli *DockerCli) CmdPull(args ...string) error {
var tag string var tag string
switch x := distributionRef.(type) { switch x := distributionRef.(type) {
case reference.Digested: case reference.Canonical:
if *allTags { if *allTags {
return errTagCantBeUsed return errTagCantBeUsed
} }
tag = x.Digest().String() tag = x.Digest().String()
case reference.Tagged: case reference.NamedTagged:
if *allTags { if *allTags {
return errTagCantBeUsed return errTagCantBeUsed
} }
tag = x.Tag() tag = x.Tag()
default: default:
if !*allTags { if !*allTags {
tag = tagpkg.DefaultTag tag = reference.DefaultTag
distributionRef, err = reference.WithTag(distributionRef, tag) distributionRef, err = reference.WithTag(distributionRef, tag)
if err != nil { if err != nil {
return err return err

Просмотреть файл

@ -4,12 +4,12 @@ import (
"errors" "errors"
"io" "io"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/client/lib" "github.com/docker/docker/api/client/lib"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
Cli "github.com/docker/docker/cli" Cli "github.com/docker/docker/cli"
"github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/jsonmessage"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
) )
@ -30,9 +30,9 @@ func (cli *DockerCli) CmdPush(args ...string) error {
var tag string var tag string
switch x := ref.(type) { switch x := ref.(type) {
case reference.Digested: case reference.Canonical:
return errors.New("cannot push a digest reference") return errors.New("cannot push a digest reference")
case reference.Tagged: case reference.NamedTagged:
tag = x.Tag() tag = x.Tag()
} }

Просмотреть файл

@ -3,10 +3,10 @@ package client
import ( import (
"errors" "errors"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
Cli "github.com/docker/docker/cli" Cli "github.com/docker/docker/cli"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
) )
@ -25,13 +25,12 @@ func (cli *DockerCli) CmdTag(args ...string) error {
return err return err
} }
_, isDigested := ref.(reference.Digested) if _, isCanonical := ref.(reference.Canonical); isCanonical {
if isDigested {
return errors.New("refusing to create a tag with a digest reference") return errors.New("refusing to create a tag with a digest reference")
} }
tag := "" tag := ""
tagged, isTagged := ref.(reference.Tagged) tagged, isTagged := ref.(reference.NamedTagged)
if isTagged { if isTagged {
tag = tagged.Tag() tag = tagged.Tag()
} }

Просмотреть файл

@ -19,7 +19,6 @@ import (
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/distribution/registry/client/auth" "github.com/docker/distribution/registry/client/auth"
"github.com/docker/distribution/registry/client/transport" "github.com/docker/distribution/registry/client/transport"
"github.com/docker/docker/api/client/lib" "github.com/docker/docker/api/client/lib"
@ -30,6 +29,7 @@ import (
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/tlsconfig" "github.com/docker/docker/pkg/tlsconfig"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/notary/client" "github.com/docker/notary/client"
"github.com/docker/notary/passphrase" "github.com/docker/notary/passphrase"

Просмотреть файл

@ -12,7 +12,6 @@ import (
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/server/httputils" "github.com/docker/docker/api/server/httputils"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/builder" "github.com/docker/docker/builder"
@ -25,8 +24,8 @@ import (
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/streamformatter" "github.com/docker/docker/pkg/streamformatter"
"github.com/docker/docker/pkg/ulimit" "github.com/docker/docker/pkg/ulimit"
"github.com/docker/docker/reference"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
tagpkg "github.com/docker/docker/tag"
"github.com/docker/docker/utils" "github.com/docker/docker/utils"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
@ -156,7 +155,7 @@ func (s *router) postImagesCreate(ctx context.Context, w http.ResponseWriter, r
} }
switch newRef.(type) { switch newRef.(type) {
case reference.Digested: case reference.Canonical:
return errors.New("cannot import digest reference") return errors.New("cannot import digest reference")
} }
@ -498,12 +497,12 @@ func sanitizeRepoAndTags(names []string) ([]reference.Named, error) {
return nil, err return nil, err
} }
if _, isDigested := ref.(reference.Digested); isDigested { if _, isCanonical := ref.(reference.Canonical); isCanonical {
return nil, errors.New("build tag cannot be a digest") return nil, errors.New("build tag cannot contain a digest")
} }
if _, isTagged := ref.(reference.Tagged); !isTagged { if _, isTagged := ref.(reference.NamedTagged); !isTagged {
ref, err = reference.WithTag(ref, tagpkg.DefaultTag) ref, err = reference.WithTag(ref, reference.DefaultTag)
} }
nameWithTag := ref.String() nameWithTag := ref.String()

Просмотреть файл

@ -7,7 +7,6 @@ import (
"strings" "strings"
"time" "time"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/dockerversion" "github.com/docker/docker/dockerversion"
@ -15,6 +14,7 @@ import (
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/reference"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
) )

Просмотреть файл

@ -19,7 +19,6 @@ import (
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api" "github.com/docker/docker/api"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
@ -58,9 +57,9 @@ import (
"github.com/docker/docker/pkg/sysinfo" "github.com/docker/docker/pkg/sysinfo"
"github.com/docker/docker/pkg/system" "github.com/docker/docker/pkg/system"
"github.com/docker/docker/pkg/truncindex" "github.com/docker/docker/pkg/truncindex"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
"github.com/docker/docker/tag"
"github.com/docker/docker/utils" "github.com/docker/docker/utils"
volumedrivers "github.com/docker/docker/volume/drivers" volumedrivers "github.com/docker/docker/volume/drivers"
"github.com/docker/docker/volume/local" "github.com/docker/docker/volume/local"
@ -138,7 +137,7 @@ type Daemon struct {
repository string repository string
containers *contStore containers *contStore
execCommands *exec.Store execCommands *exec.Store
tagStore tag.Store referenceStore reference.Store
downloadManager *xfer.LayerDownloadManager downloadManager *xfer.LayerDownloadManager
uploadManager *xfer.LayerUploadManager uploadManager *xfer.LayerUploadManager
distributionMetadataStore dmetadata.Store distributionMetadataStore dmetadata.Store
@ -789,16 +788,16 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo
eventsService := events.New() eventsService := events.New()
tagStore, err := tag.NewTagStore(filepath.Join(imageRoot, "repositories.json")) referenceStore, err := reference.NewReferenceStore(filepath.Join(imageRoot, "repositories.json"))
if err != nil { if err != nil {
return nil, fmt.Errorf("Couldn't create Tag store repositories: %s", err) return nil, fmt.Errorf("Couldn't create Tag store repositories: %s", err)
} }
if err := restoreCustomImage(d.driver, d.imageStore, d.layerStore, tagStore); err != nil { if err := restoreCustomImage(d.driver, d.imageStore, d.layerStore, referenceStore); err != nil {
return nil, fmt.Errorf("Couldn't restore custom images: %s", err) return nil, fmt.Errorf("Couldn't restore custom images: %s", err)
} }
if err := v1.Migrate(config.Root, d.driver.String(), d.layerStore, d.imageStore, tagStore, distributionMetadataStore); err != nil { if err := v1.Migrate(config.Root, d.driver.String(), d.layerStore, d.imageStore, referenceStore, distributionMetadataStore); err != nil {
return nil, err return nil, err
} }
@ -848,7 +847,7 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo
d.repository = daemonRepo d.repository = daemonRepo
d.containers = &contStore{s: make(map[string]*container.Container)} d.containers = &contStore{s: make(map[string]*container.Container)}
d.execCommands = exec.NewStore() d.execCommands = exec.NewStore()
d.tagStore = tagStore d.referenceStore = referenceStore
d.distributionMetadataStore = distributionMetadataStore d.distributionMetadataStore = distributionMetadataStore
d.trustKey = trustKey d.trustKey = trustKey
d.idIndex = truncindex.NewTruncIndex([]string{}) d.idIndex = truncindex.NewTruncIndex([]string{})
@ -1045,7 +1044,7 @@ func (daemon *Daemon) TagImage(newTag reference.Named, imageName string) error {
return err return err
} }
newTag = registry.NormalizeLocalReference(newTag) newTag = registry.NormalizeLocalReference(newTag)
if err := daemon.tagStore.AddTag(newTag, imageID, true); err != nil { if err := daemon.referenceStore.AddTag(newTag, imageID, true); err != nil {
return err return err
} }
daemon.EventsService.Log("tag", newTag.String(), "") daemon.EventsService.Log("tag", newTag.String(), "")
@ -1091,7 +1090,7 @@ func (daemon *Daemon) PullImage(ref reference.Named, metaHeaders map[string][]st
EventsService: daemon.EventsService, EventsService: daemon.EventsService,
MetadataStore: daemon.distributionMetadataStore, MetadataStore: daemon.distributionMetadataStore,
ImageStore: daemon.imageStore, ImageStore: daemon.imageStore,
TagStore: daemon.tagStore, ReferenceStore: daemon.referenceStore,
DownloadManager: daemon.downloadManager, DownloadManager: daemon.downloadManager,
} }
@ -1107,7 +1106,7 @@ func (daemon *Daemon) PullImage(ref reference.Named, metaHeaders map[string][]st
// the same tag are exported. names is the set of tags to export, and // the same tag are exported. names is the set of tags to export, and
// outStream is the writer which the images are written to. // outStream is the writer which the images are written to.
func (daemon *Daemon) ExportImage(names []string, outStream io.Writer) error { func (daemon *Daemon) ExportImage(names []string, outStream io.Writer) error {
imageExporter := tarexport.NewTarExporter(daemon.imageStore, daemon.layerStore, daemon.tagStore) imageExporter := tarexport.NewTarExporter(daemon.imageStore, daemon.layerStore, daemon.referenceStore)
return imageExporter.Save(names, outStream) return imageExporter.Save(names, outStream)
} }
@ -1135,7 +1134,7 @@ func (daemon *Daemon) PushImage(ref reference.Named, metaHeaders map[string][]st
MetadataStore: daemon.distributionMetadataStore, MetadataStore: daemon.distributionMetadataStore,
LayerStore: daemon.layerStore, LayerStore: daemon.layerStore,
ImageStore: daemon.imageStore, ImageStore: daemon.imageStore,
TagStore: daemon.tagStore, ReferenceStore: daemon.referenceStore,
TrustKey: daemon.trustKey, TrustKey: daemon.trustKey,
UploadManager: daemon.uploadManager, UploadManager: daemon.uploadManager,
} }
@ -1154,14 +1153,14 @@ func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
return nil, fmt.Errorf("No such image: %s", name) return nil, fmt.Errorf("No such image: %s", name)
} }
refs := daemon.tagStore.References(img.ID()) refs := daemon.referenceStore.References(img.ID())
repoTags := []string{} repoTags := []string{}
repoDigests := []string{} repoDigests := []string{}
for _, ref := range refs { for _, ref := range refs {
switch ref.(type) { switch ref.(type) {
case reference.Tagged: case reference.NamedTagged:
repoTags = append(repoTags, ref.String()) repoTags = append(repoTags, ref.String())
case reference.Digested: case reference.Canonical:
repoDigests = append(repoDigests, ref.String()) repoDigests = append(repoDigests, ref.String())
} }
} }
@ -1215,7 +1214,7 @@ func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
// complement of ImageExport. The input stream is an uncompressed tar // complement of ImageExport. The input stream is an uncompressed tar
// ball containing images and metadata. // ball containing images and metadata.
func (daemon *Daemon) LoadImage(inTar io.ReadCloser, outStream io.Writer) error { func (daemon *Daemon) LoadImage(inTar io.ReadCloser, outStream io.Writer) error {
imageExporter := tarexport.NewTarExporter(daemon.imageStore, daemon.layerStore, daemon.tagStore) imageExporter := tarexport.NewTarExporter(daemon.imageStore, daemon.layerStore, daemon.referenceStore)
return imageExporter.Load(inTar, outStream) return imageExporter.Load(inTar, outStream)
} }
@ -1271,7 +1270,7 @@ func (daemon *Daemon) ImageHistory(name string) ([]*types.ImageHistory, error) {
h.ID = id.String() h.ID = id.String()
var tags []string var tags []string
for _, r := range daemon.tagStore.References(id) { for _, r := range daemon.referenceStore.References(id) {
if _, ok := r.(reference.NamedTagged); ok { if _, ok := r.(reference.NamedTagged); ok {
tags = append(tags, r.String()) tags = append(tags, r.String())
} }
@ -1303,12 +1302,12 @@ func (daemon *Daemon) GetImageID(refOrID string) (image.ID, error) {
// Treat it as a possible tag or digest reference // Treat it as a possible tag or digest reference
if ref, err := reference.ParseNamed(refOrID); err == nil { if ref, err := reference.ParseNamed(refOrID); err == nil {
ref = registry.NormalizeLocalReference(ref) ref = registry.NormalizeLocalReference(ref)
if id, err := daemon.tagStore.Get(ref); err == nil { if id, err := daemon.referenceStore.Get(ref); err == nil {
return id, nil return id, nil
} }
if tagged, ok := ref.(reference.Tagged); ok { if tagged, ok := ref.(reference.NamedTagged); ok {
if id, err := daemon.imageStore.Search(tagged.Tag()); err == nil { if id, err := daemon.imageStore.Search(tagged.Tag()); err == nil {
for _, namedRef := range daemon.tagStore.References(id) { for _, namedRef := range daemon.referenceStore.References(id) {
if namedRef.Name() == ref.Name() { if namedRef.Name() == ref.Name() {
return id, nil return id, nil
} }

Просмотреть файл

@ -22,8 +22,8 @@ import (
"github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/pkg/parsers/kernel" "github.com/docker/docker/pkg/parsers/kernel"
"github.com/docker/docker/pkg/sysinfo" "github.com/docker/docker/pkg/sysinfo"
"github.com/docker/docker/reference"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
"github.com/docker/docker/tag"
"github.com/docker/libnetwork" "github.com/docker/libnetwork"
nwconfig "github.com/docker/libnetwork/config" nwconfig "github.com/docker/libnetwork/config"
"github.com/docker/libnetwork/drivers/bridge" "github.com/docker/libnetwork/drivers/bridge"
@ -694,7 +694,7 @@ func (daemon *Daemon) conditionalUnmountOnCleanup(container *container.Container
daemon.Unmount(container) daemon.Unmount(container)
} }
func restoreCustomImage(driver graphdriver.Driver, is image.Store, ls layer.Store, ts tag.Store) error { func restoreCustomImage(driver graphdriver.Driver, is image.Store, ls layer.Store, rs reference.Store) error {
// Unix has no custom images to register // Unix has no custom images to register
return nil return nil
} }

Просмотреть файл

@ -9,13 +9,12 @@ import (
"strings" "strings"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/reference"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/daemon/graphdriver" "github.com/docker/docker/daemon/graphdriver"
"github.com/docker/docker/dockerversion" "github.com/docker/docker/dockerversion"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/tag" "github.com/docker/docker/reference"
// register the windows graph driver // register the windows graph driver
"github.com/docker/docker/daemon/graphdriver/windows" "github.com/docker/docker/daemon/graphdriver/windows"
"github.com/docker/docker/pkg/system" "github.com/docker/docker/pkg/system"
@ -153,7 +152,7 @@ func (daemon *Daemon) conditionalUnmountOnCleanup(container *container.Container
} }
} }
func restoreCustomImage(driver graphdriver.Driver, is image.Store, ls layer.Store, ts tag.Store) error { func restoreCustomImage(driver graphdriver.Driver, is image.Store, ls layer.Store, rs reference.Store) error {
if wd, ok := driver.(*windows.Driver); ok { if wd, ok := driver.(*windows.Driver); ok {
imageInfos, err := wd.GetCustomImageInfos() imageInfos, err := wd.GetCustomImageInfos()
if err != nil { if err != nil {
@ -206,7 +205,7 @@ func restoreCustomImage(driver graphdriver.Driver, is image.Store, ls layer.Stor
return err return err
} }
if err := ts.AddTag(ref, id, true); err != nil { if err := rs.AddTag(ref, id, true); err != nil {
return err return err
} }

Просмотреть файл

@ -9,7 +9,6 @@ import (
"strings" "strings"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api" "github.com/docker/docker/api"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/builder" "github.com/docker/docker/builder"
@ -20,6 +19,7 @@ import (
"github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/idtools"
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/urlutil" "github.com/docker/docker/pkg/urlutil"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
) )
@ -42,8 +42,8 @@ func (d Docker) Pull(name string) (*image.Image, error) {
return nil, err return nil, err
} }
switch ref.(type) { switch ref.(type) {
case reference.Tagged: case reference.NamedTagged:
case reference.Digested: case reference.Canonical:
default: default:
ref, err = reference.WithTag(ref, "latest") ref, err = reference.WithTag(ref, "latest")
if err != nil { if err != nil {

Просмотреть файл

@ -3,9 +3,8 @@ package daemon
import ( import (
"strings" "strings"
"github.com/docker/distribution/reference"
derr "github.com/docker/docker/errors" derr "github.com/docker/docker/errors"
tagpkg "github.com/docker/docker/tag" "github.com/docker/docker/reference"
) )
func (d *Daemon) imageNotExistToErrcode(err error) error { func (d *Daemon) imageNotExistToErrcode(err error) error {
@ -13,12 +12,12 @@ func (d *Daemon) imageNotExistToErrcode(err error) error {
if strings.Contains(dne.RefOrID, "@") { if strings.Contains(dne.RefOrID, "@") {
return derr.ErrorCodeNoSuchImageHash.WithArgs(dne.RefOrID) return derr.ErrorCodeNoSuchImageHash.WithArgs(dne.RefOrID)
} }
tag := tagpkg.DefaultTag tag := reference.DefaultTag
ref, err := reference.ParseNamed(dne.RefOrID) ref, err := reference.ParseNamed(dne.RefOrID)
if err != nil { if err != nil {
return derr.ErrorCodeNoSuchImageTag.WithArgs(dne.RefOrID, tag) return derr.ErrorCodeNoSuchImageTag.WithArgs(dne.RefOrID, tag)
} }
if tagged, isTagged := ref.(reference.Tagged); isTagged { if tagged, isTagged := ref.(reference.NamedTagged); isTagged {
tag = tagged.Tag() tag = tagged.Tag()
} }
return derr.ErrorCodeNoSuchImageTag.WithArgs(ref.Name(), tag) return derr.ErrorCodeNoSuchImageTag.WithArgs(ref.Name(), tag)

Просмотреть файл

@ -1,9 +1,9 @@
package events package events
import ( import (
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
"github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/jsonmessage"
"github.com/docker/docker/reference"
) )
// Filter can filter out docker events from a stream // Filter can filter out docker events from a stream

Просмотреть файл

@ -4,13 +4,12 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/container" "github.com/docker/docker/container"
derr "github.com/docker/docker/errors" derr "github.com/docker/docker/errors"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
tagpkg "github.com/docker/docker/tag" "github.com/docker/docker/reference"
) )
// ImageDelete deletes the image referenced by the given imageRef from this // ImageDelete deletes the image referenced by the given imageRef from this
@ -58,7 +57,7 @@ func (daemon *Daemon) ImageDelete(imageRef string, force, prune bool) ([]types.I
return nil, daemon.imageNotExistToErrcode(err) return nil, daemon.imageNotExistToErrcode(err)
} }
repoRefs := daemon.tagStore.References(imgID) repoRefs := daemon.referenceStore.References(imgID)
var removedRepositoryRef bool var removedRepositoryRef bool
if !isImageIDPrefix(imgID.String(), imageRef) { if !isImageIDPrefix(imgID.String(), imageRef) {
@ -151,11 +150,11 @@ func (daemon *Daemon) getContainerUsingImage(imageID image.ID) *container.Contai
// tag is used. Returns the resolved image reference and an error. // tag is used. Returns the resolved image reference and an error.
func (daemon *Daemon) removeImageRef(ref reference.Named) (reference.Named, error) { func (daemon *Daemon) removeImageRef(ref reference.Named) (reference.Named, error) {
switch ref.(type) { switch ref.(type) {
case reference.Tagged: case reference.NamedTagged:
case reference.Digested: case reference.Canonical:
default: default:
var err error var err error
ref, err = reference.WithTag(ref, tagpkg.DefaultTag) ref, err = reference.WithTag(ref, reference.DefaultTag)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -164,7 +163,7 @@ func (daemon *Daemon) removeImageRef(ref reference.Named) (reference.Named, erro
// Ignore the boolean value returned, as far as we're concerned, this // Ignore the boolean value returned, as far as we're concerned, this
// is an idempotent operation and it's okay if the reference didn't // is an idempotent operation and it's okay if the reference didn't
// exist in the first place. // exist in the first place.
_, err := daemon.tagStore.Delete(ref) _, err := daemon.referenceStore.Delete(ref)
return ref, err return ref, err
} }
@ -175,7 +174,7 @@ func (daemon *Daemon) removeImageRef(ref reference.Named) (reference.Named, erro
// daemon's event service. An "Untagged" types.ImageDelete is added to the // daemon's event service. An "Untagged" types.ImageDelete is added to the
// given list of records. // given list of records.
func (daemon *Daemon) removeAllReferencesToImageID(imgID image.ID, records *[]types.ImageDelete) error { func (daemon *Daemon) removeAllReferencesToImageID(imgID image.ID, records *[]types.ImageDelete) error {
imageRefs := daemon.tagStore.References(imgID) imageRefs := daemon.referenceStore.References(imgID)
for _, imageRef := range imageRefs { for _, imageRef := range imageRefs {
parsedRef, err := daemon.removeImageRef(imageRef) parsedRef, err := daemon.removeImageRef(imageRef)
@ -325,7 +324,7 @@ func (daemon *Daemon) checkImageDeleteHardConflict(imgID image.ID) *imageDeleteC
func (daemon *Daemon) checkImageDeleteSoftConflict(imgID image.ID) *imageDeleteConflict { func (daemon *Daemon) checkImageDeleteSoftConflict(imgID image.ID) *imageDeleteConflict {
// Check if any repository tags/digest reference this image. // Check if any repository tags/digest reference this image.
if len(daemon.tagStore.References(imgID)) > 0 { if len(daemon.referenceStore.References(imgID)) > 0 {
return &imageDeleteConflict{ return &imageDeleteConflict{
imgID: imgID, imgID: imgID,
message: "image is referenced in one or more repositories", message: "image is referenced in one or more repositories",
@ -355,5 +354,5 @@ func (daemon *Daemon) checkImageDeleteSoftConflict(imgID image.ID) *imageDeleteC
// that there are no repository references to the given image and it has no // that there are no repository references to the given image and it has no
// child images. // child images.
func (daemon *Daemon) imageIsDangling(imgID image.ID) bool { func (daemon *Daemon) imageIsDangling(imgID image.ID) bool {
return !(len(daemon.tagStore.References(imgID)) > 0 || len(daemon.imageStore.Children(imgID)) > 0) return !(len(daemon.referenceStore.References(imgID)) > 0 || len(daemon.imageStore.Children(imgID)) > 0)
} }

Просмотреть файл

@ -5,11 +5,11 @@ import (
"path" "path"
"sort" "sort"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/reference"
) )
var acceptedImageFilterTags = map[string]bool{ var acceptedImageFilterTags = map[string]bool{
@ -68,9 +68,9 @@ func (daemon *Daemon) Images(filterArgs, filter string, all bool) ([]*types.Imag
var filterTagged bool var filterTagged bool
if filter != "" { if filter != "" {
filterRef, err := reference.Parse(filter) filterRef, err := reference.ParseNamed(filter)
if err == nil { // parse error means wildcard repo if err == nil { // parse error means wildcard repo
if _, ok := filterRef.(reference.Tagged); ok { if _, ok := filterRef.(reference.NamedTagged); ok {
filterTagged = true filterTagged = true
} }
} }
@ -105,7 +105,7 @@ func (daemon *Daemon) Images(filterArgs, filter string, all bool) ([]*types.Imag
newImage := newImage(img, size) newImage := newImage(img, size)
for _, ref := range daemon.tagStore.References(id) { for _, ref := range daemon.referenceStore.References(id) {
if filter != "" { // filter by tag/repo name if filter != "" { // filter by tag/repo name
if filterTagged { // filter by tag, require full ref match if filterTagged { // filter by tag, require full ref match
if ref.String() != filter { if ref.String() != filter {
@ -115,10 +115,10 @@ func (daemon *Daemon) Images(filterArgs, filter string, all bool) ([]*types.Imag
continue continue
} }
} }
if _, ok := ref.(reference.Digested); ok { if _, ok := ref.(reference.Canonical); ok {
newImage.RepoDigests = append(newImage.RepoDigests, ref.String()) newImage.RepoDigests = append(newImage.RepoDigests, ref.String())
} }
if _, ok := ref.(reference.Tagged); ok { if _, ok := ref.(reference.NamedTagged); ok {
newImage.RepoTags = append(newImage.RepoTags, ref.String()) newImage.RepoTags = append(newImage.RepoTags, ref.String())
} }
} }

Просмотреть файл

@ -8,13 +8,13 @@ import (
"runtime" "runtime"
"time" "time"
"github.com/docker/distribution/reference"
"github.com/docker/docker/dockerversion" "github.com/docker/docker/dockerversion"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/pkg/httputils" "github.com/docker/docker/pkg/httputils"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/streamformatter" "github.com/docker/docker/pkg/streamformatter"
"github.com/docker/docker/reference"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
) )
@ -90,7 +90,7 @@ func (daemon *Daemon) ImportImage(src string, newRef reference.Named, msg string
return err return err
} }
// FIXME: connect with commit code and call tagstore directly // FIXME: connect with commit code and call refstore directly
if newRef != nil { if newRef != nil {
if err := daemon.TagImage(newRef, id.String()); err != nil { if err := daemon.TagImage(newRef, id.String()); err != nil {
return err return err

Просмотреть файл

@ -6,15 +6,14 @@ import (
"strings" "strings"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/daemon/events" "github.com/docker/docker/daemon/events"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/distribution/xfer" "github.com/docker/docker/distribution/xfer"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/tag"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
@ -39,8 +38,8 @@ type ImagePullConfig struct {
MetadataStore metadata.Store MetadataStore metadata.Store
// ImageStore manages images. // ImageStore manages images.
ImageStore image.Store ImageStore image.Store
// TagStore manages tags. // ReferenceStore manages tags.
TagStore tag.Store ReferenceStore reference.Store
// DownloadManager manages concurrent pulls. // DownloadManager manages concurrent pulls.
DownloadManager *xfer.LayerDownloadManager DownloadManager *xfer.LayerDownloadManager
} }

Просмотреть файл

@ -11,7 +11,6 @@ import (
"time" "time"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/reference"
"github.com/docker/distribution/registry/client/transport" "github.com/docker/distribution/registry/client/transport"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/distribution/xfer" "github.com/docker/docker/distribution/xfer"
@ -21,6 +20,7 @@ import (
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
@ -34,7 +34,7 @@ type v1Puller struct {
} }
func (p *v1Puller) Pull(ctx context.Context, ref reference.Named) (fallback bool, err error) { func (p *v1Puller) Pull(ctx context.Context, ref reference.Named) (fallback bool, err error) {
if _, isDigested := ref.(reference.Digested); isDigested { if _, isCanonical := ref.(reference.Canonical); isCanonical {
// Allowing fallback, because HTTPS v1 is before HTTP v2 // Allowing fallback, because HTTPS v1 is before HTTP v2
return true, registry.ErrNoSupport{Err: errors.New("Cannot pull by digest with v1 registry")} return true, registry.ErrNoSupport{Err: errors.New("Cannot pull by digest with v1 registry")}
} }
@ -84,7 +84,7 @@ func (p *v1Puller) pullRepository(ctx context.Context, ref reference.Named) erro
logrus.Debugf("Retrieving the tag list") logrus.Debugf("Retrieving the tag list")
var tagsList map[string]string var tagsList map[string]string
tagged, isTagged := ref.(reference.Tagged) tagged, isTagged := ref.(reference.NamedTagged)
if !isTagged { if !isTagged {
tagsList, err = p.session.GetRemoteTags(repoData.Endpoints, p.repoInfo.RemoteName) tagsList, err = p.session.GetRemoteTags(repoData.Endpoints, p.repoInfo.RemoteName)
} else { } else {
@ -250,7 +250,7 @@ func (p *v1Puller) pullImage(ctx context.Context, v1ID, endpoint string, localNa
return err return err
} }
if err := p.config.TagStore.AddTag(localNameRef, imageID, true); err != nil { if err := p.config.ReferenceStore.AddTag(localNameRef, imageID, true); err != nil {
return err return err
} }

Просмотреть файл

@ -13,7 +13,6 @@ import (
"github.com/docker/distribution" "github.com/docker/distribution"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/manifest/schema1" "github.com/docker/distribution/manifest/schema1"
"github.com/docker/distribution/reference"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/distribution/xfer" "github.com/docker/docker/distribution/xfer"
"github.com/docker/docker/image" "github.com/docker/docker/image"
@ -22,6 +21,7 @@ import (
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
@ -55,13 +55,13 @@ func (p *v2Puller) Pull(ctx context.Context, ref reference.Named) (fallback bool
func (p *v2Puller) pullV2Repository(ctx context.Context, ref reference.Named) (err error) { func (p *v2Puller) pullV2Repository(ctx context.Context, ref reference.Named) (err error) {
var refs []reference.Named var refs []reference.Named
taggedName := p.repoInfo.LocalName taggedName := p.repoInfo.LocalName
if tagged, isTagged := ref.(reference.Tagged); isTagged { if tagged, isTagged := ref.(reference.NamedTagged); isTagged {
taggedName, err = reference.WithTag(p.repoInfo.LocalName, tagged.Tag()) taggedName, err = reference.WithTag(p.repoInfo.LocalName, tagged.Tag())
if err != nil { if err != nil {
return err return err
} }
refs = []reference.Named{taggedName} refs = []reference.Named{taggedName}
} else if digested, isDigested := ref.(reference.Digested); isDigested { } else if digested, isCanonical := ref.(reference.Canonical); isCanonical {
taggedName, err = reference.WithDigest(p.repoInfo.LocalName, digested.Digest()) taggedName, err = reference.WithDigest(p.repoInfo.LocalName, digested.Digest())
if err != nil { if err != nil {
return err return err
@ -197,9 +197,9 @@ func (ld *v2LayerDescriptor) Registered(diffID layer.DiffID) {
func (p *v2Puller) pullV2Tag(ctx context.Context, ref reference.Named) (tagUpdated bool, err error) { func (p *v2Puller) pullV2Tag(ctx context.Context, ref reference.Named) (tagUpdated bool, err error) {
tagOrDigest := "" tagOrDigest := ""
if tagged, isTagged := ref.(reference.Tagged); isTagged { if tagged, isTagged := ref.(reference.NamedTagged); isTagged {
tagOrDigest = tagged.Tag() tagOrDigest = tagged.Tag()
} else if digested, isDigested := ref.(reference.Digested); isDigested { } else if digested, isCanonical := ref.(reference.Canonical); isCanonical {
tagOrDigest = digested.Digest().String() tagOrDigest = digested.Digest().String()
} else { } else {
return false, fmt.Errorf("internal error: reference has neither a tag nor a digest: %s", ref.String()) return false, fmt.Errorf("internal error: reference has neither a tag nor a digest: %s", ref.String())
@ -300,27 +300,27 @@ func (p *v2Puller) pullV2Tag(ctx context.Context, ref reference.Named) (tagUpdat
progress.Message(p.config.ProgressOutput, "", "Digest: "+manifestDigest.String()) progress.Message(p.config.ProgressOutput, "", "Digest: "+manifestDigest.String())
} }
oldTagImageID, err := p.config.TagStore.Get(ref) oldTagImageID, err := p.config.ReferenceStore.Get(ref)
if err == nil && oldTagImageID == imageID { if err == nil && oldTagImageID == imageID {
return false, nil return false, nil
} }
if canonical, ok := ref.(reference.Canonical); ok { if canonical, ok := ref.(reference.Canonical); ok {
if err = p.config.TagStore.AddDigest(canonical, imageID, true); err != nil { if err = p.config.ReferenceStore.AddDigest(canonical, imageID, true); err != nil {
return false, err return false, err
} }
} else if err = p.config.TagStore.AddTag(ref, imageID, true); err != nil { } else if err = p.config.ReferenceStore.AddTag(ref, imageID, true); err != nil {
return false, err return false, err
} }
return true, nil return true, nil
} }
func verifyManifest(signedManifest *schema1.SignedManifest, ref reference.Reference) (m *schema1.Manifest, err error) { func verifyManifest(signedManifest *schema1.SignedManifest, ref reference.Named) (m *schema1.Manifest, err error) {
// If pull by digest, then verify the manifest digest. NOTE: It is // If pull by digest, then verify the manifest digest. NOTE: It is
// important to do this first, before any other content validation. If the // important to do this first, before any other content validation. If the
// digest cannot be verified, don't even bother with those other things. // digest cannot be verified, don't even bother with those other things.
if digested, isDigested := ref.(reference.Digested); isDigested { if digested, isCanonical := ref.(reference.Canonical); isCanonical {
verifier, err := digest.NewDigestVerifier(digested.Digest()) verifier, err := digest.NewDigestVerifier(digested.Digest())
if err != nil { if err != nil {
return nil, err return nil, err

Просмотреть файл

@ -9,7 +9,7 @@ import (
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/manifest/schema1" "github.com/docker/distribution/manifest/schema1"
"github.com/docker/distribution/reference" "github.com/docker/docker/reference"
) )
// TestFixManifestLayers checks that fixManifestLayers removes a duplicate // TestFixManifestLayers checks that fixManifestLayers removes a duplicate
@ -104,7 +104,7 @@ func TestFixManifestLayersBadParent(t *testing.T) {
// TestValidateManifest verifies the validateManifest function // TestValidateManifest verifies the validateManifest function
func TestValidateManifest(t *testing.T) { func TestValidateManifest(t *testing.T) {
expectedDigest, err := reference.Parse("repo@sha256:02fee8c3220ba806531f606525eceb83f4feb654f62b207191b1c9209188dedd") expectedDigest, err := reference.ParseNamed("repo@sha256:02fee8c3220ba806531f606525eceb83f4feb654f62b207191b1c9209188dedd")
if err != nil { if err != nil {
t.Fatal("could not parse reference") t.Fatal("could not parse reference")
} }

Просмотреть файл

@ -8,7 +8,6 @@ import (
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/daemon/events" "github.com/docker/docker/daemon/events"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
@ -16,8 +15,8 @@ import (
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/tag"
"github.com/docker/libtrust" "github.com/docker/libtrust"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
@ -45,8 +44,8 @@ type ImagePushConfig struct {
LayerStore layer.Store LayerStore layer.Store
// ImageStore manages images. // ImageStore manages images.
ImageStore image.Store ImageStore image.Store
// TagStore manages tags. // ReferenceStore manages tags.
TagStore tag.Store ReferenceStore reference.Store
// TrustKey is the private key for legacy signatures. This is typically // TrustKey is the private key for legacy signatures. This is typically
// an ephemeral key, since these signatures are no longer verified. // an ephemeral key, since these signatures are no longer verified.
TrustKey libtrust.PrivateKey TrustKey libtrust.PrivateKey
@ -112,7 +111,7 @@ func Push(ctx context.Context, ref reference.Named, imagePushConfig *ImagePushCo
progress.Messagef(imagePushConfig.ProgressOutput, "", "The push refers to a repository [%s]", repoInfo.CanonicalName.String()) progress.Messagef(imagePushConfig.ProgressOutput, "", "The push refers to a repository [%s]", repoInfo.CanonicalName.String())
associations := imagePushConfig.TagStore.ReferencesByName(repoInfo.LocalName) associations := imagePushConfig.ReferenceStore.ReferencesByName(repoInfo.LocalName)
if len(associations) == 0 { if len(associations) == 0 {
return fmt.Errorf("Repository does not exist: %s", repoInfo.LocalName) return fmt.Errorf("Repository does not exist: %s", repoInfo.LocalName)
} }

Просмотреть файл

@ -6,7 +6,6 @@ import (
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/distribution/registry/client/transport" "github.com/docker/distribution/registry/client/transport"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/image" "github.com/docker/docker/image"
@ -15,6 +14,7 @@ import (
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
@ -141,16 +141,15 @@ func (p *v1Pusher) getImageList() (imageList []v1Image, tagsByImage map[image.ID
tagsByImage = make(map[image.ID][]string) tagsByImage = make(map[image.ID][]string)
// Ignore digest references // Ignore digest references
_, isDigested := p.ref.(reference.Digested) if _, isCanonical := p.ref.(reference.Canonical); isCanonical {
if isDigested {
return return
} }
tagged, isTagged := p.ref.(reference.Tagged) tagged, isTagged := p.ref.(reference.NamedTagged)
if isTagged { if isTagged {
// Push a specific tag // Push a specific tag
var imgID image.ID var imgID image.ID
imgID, err = p.config.TagStore.Get(p.ref) imgID, err = p.config.ReferenceStore.Get(p.ref)
if err != nil { if err != nil {
return return
} }
@ -168,9 +167,9 @@ func (p *v1Pusher) getImageList() (imageList []v1Image, tagsByImage map[image.ID
imagesSeen := make(map[image.ID]struct{}) imagesSeen := make(map[image.ID]struct{})
dependenciesSeen := make(map[layer.ChainID]*v1DependencyImage) dependenciesSeen := make(map[layer.ChainID]*v1DependencyImage)
associations := p.config.TagStore.ReferencesByName(p.ref) associations := p.config.ReferenceStore.ReferencesByName(p.ref)
for _, association := range associations { for _, association := range associations {
if tagged, isTagged = association.Ref.(reference.Tagged); !isTagged { if tagged, isTagged = association.Ref.(reference.NamedTagged); !isTagged {
// Ignore digest references. // Ignore digest references.
continue continue
} }

Просмотреть файл

@ -13,7 +13,6 @@ import (
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/manifest" "github.com/docker/distribution/manifest"
"github.com/docker/distribution/manifest/schema1" "github.com/docker/distribution/manifest/schema1"
"github.com/docker/distribution/reference"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/distribution/xfer" "github.com/docker/docker/distribution/xfer"
"github.com/docker/docker/image" "github.com/docker/docker/image"
@ -22,8 +21,8 @@ import (
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/tag"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
@ -55,14 +54,14 @@ func (p *v2Pusher) Push(ctx context.Context) (fallback bool, err error) {
localName := p.repoInfo.LocalName.Name() localName := p.repoInfo.LocalName.Name()
var associations []tag.Association var associations []reference.Association
if _, isTagged := p.ref.(reference.Tagged); isTagged { if _, isTagged := p.ref.(reference.NamedTagged); isTagged {
imageID, err := p.config.TagStore.Get(p.ref) imageID, err := p.config.ReferenceStore.Get(p.ref)
if err != nil { if err != nil {
return false, fmt.Errorf("tag does not exist: %s", p.ref.String()) return false, fmt.Errorf("tag does not exist: %s", p.ref.String())
} }
associations = []tag.Association{ associations = []reference.Association{
{ {
Ref: p.ref, Ref: p.ref,
ImageID: imageID, ImageID: imageID,
@ -70,7 +69,7 @@ func (p *v2Pusher) Push(ctx context.Context) (fallback bool, err error) {
} }
} else { } else {
// Pull all tags // Pull all tags
associations = p.config.TagStore.ReferencesByName(p.ref) associations = p.config.ReferenceStore.ReferencesByName(p.ref)
} }
if err != nil { if err != nil {
return false, fmt.Errorf("error getting tags for %s: %s", localName, err) return false, fmt.Errorf("error getting tags for %s: %s", localName, err)
@ -88,7 +87,7 @@ func (p *v2Pusher) Push(ctx context.Context) (fallback bool, err error) {
return false, nil return false, nil
} }
func (p *v2Pusher) pushV2Tag(ctx context.Context, association tag.Association) error { func (p *v2Pusher) pushV2Tag(ctx context.Context, association reference.Association) error {
ref := association.Ref ref := association.Ref
logrus.Debugf("Pushing repository: %s", ref.String()) logrus.Debugf("Pushing repository: %s", ref.String())
@ -146,7 +145,7 @@ func (p *v2Pusher) pushV2Tag(ctx context.Context, association tag.Association) e
} }
var tag string var tag string
if tagged, isTagged := ref.(reference.Tagged); isTagged { if tagged, isTagged := ref.(reference.NamedTagged); isTagged {
tag = tagged.Tag() tag = tagged.Tag()
} }
m, err := CreateV2Manifest(p.repo.Name(), tag, img, fsLayers) m, err := CreateV2Manifest(p.repo.Name(), tag, img, fsLayers)
@ -165,7 +164,7 @@ func (p *v2Pusher) pushV2Tag(ctx context.Context, association tag.Association) e
return err return err
} }
if manifestDigest != "" { if manifestDigest != "" {
if tagged, isTagged := ref.(reference.Tagged); isTagged { if tagged, isTagged := ref.(reference.NamedTagged); isTagged {
// NOTE: do not change this format without first changing the trust client // NOTE: do not change this format without first changing the trust client
// code. This information is used to determine what was pushed and should be signed. // code. This information is used to determine what was pushed and should be signed.
progress.Messagef(p.config.ProgressOutput, "", "%s: digest: %s size: %d", tagged.Tag(), manifestDigest, manifestSize) progress.Messagef(p.config.ProgressOutput, "", "%s: digest: %s size: %d", tagged.Tag(), manifestDigest, manifestSize)

Просмотреть файл

@ -8,10 +8,10 @@ import (
"testing" "testing"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/reference"
"github.com/docker/distribution/registry/client/auth" "github.com/docker/distribution/registry/client/auth"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
registrytypes "github.com/docker/docker/api/types/registry" registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/utils" "github.com/docker/docker/utils"
"golang.org/x/net/context" "golang.org/x/net/context"

Просмотреть файл

@ -9,13 +9,13 @@ import (
"path/filepath" "path/filepath"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/reference"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/image/v1" "github.com/docker/docker/image/v1"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/chrootarchive" "github.com/docker/docker/pkg/chrootarchive"
"github.com/docker/docker/pkg/symlink" "github.com/docker/docker/pkg/symlink"
"github.com/docker/docker/reference"
) )
func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer) error { func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer) error {
@ -124,11 +124,11 @@ func (l *tarexporter) loadLayer(filename string, rootFS image.RootFS) (layer.Lay
} }
func (l *tarexporter) setLoadedTag(ref reference.NamedTagged, imgID image.ID, outStream io.Writer) error { func (l *tarexporter) setLoadedTag(ref reference.NamedTagged, imgID image.ID, outStream io.Writer) error {
if prevID, err := l.ts.Get(ref); err == nil && prevID != imgID { if prevID, err := l.rs.Get(ref); err == nil && prevID != imgID {
fmt.Fprintf(outStream, "The image %s already exists, renaming the old one with ID %s to empty string\n", ref.String(), string(prevID)) // todo: this message is wrong in case of multiple tags fmt.Fprintf(outStream, "The image %s already exists, renaming the old one with ID %s to empty string\n", ref.String(), string(prevID)) // todo: this message is wrong in case of multiple tags
} }
if err := l.ts.AddTag(ref, imgID, true); err != nil { if err := l.rs.AddTag(ref, imgID, true); err != nil {
return err return err
} }
return nil return nil

Просмотреть файл

@ -10,13 +10,12 @@ import (
"time" "time"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/image/v1" "github.com/docker/docker/image/v1"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/archive"
"github.com/docker/docker/reference"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/tag"
) )
type imageDescriptor struct { type imageDescriptor struct {
@ -50,13 +49,13 @@ func (l *tarexporter) parseNames(names []string) (map[image.ID]*imageDescriptor,
if ref != nil { if ref != nil {
var tagged reference.NamedTagged var tagged reference.NamedTagged
if _, ok := ref.(reference.Digested); ok { if _, ok := ref.(reference.Canonical); ok {
return return
} }
var ok bool var ok bool
if tagged, ok = ref.(reference.NamedTagged); !ok { if tagged, ok = ref.(reference.NamedTagged); !ok {
var err error var err error
if tagged, err = reference.WithTag(ref, tag.DefaultTag); err != nil { if tagged, err = reference.WithTag(ref, reference.DefaultTag); err != nil {
return return
} }
} }
@ -84,9 +83,9 @@ func (l *tarexporter) parseNames(names []string) (map[image.ID]*imageDescriptor,
addAssoc(imgID, nil) addAssoc(imgID, nil)
continue continue
} }
if _, ok := ref.(reference.Digested); !ok { if _, ok := ref.(reference.Canonical); !ok {
if _, ok := ref.(reference.NamedTagged); !ok { if _, ok := ref.(reference.NamedTagged); !ok {
assocs := l.ts.ReferencesByName(ref) assocs := l.rs.ReferencesByName(ref)
for _, assoc := range assocs { for _, assoc := range assocs {
addAssoc(assoc.ImageID, assoc.Ref) addAssoc(assoc.ImageID, assoc.Ref)
} }
@ -101,7 +100,7 @@ func (l *tarexporter) parseNames(names []string) (map[image.ID]*imageDescriptor,
} }
} }
var imgID image.ID var imgID image.ID
if imgID, err = l.ts.Get(ref); err != nil { if imgID, err = l.rs.Get(ref); err != nil {
return nil, err return nil, err
} }
addAssoc(imgID, ref) addAssoc(imgID, ref)

Просмотреть файл

@ -3,7 +3,7 @@ package tarexport
import ( import (
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/tag" "github.com/docker/docker/reference"
) )
const ( const (
@ -23,14 +23,14 @@ type manifestItem struct {
type tarexporter struct { type tarexporter struct {
is image.Store is image.Store
ls layer.Store ls layer.Store
ts tag.Store rs reference.Store
} }
// NewTarExporter returns new ImageExporter for tar packages // NewTarExporter returns new ImageExporter for tar packages
func NewTarExporter(is image.Store, ls layer.Store, ts tag.Store) image.Exporter { func NewTarExporter(is image.Store, ls layer.Store, rs reference.Store) image.Exporter {
return &tarexporter{ return &tarexporter{
is: is, is: is,
ls: ls, ls: ls,
ts: ts, rs: rs,
} }
} }

Просмотреть файл

@ -11,12 +11,11 @@ import (
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/image" "github.com/docker/docker/image"
imagev1 "github.com/docker/docker/image/v1" imagev1 "github.com/docker/docker/image/v1"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/tag" "github.com/docker/docker/reference"
) )
type graphIDRegistrar interface { type graphIDRegistrar interface {
@ -46,7 +45,7 @@ var (
// Migrate takes an old graph directory and transforms the metadata into the // Migrate takes an old graph directory and transforms the metadata into the
// new format. // new format.
func Migrate(root, driverName string, ls layer.Store, is image.Store, ts tag.Store, ms metadata.Store) error { func Migrate(root, driverName string, ls layer.Store, is image.Store, rs reference.Store, ms metadata.Store) error {
mappings := make(map[string]image.ID) mappings := make(map[string]image.ID)
if registrar, ok := ls.(graphIDRegistrar); !ok { if registrar, ok := ls.(graphIDRegistrar); !ok {
@ -61,7 +60,7 @@ func Migrate(root, driverName string, ls layer.Store, is image.Store, ts tag.Sto
return err return err
} }
if err := migrateTags(root, driverName, ts, mappings); err != nil { if err := migrateRefs(root, driverName, rs, mappings); err != nil {
return err return err
} }
@ -189,12 +188,12 @@ func migrateContainers(root string, ls graphIDMounter, is image.Store, imageMapp
return nil return nil
} }
type tagAdder interface { type refAdder interface {
AddTag(ref reference.Named, id image.ID, force bool) error AddTag(ref reference.Named, id image.ID, force bool) error
AddDigest(ref reference.Canonical, id image.ID, force bool) error AddDigest(ref reference.Canonical, id image.ID, force bool) error
} }
func migrateTags(root, driverName string, ts tagAdder, mappings map[string]image.ID) error { func migrateRefs(root, driverName string, rs refAdder, mappings map[string]image.ID) error {
migrationFile := filepath.Join(root, migrationTagsFileName) migrationFile := filepath.Join(root, migrationTagsFileName)
if _, err := os.Lstat(migrationFile); !os.IsNotExist(err) { if _, err := os.Lstat(migrationFile); !os.IsNotExist(err) {
return err return err
@ -232,7 +231,7 @@ func migrateTags(root, driverName string, ts tagAdder, mappings map[string]image
logrus.Errorf("migrate tags: invalid digest %q, %q", dgst, err) logrus.Errorf("migrate tags: invalid digest %q, %q", dgst, err)
continue continue
} }
if err := ts.AddDigest(canonical, strongID, false); err != nil { if err := rs.AddDigest(canonical, strongID, false); err != nil {
logrus.Errorf("can't migrate digest %q for %q, err: %q", ref.String(), strongID, err) logrus.Errorf("can't migrate digest %q for %q, err: %q", ref.String(), strongID, err)
} }
} else { } else {
@ -241,7 +240,7 @@ func migrateTags(root, driverName string, ts tagAdder, mappings map[string]image
logrus.Errorf("migrate tags: invalid tag %q, %q", tag, err) logrus.Errorf("migrate tags: invalid tag %q, %q", tag, err)
continue continue
} }
if err := ts.AddTag(tagRef, strongID, false); err != nil { if err := rs.AddTag(tagRef, strongID, false); err != nil {
logrus.Errorf("can't migrate tag %q for %q, err: %q", ref.String(), strongID, err) logrus.Errorf("can't migrate tag %q for %q, err: %q", ref.String(), strongID, err)
} }
} }

Просмотреть файл

@ -13,13 +13,13 @@ import (
"testing" "testing"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
"github.com/docker/docker/reference"
) )
func TestMigrateTags(t *testing.T) { func TestMigrateRefs(t *testing.T) {
tmpdir, err := ioutil.TempDir("", "migrate-tags") tmpdir, err := ioutil.TempDir("", "migrate-tags")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -29,7 +29,7 @@ func TestMigrateTags(t *testing.T) {
ioutil.WriteFile(filepath.Join(tmpdir, "repositories-generic"), []byte(`{"Repositories":{"busybox":{"latest":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108","sha256:16a2a52884c2a9481ed267c2d46483eac7693b813a63132368ab098a71303f8a":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108"},"registry":{"2":"5d165b8e4b203685301c815e95663231691d383fd5e3d3185d1ce3f8dddead3d","latest":"8d5547a9f329b1d3f93198cd661fb5117e5a96b721c5cf9a2c389e7dd4877128"}}}`), 0600) ioutil.WriteFile(filepath.Join(tmpdir, "repositories-generic"), []byte(`{"Repositories":{"busybox":{"latest":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108","sha256:16a2a52884c2a9481ed267c2d46483eac7693b813a63132368ab098a71303f8a":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108"},"registry":{"2":"5d165b8e4b203685301c815e95663231691d383fd5e3d3185d1ce3f8dddead3d","latest":"8d5547a9f329b1d3f93198cd661fb5117e5a96b721c5cf9a2c389e7dd4877128"}}}`), 0600)
ta := &mockTagAdder{} ta := &mockTagAdder{}
err = migrateTags(tmpdir, "generic", ta, map[string]image.ID{ err = migrateRefs(tmpdir, "generic", ta, map[string]image.ID{
"5d165b8e4b203685301c815e95663231691d383fd5e3d3185d1ce3f8dddead3d": image.ID("sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"), "5d165b8e4b203685301c815e95663231691d383fd5e3d3185d1ce3f8dddead3d": image.ID("sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"),
"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"), "b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"),
"abcdef3434c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:56434342345ae68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"), "abcdef3434c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:56434342345ae68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"),
@ -50,7 +50,7 @@ func TestMigrateTags(t *testing.T) {
// second migration is no-op // second migration is no-op
ioutil.WriteFile(filepath.Join(tmpdir, "repositories-generic"), []byte(`{"Repositories":{"busybox":{"latest":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108"`), 0600) ioutil.WriteFile(filepath.Join(tmpdir, "repositories-generic"), []byte(`{"Repositories":{"busybox":{"latest":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108"`), 0600)
err = migrateTags(tmpdir, "generic", ta, map[string]image.ID{ err = migrateRefs(tmpdir, "generic", ta, map[string]image.ID{
"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"), "b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"),
}) })
if err != nil { if err != nil {

60
reference/reference.go Normal file
Просмотреть файл

@ -0,0 +1,60 @@
package reference
import (
"github.com/docker/distribution/digest"
distreference "github.com/docker/distribution/reference"
)
// Reference is an opaque object reference identifier that may include
// modifiers such as a hostname, name, tag, and digest.
type Reference interface {
// String returns the full reference
String() string
}
// Named is an object with a full name
type Named interface {
Reference
Name() string
}
// NamedTagged is an object including a name and tag.
type NamedTagged interface {
Named
Tag() string
}
// Canonical reference is an object with a fully unique
// name including a name with hostname and digest
type Canonical interface {
Named
Digest() digest.Digest
}
// ParseNamed parses s and returns a syntactically valid reference implementing
// the Named interface. The reference must have a name, otherwise an error is
// returned.
// If an error was encountered it is returned, along with a nil Reference.
// NOTE: ParseNamed will not handle short digests.
func ParseNamed(s string) (Named, error) {
// todo: docker specific validation
return distreference.ParseNamed(s)
}
// WithName returns a named object representing the given string. If the input
// is invalid ErrReferenceInvalidFormat will be returned.
func WithName(name string) (Named, error) {
return distreference.WithName(name)
}
// WithTag combines the name from "name" and the tag from "tag" to form a
// reference incorporating both the name and the tag.
func WithTag(name Named, tag string) (NamedTagged, error) {
return distreference.WithTag(name, tag)
}
// WithDigest combines the name from "name" and the digest from "digest" to form
// a reference incorporating both the name and the digest.
func WithDigest(name Named, digest digest.Digest) (Canonical, error) {
return distreference.WithDigest(name, digest)
}

Просмотреть файл

@ -1,4 +1,4 @@
package tag package reference
import ( import (
"encoding/json" "encoding/json"
@ -11,7 +11,6 @@ import (
"sync" "sync"
"github.com/docker/distribution/digest" "github.com/docker/distribution/digest"
"github.com/docker/distribution/reference"
"github.com/docker/docker/image" "github.com/docker/docker/image"
) )
@ -26,18 +25,18 @@ var (
// An Association is a tuple associating a reference with an image ID. // An Association is a tuple associating a reference with an image ID.
type Association struct { type Association struct {
Ref reference.Named Ref Named
ImageID image.ID ImageID image.ID
} }
// Store provides the set of methods which can operate on a tag store. // Store provides the set of methods which can operate on a tag store.
type Store interface { type Store interface {
References(id image.ID) []reference.Named References(id image.ID) []Named
ReferencesByName(ref reference.Named) []Association ReferencesByName(ref Named) []Association
AddTag(ref reference.Named, id image.ID, force bool) error AddTag(ref Named, id image.ID, force bool) error
AddDigest(ref reference.Canonical, id image.ID, force bool) error AddDigest(ref Canonical, id image.ID, force bool) error
Delete(ref reference.Named) (bool, error) Delete(ref Named) (bool, error)
Get(ref reference.Named) (image.ID, error) Get(ref Named) (image.ID, error)
} }
type store struct { type store struct {
@ -49,14 +48,14 @@ type store struct {
Repositories map[string]repository Repositories map[string]repository
// referencesByIDCache is a cache of references indexed by ID, to speed // referencesByIDCache is a cache of references indexed by ID, to speed
// up References. // up References.
referencesByIDCache map[image.ID]map[string]reference.Named referencesByIDCache map[image.ID]map[string]Named
} }
// Repository maps tags to image IDs. The key is a a stringified Reference, // Repository maps tags to image IDs. The key is a a stringified Reference,
// including the repository name. // including the repository name.
type repository map[string]image.ID type repository map[string]image.ID
type lexicalRefs []reference.Named type lexicalRefs []Named
func (a lexicalRefs) Len() int { return len(a) } func (a lexicalRefs) Len() int { return len(a) }
func (a lexicalRefs) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a lexicalRefs) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
@ -68,22 +67,22 @@ func (a lexicalAssociations) Len() int { return len(a) }
func (a lexicalAssociations) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a lexicalAssociations) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a lexicalAssociations) Less(i, j int) bool { return a[i].Ref.String() < a[j].Ref.String() } func (a lexicalAssociations) Less(i, j int) bool { return a[i].Ref.String() < a[j].Ref.String() }
func defaultTagIfNameOnly(ref reference.Named) reference.Named { func defaultTagIfNameOnly(ref Named) Named {
switch ref.(type) { switch ref.(type) {
case reference.Tagged: case NamedTagged:
return ref return ref
case reference.Digested: case Canonical:
return ref return ref
default: default:
// Should never fail // Should never fail
ref, _ = reference.WithTag(ref, DefaultTag) ref, _ = WithTag(ref, DefaultTag)
return ref return ref
} }
} }
// NewTagStore creates a new tag store, tied to a file path where the set of // NewReferenceStore creates a new reference store, tied to a file path where
// tags is serialized in JSON format. // the set of references are serialized in JSON format.
func NewTagStore(jsonPath string) (Store, error) { func NewReferenceStore(jsonPath string) (Store, error) {
abspath, err := filepath.Abs(jsonPath) abspath, err := filepath.Abs(jsonPath)
if err != nil { if err != nil {
return nil, err return nil, err
@ -92,7 +91,7 @@ func NewTagStore(jsonPath string) (Store, error) {
store := &store{ store := &store{
jsonPath: abspath, jsonPath: abspath,
Repositories: make(map[string]repository), Repositories: make(map[string]repository),
referencesByIDCache: make(map[image.ID]map[string]reference.Named), referencesByIDCache: make(map[image.ID]map[string]Named),
} }
// Load the json file if it exists, otherwise create it. // Load the json file if it exists, otherwise create it.
if err := store.reload(); os.IsNotExist(err) { if err := store.reload(); os.IsNotExist(err) {
@ -105,21 +104,21 @@ func NewTagStore(jsonPath string) (Store, error) {
return store, nil return store, nil
} }
// Add adds a tag to the store. If force is set to true, existing // AddTag adds a tag reference to the store. If force is set to true, existing
// references can be overwritten. This only works for tags, not digests. // references can be overwritten. This only works for tags, not digests.
func (store *store) AddTag(ref reference.Named, id image.ID, force bool) error { func (store *store) AddTag(ref Named, id image.ID, force bool) error {
if _, isDigested := ref.(reference.Digested); isDigested { if _, isCanonical := ref.(Canonical); isCanonical {
return errors.New("refusing to create a tag with a digest reference") return errors.New("refusing to create a tag with a digest reference")
} }
return store.addReference(defaultTagIfNameOnly(ref), id, force) return store.addReference(defaultTagIfNameOnly(ref), id, force)
} }
// Add adds a digest reference to the store. // AddDigest adds a digest reference to the store.
func (store *store) AddDigest(ref reference.Canonical, id image.ID, force bool) error { func (store *store) AddDigest(ref Canonical, id image.ID, force bool) error {
return store.addReference(ref, id, force) return store.addReference(ref, id, force)
} }
func (store *store) addReference(ref reference.Named, id image.ID, force bool) error { func (store *store) addReference(ref Named, id image.ID, force bool) error {
if ref.Name() == string(digest.Canonical) { if ref.Name() == string(digest.Canonical) {
return errors.New("refusing to create an ambiguous tag using digest algorithm as name") return errors.New("refusing to create an ambiguous tag using digest algorithm as name")
} }
@ -138,7 +137,7 @@ func (store *store) addReference(ref reference.Named, id image.ID, force bool) e
if exists { if exists {
// force only works for tags // force only works for tags
if digested, isDigest := ref.(reference.Digested); isDigest { if digested, isDigest := ref.(Canonical); isDigest {
return fmt.Errorf("Cannot overwrite digest %s", digested.Digest().String()) return fmt.Errorf("Cannot overwrite digest %s", digested.Digest().String())
} }
@ -156,7 +155,7 @@ func (store *store) addReference(ref reference.Named, id image.ID, force bool) e
repository[refStr] = id repository[refStr] = id
if store.referencesByIDCache[id] == nil { if store.referencesByIDCache[id] == nil {
store.referencesByIDCache[id] = make(map[string]reference.Named) store.referencesByIDCache[id] = make(map[string]Named)
} }
store.referencesByIDCache[id][refStr] = ref store.referencesByIDCache[id][refStr] = ref
@ -165,7 +164,7 @@ func (store *store) addReference(ref reference.Named, id image.ID, force bool) e
// Delete deletes a reference from the store. It returns true if a deletion // Delete deletes a reference from the store. It returns true if a deletion
// happened, or false otherwise. // happened, or false otherwise.
func (store *store) Delete(ref reference.Named) (bool, error) { func (store *store) Delete(ref Named) (bool, error) {
ref = defaultTagIfNameOnly(ref) ref = defaultTagIfNameOnly(ref)
store.mu.Lock() store.mu.Lock()
@ -196,8 +195,8 @@ func (store *store) Delete(ref reference.Named) (bool, error) {
return false, ErrDoesNotExist return false, ErrDoesNotExist
} }
// Get retrieves an item from the store by reference. // Get retrieves an item from the store by
func (store *store) Get(ref reference.Named) (image.ID, error) { func (store *store) Get(ref Named) (image.ID, error) {
ref = defaultTagIfNameOnly(ref) ref = defaultTagIfNameOnly(ref)
store.mu.RLock() store.mu.RLock()
@ -218,15 +217,15 @@ func (store *store) Get(ref reference.Named) (image.ID, error) {
// References returns a slice of references to the given image ID. The slice // References returns a slice of references to the given image ID. The slice
// will be nil if there are no references to this image ID. // will be nil if there are no references to this image ID.
func (store *store) References(id image.ID) []reference.Named { func (store *store) References(id image.ID) []Named {
store.mu.RLock() store.mu.RLock()
defer store.mu.RUnlock() defer store.mu.RUnlock()
// Convert the internal map to an array for two reasons: // Convert the internal map to an array for two reasons:
// 1) We must not return a mutable reference. // 1) We must not return a mutable
// 2) It would be ugly to expose the extraneous map keys to callers. // 2) It would be ugly to expose the extraneous map keys to callers.
var references []reference.Named var references []Named
for _, ref := range store.referencesByIDCache[id] { for _, ref := range store.referencesByIDCache[id] {
references = append(references, ref) references = append(references, ref)
} }
@ -239,7 +238,7 @@ func (store *store) References(id image.ID) []reference.Named {
// ReferencesByName returns the references for a given repository name. // ReferencesByName returns the references for a given repository name.
// If there are no references known for this repository name, // If there are no references known for this repository name,
// ReferencesByName returns nil. // ReferencesByName returns nil.
func (store *store) ReferencesByName(ref reference.Named) []Association { func (store *store) ReferencesByName(ref Named) []Association {
store.mu.RLock() store.mu.RLock()
defer store.mu.RUnlock() defer store.mu.RUnlock()
@ -250,7 +249,7 @@ func (store *store) ReferencesByName(ref reference.Named) []Association {
var associations []Association var associations []Association
for refStr, refID := range repository { for refStr, refID := range repository {
ref, err := reference.ParseNamed(refStr) ref, err := ParseNamed(refStr)
if err != nil { if err != nil {
// Should never happen // Should never happen
return nil return nil
@ -299,13 +298,13 @@ func (store *store) reload() error {
for _, repository := range store.Repositories { for _, repository := range store.Repositories {
for refStr, refID := range repository { for refStr, refID := range repository {
ref, err := reference.ParseNamed(refStr) ref, err := ParseNamed(refStr)
if err != nil { if err != nil {
// Should never happen // Should never happen
continue continue
} }
if store.referencesByIDCache[refID] == nil { if store.referencesByIDCache[refID] == nil {
store.referencesByIDCache[refID] = make(map[string]reference.Named) store.referencesByIDCache[refID] = make(map[string]Named)
} }
store.referencesByIDCache[refID][refStr] = ref store.referencesByIDCache[refID][refStr] = ref
} }

Просмотреть файл

@ -1,4 +1,4 @@
package tag package reference
import ( import (
"bytes" "bytes"
@ -8,7 +8,6 @@ import (
"strings" "strings"
"testing" "testing"
"github.com/docker/distribution/reference"
"github.com/docker/docker/image" "github.com/docker/docker/image"
) )
@ -40,13 +39,13 @@ func TestLoad(t *testing.T) {
} }
jsonFile.Close() jsonFile.Close()
store, err := NewTagStore(jsonFile.Name()) store, err := NewReferenceStore(jsonFile.Name())
if err != nil { if err != nil {
t.Fatalf("error creating tag store: %v", err) t.Fatalf("error creating tag store: %v", err)
} }
for refStr, expectedID := range saveLoadTestCases { for refStr, expectedID := range saveLoadTestCases {
ref, err := reference.ParseNamed(refStr) ref, err := ParseNamed(refStr)
if err != nil { if err != nil {
t.Fatalf("failed to parse reference: %v", err) t.Fatalf("failed to parse reference: %v", err)
} }
@ -69,17 +68,17 @@ func TestSave(t *testing.T) {
jsonFile.Close() jsonFile.Close()
defer os.RemoveAll(jsonFile.Name()) defer os.RemoveAll(jsonFile.Name())
store, err := NewTagStore(jsonFile.Name()) store, err := NewReferenceStore(jsonFile.Name())
if err != nil { if err != nil {
t.Fatalf("error creating tag store: %v", err) t.Fatalf("error creating tag store: %v", err)
} }
for refStr, id := range saveLoadTestCases { for refStr, id := range saveLoadTestCases {
ref, err := reference.ParseNamed(refStr) ref, err := ParseNamed(refStr)
if err != nil { if err != nil {
t.Fatalf("failed to parse reference: %v", err) t.Fatalf("failed to parse reference: %v", err)
} }
if canonical, ok := ref.(reference.Canonical); ok { if canonical, ok := ref.(Canonical); ok {
err = store.AddDigest(canonical, id, false) err = store.AddDigest(canonical, id, false)
if err != nil { if err != nil {
t.Fatalf("could not add digest reference %s: %v", refStr, err) t.Fatalf("could not add digest reference %s: %v", refStr, err)
@ -111,7 +110,7 @@ func TestAddDeleteGet(t *testing.T) {
jsonFile.Close() jsonFile.Close()
defer os.RemoveAll(jsonFile.Name()) defer os.RemoveAll(jsonFile.Name())
store, err := NewTagStore(jsonFile.Name()) store, err := NewReferenceStore(jsonFile.Name())
if err != nil { if err != nil {
t.Fatalf("error creating tag store: %v", err) t.Fatalf("error creating tag store: %v", err)
} }
@ -121,7 +120,7 @@ func TestAddDeleteGet(t *testing.T) {
testImageID3 := image.ID("sha256:9655aef5fd742a1b4e1b7b163aa9f1c76c186304bf39102283d80927c916ca9e") testImageID3 := image.ID("sha256:9655aef5fd742a1b4e1b7b163aa9f1c76c186304bf39102283d80927c916ca9e")
// Try adding a reference with no tag or digest // Try adding a reference with no tag or digest
nameOnly, err := reference.WithName("username/repo") nameOnly, err := WithName("username/repo")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
@ -130,7 +129,7 @@ func TestAddDeleteGet(t *testing.T) {
} }
// Add a few references // Add a few references
ref1, err := reference.ParseNamed("username/repo1:latest") ref1, err := ParseNamed("username/repo1:latest")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
@ -138,7 +137,7 @@ func TestAddDeleteGet(t *testing.T) {
t.Fatalf("error adding to store: %v", err) t.Fatalf("error adding to store: %v", err)
} }
ref2, err := reference.ParseNamed("username/repo1:old") ref2, err := ParseNamed("username/repo1:old")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
@ -146,7 +145,7 @@ func TestAddDeleteGet(t *testing.T) {
t.Fatalf("error adding to store: %v", err) t.Fatalf("error adding to store: %v", err)
} }
ref3, err := reference.ParseNamed("username/repo1:alias") ref3, err := ParseNamed("username/repo1:alias")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
@ -154,7 +153,7 @@ func TestAddDeleteGet(t *testing.T) {
t.Fatalf("error adding to store: %v", err) t.Fatalf("error adding to store: %v", err)
} }
ref4, err := reference.ParseNamed("username/repo2:latest") ref4, err := ParseNamed("username/repo2:latest")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
@ -162,11 +161,11 @@ func TestAddDeleteGet(t *testing.T) {
t.Fatalf("error adding to store: %v", err) t.Fatalf("error adding to store: %v", err)
} }
ref5, err := reference.ParseNamed("username/repo3@sha256:58153dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c") ref5, err := ParseNamed("username/repo3@sha256:58153dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
if err = store.AddDigest(ref5.(reference.Canonical), testImageID2, false); err != nil { if err = store.AddDigest(ref5.(Canonical), testImageID2, false); err != nil {
t.Fatalf("error adding to store: %v", err) t.Fatalf("error adding to store: %v", err)
} }
@ -229,7 +228,7 @@ func TestAddDeleteGet(t *testing.T) {
} }
// Get should return ErrDoesNotExist for a nonexistent repo // Get should return ErrDoesNotExist for a nonexistent repo
nonExistRepo, err := reference.ParseNamed("username/nonexistrepo:latest") nonExistRepo, err := ParseNamed("username/nonexistrepo:latest")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
@ -238,7 +237,7 @@ func TestAddDeleteGet(t *testing.T) {
} }
// Get should return ErrDoesNotExist for a nonexistent tag // Get should return ErrDoesNotExist for a nonexistent tag
nonExistTag, err := reference.ParseNamed("username/repo1:nonexist") nonExistTag, err := ParseNamed("username/repo1:nonexist")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
@ -264,7 +263,7 @@ func TestAddDeleteGet(t *testing.T) {
} }
// Check ReferencesByName // Check ReferencesByName
repoName, err := reference.WithName("username/repo1") repoName, err := WithName("username/repo1")
if err != nil { if err != nil {
t.Fatalf("could not parse reference: %v", err) t.Fatalf("could not parse reference: %v", err)
} }
@ -328,14 +327,14 @@ func TestInvalidTags(t *testing.T) {
tmpDir, err := ioutil.TempDir("", "tag-store-test") tmpDir, err := ioutil.TempDir("", "tag-store-test")
defer os.RemoveAll(tmpDir) defer os.RemoveAll(tmpDir)
store, err := NewTagStore(filepath.Join(tmpDir, "repositories.json")) store, err := NewReferenceStore(filepath.Join(tmpDir, "repositories.json"))
if err != nil { if err != nil {
t.Fatalf("error creating tag store: %v", err) t.Fatalf("error creating tag store: %v", err)
} }
id := image.ID("sha256:470022b8af682154f57a2163d030eb369549549cba00edc69e1b99b46bb924d6") id := image.ID("sha256:470022b8af682154f57a2163d030eb369549549cba00edc69e1b99b46bb924d6")
// sha256 as repo name // sha256 as repo name
ref, err := reference.ParseNamed("sha256:abc") ref, err := ParseNamed("sha256:abc")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -345,7 +344,7 @@ func TestInvalidTags(t *testing.T) {
} }
// setting digest as a tag // setting digest as a tag
ref, err = reference.ParseNamed("registry@sha256:367eb40fd0330a7e464777121e39d2f5b3e8e23a1e159342e53ab05c9e4d94e6") ref, err = ParseNamed("registry@sha256:367eb40fd0330a7e464777121e39d2f5b3e8e23a1e159342e53ab05c9e4d94e6")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

Просмотреть файл

@ -7,11 +7,12 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/docker/distribution/reference" distreference "github.com/docker/distribution/reference"
registrytypes "github.com/docker/docker/api/types/registry" registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/image/v1" "github.com/docker/docker/image/v1"
"github.com/docker/docker/opts" "github.com/docker/docker/opts"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/reference"
) )
// Options holds command line options. // Options holds command line options.
@ -269,7 +270,7 @@ func GetAuthConfigKey(index *registrytypes.IndexInfo) string {
// splitReposName breaks a reposName into an index name and remote name // splitReposName breaks a reposName into an index name and remote name
func splitReposName(reposName reference.Named) (indexName string, remoteName reference.Named, err error) { func splitReposName(reposName reference.Named) (indexName string, remoteName reference.Named, err error) {
var remoteNameStr string var remoteNameStr string
indexName, remoteNameStr = reference.SplitHostname(reposName) indexName, remoteNameStr = distreference.SplitHostname(reposName)
if indexName == "" || (!strings.Contains(indexName, ".") && if indexName == "" || (!strings.Contains(indexName, ".") &&
!strings.Contains(indexName, ":") && indexName != "localhost") { !strings.Contains(indexName, ":") && indexName != "localhost") {
// This is a Docker Index repos (ex: samalba/hipache or ubuntu) // This is a Docker Index repos (ex: samalba/hipache or ubuntu)
@ -405,13 +406,13 @@ func localNameFromRemote(indexName string, remoteName reference.Named) (referenc
// error. // error.
func NormalizeLocalReference(ref reference.Named) reference.Named { func NormalizeLocalReference(ref reference.Named) reference.Named {
localName := NormalizeLocalName(ref) localName := NormalizeLocalName(ref)
if tagged, isTagged := ref.(reference.Tagged); isTagged { if tagged, isTagged := ref.(reference.NamedTagged); isTagged {
newRef, err := reference.WithTag(localName, tagged.Tag()) newRef, err := reference.WithTag(localName, tagged.Tag())
if err != nil { if err != nil {
return ref return ref
} }
return newRef return newRef
} else if digested, isDigested := ref.(reference.Digested); isDigested { } else if digested, isCanonical := ref.(reference.Canonical); isCanonical {
newRef, err := reference.WithDigest(localName, digested.Digest()) newRef, err := reference.WithDigest(localName, digested.Digest())
if err != nil { if err != nil {
return ref return ref

Просмотреть файл

@ -15,9 +15,9 @@ import (
"testing" "testing"
"time" "time"
"github.com/docker/distribution/reference"
registrytypes "github.com/docker/docker/api/types/registry" registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/opts" "github.com/docker/docker/opts"
"github.com/docker/docker/reference"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"

Просмотреть файл

@ -8,10 +8,10 @@ import (
"strings" "strings"
"testing" "testing"
"github.com/docker/distribution/reference"
"github.com/docker/distribution/registry/client/transport" "github.com/docker/distribution/registry/client/transport"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
registrytypes "github.com/docker/docker/api/types/registry" registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/reference"
) )
var ( var (

Просмотреть файл

@ -6,10 +6,10 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/docker/distribution/reference"
"github.com/docker/distribution/registry/client/auth" "github.com/docker/distribution/registry/client/auth"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
registrytypes "github.com/docker/docker/api/types/registry" registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/reference"
) )
// Service is a registry service. It tracks configuration data such as a list // Service is a registry service. It tracks configuration data such as a list

Просмотреть файл

@ -4,8 +4,8 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/docker/distribution/reference"
"github.com/docker/docker/pkg/tlsconfig" "github.com/docker/docker/pkg/tlsconfig"
"github.com/docker/docker/reference"
) )
func (s *Service) lookupV1Endpoints(repoName reference.Named) (endpoints []APIEndpoint, err error) { func (s *Service) lookupV1Endpoints(repoName reference.Named) (endpoints []APIEndpoint, err error) {

Просмотреть файл

@ -4,9 +4,9 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/docker/distribution/reference"
"github.com/docker/distribution/registry/client/auth" "github.com/docker/distribution/registry/client/auth"
"github.com/docker/docker/pkg/tlsconfig" "github.com/docker/docker/pkg/tlsconfig"
"github.com/docker/docker/reference"
) )
func (s *Service) lookupV2Endpoints(repoName reference.Named) (endpoints []APIEndpoint, err error) { func (s *Service) lookupV2Endpoints(repoName reference.Named) (endpoints []APIEndpoint, err error) {

Просмотреть файл

@ -19,13 +19,13 @@ import (
"strings" "strings"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
registrytypes "github.com/docker/docker/api/types/registry" registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/pkg/httputils" "github.com/docker/docker/pkg/httputils"
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/pkg/tarsum" "github.com/docker/docker/pkg/tarsum"
"github.com/docker/docker/reference"
) )
var ( var (

Просмотреть файл

@ -1,8 +1,8 @@
package registry package registry
import ( import (
"github.com/docker/distribution/reference"
registrytypes "github.com/docker/docker/api/types/registry" registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/reference"
) )
// RepositoryData tracks the image list, list of endpoints, and list of tokens // RepositoryData tracks the image list, list of endpoints, and list of tokens