Skip to content

Commit 0f9f9f4

Browse files
dinhxuanvuJeff Peeler
authored andcommitted
Verify CRD's condition to ensure it's registered with k8s API
OLM needs to verify CRD's condition to make sure it is registered with k8s API during CSV control loop before installing operator. This verification will help to avoid errors related to the unavailability of an API when installing an operator via OLM. Jira: https://jira.coreos.com/browse/ALM-775 Signed-off-by: Vu Dinh <[email protected]>
1 parent 5634e2f commit 0f9f9f4

File tree

3 files changed

+93
-16
lines changed

3 files changed

+93
-16
lines changed

pkg/api/apis/operators/v1alpha1/clusterserviceversion_types.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,10 @@ const (
252252
RequirementStatusReasonPresent StatusReason = "Present"
253253
RequirementStatusReasonNotPresent StatusReason = "NotPresent"
254254
RequirementStatusReasonPresentNotSatisfied StatusReason = "PresentNotSatisfied"
255-
DependentStatusReasonSatisfied StatusReason = "Satisfied"
256-
DependentStatusReasonNotSatisfied StatusReason = "NotSatisfied"
255+
// The CRD is present but the Established condition is False (not available)
256+
RequirementStatusReasonNotAvailable StatusReason = "PresentNotAvailable"
257+
DependentStatusReasonSatisfied StatusReason = "Satisfied"
258+
DependentStatusReasonNotSatisfied StatusReason = "NotSatisfied"
257259
)
258260

259261
// DependentStatus is the status for a dependent requirement (to prevent infinite nesting)

pkg/controller/operators/olm/requirements.go

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package olm
33
import (
44
"encoding/json"
55
"fmt"
6+
67
"github.com/sirupsen/logrus"
78

89
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
910
olmErrors "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/errors"
1011
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
12+
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
1113
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1214
)
1315

@@ -37,26 +39,47 @@ func (a *Operator) requirementStatus(strategyDetailsDeployment *install.Strategy
3739

3840
if crd.Spec.Version == r.Version {
3941
status.Status = v1alpha1.RequirementStatusReasonPresent
40-
status.UUID = string(crd.GetUID())
41-
statuses = append(statuses, status)
42-
continue
42+
} else {
43+
served := false
44+
for _, version := range crd.Spec.Versions {
45+
if version.Name == r.Version {
46+
if version.Served {
47+
status.Status = v1alpha1.RequirementStatusReasonPresent
48+
served = true
49+
}
50+
break
51+
}
52+
}
53+
54+
if !served {
55+
status.Status = v1alpha1.RequirementStatusReasonNotPresent
56+
met = false
57+
statuses = append(statuses, status)
58+
continue
59+
}
4360
}
4461

45-
served := false
46-
for _, version := range crd.Spec.Versions {
47-
if version.Name == r.Version {
48-
if version.Served {
49-
status.Status = v1alpha1.RequirementStatusReasonPresent
50-
status.UUID = string(crd.GetUID())
51-
statuses = append(statuses, status)
52-
served = true
62+
// Check if CRD has successfully registered with k8s API
63+
established := false
64+
namesAccepted := false
65+
for _, cdt := range crd.Status.Conditions {
66+
switch cdt.Type {
67+
case v1beta1.Established:
68+
if cdt.Status == v1beta1.ConditionTrue {
69+
established = true
70+
}
71+
case v1beta1.NamesAccepted:
72+
if cdt.Status == v1beta1.ConditionTrue {
73+
namesAccepted = true
5374
}
54-
break
5575
}
5676
}
5777

58-
if !served {
59-
status.Status = v1alpha1.RequirementStatusReasonNotPresent
78+
if established && namesAccepted {
79+
status.UUID = string(crd.GetUID())
80+
statuses = append(statuses, status)
81+
} else {
82+
status.Status = v1alpha1.RequirementStatusReasonNotAvailable
6083
met = false
6184
statuses = append(statuses, status)
6285
}

pkg/controller/operators/olm/requirements_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,58 @@ func TestRequirementAndPermissionStatus(t *testing.T) {
453453
},
454454
expectedError: nil,
455455
},
456+
{
457+
description: "RequirementNotMet/NotEstablishedCRDVersion",
458+
csv: csv("csv1",
459+
namespace,
460+
"",
461+
installStrategy("csv1-dep", nil, nil),
462+
[]*v1beta1.CustomResourceDefinition{crd("c1", "v2")},
463+
nil,
464+
v1alpha1.CSVPhasePending,
465+
),
466+
existingObjs: nil,
467+
existingExtObjs: []runtime.Object{
468+
crd("c1", "v2"),
469+
},
470+
met: false,
471+
expectedRequirementStatuses: map[gvkn]v1alpha1.RequirementStatus{
472+
{"apiextensions.k8s.io", "v1beta1", "CustomResourceDefinition", "c1group"}: {
473+
Group: "apiextensions.k8s.io",
474+
Version: "v1beta1",
475+
Kind: "CustomResourceDefinition",
476+
Name: "c1group",
477+
Status: v1alpha1.RequirementStatusReasonNotAvailable,
478+
},
479+
},
480+
expectedError: nil,
481+
},
482+
{
483+
description: "RequirementNotMet/NamesConflictedCRDVersion",
484+
csv: csv("csv1",
485+
namespace,
486+
"",
487+
installStrategy("csv1-dep", nil, nil),
488+
[]*v1beta1.CustomResourceDefinition{crd("c1", "v2")},
489+
nil,
490+
v1alpha1.CSVPhasePending,
491+
),
492+
existingObjs: nil,
493+
existingExtObjs: []runtime.Object{
494+
crd("c1", "v2"),
495+
},
496+
met: false,
497+
expectedRequirementStatuses: map[gvkn]v1alpha1.RequirementStatus{
498+
{"apiextensions.k8s.io", "v1beta1", "CustomResourceDefinition", "c1group"}: {
499+
Group: "apiextensions.k8s.io",
500+
Version: "v1beta1",
501+
Kind: "CustomResourceDefinition",
502+
Name: "c1group",
503+
Status: v1alpha1.RequirementStatusReasonNotAvailable,
504+
},
505+
},
506+
expectedError: nil,
507+
},
456508
}
457509

458510
for _, test := range tests {

0 commit comments

Comments
 (0)