func (h *Host) fetchImage(name types.ACIdentifier, labels types.Labels) (*Image, error) { if aci, asc, err := fetch.DiscoverACI(discovery.App{Name: name, Labels: labels.ToMap()}); err != nil { return nil, errors.Trace(err) } else if aci == nil { return nil, ErrNotFound } else { return h.ImportImage(name, aci, asc) } }
// True if all labels in `labels` are present in `candidate` and have // the same value func MatchLabels(labels, candidate types.Labels) bool { if len(labels) == 0 { return true } cmap := candidate.ToMap() for _, label := range labels { if v, ok := cmap[label.Name]; !ok || v != label.Value { return false } } return true }
// GetACI retrieves the ACI that best matches the provided app name and labels. // The returned value is the blob store key of the retrieved ACI. // If there are multiple matching ACIs choose the latest one (defined as the // last one imported in the store). // If no version label is requested, ACIs marked as latest in the ACIInfo are // preferred. func (s Store) GetACI(name types.ACIdentifier, labels types.Labels) (string, error) { var curaciinfo *ACIInfo versionRequested := false if _, ok := labels.Get("version"); ok { versionRequested = true } var aciinfos []*ACIInfo err := s.db.Do(func(tx *sql.Tx) error { var err error aciinfos, _, err = GetACIInfosWithAppName(tx, name.String()) return err }) if err != nil { return "", err } nextKey: for _, aciinfo := range aciinfos { im, err := s.GetImageManifest(aciinfo.BlobKey) if err != nil { return "", fmt.Errorf("error getting image manifest: %v", err) } // The image manifest must have all the requested labels for _, l := range labels { ok := false for _, rl := range im.Labels { if l.Name == rl.Name && l.Value == rl.Value { ok = true break } } if !ok { continue nextKey } } if curaciinfo != nil { // If no version is requested prefer the acis marked as latest if !versionRequested { if !curaciinfo.Latest && aciinfo.Latest { curaciinfo = aciinfo continue nextKey } if curaciinfo.Latest && !aciinfo.Latest { continue nextKey } } // If multiple matching image manifests are found, choose the latest imported in the cas. if aciinfo.ImportTime.After(curaciinfo.ImportTime) { curaciinfo = aciinfo } } else { curaciinfo = aciinfo } } if curaciinfo != nil { return curaciinfo.BlobKey, nil } return "", fmt.Errorf("aci not found") }