mirror of
https://github.com/containers/podman.git
synced 2025-06-22 18:08:11 +08:00
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:

committed by
Matthew Heon

parent
2440550305
commit
d2e2756a4c
@ -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
|
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
Reference in New Issue
Block a user