blob: 756963d1bb07767c658bf0c669426a8710d815fd [file] [log] [blame]
package imagedownloader
import (
"context"
"fmt"
"io"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/util"
"go.skia.org/infra/gold-client/go/httpclient"
"go.skia.org/infra/golden/go/types"
)
// ImageDownloader implementations provide functions to download images from Gold.
type ImageDownloader interface {
// DownloadImage returns the bytes belonging to a digest from a given instance.
DownloadImage(ctx context.Context, goldURL string, digest types.Digest) ([]byte, error)
}
// httpImageDownloader implements the ImageDownloaderAPI by downloading images over HTTP.
type httpImageDownloader struct {
httpClient httpclient.HTTPClient
}
func New(hc httpclient.HTTPClient) *httpImageDownloader {
return &httpImageDownloader{httpClient: hc}
}
// DownloadImage implements the ImageDownloader API. It downloads the image from the instance
// (not from GCS itself), which removes the need for the service account to have read access.
func (h *httpImageDownloader) DownloadImage(ctx context.Context, goldURL string, digest types.Digest) ([]byte, error) {
u := fmt.Sprintf("%s/img/images/%s.png", goldURL, digest)
resp, err := h.httpClient.Get(ctx, u)
if err != nil {
return nil, skerr.Wrapf(err, "getting digest from url %s", u)
}
defer util.Close(resp.Body)
return io.ReadAll(resp.Body)
}
type DryRunImpl struct{}
// DownloadImage implements the ImageDownloader interface.
func (h *DryRunImpl) DownloadImage(_ context.Context, goldURL string, digest types.Digest) ([]byte, error) {
return nil, skerr.Fmt("Dry run download image %s from %s", digest, goldURL)
}
// Make sure httpImageDownloader fulfills the ImageDownloader interface.
var _ ImageDownloader = (*httpImageDownloader)(nil)
// Make sure DryRunImpl fulfills the ImageDownloader interface.
var _ ImageDownloader = (*DryRunImpl)(nil)