mirror of
https://github.com/containers/skopeo.git
synced 2025-08-12 03:42:14 +00:00
Merge pull request #376 from runcom/fix-375
vendor c/image: fix auth handlers
This commit is contained in:
commit
b2a06ed720
80
vendor/github.com/containers/image/README.md
generated
vendored
Normal file
80
vendor/github.com/containers/image/README.md
generated
vendored
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
[](https://godoc.org/github.com/containers/image) [](https://travis-ci.org/containers/image)
|
||||||
|
=
|
||||||
|
|
||||||
|
`image` is a set of Go libraries aimed at working in various way with
|
||||||
|
containers' images and container image registries.
|
||||||
|
|
||||||
|
The containers/image library allows application to pull and push images from
|
||||||
|
container image registries, like the upstream docker registry. It also
|
||||||
|
implements "simple image signing".
|
||||||
|
|
||||||
|
The containers/image library also allows you to inspect a repository on a
|
||||||
|
container registry without pulling down the image. This means it fetches the
|
||||||
|
repository's manifest and it is able to show you a `docker inspect`-like json
|
||||||
|
output about a whole repository or a tag. This library, in contrast to `docker
|
||||||
|
inspect`, helps you gather useful information about a repository or a tag
|
||||||
|
without requiring you to run `docker pull`.
|
||||||
|
|
||||||
|
The containers/image library also allows you to translate from one image format
|
||||||
|
to another, for example docker container images to OCI images. It also allows
|
||||||
|
you to copy container images between various registries, possibly converting
|
||||||
|
them as necessary, and to sign and verify images.
|
||||||
|
|
||||||
|
## Command-line usage
|
||||||
|
|
||||||
|
The containers/image project is only a library with no user interface;
|
||||||
|
you can either incorporate it into your Go programs, or use the `skopeo` tool:
|
||||||
|
|
||||||
|
The [skopeo](https://github.com/projectatomic/skopeo) tool uses the
|
||||||
|
containers/image library and takes advantage of many of its features,
|
||||||
|
e.g. `skopeo copy` exposes the `containers/image/copy.Image` functionality.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
This library does not ship a committed version of its dependencies in a `vendor`
|
||||||
|
subdirectory. This is so you can make well-informed decisions about which
|
||||||
|
libraries you should use with this package in your own projects, and because
|
||||||
|
types defined in the `vendor` directory would be impossible to use from your projects.
|
||||||
|
|
||||||
|
What this project tests against dependencies-wise is located
|
||||||
|
[in vendor.conf](https://github.com/containers/image/blob/master/vendor.conf).
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
If you want to see what the library can do, or an example of how it is called,
|
||||||
|
consider starting with the [skopeo](https://github.com/projectatomic/skopeo) tool
|
||||||
|
instead.
|
||||||
|
|
||||||
|
To integrate this library into your project, put it into `$GOPATH` or use
|
||||||
|
your preferred vendoring tool to include a copy in your project.
|
||||||
|
Ensure that the dependencies documented [in vendor.conf](https://github.com/containers/image/blob/master/vendor.conf)
|
||||||
|
are also available
|
||||||
|
(using those exact versions or different versions of your choosing).
|
||||||
|
|
||||||
|
This library, by default, also depends on the GpgME and libostree C libraries. Either install them:
|
||||||
|
```sh
|
||||||
|
Fedora$ dnf install gpgme-devel libassuan-devel libostree-devel
|
||||||
|
macOS$ brew install gpgme
|
||||||
|
```
|
||||||
|
or use the build tags described below to avoid the dependencies (e.g. using `go build -tags …`)
|
||||||
|
|
||||||
|
### Supported build tags
|
||||||
|
|
||||||
|
- `containers_image_openpgp`: Use a Golang-only OpenPGP implementation for signature verification instead of the default cgo/gpgme-based implementation;
|
||||||
|
the primary downside is that creating new signatures with the Golang-only implementation is not supported.
|
||||||
|
- `containers_image_ostree_stub`: Instead of importing `ostree:` transport in `github.com/containers/image/transports/alltransports`, use a stub which reports that the transport is not supported. This allows building the library without requiring the `libostree` development libraries.
|
||||||
|
|
||||||
|
(Note that explicitly importing `github.com/containers/image/ostree` will still depend on the `libostree` library, this build tag only affects generic users of …`/alltransports`.)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
When developing this library, please use `make` (or `make … BUILDTAGS=…`) to take advantage of the tests and validation.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
ASL 2.0
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
- Mailing list: [containers-dev](https://groups.google.com/forum/?hl=en#!forum/containers-dev)
|
||||||
|
- IRC: #[container-projects](irc://irc.freenode.net:6667/#container-projects) on freenode.net
|
8
vendor/github.com/containers/image/docker/docker_client.go
generated
vendored
8
vendor/github.com/containers/image/docker/docker_client.go
generated
vendored
@ -308,8 +308,7 @@ func (c *dockerClient) setupRequestAuth(req *http.Request) error {
|
|||||||
if len(c.challenges) == 0 {
|
if len(c.challenges) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// assume just one...
|
for _, challenge := range c.challenges {
|
||||||
challenge := c.challenges[0]
|
|
||||||
switch challenge.Scheme {
|
switch challenge.Scheme {
|
||||||
case "basic":
|
case "basic":
|
||||||
req.SetBasicAuth(c.username, c.password)
|
req.SetBasicAuth(c.username, c.password)
|
||||||
@ -331,8 +330,11 @@ func (c *dockerClient) setupRequestAuth(req *http.Request) error {
|
|||||||
}
|
}
|
||||||
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.token.Token))
|
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.token.Token))
|
||||||
return nil
|
return nil
|
||||||
|
default:
|
||||||
|
logrus.Debugf("no handler for %s authentication", challenge.Scheme)
|
||||||
}
|
}
|
||||||
return errors.Errorf("no handler for %s authentication", challenge.Scheme)
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *dockerClient) getBearerToken(realm, service, scope string) (*bearerToken, error) {
|
func (c *dockerClient) getBearerToken(realm, service, scope string) (*bearerToken, error) {
|
||||||
|
2
vendor/github.com/containers/image/docker/reference/README.md
generated
vendored
Normal file
2
vendor/github.com/containers/image/docker/reference/README.md
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
This is a copy of github.com/docker/distribution/reference as of commit fb0bebc4b64e3881cc52a2478d749845ed76d2a8,
|
||||||
|
except that ParseAnyReferenceWithSet has been removed to drop the dependency on github.com/docker/distribution/digestset.
|
2
vendor/github.com/containers/image/image/docker_list.go
generated
vendored
2
vendor/github.com/containers/image/image/docker_list.go
generated
vendored
@ -16,7 +16,7 @@ type platformSpec struct {
|
|||||||
OSVersion string `json:"os.version,omitempty"`
|
OSVersion string `json:"os.version,omitempty"`
|
||||||
OSFeatures []string `json:"os.features,omitempty"`
|
OSFeatures []string `json:"os.features,omitempty"`
|
||||||
Variant string `json:"variant,omitempty"`
|
Variant string `json:"variant,omitempty"`
|
||||||
Features []string `json:"features,omitempty"`
|
Features []string `json:"features,omitempty"` // removed in OCI
|
||||||
}
|
}
|
||||||
|
|
||||||
// A manifestDescriptor references a platform-specific manifest.
|
// A manifestDescriptor references a platform-specific manifest.
|
||||||
|
9
vendor/github.com/containers/image/image/docker_schema2.go
generated
vendored
9
vendor/github.com/containers/image/image/docker_schema2.go
generated
vendored
@ -183,6 +183,7 @@ func (m *manifestSchema2) UpdatedImage(options types.ManifestUpdateOptions) (typ
|
|||||||
}
|
}
|
||||||
copy.LayersDescriptors = make([]descriptor, len(options.LayerInfos))
|
copy.LayersDescriptors = make([]descriptor, len(options.LayerInfos))
|
||||||
for i, info := range options.LayerInfos {
|
for i, info := range options.LayerInfos {
|
||||||
|
copy.LayersDescriptors[i].MediaType = m.LayersDescriptors[i].MediaType
|
||||||
copy.LayersDescriptors[i].Digest = info.Digest
|
copy.LayersDescriptors[i].Digest = info.Digest
|
||||||
copy.LayersDescriptors[i].Size = info.Size
|
copy.LayersDescriptors[i].Size = info.Size
|
||||||
copy.LayersDescriptors[i].URLs = info.URLs
|
copy.LayersDescriptors[i].URLs = info.URLs
|
||||||
@ -213,15 +214,17 @@ func (m *manifestSchema2) convertToManifestOCI1() (types.Image, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
config := descriptor{
|
config := descriptorOCI1{
|
||||||
|
descriptor: descriptor{
|
||||||
MediaType: imgspecv1.MediaTypeImageConfig,
|
MediaType: imgspecv1.MediaTypeImageConfig,
|
||||||
Size: int64(len(configOCIBytes)),
|
Size: int64(len(configOCIBytes)),
|
||||||
Digest: digest.FromBytes(configOCIBytes),
|
Digest: digest.FromBytes(configOCIBytes),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
layers := make([]descriptor, len(m.LayersDescriptors))
|
layers := make([]descriptorOCI1, len(m.LayersDescriptors))
|
||||||
for idx := range layers {
|
for idx := range layers {
|
||||||
layers[idx] = m.LayersDescriptors[idx]
|
layers[idx] = descriptorOCI1{descriptor: m.LayersDescriptors[idx]}
|
||||||
if m.LayersDescriptors[idx].MediaType == manifest.DockerV2Schema2ForeignLayerMediaType {
|
if m.LayersDescriptors[idx].MediaType == manifest.DockerV2Schema2ForeignLayerMediaType {
|
||||||
layers[idx].MediaType = imgspecv1.MediaTypeImageLayerNonDistributable
|
layers[idx].MediaType = imgspecv1.MediaTypeImageLayerNonDistributable
|
||||||
} else {
|
} else {
|
||||||
|
19
vendor/github.com/containers/image/image/oci.go
generated
vendored
19
vendor/github.com/containers/image/image/oci.go
generated
vendored
@ -12,12 +12,18 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type descriptorOCI1 struct {
|
||||||
|
descriptor
|
||||||
|
Annotations map[string]string `json:"annotations,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
type manifestOCI1 struct {
|
type manifestOCI1 struct {
|
||||||
src types.ImageSource // May be nil if configBlob is not nil
|
src types.ImageSource // May be nil if configBlob is not nil
|
||||||
configBlob []byte // If set, corresponds to contents of ConfigDescriptor.
|
configBlob []byte // If set, corresponds to contents of ConfigDescriptor.
|
||||||
SchemaVersion int `json:"schemaVersion"`
|
SchemaVersion int `json:"schemaVersion"`
|
||||||
ConfigDescriptor descriptor `json:"config"`
|
ConfigDescriptor descriptorOCI1 `json:"config"`
|
||||||
LayersDescriptors []descriptor `json:"layers"`
|
LayersDescriptors []descriptorOCI1 `json:"layers"`
|
||||||
|
Annotations map[string]string `json:"annotations,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func manifestOCI1FromManifest(src types.ImageSource, manifest []byte) (genericManifest, error) {
|
func manifestOCI1FromManifest(src types.ImageSource, manifest []byte) (genericManifest, error) {
|
||||||
@ -29,7 +35,7 @@ func manifestOCI1FromManifest(src types.ImageSource, manifest []byte) (genericMa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// manifestOCI1FromComponents builds a new manifestOCI1 from the supplied data:
|
// manifestOCI1FromComponents builds a new manifestOCI1 from the supplied data:
|
||||||
func manifestOCI1FromComponents(config descriptor, src types.ImageSource, configBlob []byte, layers []descriptor) genericManifest {
|
func manifestOCI1FromComponents(config descriptorOCI1, src types.ImageSource, configBlob []byte, layers []descriptorOCI1) genericManifest {
|
||||||
return &manifestOCI1{
|
return &manifestOCI1{
|
||||||
src: src,
|
src: src,
|
||||||
configBlob: configBlob,
|
configBlob: configBlob,
|
||||||
@ -148,8 +154,9 @@ func (m *manifestOCI1) UpdatedImage(options types.ManifestUpdateOptions) (types.
|
|||||||
if len(copy.LayersDescriptors) != len(options.LayerInfos) {
|
if len(copy.LayersDescriptors) != len(options.LayerInfos) {
|
||||||
return nil, errors.Errorf("Error preparing updated manifest: layer count changed from %d to %d", len(copy.LayersDescriptors), len(options.LayerInfos))
|
return nil, errors.Errorf("Error preparing updated manifest: layer count changed from %d to %d", len(copy.LayersDescriptors), len(options.LayerInfos))
|
||||||
}
|
}
|
||||||
copy.LayersDescriptors = make([]descriptor, len(options.LayerInfos))
|
copy.LayersDescriptors = make([]descriptorOCI1, len(options.LayerInfos))
|
||||||
for i, info := range options.LayerInfos {
|
for i, info := range options.LayerInfos {
|
||||||
|
copy.LayersDescriptors[i].MediaType = m.LayersDescriptors[i].MediaType
|
||||||
copy.LayersDescriptors[i].Digest = info.Digest
|
copy.LayersDescriptors[i].Digest = info.Digest
|
||||||
copy.LayersDescriptors[i].Size = info.Size
|
copy.LayersDescriptors[i].Size = info.Size
|
||||||
}
|
}
|
||||||
@ -169,7 +176,7 @@ func (m *manifestOCI1) UpdatedImage(options types.ManifestUpdateOptions) (types.
|
|||||||
|
|
||||||
func (m *manifestOCI1) convertToManifestSchema2() (types.Image, error) {
|
func (m *manifestOCI1) convertToManifestSchema2() (types.Image, error) {
|
||||||
// Create a copy of the descriptor.
|
// Create a copy of the descriptor.
|
||||||
config := m.ConfigDescriptor
|
config := m.ConfigDescriptor.descriptor
|
||||||
|
|
||||||
// The only difference between OCI and DockerSchema2 is the mediatypes. The
|
// The only difference between OCI and DockerSchema2 is the mediatypes. The
|
||||||
// media type of the manifest is handled by manifestSchema2FromComponents.
|
// media type of the manifest is handled by manifestSchema2FromComponents.
|
||||||
@ -177,7 +184,7 @@ func (m *manifestOCI1) convertToManifestSchema2() (types.Image, error) {
|
|||||||
|
|
||||||
layers := make([]descriptor, len(m.LayersDescriptors))
|
layers := make([]descriptor, len(m.LayersDescriptors))
|
||||||
for idx := range layers {
|
for idx := range layers {
|
||||||
layers[idx] = m.LayersDescriptors[idx]
|
layers[idx] = m.LayersDescriptors[idx].descriptor
|
||||||
layers[idx].MediaType = manifest.DockerV2Schema2LayerMediaType
|
layers[idx].MediaType = manifest.DockerV2Schema2LayerMediaType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
vendor/github.com/containers/image/pkg/strslice/README.md
generated
vendored
Normal file
1
vendor/github.com/containers/image/pkg/strslice/README.md
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
This package was replicated from [github.com/docker/docker v17.04.0-ce](https://github.com/docker/docker/tree/v17.04.0-ce/api/types/strslice).
|
12
vendor/github.com/containers/image/storage/storage_image.go
generated
vendored
12
vendor/github.com/containers/image/storage/storage_image.go
generated
vendored
@ -174,11 +174,11 @@ func (s *storageImageDestination) putBlob(stream io.Reader, blobinfo types.BlobI
|
|||||||
}
|
}
|
||||||
// Attempt to create the identified layer and import its contents.
|
// Attempt to create the identified layer and import its contents.
|
||||||
layer, uncompressedSize, err := s.imageRef.transport.store.PutLayer(id, parentLayer, nil, "", true, multi)
|
layer, uncompressedSize, err := s.imageRef.transport.store.PutLayer(id, parentLayer, nil, "", true, multi)
|
||||||
if err != nil && err != storage.ErrDuplicateID {
|
if err != nil && errors.Cause(err) != storage.ErrDuplicateID {
|
||||||
logrus.Debugf("error importing layer blob %q as %q: %v", blobinfo.Digest, id, err)
|
logrus.Debugf("error importing layer blob %q as %q: %v", blobinfo.Digest, id, err)
|
||||||
return errorBlobInfo, err
|
return errorBlobInfo, err
|
||||||
}
|
}
|
||||||
if err == storage.ErrDuplicateID {
|
if errors.Cause(err) == storage.ErrDuplicateID {
|
||||||
// We specified an ID, and there's already a layer with
|
// We specified an ID, and there's already a layer with
|
||||||
// the same ID. Drain the input so that we can look at
|
// the same ID. Drain the input so that we can look at
|
||||||
// its length and digest.
|
// its length and digest.
|
||||||
@ -291,7 +291,7 @@ func (s *storageImageDestination) PutBlob(stream io.Reader, blobinfo types.BlobI
|
|||||||
// it returns a non-nil error only on an unexpected failure.
|
// it returns a non-nil error only on an unexpected failure.
|
||||||
func (s *storageImageDestination) HasBlob(blobinfo types.BlobInfo) (bool, int64, error) {
|
func (s *storageImageDestination) HasBlob(blobinfo types.BlobInfo) (bool, int64, error) {
|
||||||
if blobinfo.Digest == "" {
|
if blobinfo.Digest == "" {
|
||||||
return false, -1, errors.Errorf(`"Can not check for a blob with unknown digest`)
|
return false, -1, errors.Errorf(`Can not check for a blob with unknown digest`)
|
||||||
}
|
}
|
||||||
for _, blob := range s.BlobList {
|
for _, blob := range s.BlobList {
|
||||||
if blob.Digest == blobinfo.Digest {
|
if blob.Digest == blobinfo.Digest {
|
||||||
@ -331,7 +331,7 @@ func (s *storageImageDestination) Commit() error {
|
|||||||
}
|
}
|
||||||
img, err := s.imageRef.transport.store.CreateImage(s.ID, nil, lastLayer, "", nil)
|
img, err := s.imageRef.transport.store.CreateImage(s.ID, nil, lastLayer, "", nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err != storage.ErrDuplicateID {
|
if errors.Cause(err) != storage.ErrDuplicateID {
|
||||||
logrus.Debugf("error creating image: %q", err)
|
logrus.Debugf("error creating image: %q", err)
|
||||||
return errors.Wrapf(err, "error creating image %q", s.ID)
|
return errors.Wrapf(err, "error creating image %q", s.ID)
|
||||||
}
|
}
|
||||||
@ -340,8 +340,8 @@ func (s *storageImageDestination) Commit() error {
|
|||||||
return errors.Wrapf(err, "error reading image %q", s.ID)
|
return errors.Wrapf(err, "error reading image %q", s.ID)
|
||||||
}
|
}
|
||||||
if img.TopLayer != lastLayer {
|
if img.TopLayer != lastLayer {
|
||||||
logrus.Debugf("error creating image: image with ID %q exists, but uses different layers", err)
|
logrus.Debugf("error creating image: image with ID %q exists, but uses different layers", s.ID)
|
||||||
return errors.Wrapf(err, "image with ID %q already exists, but uses a different top layer", s.ID)
|
return errors.Wrapf(storage.ErrDuplicateID, "image with ID %q already exists, but uses a different top layer", s.ID)
|
||||||
}
|
}
|
||||||
logrus.Debugf("reusing image ID %q", img.ID)
|
logrus.Debugf("reusing image ID %q", img.ID)
|
||||||
} else {
|
} else {
|
||||||
|
18
vendor/github.com/containers/image/storage/storage_reference.go
generated
vendored
18
vendor/github.com/containers/image/storage/storage_reference.go
generated
vendored
@ -71,6 +71,8 @@ func (s *storageReference) resolveImage() (*storage.Image, error) {
|
|||||||
func (s storageReference) Transport() types.ImageTransport {
|
func (s storageReference) Transport() types.ImageTransport {
|
||||||
return &storageTransport{
|
return &storageTransport{
|
||||||
store: s.transport.store,
|
store: s.transport.store,
|
||||||
|
defaultUIDMap: s.transport.defaultUIDMap,
|
||||||
|
defaultGIDMap: s.transport.defaultGIDMap,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,7 +85,12 @@ func (s storageReference) DockerReference() reference.Named {
|
|||||||
// disambiguate between images which may be present in multiple stores and
|
// disambiguate between images which may be present in multiple stores and
|
||||||
// share only their names.
|
// share only their names.
|
||||||
func (s storageReference) StringWithinTransport() string {
|
func (s storageReference) StringWithinTransport() string {
|
||||||
storeSpec := "[" + s.transport.store.GraphDriverName() + "@" + s.transport.store.GraphRoot() + "]"
|
optionsList := ""
|
||||||
|
options := s.transport.store.GraphOptions()
|
||||||
|
if len(options) > 0 {
|
||||||
|
optionsList = ":" + strings.Join(options, ",")
|
||||||
|
}
|
||||||
|
storeSpec := "[" + s.transport.store.GraphDriverName() + "@" + s.transport.store.GraphRoot() + "+" + s.transport.store.RunRoot() + optionsList + "]"
|
||||||
if s.name == nil {
|
if s.name == nil {
|
||||||
return storeSpec + "@" + s.id
|
return storeSpec + "@" + s.id
|
||||||
}
|
}
|
||||||
@ -94,7 +101,14 @@ func (s storageReference) StringWithinTransport() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s storageReference) PolicyConfigurationIdentity() string {
|
func (s storageReference) PolicyConfigurationIdentity() string {
|
||||||
return s.StringWithinTransport()
|
storeSpec := "[" + s.transport.store.GraphDriverName() + "@" + s.transport.store.GraphRoot() + "]"
|
||||||
|
if s.name == nil {
|
||||||
|
return storeSpec + "@" + s.id
|
||||||
|
}
|
||||||
|
if s.id == "" {
|
||||||
|
return storeSpec + s.reference
|
||||||
|
}
|
||||||
|
return storeSpec + s.reference + "@" + s.id
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also accept policy that's tied to the combination of the graph root and
|
// Also accept policy that's tied to the combination of the graph root and
|
||||||
|
129
vendor/github.com/containers/image/storage/storage_transport.go
generated
vendored
129
vendor/github.com/containers/image/storage/storage_transport.go
generated
vendored
@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/containers/image/transports"
|
"github.com/containers/image/transports"
|
||||||
"github.com/containers/image/types"
|
"github.com/containers/image/types"
|
||||||
"github.com/containers/storage"
|
"github.com/containers/storage"
|
||||||
|
"github.com/containers/storage/pkg/idtools"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
ddigest "github.com/opencontainers/go-digest"
|
ddigest "github.com/opencontainers/go-digest"
|
||||||
)
|
)
|
||||||
@ -46,10 +47,20 @@ type StoreTransport interface {
|
|||||||
// ParseStoreReference parses a reference, overriding any store
|
// ParseStoreReference parses a reference, overriding any store
|
||||||
// specification that it may contain.
|
// specification that it may contain.
|
||||||
ParseStoreReference(store storage.Store, reference string) (*storageReference, error)
|
ParseStoreReference(store storage.Store, reference string) (*storageReference, error)
|
||||||
|
// SetDefaultUIDMap sets the default UID map to use when opening stores.
|
||||||
|
SetDefaultUIDMap(idmap []idtools.IDMap)
|
||||||
|
// SetDefaultGIDMap sets the default GID map to use when opening stores.
|
||||||
|
SetDefaultGIDMap(idmap []idtools.IDMap)
|
||||||
|
// DefaultUIDMap returns the default UID map used when opening stores.
|
||||||
|
DefaultUIDMap() []idtools.IDMap
|
||||||
|
// DefaultGIDMap returns the default GID map used when opening stores.
|
||||||
|
DefaultGIDMap() []idtools.IDMap
|
||||||
}
|
}
|
||||||
|
|
||||||
type storageTransport struct {
|
type storageTransport struct {
|
||||||
store storage.Store
|
store storage.Store
|
||||||
|
defaultUIDMap []idtools.IDMap
|
||||||
|
defaultGIDMap []idtools.IDMap
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *storageTransport) Name() string {
|
func (s *storageTransport) Name() string {
|
||||||
@ -66,6 +77,26 @@ func (s *storageTransport) SetStore(store storage.Store) {
|
|||||||
s.store = store
|
s.store = store
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetDefaultUIDMap sets the default UID map to use when opening stores.
|
||||||
|
func (s *storageTransport) SetDefaultUIDMap(idmap []idtools.IDMap) {
|
||||||
|
s.defaultUIDMap = idmap
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetDefaultGIDMap sets the default GID map to use when opening stores.
|
||||||
|
func (s *storageTransport) SetDefaultGIDMap(idmap []idtools.IDMap) {
|
||||||
|
s.defaultGIDMap = idmap
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultUIDMap returns the default UID map used when opening stores.
|
||||||
|
func (s *storageTransport) DefaultUIDMap() []idtools.IDMap {
|
||||||
|
return s.defaultUIDMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultGIDMap returns the default GID map used when opening stores.
|
||||||
|
func (s *storageTransport) DefaultGIDMap() []idtools.IDMap {
|
||||||
|
return s.defaultGIDMap
|
||||||
|
}
|
||||||
|
|
||||||
// ParseStoreReference takes a name or an ID, tries to figure out which it is
|
// ParseStoreReference takes a name or an ID, tries to figure out which it is
|
||||||
// relative to the given store, and returns it in a reference object.
|
// relative to the given store, and returns it in a reference object.
|
||||||
func (s storageTransport) ParseStoreReference(store storage.Store, ref string) (*storageReference, error) {
|
func (s storageTransport) ParseStoreReference(store storage.Store, ref string) (*storageReference, error) {
|
||||||
@ -110,7 +141,12 @@ func (s storageTransport) ParseStoreReference(store storage.Store, ref string) (
|
|||||||
// recognize.
|
// recognize.
|
||||||
return nil, ErrInvalidReference
|
return nil, ErrInvalidReference
|
||||||
}
|
}
|
||||||
storeSpec := "[" + store.GraphDriverName() + "@" + store.GraphRoot() + "]"
|
optionsList := ""
|
||||||
|
options := store.GraphOptions()
|
||||||
|
if len(options) > 0 {
|
||||||
|
optionsList = ":" + strings.Join(options, ",")
|
||||||
|
}
|
||||||
|
storeSpec := "[" + store.GraphDriverName() + "@" + store.GraphRoot() + "+" + store.RunRoot() + optionsList + "]"
|
||||||
id := ""
|
id := ""
|
||||||
if sum.Validate() == nil {
|
if sum.Validate() == nil {
|
||||||
id = sum.Hex()
|
id = sum.Hex()
|
||||||
@ -127,14 +163,17 @@ func (s storageTransport) ParseStoreReference(store storage.Store, ref string) (
|
|||||||
} else {
|
} else {
|
||||||
logrus.Debugf("parsed reference into %q", storeSpec+refname+"@"+id)
|
logrus.Debugf("parsed reference into %q", storeSpec+refname+"@"+id)
|
||||||
}
|
}
|
||||||
return newReference(storageTransport{store: store}, refname, id, name), nil
|
return newReference(storageTransport{store: store, defaultUIDMap: s.defaultUIDMap, defaultGIDMap: s.defaultGIDMap}, refname, id, name), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *storageTransport) GetStore() (storage.Store, error) {
|
func (s *storageTransport) GetStore() (storage.Store, error) {
|
||||||
// Return the transport's previously-set store. If we don't have one
|
// Return the transport's previously-set store. If we don't have one
|
||||||
// of those, initialize one now.
|
// of those, initialize one now.
|
||||||
if s.store == nil {
|
if s.store == nil {
|
||||||
store, err := storage.GetStore(storage.DefaultStoreOptions)
|
options := storage.DefaultStoreOptions
|
||||||
|
options.UIDMap = s.defaultUIDMap
|
||||||
|
options.GIDMap = s.defaultGIDMap
|
||||||
|
store, err := storage.GetStore(options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -145,15 +184,11 @@ func (s *storageTransport) GetStore() (storage.Store, error) {
|
|||||||
|
|
||||||
// ParseReference takes a name and/or an ID ("_name_"/"@_id_"/"_name_@_id_"),
|
// ParseReference takes a name and/or an ID ("_name_"/"@_id_"/"_name_@_id_"),
|
||||||
// possibly prefixed with a store specifier in the form "[_graphroot_]" or
|
// possibly prefixed with a store specifier in the form "[_graphroot_]" or
|
||||||
// "[_driver_@_graphroot_]", tries to figure out which it is, and returns it in
|
// "[_driver_@_graphroot_]" or "[_driver_@_graphroot_+_runroot_]" or
|
||||||
// a reference object. If the _graphroot_ is a location other than the default,
|
// "[_driver_@_graphroot_:_options_]" or "[_driver_@_graphroot_+_runroot_:_options_]",
|
||||||
// it needs to have been previously opened using storage.GetStore(), so that it
|
// tries to figure out which it is, and returns it in a reference object.
|
||||||
// can figure out which run root goes with the graph root.
|
|
||||||
func (s *storageTransport) ParseReference(reference string) (types.ImageReference, error) {
|
func (s *storageTransport) ParseReference(reference string) (types.ImageReference, error) {
|
||||||
store, err := s.GetStore()
|
var store storage.Store
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Check if there's a store location prefix. If there is, then it
|
// Check if there's a store location prefix. If there is, then it
|
||||||
// needs to match a store that was previously initialized using
|
// needs to match a store that was previously initialized using
|
||||||
// storage.GetStore(), or be enough to let the storage library fill out
|
// storage.GetStore(), or be enough to let the storage library fill out
|
||||||
@ -165,37 +200,65 @@ func (s *storageTransport) ParseReference(reference string) (types.ImageReferenc
|
|||||||
}
|
}
|
||||||
storeSpec := reference[1:closeIndex]
|
storeSpec := reference[1:closeIndex]
|
||||||
reference = reference[closeIndex+1:]
|
reference = reference[closeIndex+1:]
|
||||||
storeInfo := strings.SplitN(storeSpec, "@", 2)
|
// Peel off a "driver@" from the start.
|
||||||
if len(storeInfo) == 1 && storeInfo[0] != "" {
|
driverInfo := ""
|
||||||
// One component: the graph root.
|
driverSplit := strings.SplitN(storeSpec, "@", 2)
|
||||||
if !filepath.IsAbs(storeInfo[0]) {
|
if len(driverSplit) != 2 {
|
||||||
|
if storeSpec == "" {
|
||||||
|
return nil, ErrInvalidReference
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
driverInfo = driverSplit[0]
|
||||||
|
if driverInfo == "" {
|
||||||
|
return nil, ErrInvalidReference
|
||||||
|
}
|
||||||
|
storeSpec = driverSplit[1]
|
||||||
|
if storeSpec == "" {
|
||||||
|
return nil, ErrInvalidReference
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Peel off a ":options" from the end.
|
||||||
|
var options []string
|
||||||
|
optionsSplit := strings.SplitN(storeSpec, ":", 2)
|
||||||
|
if len(optionsSplit) == 2 {
|
||||||
|
options = strings.Split(optionsSplit[1], ",")
|
||||||
|
storeSpec = optionsSplit[0]
|
||||||
|
}
|
||||||
|
// Peel off a "+runroot" from the new end.
|
||||||
|
runRootInfo := ""
|
||||||
|
runRootSplit := strings.SplitN(storeSpec, "+", 2)
|
||||||
|
if len(runRootSplit) == 2 {
|
||||||
|
runRootInfo = runRootSplit[1]
|
||||||
|
storeSpec = runRootSplit[0]
|
||||||
|
}
|
||||||
|
// The rest is our graph root.
|
||||||
|
rootInfo := storeSpec
|
||||||
|
// Check that any paths are absolute paths.
|
||||||
|
if rootInfo != "" && !filepath.IsAbs(rootInfo) {
|
||||||
|
return nil, ErrPathNotAbsolute
|
||||||
|
}
|
||||||
|
if runRootInfo != "" && !filepath.IsAbs(runRootInfo) {
|
||||||
return nil, ErrPathNotAbsolute
|
return nil, ErrPathNotAbsolute
|
||||||
}
|
}
|
||||||
store2, err := storage.GetStore(storage.StoreOptions{
|
store2, err := storage.GetStore(storage.StoreOptions{
|
||||||
GraphRoot: storeInfo[0],
|
GraphDriverName: driverInfo,
|
||||||
})
|
GraphRoot: rootInfo,
|
||||||
if err != nil {
|
RunRoot: runRootInfo,
|
||||||
return nil, err
|
GraphDriverOptions: options,
|
||||||
}
|
UIDMap: s.defaultUIDMap,
|
||||||
store = store2
|
GIDMap: s.defaultGIDMap,
|
||||||
} else if len(storeInfo) == 2 && storeInfo[0] != "" && storeInfo[1] != "" {
|
|
||||||
// Two components: the driver type and the graph root.
|
|
||||||
if !filepath.IsAbs(storeInfo[1]) {
|
|
||||||
return nil, ErrPathNotAbsolute
|
|
||||||
}
|
|
||||||
store2, err := storage.GetStore(storage.StoreOptions{
|
|
||||||
GraphDriverName: storeInfo[0],
|
|
||||||
GraphRoot: storeInfo[1],
|
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
store = store2
|
store = store2
|
||||||
} else {
|
} else {
|
||||||
// Anything else: store specified in a form we don't
|
// We didn't have a store spec, so use the default.
|
||||||
// recognize.
|
store2, err := s.GetStore()
|
||||||
return nil, ErrInvalidReference
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
store = store2
|
||||||
}
|
}
|
||||||
return s.ParseStoreReference(store, reference)
|
return s.ParseStoreReference(store, reference)
|
||||||
}
|
}
|
||||||
@ -250,7 +313,7 @@ func (s storageTransport) ValidatePolicyConfigurationScope(scope string) error {
|
|||||||
return ErrPathNotAbsolute
|
return ErrPathNotAbsolute
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Anything else: store specified in a form we don't
|
// Anything else: scope specified in a form we don't
|
||||||
// recognize.
|
// recognize.
|
||||||
return ErrInvalidReference
|
return ErrInvalidReference
|
||||||
}
|
}
|
||||||
|
37
vendor/github.com/containers/image/vendor.conf
generated
vendored
Normal file
37
vendor/github.com/containers/image/vendor.conf
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
github.com/Sirupsen/logrus 7f4b1adc791766938c29457bed0703fb9134421a
|
||||||
|
github.com/containers/storage 105f7c77aef0c797429e41552743bf5b03b63263
|
||||||
|
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
|
||||||
|
github.com/docker/distribution df5327f76fb6468b84a87771e361762b8be23fdb
|
||||||
|
github.com/docker/docker 75843d36aa5c3eaade50da005f9e0ff2602f3d5e
|
||||||
|
github.com/docker/go-connections 7da10c8c50cad14494ec818dcdfb6506265c0086
|
||||||
|
github.com/docker/go-units 0dadbb0345b35ec7ef35e228dabb8de89a65bf52
|
||||||
|
github.com/docker/libtrust aabc10ec26b754e797f9028f4589c5b7bd90dc20
|
||||||
|
github.com/ghodss/yaml 04f313413ffd65ce25f2541bfd2b2ceec5c0908c
|
||||||
|
github.com/gorilla/context 08b5f424b9271eedf6f9f0ce86cb9396ed337a42
|
||||||
|
github.com/gorilla/mux 94e7d24fd285520f3d12ae998f7fdd6b5393d453
|
||||||
|
github.com/imdario/mergo 50d4dbd4eb0e84778abe37cefef140271d96fade
|
||||||
|
github.com/mattn/go-runewidth 14207d285c6c197daabb5c9793d63e7af9ab2d50
|
||||||
|
github.com/mattn/go-shellwords 005a0944d84452842197c2108bd9168ced206f78
|
||||||
|
github.com/mistifyio/go-zfs c0224de804d438efd11ea6e52ada8014537d6062
|
||||||
|
github.com/mtrmac/gpgme b2432428689ca58c2b8e8dea9449d3295cf96fc9
|
||||||
|
github.com/opencontainers/go-digest aa2ec055abd10d26d539eb630a92241b781ce4bc
|
||||||
|
github.com/opencontainers/image-spec v1.0.0-rc6
|
||||||
|
github.com/opencontainers/runc 6b1d0e76f239ffb435445e5ae316d2676c07c6e3
|
||||||
|
github.com/pborman/uuid 1b00554d822231195d1babd97ff4a781231955c9
|
||||||
|
github.com/pkg/errors 248dadf4e9068a0b3e79f02ed0a610d935de5302
|
||||||
|
github.com/pmezard/go-difflib 792786c7400a136282c1664665ae0a8db921c6c2
|
||||||
|
github.com/stretchr/testify 4d4bfba8f1d1027c4fdbe371823030df51419987
|
||||||
|
github.com/vbatts/tar-split bd4c5d64c3e9297f410025a3b1bd0c58f659e721
|
||||||
|
golang.org/x/crypto 453249f01cfeb54c3d549ddb75ff152ca243f9d8
|
||||||
|
golang.org/x/net 6b27048ae5e6ad1ef927e72e437531493de612fe
|
||||||
|
golang.org/x/sys 075e574b89e4c2d22f2286a7e2b919519c6f3547
|
||||||
|
gopkg.in/cheggaaa/pb.v1 d7e6ca3010b6f084d8056847f55d7f572f180678
|
||||||
|
gopkg.in/yaml.v2 a3f3340b5840cee44f372bddb5880fcbc419b46a
|
||||||
|
k8s.io/client-go bcde30fb7eaed76fd98a36b4120321b94995ffb6
|
||||||
|
github.com/xeipuuv/gojsonschema master
|
||||||
|
github.com/xeipuuv/gojsonreference master
|
||||||
|
github.com/xeipuuv/gojsonpointer master
|
||||||
|
github.com/tchap/go-patricia v2.2.6
|
||||||
|
github.com/opencontainers/selinux ba1aefe8057f1d0cfb8e88d0ec1dc85925ef987d
|
||||||
|
github.com/BurntSushi/toml b26d9c308763d68093482582cea63d69be07a0f0
|
||||||
|
github.com/ostreedev/ostree-go aeb02c6b6aa2889db3ef62f7855650755befd460
|
Loading…
Reference in New Issue
Block a user