// ListImages lists the images from given image store func ListImages(host, storename string, images []*ImageWithMeta) (map[string]*models.Image, error) { defer trace.End(trace.Begin(storename)) transport := httptransport.New(host, "/", []string{"http"}) client := apiclient.New(transport, nil) ids := make([]string, len(images)) for i := range images { ids = append(ids, images[i].ID) } imageList, err := client.Storage.ListImages( storage.NewListImagesParamsWithContext(ctx).WithStoreName(storename).WithIds(ids), ) if err != nil { return nil, err } existingImages := make(map[string]*models.Image) for i := range imageList.Payload { v := imageList.Payload[i] existingImages[v.ID] = v } return existingImages, nil }
// Update runs only once at startup to hydrate the image cache func (ic *ICache) Update(client *client.PortLayer) error { log.Debugf("Updating image cache...") host, err := sys.UUID() if host == "" { host, err = os.Hostname() } if err != nil { return fmt.Errorf("Unexpected error getting hostname: %s", err) } // attempt to create the image store if it doesn't exist store := &models.ImageStore{Name: host} _, err = client.Storage.CreateImageStore( storage.NewCreateImageStoreParamsWithContext(ctx).WithBody(store), ) if err != nil { if _, ok := err.(*storage.CreateImageStoreConflict); ok { log.Debugf("Store already exists") } else { log.Debugf("Creating a store failed: %#v", err) return err } } params := storage.NewListImagesParamsWithContext(ctx).WithStoreName(host) layers, err := client.Storage.ListImages(params) if err != nil { return fmt.Errorf("Failed to retrieve image list from portlayer: %s", err) } for _, layer := range layers.Payload { imageConfig := &metadata.ImageConfig{} if err := json.Unmarshal([]byte(layer.Metadata["metaData"]), imageConfig); err != nil { derr.NewErrorWithStatusCode(fmt.Errorf("Failed to unmarshal image config: %s", err), http.StatusInternalServerError) } if imageConfig.ImageID != "" { ic.AddImage(imageConfig) } } return nil }