From 15cbb88e764c4ca4b10bcffd015fcee4bfe262d5 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Tue, 24 May 2016 11:32:17 +0200 Subject: [PATCH] add the possibility to choose image's MIME type Signed-off-by: Antonio Murdaca --- image/cmd/skopeo/copy.go | 3 ++- image/directory/directory.go | 2 +- image/docker/docker_image.go | 3 ++- image/docker/docker_image_src.go | 6 ++++-- image/openshift/openshift.go | 4 ++-- image/types/types.go | 5 +++-- 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/image/cmd/skopeo/copy.go b/image/cmd/skopeo/copy.go index 5fe78ce6aa..8c2085269b 100644 --- a/image/cmd/skopeo/copy.go +++ b/image/cmd/skopeo/copy.go @@ -5,6 +5,7 @@ import ( "github.com/Sirupsen/logrus" "github.com/codegangsta/cli" + "github.com/projectatomic/skopeo/docker/utils" "github.com/projectatomic/skopeo/signature" ) @@ -54,7 +55,7 @@ func copyHandler(context *cli.Context) { } signBy := context.String("sign-by") - manifest, _, err := src.GetManifest() + manifest, _, err := src.GetManifest([]string{utils.DockerV2Schema1MIMEType}) if err != nil { logrus.Fatalf("Error reading manifest: %s", err.Error()) } diff --git a/image/directory/directory.go b/image/directory/directory.go index 757a4b1a68..547e994261 100644 --- a/image/directory/directory.go +++ b/image/directory/directory.go @@ -85,7 +85,7 @@ func (s *dirImageSource) IntendedDockerReference() string { } // it's up to the caller to determine the MIME type of the returned manifest's bytes -func (s *dirImageSource) GetManifest() ([]byte, string, error) { +func (s *dirImageSource) GetManifest(_ []string) ([]byte, string, error) { m, err := ioutil.ReadFile(manifestPath(s.dir)) if err != nil { return nil, "", err diff --git a/image/docker/docker_image.go b/image/docker/docker_image.go index 37e4f47931..a972172f4f 100644 --- a/image/docker/docker_image.go +++ b/image/docker/docker_image.go @@ -11,6 +11,7 @@ import ( "time" "github.com/projectatomic/skopeo/directory" + "github.com/projectatomic/skopeo/docker/utils" "github.com/projectatomic/skopeo/types" ) @@ -44,7 +45,7 @@ func (i *dockerImage) IntendedDockerReference() string { // Manifest is like ImageSource.GetManifest, but the result is cached; it is OK to call this however often you need. func (i *dockerImage) Manifest() ([]byte, error) { if i.cachedManifest == nil { - m, _, err := i.src.GetManifest() + m, _, err := i.src.GetManifest([]string{utils.DockerV2Schema1MIMEType}) if err != nil { return nil, err } diff --git a/image/docker/docker_image_src.go b/image/docker/docker_image_src.go index 777fef2fc9..65d6e76fdb 100644 --- a/image/docker/docker_image_src.go +++ b/image/docker/docker_image_src.go @@ -55,11 +55,13 @@ func (s *dockerImageSource) IntendedDockerReference() string { return fmt.Sprintf("%s:%s", s.ref.Name(), s.tag) } -func (s *dockerImageSource) GetManifest() ([]byte, string, error) { +func (s *dockerImageSource) GetManifest(mimetypes []string) ([]byte, string, error) { url := fmt.Sprintf(manifestURL, s.ref.RemoteName(), s.tag) // 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 - res, err := s.c.makeRequest("GET", url, nil, nil) + headers := make(map[string][]string) + headers["Accept"] = mimetypes + res, err := s.c.makeRequest("GET", url, headers, nil) if err != nil { return nil, "", err } diff --git a/image/openshift/openshift.go b/image/openshift/openshift.go index 4b4dc94a73..f9a647e940 100644 --- a/image/openshift/openshift.go +++ b/image/openshift/openshift.go @@ -193,11 +193,11 @@ func (s *openshiftImageSource) IntendedDockerReference() string { return s.client.canonicalDockerReference() } -func (s *openshiftImageSource) GetManifest() ([]byte, string, error) { +func (s *openshiftImageSource) GetManifest(mimetypes []string) ([]byte, string, error) { if err := s.ensureImageIsResolved(); err != nil { return nil, "", err } - return s.docker.GetManifest() + return s.docker.GetManifest(mimetypes) } func (s *openshiftImageSource) GetLayer(digest string) (io.ReadCloser, error) { diff --git a/image/types/types.go b/image/types/types.go index f3f186f8f4..6b0ae37587 100644 --- a/image/types/types.go +++ b/image/types/types.go @@ -27,8 +27,9 @@ type ImageSource interface { // (not as the image itself, or its underlying storage, claims). This can be used e.g. to determine which public keys are trusted for this image. // May be "" if unknown. IntendedDockerReference() string - // GetManifest returns the image's manifest along with its MIME type. The empty string is returned if the MIME type is unknown. It may use a remote (= slow) service. - GetManifest() ([]byte, string, error) + // GetManifest returns the image's manifest along with its MIME type. The empty string is returned if the MIME type is unknown. The slice parameter indicates the supported mime types the manifest should be when getting it. + // It may use a remote (= slow) service. + GetManifest([]string) ([]byte, string, error) // Note: Calling GetLayer() may have ordering dependencies WRT other methods of this type. FIXME: How does this work with (docker save) on stdin? GetLayer(digest string) (io.ReadCloser, error) // GetSignatures returns the image's signatures. It may use a remote (= slow) service.