Handle extra-paremeter within checksum calculations

This commit is contained in:
Guillaume J. Charmes 2013-07-22 14:50:32 -07:00
parent 8ca7b0646e
commit e3f68b22d8
3 changed files with 17 additions and 9 deletions

View File

@ -17,8 +17,10 @@ import (
"strings" "strings"
) )
var ErrAlreadyExists = errors.New("Image already exists") var (
var ErrInvalidRepositoryName = errors.New("Invalid repository name (ex: \"registry.domain.tld/myrepos\")") ErrAlreadyExists = errors.New("Image already exists")
ErrInvalidRepositoryName = errors.New("Invalid repository name (ex: \"registry.domain.tld/myrepos\")")
)
func pingRegistryEndpoint(endpoint string) error { func pingRegistryEndpoint(endpoint string) error {
if endpoint == auth.IndexServerAddress() { if endpoint == auth.IndexServerAddress() {
@ -266,8 +268,11 @@ func (r *Registry) GetRemoteTags(registries []string, repository string, token [
} }
func (r *Registry) GetRepositoryData(indexEp, remote string) (*RepositoryData, error) { func (r *Registry) GetRepositoryData(indexEp, remote string) (*RepositoryData, error) {
repositoryTarget := fmt.Sprintf("%srepositories/%s/images", indexEp, remote) repositoryTarget := fmt.Sprintf("%srepositories/%s/images", indexEp, remote)
utils.Debugf("[registry] Calling GET %s", repositoryTarget)
req, err := r.opaqueRequest("GET", repositoryTarget, nil) req, err := r.opaqueRequest("GET", repositoryTarget, nil)
if err != nil { if err != nil {
return nil, err return nil, err
@ -378,7 +383,6 @@ func (r *Registry) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, regis
req.Header.Set("Authorization", "Token "+strings.Join(token, ",")) req.Header.Set("Authorization", "Token "+strings.Join(token, ","))
r.setUserAgent(req) r.setUserAgent(req)
utils.Debugf("Setting checksum for %s: %s", imgData.ID, imgData.Checksum)
res, err := doWithCookies(r.client, req) res, err := doWithCookies(r.client, req)
if err != nil { if err != nil {
return fmt.Errorf("Failed to upload metadata: %s", err) return fmt.Errorf("Failed to upload metadata: %s", err)
@ -400,11 +404,12 @@ func (r *Registry) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, regis
return nil return nil
} }
func (r *Registry) PushImageLayerRegistry(imgID string, layer io.Reader, registry string, token []string) (checksum string, err error) { func (r *Registry) PushImageLayerRegistry(imgID string, layer io.Reader, registry string, token []string, jsonRaw []byte) (checksum string, err error) {
utils.Debugf("[registry] Calling PUT %s", registry+"images/"+imgID+"/layer") utils.Debugf("[registry] Calling PUT %s", registry+"images/"+imgID+"/layer")
tarsumLayer := &utils.TarSum{Reader: layer} tarsumLayer := &utils.TarSum{Reader: layer}
req, err := http.NewRequest("PUT", registry+"images/"+imgID+"/layer", tarsumLayer) req, err := http.NewRequest("PUT", registry+"images/"+imgID+"/layer", tarsumLayer)
if err != nil { if err != nil {
return "", err return "", err
@ -426,7 +431,7 @@ func (r *Registry) PushImageLayerRegistry(imgID string, layer io.Reader, registr
} }
return "", fmt.Errorf("Received HTTP code %d while uploading layer: %s", res.StatusCode, errBody) return "", fmt.Errorf("Received HTTP code %d while uploading layer: %s", res.StatusCode, errBody)
} }
return tarsumLayer.Sum(), nil return tarsumLayer.Sum(jsonRaw), nil
} }
func (r *Registry) opaqueRequest(method, urlStr string, body io.Reader) (*http.Request, error) { func (r *Registry) opaqueRequest(method, urlStr string, body io.Reader) (*http.Request, error) {
@ -474,7 +479,7 @@ func (r *Registry) PushImageJSONIndex(indexEp, remote string, imgList []*ImgData
} }
u := fmt.Sprintf("%srepositories/%s/%s", indexEp, remote, suffix) u := fmt.Sprintf("%srepositories/%s/%s", indexEp, remote, suffix)
utils.Debugf("PUT %s", u) utils.Debugf("[registry] PUT %s", u)
utils.Debugf("Image list pushed to index:\n%s\n", imgListJSON) utils.Debugf("Image list pushed to index:\n%s\n", imgListJSON)
req, err := r.opaqueRequest("PUT", u, bytes.NewReader(imgListJSON)) req, err := r.opaqueRequest("PUT", u, bytes.NewReader(imgListJSON))
if err != nil { if err != nil {

View File

@ -690,7 +690,7 @@ func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgID,
} }
// Send the layer // Send the layer
if checksum, err := r.PushImageLayerRegistry(imgData.ID, utils.ProgressReader(layerData, int(layerData.Size), out, sf.FormatProgress("Pushing", "%8v/%v (%v)"), sf), ep, token); err != nil { if checksum, err := r.PushImageLayerRegistry(imgData.ID, utils.ProgressReader(layerData, int(layerData.Size), out, sf.FormatProgress("Pushing", "%8v/%v (%v)"), sf), ep, token, jsonRaw); err != nil {
return err return err
} else { } else {
imgData.Checksum = checksum imgData.Checksum = checksum

View File

@ -142,14 +142,17 @@ func (ts *TarSum) Read(buf []byte) (int, error) {
return ts.bufGz.Read(buf) return ts.bufGz.Read(buf)
} }
func (ts *TarSum) Sum() string { func (ts *TarSum) Sum(extra []byte) string {
sort.Strings(ts.sums) sort.Strings(ts.sums)
h := sha256.New() h := sha256.New()
for _, sum := range ts.sums { for _, sum := range ts.sums {
Debugf("-->%s<--", sum) Debugf("-->%s<--", sum)
h.Write([]byte(sum)) h.Write([]byte(sum))
} }
checksum := "tarsum+sha256:" + hex.EncodeToString(ts.h.Sum(nil)) if extra != nil {
h.Write(extra)
}
checksum := "tarsum+sha256:" + hex.EncodeToString(h.Sum(nil))
Debugf("checksum processed: %s", checksum) Debugf("checksum processed: %s", checksum)
return checksum return checksum
} }