Skip to content

Commit dd88607

Browse files
committed
feat(resolver): treat the registry as the source of truth for
replaces fields this lets the registry tell olm which operators replace which others
1 parent 2e028b2 commit dd88607

File tree

10 files changed

+257
-109
lines changed

10 files changed

+257
-109
lines changed

pkg/controller/operators/olm/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1379,7 +1379,7 @@ func (a *Operator) isReplacing(in *v1alpha1.ClusterServiceVersion) *v1alpha1.Clu
13791379
}
13801380

13811381
// using the client instead of a lister; missing an object because of a cache sync can cause upgrades to fail
1382-
previous, err := a.lister.OperatorsV1alpha1().ClusterServiceVersionLister().ClusterServiceVersions(in.GetNamespace()).Get(in.Spec.Replaces)
1382+
previous, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(in.GetNamespace()).Get(in.Spec.Replaces, metav1.GetOptions{})
13831383
if err != nil {
13841384
a.Log.WithField("replacing", in.Spec.Replaces).WithError(err).Debugf("unable to get previous csv")
13851385
return nil

pkg/controller/registry/resolver/evolver.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,12 @@ func (e *NamespaceGenerationEvolver) checkForUpdates() error {
6262
continue
6363
}
6464

65-
o, err := NewOperatorFromBundle(bundle, op.SourceInfo().StartingCSV, *key)
65+
o, err := NewOperatorFromBundle(bundle, op.Identifier(), op.SourceInfo().StartingCSV, *key)
6666
if err != nil {
6767
return errors.Wrap(err, "error parsing bundle")
6868
}
6969
if err := e.gen.AddOperator(o); err != nil {
70-
if err != nil {
71-
return errors.Wrap(err, "error calculating generation changes due to new bundle")
72-
}
70+
return errors.Wrap(err, "error calculating generation changes due to new bundle")
7371
}
7472
e.gen.RemoveOperator(op)
7573
}
@@ -91,7 +89,7 @@ func (e *NamespaceGenerationEvolver) addNewOperators(add map[OperatorSourceInfo]
9189
return errors.Wrapf(err, "%s not found", s)
9290
}
9391

94-
o, err := NewOperatorFromBundle(bundle, s.StartingCSV, *key)
92+
o, err := NewOperatorFromBundle(bundle, "", s.StartingCSV, *key)
9593
if err != nil {
9694
return errors.Wrap(err, "error parsing bundle")
9795
}
@@ -117,7 +115,7 @@ func (e *NamespaceGenerationEvolver) queryForRequiredAPIs() error {
117115
// attempt to find a bundle that provides that api
118116
if bundle, key, err := e.querier.FindProvider(*api); err == nil {
119117
// add a bundle that provides the api to the generation
120-
o, err := NewOperatorFromBundle(bundle, "", *key)
118+
o, err := NewOperatorFromBundle(bundle, "", "", *key)
121119
if err != nil {
122120
return errors.Wrap(err, "error parsing bundle")
123121
}

pkg/controller/registry/resolver/evolver_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,22 @@ func TestNamespaceGenerationEvolver(t *testing.T) {
394394
NewFakeOperatorSurface("updated", "o", "c", "original", "catsrc", "", nil, nil, nil, nil),
395395
),
396396
},
397+
{
398+
// an existing operator has an update available and skips previous versions via channel head annotations
399+
name: "UpdateRequired/SkipVersions",
400+
fields: fields{
401+
querier: NewFakeSourceQuerierCustomReplacement(CatalogKey{"catsrc", "catsrc-namespace"}, bundle("updated.v3", "o", "c", "updated.v2", nil, nil, nil, nil)),
402+
gen: NewGenerationFromOperators(
403+
NewFakeOperatorSurface("original", "o", "c", "", "catsrc", "", nil, nil, nil, nil),
404+
),
405+
},
406+
args: args{},
407+
wantGen: NewGenerationFromOperators(
408+
// the csv in the bundle still has the original replaces field, but the surface has the value overridden
409+
withReplaces(NewFakeOperatorSurface("updated.v3", "o", "c", "updated.v2", "catsrc", "", nil, nil, nil, nil),
410+
"original"),
411+
),
412+
},
397413
}
398414
for _, tt := range tests {
399415
t.Run(tt.name, func(t *testing.T) {

pkg/controller/registry/resolver/operators.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ type Operator struct {
234234

235235
var _ OperatorSurface = &Operator{}
236236

237-
func NewOperatorFromBundle(bundle *opregistry.Bundle, startingCSV string, sourceKey CatalogKey) (*Operator, error) {
237+
func NewOperatorFromBundle(bundle *opregistry.Bundle, replaces string, startingCSV string, sourceKey CatalogKey) (*Operator, error) {
238238
csv, err := bundle.ClusterServiceVersion()
239239
if err != nil {
240240
return nil, err
@@ -247,9 +247,13 @@ func NewOperatorFromBundle(bundle *opregistry.Bundle, startingCSV string, source
247247
if err != nil {
248248
return nil, err
249249
}
250+
r := replaces
251+
if r == "" {
252+
r = csv.Spec.Replaces
253+
}
250254
return &Operator{
251255
name: csv.GetName(),
252-
replaces: csv.Spec.Replaces,
256+
replaces: r,
253257
version: &csv.Spec.Version.Version,
254258
providedAPIs: providedAPIs,
255259
requiredAPIs: requiredAPIs,

pkg/controller/registry/resolver/operators_test.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,7 @@ func TestNewOperatorFromBundle(t *testing.T) {
898898
Namespace: "testNamespace",
899899
},
900900
Spec: v1alpha1.ClusterServiceVersionSpec{
901+
Replaces: "v1",
901902
CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{
902903
Owned: []v1alpha1.CRDDescription{},
903904
Required: []v1alpha1.CRDDescription{},
@@ -982,6 +983,7 @@ func TestNewOperatorFromBundle(t *testing.T) {
982983
type args struct {
983984
bundle *opregistry.Bundle
984985
sourceKey CatalogKey
986+
replaces string
985987
}
986988
tests := []struct {
987989
name string
@@ -994,10 +996,12 @@ func TestNewOperatorFromBundle(t *testing.T) {
994996
args: args{
995997
bundle: bundleNoAPIs,
996998
sourceKey: CatalogKey{Name: "source", Namespace: "testNamespace"},
999+
replaces: "",
9971000
},
9981001
want: &Operator{
9991002
name: "testCSV",
10001003
version: &version.Version,
1004+
replaces: "v1",
10011005
providedAPIs: EmptyAPISet(),
10021006
requiredAPIs: EmptyAPISet(),
10031007
bundle: bundleNoAPIs,
@@ -1013,10 +1017,12 @@ func TestNewOperatorFromBundle(t *testing.T) {
10131017
args: args{
10141018
bundle: bundleWithAPIs,
10151019
sourceKey: CatalogKey{Name: "source", Namespace: "testNamespace"},
1020+
replaces: "",
10161021
},
10171022
want: &Operator{
1018-
name: "testCSV",
1019-
version: &version.Version,
1023+
name: "testCSV",
1024+
version: &version.Version,
1025+
replaces: "v1",
10201026
providedAPIs: APISet{
10211027
opregistry.APIKey{
10221028
Group: "crd.group.com",
@@ -1053,10 +1059,31 @@ func TestNewOperatorFromBundle(t *testing.T) {
10531059
},
10541060
},
10551061
},
1062+
{
1063+
name: "BundleReplaceOverrides",
1064+
args: args{
1065+
bundle: bundleNoAPIs,
1066+
sourceKey: CatalogKey{Name: "source", Namespace: "testNamespace"},
1067+
replaces: "replaced",
1068+
},
1069+
want: &Operator{
1070+
name: "testCSV",
1071+
providedAPIs: EmptyAPISet(),
1072+
requiredAPIs: EmptyAPISet(),
1073+
bundle: bundleNoAPIs,
1074+
replaces: "replaced",
1075+
version: &version.Version,
1076+
sourceInfo: &OperatorSourceInfo{
1077+
Package: "testPackage",
1078+
Channel: "testChannel",
1079+
Catalog: CatalogKey{"source", "testNamespace"},
1080+
},
1081+
},
1082+
},
10561083
}
10571084
for _, tt := range tests {
10581085
t.Run(tt.name, func(t *testing.T) {
1059-
got, err := NewOperatorFromBundle(tt.args.bundle, "", tt.args.sourceKey)
1086+
got, err := NewOperatorFromBundle(tt.args.bundle, tt.args.replaces, "", tt.args.sourceKey)
10601087
require.Equal(t, tt.wantErr, err)
10611088
require.Equal(t, tt.want, got)
10621089
})

pkg/controller/registry/resolver/resolver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func (r *OperatorsV1alpha1Resolver) ResolveSteps(namespace string, sourceQuerier
9191

9292
// add steps for any new bundle
9393
if op.Bundle() != nil {
94-
bundleSteps, err := NewStepResourceFromBundle(op.Bundle(), namespace, op.SourceInfo().Catalog.Name, op.SourceInfo().Catalog.Namespace)
94+
bundleSteps, err := NewStepResourceFromBundle(op.Bundle(), namespace, op.Replaces(), op.SourceInfo().Catalog.Name, op.SourceInfo().Catalog.Namespace)
9595
if err != nil {
9696
return nil, nil, fmt.Errorf("failed to turn bundle into steps")
9797
}

0 commit comments

Comments
 (0)