Skip to content

Commit 233ea85

Browse files
committed
pkg/rhcos: merge marketplace with coreos stream
Reworks the logic for fetching the coreos stream to merge a marketplace.json file (if it exists) with the (rhcos|fcos).json file before producing the results.
1 parent bc46191 commit 233ea85

File tree

4 files changed

+81
-10
lines changed

4 files changed

+81
-10
lines changed

pkg/rhcos/builds.go

Lines changed: 64 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,43 +7,69 @@ package rhcos
77
import (
88
"context"
99
"encoding/json"
10+
"errors"
1011
"fmt"
1112
"io"
13+
"io/fs"
1214
"net/url"
1315

1416
"github.com/coreos/stream-metadata-go/stream"
15-
"github.com/pkg/errors"
17+
"github.com/coreos/stream-metadata-go/stream/rhcos"
18+
"github.com/sirupsen/logrus"
1619

1720
"github.com/openshift/installer/data"
1821
)
1922

23+
type marketplaceStream map[string]*rhcos.Marketplace
24+
2025
// FetchRawCoreOSStream returns the raw stream metadata for the
2126
// bootimages embedded in the installer.
2227
func FetchRawCoreOSStream(ctx context.Context) ([]byte, error) {
23-
file, err := data.Assets.Open(getStreamFileName())
28+
st, err := FetchCoreOSBuild(ctx)
2429
if err != nil {
25-
return nil, errors.Wrapf(err, "failed to read embedded CoreOS stream metadata")
30+
return nil, fmt.Errorf("failed to get combined CoreOS build: %w", err)
2631
}
27-
defer file.Close()
28-
29-
body, err := io.ReadAll(file)
32+
rawStream, err := json.Marshal(st)
3033
if err != nil {
31-
return nil, errors.Wrap(err, "failed to read CoreOS stream metadata")
34+
return nil, fmt.Errorf("failed to marshal combined CoreOS stream: %w", err)
3235
}
33-
return body, nil
36+
return rawStream, nil
3437
}
3538

3639
// FetchCoreOSBuild returns the pinned version of RHEL/Fedora CoreOS used
3740
// by the installer to provision the bootstrap node and control plane currently.
3841
// For more information, see e.g. https://github.com/openshift/enhancements/pull/201
3942
func FetchCoreOSBuild(ctx context.Context) (*stream.Stream, error) {
40-
body, err := FetchRawCoreOSStream(ctx)
43+
body, err := fetchRawCoreOSStream(ctx)
4144
if err != nil {
4245
return nil, err
4346
}
4447
var st stream.Stream
4548
if err := json.Unmarshal(body, &st); err != nil {
46-
return nil, errors.Wrap(err, "failed to parse CoreOS stream metadata")
49+
return nil, fmt.Errorf("failed to parse CoreOS stream metadata: %w", err)
50+
}
51+
52+
// Merge marketplace json file into stream json file
53+
mktBody, err := fetchRawMarketplaceStream()
54+
if err != nil {
55+
if errors.Is(err, fs.ErrNotExist) {
56+
logrus.Debug("No marketplace json file found: skipping merge.")
57+
return &st, nil
58+
}
59+
return nil, err
60+
}
61+
var mktSt marketplaceStream
62+
if err := json.Unmarshal(mktBody, &mktSt); err != nil {
63+
return nil, fmt.Errorf("failed to parse marketplace stream: %w", err)
64+
}
65+
66+
for name, arch := range st.Architectures {
67+
if mkt, ok := mktSt[name]; ok {
68+
if arch.RHELCoreOSExtensions == nil {
69+
arch.RHELCoreOSExtensions = &rhcos.Extensions{}
70+
}
71+
arch.RHELCoreOSExtensions.Marketplace = mkt
72+
}
4773
}
4874
return &st, nil
4975
}
@@ -87,3 +113,31 @@ func FindArtifactURL(artifacts stream.PlatformArtifacts) (string, error) {
87113
}
88114
return "", fmt.Errorf("no \"disk\" artifact found")
89115
}
116+
117+
func fetchRawCoreOSStream(ctx context.Context) ([]byte, error) {
118+
file, err := data.Assets.Open(getStreamFileName())
119+
if err != nil {
120+
return nil, fmt.Errorf("failed to read embedded CoreOS stream metadata: %w", err)
121+
}
122+
defer file.Close()
123+
124+
body, err := io.ReadAll(file)
125+
if err != nil {
126+
return nil, fmt.Errorf("failed to read CoreOS stream metadata: %w", err)
127+
}
128+
return body, nil
129+
}
130+
131+
func fetchRawMarketplaceStream() ([]byte, error) {
132+
file, err := data.Assets.Open(getMarketplaceStreamFileName())
133+
if err != nil {
134+
return nil, err
135+
}
136+
defer file.Close()
137+
138+
body, err := io.ReadAll(file)
139+
if err != nil {
140+
return nil, err
141+
}
142+
return body, nil
143+
}

pkg/rhcos/stream.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ package rhcos
55
func getStreamFileName() string {
66
return "coreos/rhcos.json"
77
}
8+
9+
func getMarketplaceStreamFileName() string {
10+
return "coreos/marketplace-rhcos.json"
11+
}

pkg/rhcos/stream_fcos.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,9 @@ package rhcos
55
func getStreamFileName() string {
66
return "coreos/fcos.json"
77
}
8+
9+
func getMarketplaceStreamFileName() string {
10+
// There is no need for OKD marketplace images at this time
11+
// so we can skip reading a marketplace stream file.
12+
return ""
13+
}

pkg/rhcos/stream_scos.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,10 @@ package rhcos
55
func getStreamFileName() string {
66
return "coreos/scos.json"
77
}
8+
9+
func getMarketplaceStreamFileName() string {
10+
// There is no current need for scos marketplace images,
11+
// so this file does not currently exist. The calling
12+
// functions will gracefully handle the missing file.
13+
return "coreos/marketplace-scos.json"
14+
}

0 commit comments

Comments
 (0)