Print rootfs download as a specific version on Win

- Also save the file using this convention.
- Change the general pull mechanism to print the local file
  as opposed to the remote to enable this - no change in
  observed behavior on mac

Signed-off-by: Jason T. Greene <jason.greene@redhat.com>
This commit is contained in:
Jason T. Greene
2022-07-18 10:34:42 -05:00
committed by Matthew Heon
parent 2440550305
commit d2e2756a4c
2 changed files with 31 additions and 14 deletions

View File

@ -6,7 +6,10 @@ package machine
import ( import (
"errors" "errors"
"fmt" "fmt"
"io"
"os" "os"
"path"
"strings"
"net/http" "net/http"
"net/url" "net/url"
@ -23,7 +26,7 @@ type FedoraDownload struct {
} }
func NewFedoraDownloader(vmType, vmName, releaseStream string) (DistributionDownload, error) { func NewFedoraDownloader(vmType, vmName, releaseStream string) (DistributionDownload, error) {
downloadURL, size, err := getFedoraDownload(githubLatestReleaseURL) downloadURL, version, size, err := getFedoraDownload(githubLatestReleaseURL)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -33,7 +36,7 @@ func NewFedoraDownloader(vmType, vmName, releaseStream string) (DistributionDown
return nil, err return nil, err
} }
imageName := "rootfs.tar.xz" imageName := fmt.Sprintf("fedora-podman-%s.tar.xz", version)
f := FedoraDownload{ f := FedoraDownload{
Download: Download{ Download: Download{
@ -77,21 +80,36 @@ func (f FedoraDownload) CleanCache() error {
return removeImageAfterExpire(f.CacheDir, expire) return removeImageAfterExpire(f.CacheDir, expire)
} }
func getFedoraDownload(releaseURL string) (*url.URL, int64, error) { func getFedoraDownload(releaseURL string) (*url.URL, string, int64, error) {
downloadURL, err := url.Parse(releaseURL) downloadURL, err := url.Parse(releaseURL)
if err != nil { if err != nil {
return nil, -1, fmt.Errorf("invalid URL generated from discovered Fedora file: %s: %w", releaseURL, err) return nil, "", -1, fmt.Errorf("invalid URL generated from discovered Fedora file: %s: %w", releaseURL, err)
} }
resp, err := http.Head(releaseURL) resp, err := http.Head(releaseURL)
if err != nil { if err != nil {
return nil, -1, fmt.Errorf("head request failed: %s: %w", releaseURL, err) return nil, "", -1, fmt.Errorf("head request failed: %s: %w", releaseURL, err)
}
_ = resp.Body.Close()
contentLen := resp.ContentLength
if resp.StatusCode != http.StatusOK {
return nil, "", -1, fmt.Errorf("head request failed: %s: %w", releaseURL, err)
}
verURL := *downloadURL
verURL.Path = path.Join(path.Dir(downloadURL.Path), "version")
resp, err = http.Get(verURL.String())
if err != nil {
return nil, "", -1, fmt.Errorf("get request failed: %s: %w", verURL.String(), err)
}
bytes, err := io.ReadAll(&io.LimitedReader{R: resp.Body, N: 1024})
if err != nil {
return nil, "", -1, fmt.Errorf("failed reading: %s: %w", verURL.String(), err)
} }
_ = resp.Body.Close() _ = resp.Body.Close()
if resp.StatusCode != http.StatusOK { return downloadURL, strings.TrimSpace(string(bytes)), contentLen, nil
return nil, -1, fmt.Errorf("head request failed: %s: %w", releaseURL, err)
}
return downloadURL, resp.ContentLength, nil
} }

View File

@ -113,7 +113,7 @@ func DownloadImage(d DistributionDownload) error {
return err return err
} }
if !ok { if !ok {
if err := DownloadVMImage(d.Get().URL, d.Get().LocalPath); err != nil { if err := DownloadVMImage(d.Get().URL, d.Get().ImageName, d.Get().LocalPath); err != nil {
return err return err
} }
// Clean out old cached images, since we didn't find needed image in cache // Clean out old cached images, since we didn't find needed image in cache
@ -128,7 +128,7 @@ func DownloadImage(d DistributionDownload) error {
// DownloadVMImage downloads a VM image from url to given path // DownloadVMImage downloads a VM image from url to given path
// with download status // with download status
func DownloadVMImage(downloadURL *url2.URL, localImagePath string) error { func DownloadVMImage(downloadURL *url2.URL, imageName string, localImagePath string) error {
out, err := os.Create(localImagePath) out, err := os.Create(localImagePath)
if err != nil { if err != nil {
return err return err
@ -153,8 +153,7 @@ func DownloadVMImage(downloadURL *url2.URL, localImagePath string) error {
return fmt.Errorf("downloading VM image %s: %s", downloadURL, resp.Status) return fmt.Errorf("downloading VM image %s: %s", downloadURL, resp.Status)
} }
size := resp.ContentLength size := resp.ContentLength
urlSplit := strings.Split(downloadURL.Path, "/") prefix := "Downloading VM image: " + imageName
prefix := "Downloading VM image: " + urlSplit[len(urlSplit)-1]
onComplete := prefix + ": done" onComplete := prefix + ": done"
p := mpb.New( p := mpb.New(