@@ -23,6 +23,7 @@ import (
23
23
semver "github.com/Masterminds/semver/v3"
24
24
"github.com/go-logr/logr"
25
25
"k8s.io/client-go/tools/record"
26
+ "k8s.io/client-go/util/retry"
26
27
"sigs.k8s.io/controller-runtime/pkg/client"
27
28
28
29
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
@@ -67,23 +68,36 @@ func (u VersionUpgrade) ManagedInstances(ctx context.Context) error {
67
68
u .Recorder .Event (& original , "Error" , "Upgrade" , msg )
68
69
continue
69
70
}
70
-
71
71
if ! reflect .DeepEqual (upgraded , list .Items [i ]) {
72
72
// the resource update overrides the status, so, keep it so that we can reset it later
73
73
st := upgraded .Status
74
- patch := client .MergeFrom (& original )
75
- if err := u .Client .Patch (ctx , & upgraded , patch ); err != nil {
74
+ err := retry .RetryOnConflict (retry .DefaultRetry , func () error {
75
+ col := v1beta1.OpenTelemetryCollector {}
76
+ err = u .Client .Get (ctx , client .ObjectKeyFromObject (& original ), & col )
77
+ if err != nil {
78
+ return err
79
+ }
80
+ var upgradedErr error
81
+ upgraded , upgradedErr = u .ManagedInstance (ctx , col )
82
+ if upgradedErr != nil {
83
+ return upgradedErr
84
+ }
85
+ if err := u .Client .Update (ctx , & upgraded ); err != nil {
86
+ return err
87
+ }
88
+ return nil
89
+ })
90
+ if err != nil {
76
91
itemLogger .Error (err , "failed to apply changes to instance" )
77
- continue
92
+ return err
78
93
}
79
94
80
95
// the status object requires its own update
81
96
upgraded .Status = st
82
- if err := u .Client .Status ().Patch (ctx , & upgraded , patch ); err != nil {
97
+ if err := u .Client .Status ().Patch (ctx , & upgraded , client . MergeFrom ( & original ) ); err != nil {
83
98
itemLogger .Error (err , "failed to apply changes to instance's status object" )
84
99
continue
85
100
}
86
-
87
101
itemLogger .Info ("instance upgraded" , "version" , upgraded .Status .Version )
88
102
}
89
103
}
0 commit comments