1
1
package olm
2
2
3
3
import (
4
+ "errors"
4
5
"fmt"
5
6
"strings"
6
7
"time"
@@ -65,18 +66,6 @@ func (a *Operator) checkAPIServiceResources(csv *v1alpha1.ClusterServiceVersion,
65
66
})
66
67
67
68
errs := []error {}
68
- owners := []ownerutil.Owner {csv }
69
-
70
- // Get replacing CSV if exists
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
75
- }
76
- if replacing != nil {
77
- owners = append (owners , replacing )
78
- }
79
-
80
69
ruleChecker := install .NewCSVRuleChecker (a .lister .RbacV1 ().RoleLister (), a .lister .RbacV1 ().RoleBindingLister (), a .lister .RbacV1 ().ClusterRoleLister (), a .lister .RbacV1 ().ClusterRoleBindingLister (), csv )
81
70
for _ , desc := range csv .GetOwnedAPIServiceDescriptions () {
82
71
apiServiceName := desc .GetName ()
@@ -92,8 +81,15 @@ func (a *Operator) checkAPIServiceResources(csv *v1alpha1.ClusterServiceVersion,
92
81
}
93
82
94
83
// Check if the APIService is adoptable
95
- if ! ownerutil .AdoptableLabels (apiService .GetLabels (), true , owners ... ) {
96
- logger .WithFields (log.Fields {"obj" : "apiService" , "labels" : apiService .GetLabels ()}).Debug ("adoption failed" )
84
+ adoptable , err := a .isAPIServiceAdoptable (csv , apiService )
85
+ if err != nil {
86
+ logger .WithFields (log.Fields {"obj" : "apiService" , "labels" : apiService .GetLabels ()}).Errorf ("adoption check failed - %v" , err )
87
+ errs = append (errs , err )
88
+ return utilerrors .NewAggregate (errs )
89
+ }
90
+
91
+ if ! adoptable {
92
+ logger .WithFields (log.Fields {"obj" : "apiService" , "labels" : apiService .GetLabels ()}).Errorf ("adoption failed" )
97
93
err := olmerrors .NewUnadoptableError ("" , apiServiceName )
98
94
logger .WithError (err ).Warn ("found unadoptable apiservice" )
99
95
errs = append (errs , err )
@@ -707,17 +703,12 @@ func (a *Operator) installAPIServiceRequirements(desc v1alpha1.APIServiceDescrip
707
703
}
708
704
apiService .SetName (apiServiceName )
709
705
} else {
710
- owners := []ownerutil.Owner {csv }
711
-
712
- // Get replacing CSV
713
- replaces , err := a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (csv .GetNamespace ()).Get (csv .Spec .Replaces )
714
- if err == nil {
715
- owners = append (owners , replaces )
706
+ adoptable , err := a .isAPIServiceAdoptable (csv , apiService )
707
+ if err != nil {
708
+ logger .WithFields (log.Fields {"obj" : "apiService" , "labels" : apiService .GetLabels ()}).Errorf ("adoption check failed - %v" , err )
716
709
}
717
710
718
- // check if the APIService is adoptable
719
- if ! ownerutil .AdoptableLabels (apiService .GetLabels (), true , owners ... ) {
720
- logger .WithFields (log.Fields {"obj" : "apiService" , "labels" : apiService .GetLabels ()}).Debug ("adoption failed" )
711
+ if ! adoptable {
721
712
return nil , fmt .Errorf ("pre-existing APIService %s is not adoptable" , apiServiceName )
722
713
}
723
714
}
@@ -759,3 +750,54 @@ func APIServiceNameToServiceName(apiServiceName string) string {
759
750
// Replace all '.'s with "-"s to convert to a DNS-1035 label
760
751
return strings .Replace (apiServiceName , "." , "-" , - 1 )
761
752
}
753
+
754
+ func (a * Operator ) isAPIServiceAdoptable (target * v1alpha1.ClusterServiceVersion , apiService * apiregistrationv1.APIService ) (adoptable bool , err error ) {
755
+ if apiService == nil || target == nil {
756
+ err = errors .New ("invalid input" )
757
+ return
758
+ }
759
+
760
+ labels := apiService .GetLabels ()
761
+ ownerKind := labels [ownerutil .OwnerKind ]
762
+ ownerName := labels [ownerutil .OwnerKey ]
763
+ ownerNamespace := labels [ownerutil .OwnerNamespaceKey ]
764
+
765
+ if ownerKind == "" || ownerNamespace == "" || ownerName == "" {
766
+ return
767
+ }
768
+
769
+ if err := ownerutil .InferGroupVersionKind (target ); err != nil {
770
+ a .logger .Warn (err .Error ())
771
+ }
772
+
773
+ targetKind := target .GetObjectKind ().GroupVersionKind ().Kind
774
+ if ownerKind != targetKind {
775
+ return
776
+ }
777
+
778
+ // Get the CSV that target replaces
779
+ replacing , replaceGetErr := a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (target .GetNamespace ()).Get (target .Spec .Replaces )
780
+ if replaceGetErr != nil && ! k8serrors .IsNotFound (replaceGetErr ) && ! k8serrors .IsGone (replaceGetErr ) {
781
+ err = replaceGetErr
782
+ return
783
+ }
784
+
785
+ // Get the current owner CSV of the APIService
786
+ currentOwnerCSV , ownerGetErr := a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (ownerNamespace ).Get (ownerName )
787
+ if ownerGetErr != nil && ! k8serrors .IsNotFound (ownerGetErr ) && ! k8serrors .IsGone (ownerGetErr ) {
788
+ err = ownerGetErr
789
+ return
790
+ }
791
+
792
+ owners := []ownerutil.Owner {target }
793
+ if replacing != nil {
794
+ owners = append (owners , replacing )
795
+ }
796
+ if currentOwnerCSV != nil && (
797
+ currentOwnerCSV .Status .Phase == v1alpha1 .CSVPhaseReplacing || currentOwnerCSV .Status .Phase == v1alpha1 .CSVPhaseDeleting ) {
798
+ owners = append (owners , currentOwnerCSV )
799
+ }
800
+
801
+ adoptable = ownerutil .AdoptableLabels (apiService .GetLabels (), true , owners ... )
802
+ return
803
+ }
0 commit comments