Skip to content

Commit

Permalink
More fixup!
Browse files Browse the repository at this point in the history
- Move error handling and other main logic to run()
- Use map to handle release and stream arches
- Omit instead of showing empty when images are not available
  for a cloud provider
  • Loading branch information
sinnykumari committed Jul 1, 2019
1 parent ebe8963 commit 2899dae
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 70 deletions.
90 changes: 46 additions & 44 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"encoding/json"
"errors"
"flag"
"fmt"
"net/http"
Expand All @@ -11,7 +12,7 @@ import (

func releaseToStream(releaseArch *ReleaseArch, release Release) StreamArch {
artifacts := StreamArtifacts{}
cloudImage := StreamImages{}
cloudImages := StreamImages{}
if releaseArch.Media.Aws != nil {
aws := StreamMediaDetails{
Release: release.Release,
Expand All @@ -22,16 +23,16 @@ func releaseToStream(releaseArch *ReleaseArch, release Release) StreamArch {
Regions: make(map[string]*StreamAwsAMI),
}

if releaseArch.Media.Aws != nil {
if releaseArch.Media.Aws != nil && releaseArch.Media.Aws.Images != nil {
streamAwsAMI := StreamAwsAMI{}
for region, ami := range *releaseArch.Media.Aws.Images {
streamAwsAMI.Release = release.Release
streamAwsAMI.Image = ami.Image
streamAwsAMI.Image = *ami.Image
awsAmis.Regions[region] = &streamAwsAMI

}

cloudImage.Aws = &awsAmis
cloudImages.Aws = &awsAmis
}
}

Expand All @@ -41,13 +42,15 @@ func releaseToStream(releaseArch *ReleaseArch, release Release) StreamArch {
Formats: releaseArch.Media.Azure.Artifacts,
}
artifacts.Azure = &azure
azureImage := StreamCloudImage{}

if releaseArch.Media.Azure.Images.Global != nil {
if releaseArch.Media.Azure.Images != nil &&
releaseArch.Media.Azure.Images.Global != nil &&
releaseArch.Media.Azure.Images.Global.Image != nil {
azureImage := StreamCloudImage{}
azureImage.Image = "Fedora:CoreOS:stable:latest"
cloudImages.Azure = &azureImage
}

cloudImage.Azure = &azureImage
}

if releaseArch.Media.Gcp != nil {
Expand All @@ -56,13 +59,13 @@ func releaseToStream(releaseArch *ReleaseArch, release Release) StreamArch {
Formats: releaseArch.Media.Gcp.Artifacts,
}
artifacts.Gcp = &gcp
gcpImage := StreamCloudImage{}

if releaseArch.Media.Gcp != nil {
if releaseArch.Media.Gcp != nil && releaseArch.Media.Gcp.Image != nil {
gcpImage := StreamCloudImage{}
gcpImage.Image = "projects/fedora-cloud/global/images/family/fedora-coreos-stable"
cloudImages.Gcp = &gcpImage

}
cloudImage.Gcp = &gcpImage
}

if releaseArch.Media.Digitalocean != nil {
Expand All @@ -74,7 +77,7 @@ func releaseToStream(releaseArch *ReleaseArch, release Release) StreamArch {

artifacts.Digitalocean = &digitalOcean
digitalOceanImage := StreamCloudImage{Image: "fedora-coreos-stable"}
cloudImage.Digitalocean = &digitalOceanImage
cloudImages.Digitalocean = &digitalOceanImage
}

if releaseArch.Media.Packet != nil {
Expand All @@ -85,7 +88,7 @@ func releaseToStream(releaseArch *ReleaseArch, release Release) StreamArch {
artifacts.Packet = &packet

packetImage := StreamCloudImage{Image: "fedora_coreos_stable"}
cloudImage.Packet = &packetImage
cloudImages.Packet = &packetImage
}

if releaseArch.Media.Openstack != nil {
Expand Down Expand Up @@ -131,12 +134,14 @@ func releaseToStream(releaseArch *ReleaseArch, release Release) StreamArch {
streamArch := StreamArch{
Artifacts: artifacts,
Updates: StreamUpdates{Release: release.Release},
Images: &cloudImage,
Images: &cloudImages,
}
return streamArch
}

func main() {
var errReleaseIndexMissing = errors.New("Please specify release index url")

func run() error {
var releasesURL string

flag.StringVar(&releasesURL, "release-index", "", "Release index location for the required stream")
Expand All @@ -146,82 +151,79 @@ func main() {
flag.Parse()

if releasesURL == "" {
fmt.Println("Please specify release index url")
flag.Usage()
os.Exit(1)
return errReleaseIndexMissing
}

releasePath, err := ReleaseURL(releasesURL)

if err != nil {
fmt.Printf("Error with Release Index %v", err)
os.Exit(1)
return fmt.Errorf("Error with Release Index: %v", err)
}

var release Release
resp, err := http.Get(releasePath)
if err != nil {
fmt.Printf("Error while fetching %v", err)
os.Exit(1)
return fmt.Errorf("Error while fetching: %v", err)
}

defer resp.Body.Close()

decoder := json.NewDecoder(resp.Body)
if err := decoder.Decode(&release); err != nil {
fmt.Printf("Error while decoding json %v", err)
os.Exit(1)
}

arch := StreamArchitectures{}
if release.Architectures.X8664 != nil {
x8664 := releaseToStream(release.Architectures.X8664, release)
arch.X8664 = &x8664
}

if release.Architectures.PowerPC != nil {
powerPC := releaseToStream(release.Architectures.PowerPC, release)
arch.PowerPC = &powerPC
return fmt.Errorf("Error while decoding json: %v", err)
}

if release.Architectures.Arm64 != nil {
arm64 := releaseToStream(release.Architectures.Arm64, release)
arch.Arm64 = &arm64
streamArch := make(map[string]*StreamArch)
for arch, releaseArch := range release.Architectures {
archContent := releaseToStream(releaseArch, release)
streamArch[arch] = &archContent
}

streamMetadata := StreamMetadata{
Stream: release.Stream,
Metadata: Metadata{LastModified: time.Now().UTC().Format(time.RFC3339)},
Architectures: arch,
Architectures: streamArch,
}

file, err := os.Create("stream.json")
if err != nil {
fmt.Printf("Can't Open file: %v", err)
os.Exit(1)
return fmt.Errorf("Can't Open file: %v", err)
}

defer file.Close()

if overrideFilename != "" {
overrideFile, err := os.Open(overrideFilename)
if err != nil {
fmt.Printf("Can't open file %s: %v", overrideFilename, err)
os.Exit(1)
return fmt.Errorf("Can't open file %s: %v", overrideFilename, err)
}
defer overrideFile.Close()

overrideDecoder := json.NewDecoder(overrideFile)
err = overrideDecoder.Decode(&streamMetadata)
if err != nil {
fmt.Printf("Error while decoding: %v", err)
return fmt.Errorf("Error while decoding: %v", err)
}
}

encoder := json.NewEncoder(file)
err = encoder.Encode(&streamMetadata)
if err != nil {
fmt.Printf("Error while encoding: %v", err)
return fmt.Errorf("Error while encoding: %v", err)
}
return nil

}

func main() {
err := run()
if err != nil {
fmt.Println(err)

if err == errReleaseIndexMissing {
flag.Usage()
}

os.Exit(1)
}
}
23 changes: 8 additions & 15 deletions release.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,10 @@ package main

// Release contains details from release.json
type Release struct {
Release string `json:"release"`
Stream string `json:"stream"`
Metadata Metadata `json:"metadata"`
Architectures ReleaseArchitectures `json:"architectures"`
}

// ReleaseArchitectures contains list of architetcures for which release is available
type ReleaseArchitectures struct {
X8664 *ReleaseArch `json:"x86_64"`
PowerPC *ReleaseArch `json:"ppc64le"`
Arm64 *ReleaseArch `json:"aarch64"`
Release string `json:"release"`
Stream string `json:"stream"`
Metadata Metadata `json:"metadata"`
Architectures map[string]*ReleaseArch `json:"architectures"`
}

// ReleaseArch release details for x86_64 architetcure
Expand Down Expand Up @@ -48,8 +41,8 @@ type ReleaseDigitalOcean struct {

// ReleaseAzure Azure image detail
type ReleaseAzure struct {
Artifacts Artifacts `json:"artifacts"`
Images ReleaseAzureImages `json:"images"`
Artifacts Artifacts `json:"artifacts"`
Images *ReleaseAzureImages `json:"images"`
}

// ReleaseAzureImages Azure image detail
Expand All @@ -60,12 +53,12 @@ type ReleaseAzureImages struct {
// ReleaseGcp GCP image detail
type ReleaseGcp struct {
Artifacts Artifacts `json:"artifacts"`
Image string `json:"image"`
Image *string `json:"image"`
}

// ReleaseCloudImage cloud image information
type ReleaseCloudImage struct {
Image string `json:"image"`
Image *string `json:"image"`
}

// ReleaseTargetPlatform target platforms
Expand Down
15 changes: 4 additions & 11 deletions stream.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,9 @@ package main

// StreamMetadata contains artifacts available in a stream
type StreamMetadata struct {
Stream string `json:"stream"`
Metadata Metadata `json:"metadata"`
Architectures StreamArchitectures `json:"architectures"`
}

// StreamArchitectures contains list of architetcures for which stream is available
type StreamArchitectures struct {
X8664 *StreamArch `json:"x86_64,omitempty"`
Arm64 *StreamArch `json:"aarch64,omitempty"`
PowerPC *StreamArch `json:"ppc64le,omitempty"`
Stream string `json:"stream"`
Metadata Metadata `json:"metadata"`
Architectures map[string]*StreamArch `json:"architectures"`
}

// StreamArch release details for x86_64 architetcure
Expand Down Expand Up @@ -52,7 +45,7 @@ type StreamImages struct {

// StreamCloudImage image for Cloud provider
type StreamCloudImage struct {
Image string `json:"image"`
Image string `json:"image,omitempty"`
}

// StreamAwsImage Aws images
Expand Down

0 comments on commit 2899dae

Please sign in to comment.