@@ -7,43 +7,69 @@ package rhcos
77import (
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.
2227func 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
3942func 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+ }
0 commit comments