mirror of
https://github.com/containers/podman.git
synced 2025-06-24 19:42:56 +08:00
Merge pull request #11569 from baude/macaarch64pullfcos
Use new aarch64 fcos repos
This commit is contained in:
@ -3,12 +3,20 @@
|
||||
package machine
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
url2 "net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"github.com/coreos/stream-metadata-go/fedoracoreos"
|
||||
"github.com/coreos/stream-metadata-go/stream"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
@ -121,3 +129,68 @@ func getFcosArch() string {
|
||||
}
|
||||
return arch
|
||||
}
|
||||
|
||||
// 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
|
||||
}
|
||||
|
@ -1,78 +0,0 @@
|
||||
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
|
||||
}
|
@ -1,177 +0,0 @@
|
||||
package machine
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
url2 "net/url"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
const aarchBaseURL = "https://fedorapeople.org/groups/fcos-images/builds/latest/aarch64/"
|
||||
|
||||
// Total hack until automation is possible.
|
||||
// We need a proper json file at least to automate
|
||||
func getFCOSDownload(imageStream string) (*fcosDownloadInfo, error) {
|
||||
meta := Build{}
|
||||
resp, err := http.Get(aarchBaseURL + "meta.json")
|
||||
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, &meta); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pathURL, err := url2.Parse(meta.BuildArtifacts.Qemu.Path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
baseURL, err := url2.Parse(aarchBaseURL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pullURL := baseURL.ResolveReference(pathURL)
|
||||
return &fcosDownloadInfo{
|
||||
Location: pullURL.String(),
|
||||
Release: "",
|
||||
Sha256Sum: meta.BuildArtifacts.Qemu.Sha256,
|
||||
}, nil
|
||||
}
|
||||
|
||||
/*
|
||||
All of this can be nuked when fcos upstream generates a proper meta data file for aarch.
|
||||
*/
|
||||
type AliyunImage struct {
|
||||
ImageID string `json:"id"`
|
||||
Region string `json:"name"`
|
||||
}
|
||||
|
||||
type Amis struct {
|
||||
Hvm string `json:"hvm"`
|
||||
Region string `json:"name"`
|
||||
Snapshot string `json:"snapshot"`
|
||||
}
|
||||
|
||||
type Artifact struct {
|
||||
Path string `json:"path"`
|
||||
Sha256 string `json:"sha256"`
|
||||
SizeInBytes float64 `json:"size,omitempty"`
|
||||
UncompressedSha256 string `json:"uncompressed-sha256,omitempty"`
|
||||
UncompressedSize int `json:"uncompressed-size,omitempty"`
|
||||
}
|
||||
|
||||
type Build struct {
|
||||
AlibabaAliyunUploads []AliyunImage `json:"aliyun,omitempty"`
|
||||
Amis []Amis `json:"amis,omitempty"`
|
||||
Architecture string `json:"coreos-assembler.basearch,omitempty"`
|
||||
Azure *Cloudartifact `json:"azure,omitempty"`
|
||||
BuildArtifacts *BuildArtifacts `json:"images,omitempty"`
|
||||
BuildID string `json:"buildid"`
|
||||
BuildRef string `json:"ref,omitempty"`
|
||||
BuildSummary string `json:"summary"`
|
||||
BuildTimeStamp string `json:"coreos-assembler.build-timestamp,omitempty"`
|
||||
BuildURL string `json:"build-url,omitempty"`
|
||||
ConfigGitRev string `json:"coreos-assembler.config-gitrev,omitempty"`
|
||||
ContainerConfigGit *Git `json:"coreos-assembler.container-config-git,omitempty"`
|
||||
CoreOsSource string `json:"coreos-assembler.code-source,omitempty"`
|
||||
CosaContainerImageGit *Git `json:"coreos-assembler.container-image-git,omitempty"`
|
||||
CosaDelayedMetaMerge bool `json:"coreos-assembler.delayed-meta-merge,omitempty"`
|
||||
CosaImageChecksum string `json:"coreos-assembler.image-config-checksum,omitempty"`
|
||||
CosaImageVersion int `json:"coreos-assembler.image-genver,omitempty"`
|
||||
Extensions *Extensions `json:"extensions,omitempty"`
|
||||
FedoraCoreOsParentCommit string `json:"fedora-coreos.parent-commit,omitempty"`
|
||||
FedoraCoreOsParentVersion string `json:"fedora-coreos.parent-version,omitempty"`
|
||||
Gcp *Gcp `json:"gcp,omitempty"`
|
||||
GitDirty string `json:"coreos-assembler.config-dirty,omitempty"`
|
||||
ImageInputChecksum string `json:"coreos-assembler.image-input-checksum,omitempty"`
|
||||
InputHasOfTheRpmOstree string `json:"rpm-ostree-inputhash"`
|
||||
MetaStamp float64 `json:"coreos-assembler.meta-stamp,omitempty"`
|
||||
Name string `json:"name"`
|
||||
Oscontainer *Image `json:"oscontainer,omitempty"`
|
||||
OstreeCommit string `json:"ostree-commit"`
|
||||
OstreeContentBytesWritten int `json:"ostree-content-bytes-written,omitempty"`
|
||||
OstreeContentChecksum string `json:"ostree-content-checksum"`
|
||||
OstreeNCacheHits int `json:"ostree-n-cache-hits,omitempty"`
|
||||
OstreeNContentTotal int `json:"ostree-n-content-total,omitempty"`
|
||||
OstreeNContentWritten int `json:"ostree-n-content-written,omitempty"`
|
||||
OstreeNMetadataTotal int `json:"ostree-n-metadata-total,omitempty"`
|
||||
OstreeNMetadataWritten int `json:"ostree-n-metadata-written,omitempty"`
|
||||
OstreeTimestamp string `json:"ostree-timestamp"`
|
||||
OstreeVersion string `json:"ostree-version"`
|
||||
OverridesActive bool `json:"coreos-assembler.overrides-active,omitempty"`
|
||||
PkgdiffAgainstParent PackageSetDifferences `json:"parent-pkgdiff,omitempty"`
|
||||
PkgdiffBetweenBuilds PackageSetDifferences `json:"pkgdiff,omitempty"`
|
||||
ReleasePayload *Image `json:"release-payload,omitempty"`
|
||||
}
|
||||
|
||||
type BuildArtifacts struct {
|
||||
Aliyun *Artifact `json:"aliyun,omitempty"`
|
||||
Aws *Artifact `json:"aws,omitempty"`
|
||||
Azure *Artifact `json:"azure,omitempty"`
|
||||
AzureStack *Artifact `json:"azurestack,omitempty"`
|
||||
Dasd *Artifact `json:"dasd,omitempty"`
|
||||
DigitalOcean *Artifact `json:"digitalocean,omitempty"`
|
||||
Exoscale *Artifact `json:"exoscale,omitempty"`
|
||||
Gcp *Artifact `json:"gcp,omitempty"`
|
||||
IbmCloud *Artifact `json:"ibmcloud,omitempty"`
|
||||
Initramfs *Artifact `json:"initramfs,omitempty"`
|
||||
Iso *Artifact `json:"iso,omitempty"`
|
||||
Kernel *Artifact `json:"kernel,omitempty"`
|
||||
LiveInitramfs *Artifact `json:"live-initramfs,omitempty"`
|
||||
LiveIso *Artifact `json:"live-iso,omitempty"`
|
||||
LiveKernel *Artifact `json:"live-kernel,omitempty"`
|
||||
LiveRootfs *Artifact `json:"live-rootfs,omitempty"`
|
||||
Metal *Artifact `json:"metal,omitempty"`
|
||||
Metal4KNative *Artifact `json:"metal4k,omitempty"`
|
||||
OpenStack *Artifact `json:"openstack,omitempty"`
|
||||
Ostree Artifact `json:"ostree"`
|
||||
Qemu *Artifact `json:"qemu,omitempty"`
|
||||
Vmware *Artifact `json:"vmware,omitempty"`
|
||||
Vultr *Artifact `json:"vultr,omitempty"`
|
||||
}
|
||||
|
||||
type Cloudartifact struct {
|
||||
Image string `json:"image"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
type Extensions struct {
|
||||
Manifest map[string]interface{} `json:"manifest"`
|
||||
Path string `json:"path"`
|
||||
RpmOstreeState string `json:"rpm-ostree-state"`
|
||||
Sha256 string `json:"sha256"`
|
||||
}
|
||||
|
||||
type Gcp struct {
|
||||
ImageFamily string `json:"family,omitempty"`
|
||||
ImageName string `json:"image"`
|
||||
ImageProject string `json:"project,omitempty"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
type Git struct {
|
||||
Branch string `json:"branch,omitempty"`
|
||||
Commit string `json:"commit"`
|
||||
Dirty string `json:"dirty,omitempty"`
|
||||
Origin string `json:"origin"`
|
||||
}
|
||||
|
||||
type Image struct {
|
||||
Comment string `json:"comment,omitempty"`
|
||||
Digest string `json:"digest"`
|
||||
Image string `json:"image"`
|
||||
}
|
||||
|
||||
type Items interface{}
|
||||
|
||||
type PackageSetDifferences []Items
|
Reference in New Issue
Block a user