Merge pull request #11569 from baude/macaarch64pullfcos

Use new aarch64 fcos repos
This commit is contained in:
OpenShift Merge Robot
2021-09-14 13:08:13 -04:00
committed by GitHub
3 changed files with 73 additions and 255 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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