Skip to content

Commit ad76da4

Browse files
committed
fix(requirements): add CRD served version requirement check
1 parent 017a8aa commit ad76da4

File tree

3 files changed

+61
-5
lines changed

3 files changed

+61
-5
lines changed

pkg/controller/operators/olm/operator_test.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ func TestTransitionCSV(t *testing.T) {
410410
{
411411
Verbs: []string{"*"},
412412
Resources: []string{"*"},
413-
NonResourceURLs: []string{"osb"},
413+
NonResourceURLs: []string{"/osb"},
414414
},
415415
},
416416
},
@@ -423,6 +423,14 @@ func TestTransitionCSV(t *testing.T) {
423423
crds: []runtime.Object{
424424
crd("c1", "v1"),
425425
},
426+
objs: []runtime.Object{
427+
&v1.ServiceAccount{
428+
ObjectMeta: metav1.ObjectMeta{
429+
Name: "sa",
430+
Namespace: namespace,
431+
},
432+
},
433+
},
426434
},
427435
expected: expected{
428436
csvStates: map[string]csvState{

pkg/controller/operators/olm/requirements.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,35 @@ func (a *Operator) requirementStatus(strategyDetailsDeployment *install.Strategy
3030
if err != nil {
3131
status.Status = v1alpha1.RequirementStatusReasonNotPresent
3232
met = false
33-
} else {
33+
statuses = append(statuses, status)
34+
continue
35+
}
36+
37+
if crd.Spec.Version == r.Version {
3438
status.Status = v1alpha1.RequirementStatusReasonPresent
3539
status.UUID = string(crd.GetUID())
40+
statuses = append(statuses, status)
41+
continue
42+
}
43+
44+
served := false
45+
for _, version := range crd.Spec.Versions {
46+
if version.Name == r.Version {
47+
if version.Served {
48+
status.Status = v1alpha1.RequirementStatusReasonPresent
49+
status.UUID = string(crd.GetUID())
50+
statuses = append(statuses, status)
51+
served = true
52+
}
53+
break
54+
}
55+
}
56+
57+
if !served {
58+
status.Status = v1alpha1.RequirementStatusReasonNotPresent
59+
met = false
60+
statuses = append(statuses, status)
3661
}
37-
statuses = append(statuses, status)
3862
}
3963

4064
// Check for required API services
@@ -215,8 +239,6 @@ func (a *Operator) requirementAndPermissionStatus(csv *v1alpha1.ClusterServiceVe
215239
return false, nil, fmt.Errorf("could not cast install strategy as type %T", strategyDetailsDeployment)
216240
}
217241

218-
// Ensure permissions are valid
219-
220242
reqMet, reqStatuses := a.requirementStatus(strategyDetailsDeployment, csv.GetAllCRDDescriptions(), csv.GetOwnedAPIServiceDescriptions(), csv.GetRequiredAPIServiceDescriptions())
221243

222244
ruleChecker := install.NewCSVRuleChecker(a.roleLister, a.roleBindingLister, a.clusterRoleLister, a.clusterRoleBindingLister, csv)

pkg/controller/operators/olm/requirements_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,32 @@ func TestRequirementAndPermissionStatus(t *testing.T) {
427427
},
428428
expectedError: nil,
429429
},
430+
{
431+
description: "RequirementNotMet/NonServedCRDVersion",
432+
csv: csv("csv1",
433+
namespace,
434+
"",
435+
installStrategy("csv1-dep", nil, nil),
436+
[]*v1beta1.CustomResourceDefinition{crd("c1", "v2")},
437+
nil,
438+
v1alpha1.CSVPhasePending,
439+
),
440+
existingObjs: nil,
441+
existingExtObjs: []runtime.Object{
442+
crd("c1", "v1"),
443+
},
444+
met: false,
445+
expectedRequirementStatuses: map[gvkn]v1alpha1.RequirementStatus{
446+
{"apiextensions.k8s.io", "v1beta1", "CustomResourceDefinition", "c1group"}: {
447+
Group: "apiextensions.k8s.io",
448+
Version: "v1beta1",
449+
Kind: "CustomResourceDefinition",
450+
Name: "c1group",
451+
Status: v1alpha1.RequirementStatusReasonNotPresent,
452+
},
453+
},
454+
expectedError: nil,
455+
},
430456
}
431457

432458
for _, test := range tests {

0 commit comments

Comments
 (0)