@@ -11,6 +11,7 @@ import (
11
11
rbacv1 "k8s.io/api/rbac/v1"
12
12
k8serrors "k8s.io/apimachinery/pkg/api/errors"
13
13
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14
+ utilerrors "k8s.io/apimachinery/pkg/util/errors"
14
15
"k8s.io/apimachinery/pkg/util/intstr"
15
16
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
16
17
@@ -41,42 +42,45 @@ func (a *Operator) shouldRotateCerts(csv *v1alpha1.ClusterServiceVersion) bool {
41
42
return false
42
43
}
43
44
44
- // apiServiceResourceErrorsActionable returns true if OLM can do something about any one
45
+ // apiServiceResourceErrorActionable returns true if OLM can do something about any one
45
46
// of the apiService errors in errs; otherwise returns false
46
47
//
47
48
// This method can be used to determine if a CSV in a failed state due to APIService
48
49
// issues can resolve them by reinstalling
49
- func (a * Operator ) apiServiceResourceErrorsActionable (errs []error ) bool {
50
- for _ , err := range errs {
51
- switch err .(type ) {
52
- case olmerrors.UnadoptableError :
53
- return false
54
- }
55
- }
50
+ func (a * Operator ) apiServiceResourceErrorActionable (err error ) bool {
51
+ filtered := utilerrors .FilterOut (err , func (e error ) bool {
52
+ _ , unadoptable := e .(olmerrors.UnadoptableError )
53
+ return ! unadoptable
54
+ })
55
+ actionable := filtered == nil
56
56
57
- return true
57
+ return actionable
58
58
}
59
59
60
60
// checkAPIServiceResources checks if all expected generated resources for the given APIService exist
61
- func (a * Operator ) checkAPIServiceResources (csv * v1alpha1.ClusterServiceVersion , hashFunc certs.PEMHash ) []error {
61
+ func (a * Operator ) checkAPIServiceResources (csv * v1alpha1.ClusterServiceVersion , hashFunc certs.PEMHash ) error {
62
+ logger := log .WithFields (log.Fields {
63
+ "csv" : csv .GetName (),
64
+ "namespace" : csv .GetNamespace (),
65
+ })
66
+
62
67
errs := []error {}
63
68
owners := []ownerutil.Owner {csv }
69
+
64
70
// Get replacing CSV if exists
65
- replacement , err := a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (csv .GetNamespace ()).Get (csv .Spec .Replaces )
66
- if err != nil && k8serrors .IsNotFound (err ) == false {
67
- a .Log .Debugf ("Replacement error regarding CSV (%v): %v" , csv .GetName (), err )
68
- errs = append (errs , err )
69
- return errs
71
+ replacing , err := a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (csv .GetNamespace ()).Get (csv .Spec .Replaces )
72
+ if err != nil && ! k8serrors .IsNotFound (err ) {
73
+ logger .WithError (err ).Warn ("could not get replacement csv" )
74
+ return err
70
75
}
71
- if replacement != nil {
72
- owners = append (owners , replacement )
76
+ if replacing != nil {
77
+ owners = append (owners , replacing )
73
78
}
79
+
74
80
ruleChecker := install .NewCSVRuleChecker (a .lister .RbacV1 ().RoleLister (), a .lister .RbacV1 ().RoleBindingLister (), a .lister .RbacV1 ().ClusterRoleLister (), a .lister .RbacV1 ().ClusterRoleBindingLister (), csv )
75
81
for _ , desc := range csv .GetOwnedAPIServiceDescriptions () {
76
- apiServiceName := fmt .Sprintf ("%s.%s" , desc .Version , desc .Group )
77
- logger := log .WithFields (log.Fields {
78
- "csv" : csv .GetName (),
79
- "namespace" : csv .GetNamespace (),
82
+ apiServiceName := desc .GetName ()
83
+ logger := logger .WithFields (log.Fields {
80
84
"apiservice" : apiServiceName ,
81
85
})
82
86
@@ -88,11 +92,11 @@ func (a *Operator) checkAPIServiceResources(csv *v1alpha1.ClusterServiceVersion,
88
92
}
89
93
90
94
// Check if the APIService is adoptable
91
- if ! ownerutil .OwnersIntersect ( owners , apiService ) {
95
+ if ! ownerutil .AdoptableLabels ( apiService . GetLabels (), true , owners ... ) {
92
96
err := olmerrors .NewUnadoptableError ("" , apiServiceName )
93
97
logger .WithError (err ).Warn ("found unadoptable apiservice" )
94
98
errs = append (errs , err )
95
- return errs
99
+ return utilerrors . NewAggregate ( errs )
96
100
}
97
101
98
102
serviceName := APIServiceNameToServiceName (apiServiceName )
@@ -239,7 +243,7 @@ func (a *Operator) checkAPIServiceResources(csv *v1alpha1.ClusterServiceVersion,
239
243
}
240
244
}
241
245
242
- return errs
246
+ return utilerrors . NewAggregate ( errs )
243
247
}
244
248
245
249
func (a * Operator ) isAPIServiceAvailable (apiService * apiregistrationv1.APIService ) bool {
@@ -251,10 +255,9 @@ func (a *Operator) isAPIServiceAvailable(apiService *apiregistrationv1.APIServic
251
255
return false
252
256
}
253
257
254
- func (a * Operator ) areAPIServicesAvailable (descs []v1alpha1.APIServiceDescription ) (bool , error ) {
255
- for _ , desc := range descs {
256
- apiServiceName := fmt .Sprintf ("%s.%s" , desc .Version , desc .Group )
257
- apiService , err := a .lister .APIRegistrationV1 ().APIServiceLister ().Get (apiServiceName )
258
+ func (a * Operator ) areAPIServicesAvailable (csv * v1alpha1.ClusterServiceVersion ) (bool , error ) {
259
+ for _ , desc := range csv .Spec .APIServiceDefinitions .Owned {
260
+ apiService , err := a .lister .APIRegistrationV1 ().APIServiceLister ().Get (desc .GetName ())
258
261
if k8serrors .IsNotFound (err ) {
259
262
return false , nil
260
263
}
@@ -550,7 +553,7 @@ func (a *Operator) installAPIServiceRequirements(desc v1alpha1.APIServiceDescrip
550
553
existingAuthDelegatorClusterRoleBinding , err := a .lister .RbacV1 ().ClusterRoleBindingLister ().Get (authDelegatorClusterRoleBinding .GetName ())
551
554
if err == nil {
552
555
// Check if the only owners are this CSV or in this CSV's replacement chain.
553
- if ownerutil .AdoptableLabels (csv , existingAuthDelegatorClusterRoleBinding .GetLabels ()) {
556
+ if ownerutil .AdoptableLabels (existingAuthDelegatorClusterRoleBinding .GetLabels (), true , csv ) {
554
557
ownerutil .AddOwnerLabels (authDelegatorClusterRoleBinding , csv )
555
558
}
556
559
@@ -593,7 +596,7 @@ func (a *Operator) installAPIServiceRequirements(desc v1alpha1.APIServiceDescrip
593
596
existingAuthReaderRoleBinding , err := a .lister .RbacV1 ().RoleBindingLister ().RoleBindings ("kube-system" ).Get (authReaderRoleBinding .GetName ())
594
597
if err == nil {
595
598
// Check if the only owners are this CSV or in this CSV's replacement chain.
596
- if ownerutil .AdoptableLabels (csv , existingAuthReaderRoleBinding .GetLabels ()) {
599
+ if ownerutil .AdoptableLabels (existingAuthReaderRoleBinding .GetLabels (), true , csv ) {
597
600
ownerutil .AddOwnerLabels (authReaderRoleBinding , csv )
598
601
}
599
602
// Attempt an update.
@@ -694,13 +697,15 @@ func (a *Operator) installAPIServiceRequirements(desc v1alpha1.APIServiceDescrip
694
697
apiService .SetName (apiServiceName )
695
698
} else {
696
699
owners := []ownerutil.Owner {csv }
700
+
697
701
// Get replacing CSV
698
702
replaces , err := a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (csv .GetNamespace ()).Get (csv .Spec .Replaces )
699
703
if err == nil {
700
704
owners = append (owners , replaces )
701
705
}
706
+
702
707
// check if the APIService is adoptable
703
- if ! ownerutil .OwnersIntersect ( owners , apiService ) {
708
+ if ! ownerutil .AdoptableLabels ( apiService . GetLabels (), true , owners ... ) {
704
709
return nil , fmt .Errorf ("pre-existing APIService %s is not adoptable" , apiServiceName )
705
710
}
706
711
}
0 commit comments