@@ -11,6 +11,7 @@ import (
1111 rbacv1 "k8s.io/api/rbac/v1"
1212 k8serrors "k8s.io/apimachinery/pkg/api/errors"
1313 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+ utilerrors "k8s.io/apimachinery/pkg/util/errors"
1415 "k8s.io/apimachinery/pkg/util/intstr"
1516 apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
1617
@@ -41,42 +42,45 @@ func (a *Operator) shouldRotateCerts(csv *v1alpha1.ClusterServiceVersion) bool {
4142 return false
4243}
4344
44- // apiServiceResourceErrorsActionable returns true if OLM can do something about any one
45+ // apiServiceResourceErrorActionable returns true if OLM can do something about any one
4546// of the apiService errors in errs; otherwise returns false
4647//
4748// This method can be used to determine if a CSV in a failed state due to APIService
4849// 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
5656
57- return true
57+ return actionable
5858}
5959
6060// 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+
6267 errs := []error {}
6368 owners := []ownerutil.Owner {csv }
69+
6470 // 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
7075 }
71- if replacement != nil {
72- owners = append (owners , replacement )
76+ if replacing != nil {
77+ owners = append (owners , replacing )
7378 }
79+
7480 ruleChecker := install .NewCSVRuleChecker (a .lister .RbacV1 ().RoleLister (), a .lister .RbacV1 ().RoleBindingLister (), a .lister .RbacV1 ().ClusterRoleLister (), a .lister .RbacV1 ().ClusterRoleBindingLister (), csv )
7581 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 {
8084 "apiservice" : apiServiceName ,
8185 })
8286
@@ -88,11 +92,11 @@ func (a *Operator) checkAPIServiceResources(csv *v1alpha1.ClusterServiceVersion,
8892 }
8993
9094 // Check if the APIService is adoptable
91- if ! ownerutil .OwnersIntersect ( owners , apiService ) {
95+ if ! ownerutil .AdoptableLabels ( apiService . GetLabels (), true , owners ... ) {
9296 err := olmerrors .NewUnadoptableError ("" , apiServiceName )
9397 logger .WithError (err ).Warn ("found unadoptable apiservice" )
9498 errs = append (errs , err )
95- return errs
99+ return utilerrors . NewAggregate ( errs )
96100 }
97101
98102 serviceName := APIServiceNameToServiceName (apiServiceName )
@@ -239,7 +243,7 @@ func (a *Operator) checkAPIServiceResources(csv *v1alpha1.ClusterServiceVersion,
239243 }
240244 }
241245
242- return errs
246+ return utilerrors . NewAggregate ( errs )
243247}
244248
245249func (a * Operator ) isAPIServiceAvailable (apiService * apiregistrationv1.APIService ) bool {
@@ -251,10 +255,9 @@ func (a *Operator) isAPIServiceAvailable(apiService *apiregistrationv1.APIServic
251255 return false
252256}
253257
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 ())
258261 if k8serrors .IsNotFound (err ) {
259262 return false , nil
260263 }
@@ -550,7 +553,7 @@ func (a *Operator) installAPIServiceRequirements(desc v1alpha1.APIServiceDescrip
550553 existingAuthDelegatorClusterRoleBinding , err := a .lister .RbacV1 ().ClusterRoleBindingLister ().Get (authDelegatorClusterRoleBinding .GetName ())
551554 if err == nil {
552555 // 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 ) {
554557 ownerutil .AddOwnerLabels (authDelegatorClusterRoleBinding , csv )
555558 }
556559
@@ -593,7 +596,7 @@ func (a *Operator) installAPIServiceRequirements(desc v1alpha1.APIServiceDescrip
593596 existingAuthReaderRoleBinding , err := a .lister .RbacV1 ().RoleBindingLister ().RoleBindings ("kube-system" ).Get (authReaderRoleBinding .GetName ())
594597 if err == nil {
595598 // 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 ) {
597600 ownerutil .AddOwnerLabels (authReaderRoleBinding , csv )
598601 }
599602 // Attempt an update.
@@ -694,13 +697,15 @@ func (a *Operator) installAPIServiceRequirements(desc v1alpha1.APIServiceDescrip
694697 apiService .SetName (apiServiceName )
695698 } else {
696699 owners := []ownerutil.Owner {csv }
700+
697701 // Get replacing CSV
698702 replaces , err := a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (csv .GetNamespace ()).Get (csv .Spec .Replaces )
699703 if err == nil {
700704 owners = append (owners , replaces )
701705 }
706+
702707 // check if the APIService is adoptable
703- if ! ownerutil .OwnersIntersect ( owners , apiService ) {
708+ if ! ownerutil .AdoptableLabels ( apiService . GetLabels (), true , owners ... ) {
704709 return nil , fmt .Errorf ("pre-existing APIService %s is not adoptable" , apiServiceName )
705710 }
706711 }
0 commit comments