// ManifestMatchesImage returns true if the provided manifest matches the name of the image. func ManifestMatchesImage(image *Image, newManifest []byte) (bool, error) { dgst, err := digest.ParseDigest(image.Name) if err != nil { return false, err } v, err := digest.NewDigestVerifier(dgst) if err != nil { return false, err } var canonical []byte switch image.DockerImageManifestMediaType { case schema2.MediaTypeManifest: var m schema2.DeserializedManifest if err := json.Unmarshal(newManifest, &m); err != nil { return false, err } _, canonical, err = m.Payload() if err != nil { return false, err } case schema1.MediaTypeManifest, "": var m schema1.SignedManifest if err := json.Unmarshal(newManifest, &m); err != nil { return false, err } canonical = m.Canonical default: return false, fmt.Errorf("unsupported manifest mediatype: %s", image.DockerImageManifestMediaType) } if _, err := v.Write(canonical); err != nil { return false, err } return v.Verified(), nil }
func schema2ToImage(manifest *schema2.DeserializedManifest, imageConfig []byte, d digest.Digest) (*api.Image, error) { mediatype, payload, err := manifest.Payload() if err != nil { return nil, err } dockerImage, err := unmarshalDockerImage(imageConfig) if err != nil { return nil, err } if len(d) > 0 { dockerImage.ID = d.String() } else { dockerImage.ID = digest.FromBytes(payload).String() } image := &api.Image{ ObjectMeta: kapi.ObjectMeta{ Name: dockerImage.ID, }, DockerImageMetadata: *dockerImage, DockerImageManifest: string(payload), DockerImageConfig: string(imageConfig), DockerImageManifestMediaType: mediatype, DockerImageMetadataVersion: "1.0", } return image, nil }