mirror of https://github.com/containers/podman.git
124 lines
2.6 KiB
Go
124 lines
2.6 KiB
Go
// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
|
|
|
|
package machine
|
|
|
|
import (
|
|
url2 "net/url"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
|
|
digest "github.com/opencontainers/go-digest"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// These should eventually be moved into machine/qemu as
|
|
// they are specific to running qemu
|
|
var (
|
|
artifact string = "qemu"
|
|
Format string = "qcow2.xz"
|
|
)
|
|
|
|
type FcosDownload struct {
|
|
Download
|
|
}
|
|
|
|
func NewFcosDownloader(vmType, vmName string) (DistributionDownload, error) {
|
|
info, err := getFCOSDownload()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
urlSplit := strings.Split(info.Location, "/")
|
|
imageName := urlSplit[len(urlSplit)-1]
|
|
url, err := url2.Parse(info.Location)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
dataDir, err := GetDataDir(vmType)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fcd := FcosDownload{
|
|
Download: Download{
|
|
Arch: getFcosArch(),
|
|
Artifact: artifact,
|
|
Format: Format,
|
|
ImageName: imageName,
|
|
LocalPath: filepath.Join(dataDir, imageName),
|
|
Sha256sum: info.Sha256Sum,
|
|
URL: url,
|
|
VMName: vmName,
|
|
},
|
|
}
|
|
fcd.Download.LocalUncompressedFile = fcd.getLocalUncompressedName()
|
|
return fcd, nil
|
|
}
|
|
|
|
func (f FcosDownload) getLocalUncompressedName() string {
|
|
uncompressedFilename := filepath.Join(filepath.Dir(f.LocalPath), f.VMName+"_"+f.ImageName)
|
|
return strings.TrimSuffix(uncompressedFilename, ".xz")
|
|
}
|
|
|
|
func (f FcosDownload) DownloadImage() error {
|
|
// check if the latest image is already present
|
|
ok, err := UpdateAvailable(&f.Download)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !ok {
|
|
if err := DownloadVMImage(f.URL, f.LocalPath); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return Decompress(f.LocalPath, f.getLocalUncompressedName())
|
|
}
|
|
|
|
func (f FcosDownload) Get() *Download {
|
|
return &f.Download
|
|
}
|
|
|
|
type fcosDownloadInfo struct {
|
|
CompressionType string
|
|
Location string
|
|
Release string
|
|
Sha256Sum string
|
|
}
|
|
|
|
func UpdateAvailable(d *Download) (bool, error) {
|
|
// check the sha of the local image if it exists
|
|
// get the sha of the remote image
|
|
// == dont bother to pull
|
|
if _, err := os.Stat(d.LocalPath); os.IsNotExist(err) {
|
|
return false, nil
|
|
}
|
|
fd, err := os.Open(d.LocalPath)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer func() {
|
|
if err := fd.Close(); err != nil {
|
|
logrus.Error(err)
|
|
}
|
|
}()
|
|
sum, err := digest.SHA256.FromReader(fd)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return sum.Encoded() == d.Sha256sum, nil
|
|
}
|
|
|
|
func getFcosArch() string {
|
|
var arch string
|
|
// TODO fill in more architectures
|
|
switch runtime.GOARCH {
|
|
case "arm64":
|
|
arch = "aarch64"
|
|
default:
|
|
arch = "x86_64"
|
|
}
|
|
return arch
|
|
}
|