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 (d *ociImageDestination) PutManifest(m []byte) error { if err := d.ensureParentDirectoryExists("refs"); err != nil { return err } // TODO(mitr, runcom): this breaks signatures entirely since at this point we're creating a new manifest // and signatures don't apply anymore. Will fix. ociMan, mt, err := createManifest(m) if err != nil { return err } digest, err := manifest.Digest(ociMan) if err != nil { return err } desc := descriptor{} desc.Digest = digest // TODO(runcom): beaware and add support for OCI manifest list desc.MediaType = mt desc.Size = int64(len(ociMan)) data, err := json.Marshal(desc) if err != nil { return err } if err := ioutil.WriteFile(blobPath(d.dir, digest), ociMan, 0644); err != nil { return err } // TODO(runcom): ugly here? if err := ioutil.WriteFile(ociLayoutPath(d.dir), []byte(`{"imageLayoutVersion": "1.0.0"}`), 0644); err != nil { return err } return ioutil.WriteFile(descriptorPath(d.dir, d.tag), data, 0644) }
func (d *openshiftImageDestination) PutManifest(m []byte) error { manifestDigest, err := manifest.Digest(m) if err != nil { return err } d.imageStreamImageName = manifestDigest.String() return d.docker.PutManifest(m) }
// SignDockerManifest returns a signature for manifest as the specified dockerReference, // using mech and keyIdentity. func SignDockerManifest(m []byte, dockerReference string, mech SigningMechanism, keyIdentity string) ([]byte, error) { manifestDigest, err := manifest.Digest(m) if err != nil { return nil, err } sig := privateSignature{ Signature{ DockerManifestDigest: manifestDigest, DockerReference: dockerReference, }, } return sig.sign(mech, keyIdentity) }
func (d *openshiftImageDestination) PutManifest(m []byte) error { // Note: This does absolutely no kind/version checking or conversions. manifestDigest, err := manifest.Digest(m) if err != nil { return err } // FIXME: We can't do what respositorymiddleware.go does because we don't know the internal address. Does any of this matter? dockerImageReference := fmt.Sprintf("%s/%s/%s@%s", d.client.dockerRegistryHostPart(), d.client.namespace, d.client.stream, manifestDigest) ism := imageStreamMapping{ typeMeta: typeMeta{ Kind: "ImageStreamMapping", APIVersion: "v1", }, objectMeta: objectMeta{ Namespace: d.client.namespace, Name: d.client.stream, }, Image: image{ objectMeta: objectMeta{ Name: manifestDigest, }, DockerImageReference: dockerImageReference, DockerImageManifest: string(m), }, Tag: d.client.tag, } body, err := json.Marshal(ism) if err != nil { return err } // FIXME: validate components per validation.IsValidPathSegmentName? path := fmt.Sprintf("/oapi/v1/namespaces/%s/imagestreammappings", d.client.namespace) body, err = d.client.doRequest("POST", path, body) if err != nil { return err } return d.docker.PutManifest(m) }