func (h *Host) getLocalImage(hash types.Hash, name types.ACIdentifier, labels types.Labels) (*Image, error) { if hash.Empty() && name.Empty() { return nil, errors.Trace(ErrUsage) } if !hash.Empty() { if idStr, err := os.Readlink(h.Path("images", hash.String())); os.IsNotExist(err) { return nil, ErrNotFound } else if err != nil { return nil, errors.Trace(err) } else if id := uuid.Parse(idStr); id == nil { return nil, errors.Errorf("Invalid UUID: %v", idStr) } else if img, err := LoadImage(h, id); err != nil { return nil, errors.Trace(err) } else { return img, nil } } else if imgs, err := h.Images(); err != nil { return nil, errors.Trace(err) } else { for _, img := range imgs { if img.Manifest.Name != name { continue } if !acutil.MatchLabels(labels, img.Manifest.Labels) { continue } // TODO: multiple matches? return img, nil } return nil, ErrNotFound } }
func doubleCheckImage(img *Image, hash types.Hash, name types.ACIdentifier, labels types.Labels) error { if !hash.Empty() && hash != *img.Hash { return stderrors.New("Image hash mismatch") } if !name.Empty() && name != img.Manifest.Name { return stderrors.New("Image name mismatch") } if !acutil.MatchLabels(labels, img.Manifest.Labels) { return stderrors.New("Image label mismatch") } return nil }