Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions directory/directory_src.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package directory

import (
"fmt"
"io"
"io/ioutil"
"os"
Expand All @@ -25,7 +24,7 @@ func (s *dirImageSource) Reference() types.ImageReference {
}

// it's up to the caller to determine the MIME type of the returned manifest's bytes
func (s *dirImageSource) GetManifest(_ []string) ([]byte, string, error) {
func (s *dirImageSource) GetManifest() ([]byte, string, error) {
m, err := ioutil.ReadFile(s.ref.manifestPath())
if err != nil {
return nil, "", err
Expand Down Expand Up @@ -59,7 +58,3 @@ func (s *dirImageSource) GetSignatures() ([][]byte, error) {
}
return signatures, nil
}

func (s *dirImageSource) Delete() error {
return fmt.Errorf("directory#dirImageSource.Delete() not implmented")
}
30 changes: 10 additions & 20 deletions directory/directory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func TestDestinationReference(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)

dest, err := ref.NewImageDestination("", true)
dest, err := ref.NewImageDestination(nil)
require.NoError(t, err)
ref2 := dest.Reference()
assert.Equal(t, tmpDir, ref2.StringWithinTransport())
Expand All @@ -26,14 +26,14 @@ func TestGetPutManifest(t *testing.T) {
defer os.RemoveAll(tmpDir)

man := []byte("test-manifest")
dest, err := ref.NewImageDestination("", true)
dest, err := ref.NewImageDestination(nil)
require.NoError(t, err)
err = dest.PutManifest(man)
assert.NoError(t, err)

src, err := ref.NewImageSource("", true)
src, err := ref.NewImageSource(nil, nil)
require.NoError(t, err)
m, mt, err := src.GetManifest(nil)
m, mt, err := src.GetManifest()
assert.NoError(t, err)
assert.Equal(t, man, m)
assert.Equal(t, "", mt)
Expand All @@ -45,12 +45,12 @@ func TestGetPutBlob(t *testing.T) {

digest := "digest-test"
blob := []byte("test-blob")
dest, err := ref.NewImageDestination("", true)
dest, err := ref.NewImageDestination(nil)
require.NoError(t, err)
err = dest.PutBlob(digest, bytes.NewReader(blob))
assert.NoError(t, err)

src, err := ref.NewImageSource("", true)
src, err := ref.NewImageSource(nil, nil)
require.NoError(t, err)
rc, size, err := src.GetBlob(digest)
assert.NoError(t, err)
Expand Down Expand Up @@ -96,7 +96,7 @@ func TestPutBlobDigestFailure(t *testing.T) {
return 0, fmt.Errorf(digestErrorString)
})

dest, err := ref.NewImageDestination("", true)
dest, err := ref.NewImageDestination(nil)
require.NoError(t, err)
err = dest.PutBlob(blobDigest, reader)
assert.Error(t, err)
Expand All @@ -111,7 +111,7 @@ func TestGetPutSignatures(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)

dest, err := ref.NewImageDestination("", true)
dest, err := ref.NewImageDestination(nil)
require.NoError(t, err)
signatures := [][]byte{
[]byte("sig1"),
Expand All @@ -120,28 +120,18 @@ func TestGetPutSignatures(t *testing.T) {
err = dest.PutSignatures(signatures)
assert.NoError(t, err)

src, err := ref.NewImageSource("", true)
src, err := ref.NewImageSource(nil, nil)
require.NoError(t, err)
sigs, err := src.GetSignatures()
assert.NoError(t, err)
assert.Equal(t, signatures, sigs)
}

func TestDelete(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)

src, err := ref.NewImageSource("", true)
require.NoError(t, err)
err = src.Delete()
assert.Error(t, err)
}

func TestSourceReference(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)

src, err := ref.NewImageSource("", true)
src, err := ref.NewImageSource(nil, nil)
require.NoError(t, err)
ref2 := src.Reference()
assert.Equal(t, tmpDir, ref2.StringWithinTransport())
Expand Down
17 changes: 12 additions & 5 deletions directory/directory_transport.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,21 +128,28 @@ func (ref dirReference) PolicyConfigurationNamespaces() []string {
}

// NewImage returns a types.Image for this reference.
func (ref dirReference) NewImage(certPath string, tlsVerify bool) (types.Image, error) {
func (ref dirReference) NewImage(ctx *types.SystemContext) (types.Image, error) {
src := newImageSource(ref)
return image.FromSource(src, nil), nil
return image.FromSource(src), nil
}

// NewImageSource returns a types.ImageSource for this reference.
func (ref dirReference) NewImageSource(certPath string, tlsVerify bool) (types.ImageSource, error) {
// NewImageSource returns a types.ImageSource for this reference,
// asking the backend to use a manifest from requestedManifestMIMETypes if possible
// nil requestedManifestMIMETypes means manifest.DefaultRequestedManifestMIMETypes.
func (ref dirReference) NewImageSource(ctx *types.SystemContext, requestedManifestMIMETypes []string) (types.ImageSource, error) {
return newImageSource(ref), nil
}

// NewImageDestination returns a types.ImageDestination for this reference.
func (ref dirReference) NewImageDestination(certPath string, tlsVerify bool) (types.ImageDestination, error) {
func (ref dirReference) NewImageDestination(ctx *types.SystemContext) (types.ImageDestination, error) {
return newImageDestination(ref), nil
}

// DeleteImage deletes the named image from the registry, if supported.
func (ref dirReference) DeleteImage(ctx *types.SystemContext) error {
return fmt.Errorf("Deleting images not implemented for dir: images")
}

// manifestPath returns a path for the manifest within a directory using our conventions.
func (ref dirReference) manifestPath() string {
return filepath.Join(ref.path, "manifest.json")
Expand Down
13 changes: 10 additions & 3 deletions directory/directory_transport_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,24 +149,31 @@ func TestReferencePolicyConfigurationNamespaces(t *testing.T) {
func TestReferenceNewImage(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)
_, err := ref.NewImage("/this/doesn't/exist", true)
_, err := ref.NewImage(nil)
assert.NoError(t, err)
}

func TestReferenceNewImageSource(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)
_, err := ref.NewImageSource("/this/doesn't/exist", true)
_, err := ref.NewImageSource(nil, nil)
assert.NoError(t, err)
}

func TestReferenceNewImageDestination(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)
_, err := ref.NewImageDestination("/this/doesn't/exist", true)
_, err := ref.NewImageDestination(nil)
assert.NoError(t, err)
}

func TestReferenceDeleteImage(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)
err := ref.DeleteImage(nil)
assert.Error(t, err)
}

func TestReferenceManifestPath(t *testing.T) {
ref, tmpDir := refToTempDir(t)
defer os.RemoveAll(tmpDir)
Expand Down
2 changes: 1 addition & 1 deletion doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// if err != nil {
// panic(err)
// }
// img, err := ref.NewImage("", true)
// img, err := ref.NewImage(nil)
// if err != nil {
// panic(err)
// }
Expand Down
11 changes: 6 additions & 5 deletions docker/docker_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"time"

"github.com/Sirupsen/logrus"
"github.com/containers/image/types"
"github.com/docker/docker/pkg/homedir"
)

Expand Down Expand Up @@ -44,7 +45,7 @@ type dockerClient struct {
}

// newDockerClient returns a new dockerClient instance for refHostname (a host a specified in the Docker image reference, not canonicalized to dockerRegistry)
func newDockerClient(refHostname, certPath string, tlsVerify bool) (*dockerClient, error) {
func newDockerClient(ctx *types.SystemContext, refHostname string) (*dockerClient, error) {
var registry string
if refHostname == dockerHostname {
registry = dockerRegistry
Expand All @@ -56,17 +57,17 @@ func newDockerClient(refHostname, certPath string, tlsVerify bool) (*dockerClien
return nil, err
}
var tr *http.Transport
if certPath != "" || !tlsVerify {
if ctx != nil && (ctx.DockerCertPath != "" || ctx.DockerInsecureSkipTLSVerify) {
tlsc := &tls.Config{}

if certPath != "" {
cert, err := tls.LoadX509KeyPair(filepath.Join(certPath, "cert.pem"), filepath.Join(certPath, "key.pem"))
if ctx.DockerCertPath != "" {
cert, err := tls.LoadX509KeyPair(filepath.Join(ctx.DockerCertPath, "cert.pem"), filepath.Join(ctx.DockerCertPath, "key.pem"))
if err != nil {
return nil, fmt.Errorf("Error loading x509 key pair: %s", err)
}
tlsc.Certificates = append(tlsc.Certificates, cert)
}
tlsc.InsecureSkipVerify = !tlsVerify
tlsc.InsecureSkipVerify = ctx.DockerInsecureSkipTLSVerify
tr = &http.Transport{
TLSClientConfig: tlsc,
}
Expand Down
6 changes: 3 additions & 3 deletions docker/docker_image.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ type Image struct {

// newImage returns a new Image interface type after setting up
// a client to the registry hosting the given image.
func newImage(ref dockerReference, certPath string, tlsVerify bool) (types.Image, error) {
s, err := newImageSource(ref, certPath, tlsVerify)
func newImage(ctx *types.SystemContext, ref dockerReference) (types.Image, error) {
s, err := newImageSource(ctx, ref, nil)
if err != nil {
return nil, err
}
return &Image{Image: image.FromSource(s, nil), src: s}, nil
return &Image{Image: image.FromSource(s), src: s}, nil
}

// SourceRefFullName returns a fully expanded name for the repository this image is in.
Expand Down
6 changes: 3 additions & 3 deletions docker/docker_image_dest.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ type dockerImageDestination struct {
c *dockerClient
}

// newImageDestination creates a new ImageDestination for the specified image reference and connection specification.
func newImageDestination(ref dockerReference, certPath string, tlsVerify bool) (types.ImageDestination, error) {
c, err := newDockerClient(ref.ref.Hostname(), certPath, tlsVerify)
// newImageDestination creates a new ImageDestination for the specified image reference.
func newImageDestination(ctx *types.SystemContext, ref dockerReference) (types.ImageDestination, error) {
c, err := newDockerClient(ctx, ref.ref.Hostname())
if err != nil {
return nil, err
}
Expand Down
47 changes: 29 additions & 18 deletions docker/docker_image_src.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,26 @@ func (e errFetchManifest) Error() string {
}

type dockerImageSource struct {
ref dockerReference
c *dockerClient
ref dockerReference
requestedManifestMIMETypes []string
c *dockerClient
}

// newImageSource creates a new ImageSource for the specified image reference and connection specification.
func newImageSource(ref dockerReference, certPath string, tlsVerify bool) (*dockerImageSource, error) {
c, err := newDockerClient(ref.ref.Hostname(), certPath, tlsVerify)
// newImageSource creates a new ImageSource for the specified image reference,
// asking the backend to use a manifest from requestedManifestMIMETypes if possible
// nil requestedManifestMIMETypes means manifest.DefaultRequestedManifestMIMETypes.
func newImageSource(ctx *types.SystemContext, ref dockerReference, requestedManifestMIMETypes []string) (*dockerImageSource, error) {
c, err := newDockerClient(ctx, ref.ref.Hostname())
if err != nil {
return nil, err
}
if requestedManifestMIMETypes == nil {
requestedManifestMIMETypes = manifest.DefaultRequestedManifestMIMETypes
}
return &dockerImageSource{
ref: ref,
c: c,
requestedManifestMIMETypes: requestedManifestMIMETypes,
c: c,
}, nil
}

Expand All @@ -58,7 +65,7 @@ func simplifyContentType(contentType string) string {
return mimeType
}

func (s *dockerImageSource) GetManifest(mimetypes []string) ([]byte, string, error) {
func (s *dockerImageSource) GetManifest() ([]byte, string, error) {
reference, err := s.ref.tagOrDigest()
if err != nil {
return nil, "", err
Expand All @@ -67,7 +74,7 @@ func (s *dockerImageSource) GetManifest(mimetypes []string) ([]byte, string, err
// TODO(runcom) set manifest version header! schema1 for now - then schema2 etc etc and v1
// TODO(runcom) NO, switch on the resulter manifest like Docker is doing
headers := make(map[string][]string)
headers["Accept"] = mimetypes
headers["Accept"] = s.requestedManifestMIMETypes
res, err := s.c.makeRequest("GET", url, headers, nil)
if err != nil {
return nil, "", err
Expand Down Expand Up @@ -106,42 +113,46 @@ func (s *dockerImageSource) GetSignatures() ([][]byte, error) {
return [][]byte{}, nil
}

func (s *dockerImageSource) Delete() error {
var body []byte
// deleteImage deletes the named image from the registry, if supported.
func deleteImage(ctx *types.SystemContext, ref dockerReference) error {
c, err := newDockerClient(ctx, ref.ref.Hostname())
if err != nil {
return err
}

// When retrieving the digest from a registry >= 2.3 use the following header:
// "Accept": "application/vnd.docker.distribution.manifest.v2+json"
headers := make(map[string][]string)
headers["Accept"] = []string{manifest.DockerV2Schema2MIMEType}

reference, err := s.ref.tagOrDigest()
reference, err := ref.tagOrDigest()
if err != nil {
return err
}
getURL := fmt.Sprintf(manifestURL, s.ref.ref.RemoteName(), reference)
get, err := s.c.makeRequest("GET", getURL, headers, nil)
getURL := fmt.Sprintf(manifestURL, ref.ref.RemoteName(), reference)
get, err := c.makeRequest("GET", getURL, headers, nil)
if err != nil {
return err
}
defer get.Body.Close()
body, err = ioutil.ReadAll(get.Body)
body, err := ioutil.ReadAll(get.Body)
if err != nil {
return err
}
switch get.StatusCode {
case http.StatusOK:
case http.StatusNotFound:
return fmt.Errorf("Unable to delete %v. Image may not exist or is not stored with a v2 Schema in a v2 registry.", s.ref.ref)
return fmt.Errorf("Unable to delete %v. Image may not exist or is not stored with a v2 Schema in a v2 registry.", ref.ref)
default:
return fmt.Errorf("Failed to delete %v: %s (%v)", s.ref.ref, string(body), get.Status)
return fmt.Errorf("Failed to delete %v: %s (%v)", ref.ref, string(body), get.Status)
}

digest := get.Header.Get("Docker-Content-Digest")
deleteURL := fmt.Sprintf(manifestURL, s.ref.ref.RemoteName(), digest)
deleteURL := fmt.Sprintf(manifestURL, ref.ref.RemoteName(), digest)

// When retrieving the digest from a registry >= 2.3 use the following header:
// "Accept": "application/vnd.docker.distribution.manifest.v2+json"
delete, err := s.c.makeRequest("DELETE", deleteURL, headers, nil)
delete, err := c.makeRequest("DELETE", deleteURL, headers, nil)
if err != nil {
return err
}
Expand Down
Loading