@@ -6,14 +6,14 @@ import (
6
6
7
7
"github.com/pkg/errors"
8
8
"github.com/sirupsen/logrus"
9
-
10
9
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
11
10
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
12
11
apiextensionsv1client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
13
12
apiextensionsv1beta1client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
14
13
k8serrors "k8s.io/apimachinery/pkg/api/errors"
15
14
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16
15
"k8s.io/client-go/dynamic"
16
+ "k8s.io/client-go/util/retry"
17
17
18
18
"github.com/operator-framework/api/pkg/operators/v1alpha1"
19
19
listersv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1"
@@ -132,27 +132,33 @@ func (b *builder) NewCRDV1Step(client apiextensionsv1client.ApiextensionsV1Inter
132
132
133
133
_ , createError := client .CustomResourceDefinitions ().Create (context .TODO (), crd , metav1.CreateOptions {})
134
134
if k8serrors .IsAlreadyExists (createError ) {
135
- currentCRD , _ := client .CustomResourceDefinitions ().Get (context .TODO (), crd .GetName (), metav1.GetOptions {})
136
- crd .SetResourceVersion (currentCRD .GetResourceVersion ())
137
- if err = validateV1CRDCompatibility (b .dynamicClient , currentCRD , crd ); err != nil {
138
- return v1alpha1 .StepStatusUnknown , errors .Wrapf (err , "error validating existing CRs against new CRD's schema: %s" , step .Resource .Name )
139
- }
135
+ err := retry .RetryOnConflict (retry .DefaultRetry , func () error {
136
+ currentCRD , _ := client .CustomResourceDefinitions ().Get (context .TODO (), crd .GetName (), metav1.GetOptions {})
137
+ crd .SetResourceVersion (currentCRD .GetResourceVersion ())
138
+ if err = validateV1CRDCompatibility (b .dynamicClient , currentCRD , crd ); err != nil {
139
+ return fmt .Errorf ("error validating existing CRs against new CRD's schema for %q: %w" , step .Resource .Name , err )
140
+ }
140
141
141
- // check to see if stored versions changed and whether the upgrade could cause potential data loss
142
- safe , err := crdlib .SafeStorageVersionUpgrade (currentCRD , crd )
143
- if ! safe {
144
- b .logger .Errorf ("risk of data loss updating %s : %s" , step .Resource .Name , err )
145
- return v1alpha1 . StepStatusUnknown , errors . Wrapf ( err , "risk of data loss updating %s " , step .Resource .Name )
146
- }
147
- if err != nil {
148
- return v1alpha1 . StepStatusUnknown , errors . Wrapf ( err , "checking CRD for potential data loss updating %s " , step .Resource .Name )
149
- }
142
+ // check to see if stored versions changed and whether the upgrade could cause potential data loss
143
+ safe , err := crdlib .SafeStorageVersionUpgrade (currentCRD , crd )
144
+ if ! safe {
145
+ b .logger .Errorf ("risk of data loss updating %q : %s" , step .Resource .Name , err )
146
+ return fmt . Errorf ( "risk of data loss updating %q: %w " , step .Resource .Name , err )
147
+ }
148
+ if err != nil {
149
+ return fmt . Errorf ( "checking CRD for potential data loss updating %q: %w " , step .Resource .Name , err )
150
+ }
150
151
151
- // Update CRD to new version
152
- setInstalledAlongsideAnnotation (b .annotator , crd , b .plan .GetNamespace (), step .Resolving , b .csvLister , crd , currentCRD )
153
- _ , err = client .CustomResourceDefinitions ().Update (context .TODO (), crd , metav1.UpdateOptions {})
152
+ // Update CRD to new version
153
+ setInstalledAlongsideAnnotation (b .annotator , crd , b .plan .GetNamespace (), step .Resolving , b .csvLister , crd , currentCRD )
154
+ _ , err = client .CustomResourceDefinitions ().Update (context .TODO (), crd , metav1.UpdateOptions {})
155
+ if err != nil {
156
+ return fmt .Errorf ("error updating CRD %q: %w" , step .Resource .Name , err )
157
+ }
158
+ return nil
159
+ })
154
160
if err != nil {
155
- return v1alpha1 .StepStatusUnknown , errors . Wrapf ( err , "error updating CRD: %s" , step . Resource . Name )
161
+ return v1alpha1 .StepStatusUnknown , err
156
162
}
157
163
// If it already existed, mark the step as Present.
158
164
// they were equal - mark CRD as present
@@ -181,7 +187,7 @@ func (b *builder) NewCRDV1Beta1Step(client apiextensionsv1beta1client.Apiextensi
181
187
if k8serrors .IsNotFound (err ) {
182
188
return v1alpha1 .StepStatusNotPresent , nil
183
189
} else {
184
- return v1alpha1 .StepStatusNotPresent , errors . Wrapf ( err , "error finding the %s CRD" , crd .Name )
190
+ return v1alpha1 .StepStatusNotPresent , fmt . Errorf ( "error finding the %q CRD: %w " , crd .Name , err )
185
191
}
186
192
}
187
193
established , namesAccepted := false , false
@@ -210,28 +216,34 @@ func (b *builder) NewCRDV1Beta1Step(client apiextensionsv1beta1client.Apiextensi
210
216
211
217
_ , createError := client .CustomResourceDefinitions ().Create (context .TODO (), crd , metav1.CreateOptions {})
212
218
if k8serrors .IsAlreadyExists (createError ) {
213
- currentCRD , _ := client .CustomResourceDefinitions ().Get (context .TODO (), crd .GetName (), metav1.GetOptions {})
214
- crd .SetResourceVersion (currentCRD .GetResourceVersion ())
219
+ err := retry .RetryOnConflict (retry .DefaultRetry , func () error {
220
+ currentCRD , _ := client .CustomResourceDefinitions ().Get (context .TODO (), crd .GetName (), metav1.GetOptions {})
221
+ crd .SetResourceVersion (currentCRD .GetResourceVersion ())
215
222
216
- if err = validateV1Beta1CRDCompatibility (b .dynamicClient , currentCRD , crd ); err != nil {
217
- return v1alpha1 . StepStatusUnknown , errors . Wrapf ( err , "error validating existing CRs against new CRD's schema: %s " , step .Resource .Name )
218
- }
223
+ if err = validateV1Beta1CRDCompatibility (b .dynamicClient , currentCRD , crd ); err != nil {
224
+ return fmt . Errorf ( "error validating existing CRs against new CRD's schema for %q : %w " , step .Resource .Name , err )
225
+ }
219
226
220
- // check to see if stored versions changed and whether the upgrade could cause potential data loss
221
- safe , err := crdlib .SafeStorageVersionUpgrade (currentCRD , crd )
222
- if ! safe {
223
- b .logger .Errorf ("risk of data loss updating %s : %s" , step .Resource .Name , err )
224
- return v1alpha1 . StepStatusUnknown , errors . Wrapf ( err , "risk of data loss updating %s " , step .Resource .Name )
225
- }
226
- if err != nil {
227
- return v1alpha1 . StepStatusUnknown , errors . Wrapf ( err , "checking CRD for potential data loss updating %s " , step .Resource .Name )
228
- }
227
+ // check to see if stored versions changed and whether the upgrade could cause potential data loss
228
+ safe , err := crdlib .SafeStorageVersionUpgrade (currentCRD , crd )
229
+ if ! safe {
230
+ b .logger .Errorf ("risk of data loss updating %q : %s" , step .Resource .Name , err )
231
+ return fmt . Errorf ( "risk of data loss updating %q: %w " , step .Resource .Name , err )
232
+ }
233
+ if err != nil {
234
+ return fmt . Errorf ( "checking CRD for potential data loss updating %q: %w " , step .Resource .Name , err )
235
+ }
229
236
230
- // Update CRD to new version
231
- setInstalledAlongsideAnnotation (b .annotator , crd , b .plan .GetNamespace (), step .Resolving , b .csvLister , crd , currentCRD )
232
- _ , err = client .CustomResourceDefinitions ().Update (context .TODO (), crd , metav1.UpdateOptions {})
237
+ // Update CRD to new version
238
+ setInstalledAlongsideAnnotation (b .annotator , crd , b .plan .GetNamespace (), step .Resolving , b .csvLister , crd , currentCRD )
239
+ _ , err = client .CustomResourceDefinitions ().Update (context .TODO (), crd , metav1.UpdateOptions {})
240
+ if err != nil {
241
+ return fmt .Errorf ("error updating CRD %q: %w" , step .Resource .Name , err )
242
+ }
243
+ return nil
244
+ })
233
245
if err != nil {
234
- return v1alpha1 .StepStatusUnknown , errors . Wrapf ( err , "error updating CRD: %s" , step . Resource . Name )
246
+ return v1alpha1 .StepStatusUnknown , err
235
247
}
236
248
// If it already existed, mark the step as Present.
237
249
// they were equal - mark CRD as present
0 commit comments