Skip to content

Commit 861b842

Browse files
committed
extract csv.release if present, parse from version build metadata if possible; fatal if annotation present and build metadata cannot represent release
Signed-off-by: grokspawn <[email protected]>
1 parent c746664 commit 861b842

File tree

6 files changed

+80
-2
lines changed

6 files changed

+80
-2
lines changed

pkg/lib/validation/bundle.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ func validateBundle(bundle *registry.Bundle) errors.ManifestResult {
3939
result.Add(errors.ErrInvalidParse("error getting bundle CSV version", err))
4040
return result
4141
}
42+
if result.Name, err = csv.GetRelease(); err != nil {
43+
result.Add(errors.ErrInvalidParse("error getting bundle CSV release version", err))
44+
return result
45+
}
46+
rel, _ := csv.GetRelease()
47+
if rel == "" {
48+
result.Add(errors.ErrInvalidParse("bundle CSV release version is not defined", errors.Error{}))
49+
}
4250
return result
4351
}
4452

pkg/registry/bundle.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type Bundle struct {
4242
Channels []string
4343
BundleImage string
4444
version string
45+
release string
4546
csv *ClusterServiceVersion
4647
v1beta1crds []*apiextensionsv1beta1.CustomResourceDefinition
4748
v1crds []*apiextensionsv1.CustomResourceDefinition
@@ -130,6 +131,23 @@ func (b *Bundle) Version() (string, error) {
130131
return b.version, err
131132
}
132133

134+
func (b *Bundle) Release() (string, error) {
135+
if b.release != "" {
136+
return b.release, nil
137+
}
138+
139+
var err error
140+
if err = b.cache(); err != nil {
141+
return "", err
142+
}
143+
144+
if b.csv != nil {
145+
b.release, err = b.csv.GetRelease()
146+
}
147+
148+
return b.release, err
149+
}
150+
133151
func (b *Bundle) SkipRange() (string, error) {
134152
if err := b.cache(); err != nil {
135153
return "", err

pkg/registry/csv.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ const (
5858
// expected to be semver and parseable by blang/semver/v4
5959
version = "version"
6060

61+
// The yaml attribute that specifies the release version of the ClusterServiceVersion
62+
release = "release"
63+
6164
// The yaml attribute that specifies the related images of the ClusterServiceVersion
6265
relatedImages = "relatedImages"
6366

@@ -181,6 +184,28 @@ func (csv *ClusterServiceVersion) GetVersion() (string, error) {
181184
return v, nil
182185
}
183186

187+
// GetRelease returns the release of the CSV
188+
//
189+
// If not defined, the function returns an empty string.
190+
func (csv *ClusterServiceVersion) GetRelease() (string, error) {
191+
var objmap map[string]*json.RawMessage
192+
if err := json.Unmarshal(csv.Spec, &objmap); err != nil {
193+
return "", err
194+
}
195+
196+
rawValue, ok := objmap[release]
197+
if !ok || rawValue == nil {
198+
return "", nil
199+
}
200+
201+
var r string
202+
if err := json.Unmarshal(*rawValue, &r); err != nil {
203+
return "", err
204+
}
205+
206+
return r, nil
207+
}
208+
184209
// GetSkipRange returns the skiprange of the CSV
185210
//
186211
// If not defined, the function returns an empty string.

pkg/registry/parse.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,29 @@ func (b *bundleParser) derivedProperties(bundle *Bundle) ([]Property, error) {
203203
if err != nil {
204204
return nil, err
205205
}
206+
release, err := bundle.Release()
207+
if err != nil {
208+
return nil, err
209+
}
210+
if release == "" && csv.GetSubstitutesFor() != "" {
211+
// if the bundle expresses no release version, but
212+
// includes the substitutesFor annotation, then we
213+
// interpret any build metadata in the version as
214+
// the release version.
215+
// failure to parse build metadata under these conditions is fatal,
216+
// though validation is later
217+
parts := strings.SplitN(version, "+", 2)
218+
if len(parts) == 2 {
219+
release = parts[1]
220+
} else {
221+
return nil, fmt.Errorf("bundle %q with has substitutesFor annotation but release version not expressed as build metadata: %q", bundle.Name, version)
222+
}
223+
}
206224

207225
value, err := json.Marshal(PackageProperty{
208226
PackageName: pkg,
209227
Version: version,
228+
Release: release,
210229
})
211230
if err != nil {
212231
return nil, fmt.Errorf("failed to marshal package property: %s", err)

pkg/registry/registry_to_model.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func ObjectsAndPropertiesFromBundle(b *Bundle) ([]string, []property.Property, e
2929
if err := json.Unmarshal(p.Value, &v); err != nil {
3030
return nil, nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
3131
}
32-
p := property.MustBuildPackage(v.PackageName, v.Version)
32+
p := property.MustBuildPackageRelease(v.PackageName, v.Version, v.Release)
3333
packageProvidedProperty = &p
3434
default:
3535
otherProps = append(otherProps, property.Property{
@@ -68,6 +68,11 @@ func ObjectsAndPropertiesFromBundle(b *Bundle) ([]string, []property.Property, e
6868
return nil, nil, fmt.Errorf("get version: %v", err)
6969
}
7070

71+
release, err := b.Release()
72+
if err != nil {
73+
return nil, nil, fmt.Errorf("get release: %v", err)
74+
}
75+
7176
providedApis, err := b.ProvidedAPIs()
7277
if err != nil {
7378
return nil, nil, fmt.Errorf("get provided apis: %v", err)
@@ -105,7 +110,7 @@ func ObjectsAndPropertiesFromBundle(b *Bundle) ([]string, []property.Property, e
105110
}
106111

107112
if packageProvidedProperty == nil {
108-
p := property.MustBuildPackage(b.Package, version)
113+
p := property.MustBuildPackageRelease(b.Package, version, release)
109114
packageProvidedProperty = &p
110115
}
111116
props = append(props, *packageProvidedProperty)

pkg/registry/types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,9 @@ type PackageProperty struct {
256256

257257
// The version of package in semver format
258258
Version string `json:"version" yaml:"version"`
259+
260+
// The release version of the package in semver pre-release format
261+
Release string `json:"release,omitzero" yaml:"release,omitzero"`
259262
}
260263

261264
type DeprecatedProperty struct {

0 commit comments

Comments
 (0)