mirror of https://github.com/containers/podman.git
79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
package machine
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
|
|
"github.com/coreos/stream-metadata-go/fedoracoreos"
|
|
"github.com/coreos/stream-metadata-go/stream"
|
|
"github.com/pkg/errors"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// This should get Exported and stay put as it will apply to all fcos downloads
|
|
// getFCOS parses fedoraCoreOS's stream and returns the image download URL and the release version
|
|
func getFCOSDownload(imageStream string) (*fcosDownloadInfo, error) {
|
|
var (
|
|
fcosstable stream.Stream
|
|
streamType string
|
|
)
|
|
switch imageStream {
|
|
case "testing", "":
|
|
streamType = fedoracoreos.StreamNext
|
|
case "stable":
|
|
streamType = fedoracoreos.StreamStable
|
|
default:
|
|
return nil, errors.Errorf("invalid stream %s: valid streams are `testing` and `stable`", imageStream)
|
|
}
|
|
streamurl := fedoracoreos.GetStreamURL(streamType)
|
|
resp, err := http.Get(streamurl.String())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer func() {
|
|
if err := resp.Body.Close(); err != nil {
|
|
logrus.Error(err)
|
|
}
|
|
}()
|
|
|
|
if err := json.Unmarshal(body, &fcosstable); err != nil {
|
|
return nil, err
|
|
}
|
|
arch, ok := fcosstable.Architectures[getFcosArch()]
|
|
if !ok {
|
|
return nil, fmt.Errorf("unable to pull VM image: no targetArch in stream")
|
|
}
|
|
artifacts := arch.Artifacts
|
|
if artifacts == nil {
|
|
return nil, fmt.Errorf("unable to pull VM image: no artifact in stream")
|
|
}
|
|
qemu, ok := artifacts[artifact]
|
|
if !ok {
|
|
return nil, fmt.Errorf("unable to pull VM image: no qemu artifact in stream")
|
|
}
|
|
formats := qemu.Formats
|
|
if formats == nil {
|
|
return nil, fmt.Errorf("unable to pull VM image: no formats in stream")
|
|
}
|
|
qcow, ok := formats[Format]
|
|
if !ok {
|
|
return nil, fmt.Errorf("unable to pull VM image: no qcow2.xz format in stream")
|
|
}
|
|
disk := qcow.Disk
|
|
if disk == nil {
|
|
return nil, fmt.Errorf("unable to pull VM image: no disk in stream")
|
|
}
|
|
return &fcosDownloadInfo{
|
|
Location: disk.Location,
|
|
Release: qemu.Release,
|
|
Sha256Sum: disk.Sha256,
|
|
CompressionType: "xz",
|
|
}, nil
|
|
}
|