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, imageStream string) (DistributionDownload, error) {
 | |
| 	info, err := getFCOSDownload(imageStream)
 | |
| 	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
 | |
| }
 |