func (d *dockerImageDestination) PutManifest(manifest []byte) error { // FIXME: This only allows upload by digest, not creating a tag. See the // corresponding comment in NewOpenshiftImageDestination. digest, err := utils.ManifestDigest(manifest) if err != nil { return err } url := fmt.Sprintf(manifestURL, d.ref.RemoteName(), digest) headers := map[string][]string{} mimeType := utils.GuessManifestMIMEType(manifest) if mimeType != "" { headers["Content-Type"] = []string{mimeType} } res, err := d.c.makeRequest("PUT", url, headers, bytes.NewReader(manifest)) 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 }
// SignDockerManifest returns a signature for manifest as the specified dockerReference, // using mech and keyIdentity. func SignDockerManifest(manifest []byte, dockerReference string, mech SigningMechanism, keyIdentity string) ([]byte, error) { manifestDigest, err := utils.ManifestDigest(manifest) if err != nil { return nil, err } sig := privateSignature{ Signature{ DockerManifestDigest: manifestDigest, DockerReference: dockerReference, }, } return sig.sign(mech, keyIdentity) }
func (d *openshiftImageDestination) PutManifest(manifest []byte) error { // Note: This does absolutely no kind/version checking or conversions. manifestDigest, err := utils.ManifestDigest(manifest) 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(manifest), }, 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(manifest) }