in internal/plugin/manager/pluginengine.go [321:372]
func (d *downloadStep) Run(ctx context.Context, _ *Plugin) error {
// Try downloading package d.attempts times with 2 second interval.
policy := retry.Policy{MaxAttempts: d.attempts, BackoffFactor: 1, Jitter: time.Second * 2}
return retry.Run(ctx, policy, func() error {
client := http.Client{
Timeout: d.timeout,
}
req, err := http.NewRequestWithContext(ctx, http.MethodGet, d.url, nil)
if err != nil {
return fmt.Errorf("failed to create request for %q: %w", d.url, err)
}
resp, err := client.Do(req)
if err != nil {
return fmt.Errorf("failed to download from %q: %w", d.url, err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to download from %q, bad status: %q", d.url, resp.Status)
}
dir := filepath.Dir(d.targetPath)
if err := os.MkdirAll(dir, 0755); err != nil {
return fmt.Errorf("failed to create directory %q: %w", dir, err)
}
f, err := os.Create(d.targetPath)
if err != nil {
return fmt.Errorf("unable to create file %q: %w", d.targetPath, err)
}
defer f.Close()
if _, err = io.Copy(f, resp.Body); err != nil {
return fmt.Errorf("unable to copy response body to file %q: %w", f.Name(), err)
}
calculated, err := file.SHA256FileSum(f.Name())
if err != nil {
return fmt.Errorf("failed to calculate sha256sum of file %q: %w", f.Name(), err)
}
if calculated != d.checksum {
return fmt.Errorf("file %q has different sha256sum: %q != %q", f.Name(), calculated, d.checksum)
}
galog.Debugf("Successfully downloaded %q to %q", d.url, d.targetPath)
return nil
})
}