func (d *dockerImageDestination) PutManifest(m []byte) error { // FIXME: This only allows upload by digest, not creating a tag. See the // corresponding comment in openshift.NewImageDestination. digest, err := manifest.Digest(m) if err != nil { return err } url := fmt.Sprintf(manifestURL, d.ref.RemoteName(), digest) headers := map[string][]string{} mimeType := manifest.GuessMIMEType(m) if mimeType != "" { headers["Content-Type"] = []string{mimeType} } res, err := d.c.makeRequest("PUT", url, headers, bytes.NewReader(m)) if err != nil { return err } defer res.Body.Close() if res.StatusCode != http.StatusCreated { body, err := ioutil.ReadAll(res.Body) if err == nil { logrus.Debugf("Error body %s", string(body)) } logrus.Debugf("Error uploading manifest, status %d, %#v", res.StatusCode, res) return fmt.Errorf("Error uploading manifest to %s, status %d", url, res.StatusCode) } return nil }
func createManifest(m []byte) ([]byte, string, error) { om := ociManifest{} mt := manifest.GuessMIMEType(m) switch mt { case manifest.DockerV2Schema1MIMEType: // There a simple reason about not yet implementing this. // OCI image-spec assure about backward compatibility with docker v2s2 but not v2s1 // generating a v2s2 is a migration docker does when upgrading to 1.10.3 // and I don't think we should bother about this now (I don't want to have migration code here in skopeo) return nil, "", fmt.Errorf("can't create OCI manifest from Docker V2 schema 1 manifest") case manifest.DockerV2Schema2MIMEType: if err := json.Unmarshal(m, &om); err != nil { return nil, "", err } om.MediaType = manifest.OCIV1ImageManifestMIMEType for i := range om.Layers { om.Layers[i].MediaType = manifest.OCIV1ImageSerializationMIMEType } om.Config.MediaType = manifest.OCIV1ImageSerializationConfigMIMEType b, err := json.Marshal(om) if err != nil { return nil, "", err } return b, om.MediaType, nil case manifest.DockerV2ListMIMEType: return nil, "", fmt.Errorf("can't create OCI manifest from Docker V2 schema 2 manifest list") case manifest.OCIV1ImageManifestListMIMEType: return nil, "", fmt.Errorf("can't create OCI manifest from OCI manifest list") case manifest.OCIV1ImageManifestMIMEType: return m, om.MediaType, nil } return nil, "", fmt.Errorf("Unrecognized manifest media type") }
func (s *ociImageSource) GetTargetManifest(digest digest.Digest) ([]byte, string, error) { manifestPath, err := s.ref.blobPath(digest) if err != nil { return nil, "", err } m, err := ioutil.ReadFile(manifestPath) if err != nil { return nil, "", err } return m, manifest.GuessMIMEType(m), nil }
// Manifest is like ImageSource.GetManifest, but the result is cached; it is OK to call this however often you need. // NOTE: It is essential for signature verification that Manifest returns the manifest from which BlobDigests is computed. func (i *genericImage) Manifest() ([]byte, string, error) { if i.cachedManifest == nil { m, mt, err := i.src.GetManifest(i.requestedManifestMIMETypes) if err != nil { return nil, "", err } i.cachedManifest = m if mt == "" { mt = manifest.GuessMIMEType(i.cachedManifest) } i.cachedManifestMIMEType = mt } return i.cachedManifest, i.cachedManifestMIMEType, nil }
// GetManifest returns the image's manifest along with its MIME type (which may be empty when it can't be determined but the manifest is available). // It may use a remote (= slow) service. func (s *ociImageSource) GetManifest() ([]byte, string, error) { descriptorPath := s.ref.descriptorPath(s.ref.tag) data, err := ioutil.ReadFile(descriptorPath) if err != nil { return nil, "", err } desc := imgspecv1.Descriptor{} err = json.Unmarshal(data, &desc) if err != nil { return nil, "", err } manifestPath, err := s.ref.blobPath(digest.Digest(desc.Digest)) if err != nil { return nil, "", err } m, err := ioutil.ReadFile(manifestPath) if err != nil { return nil, "", err } return m, manifest.GuessMIMEType(m), nil }
func (s *storageImageSource) GetManifest() (manifestBlob []byte, MIMEType string, err error) { manifestBlob, err = s.imageRef.transport.store.GetImageBigData(s.ID, "manifest") return manifestBlob, manifest.GuessMIMEType(manifestBlob), err }