54
54
)
55
55
56
56
// PreflightChecks performs preflight checks before installing provider.
57
- func PreflightChecks (ctx context.Context , c client.Client , provider genericprovider.GenericProvider , providerList genericprovider.GenericProviderList ) (ctrl.Result , error ) {
57
+ func PreflightChecks (ctx context.Context , c client.Client , provider genericprovider.GenericProvider , providerList genericprovider.GenericProviderList ) (ctrl.Result , bool , error ) {
58
58
log := ctrl .LoggerFrom (ctx )
59
59
60
60
log .Info ("Performing preflight checks" )
@@ -71,7 +71,7 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
71
71
emptyVersionMessage ,
72
72
))
73
73
74
- return ctrl.Result {}, fmt .Errorf ("version can't be empty for provider %s" , provider .GetName ())
74
+ return ctrl.Result {}, true , fmt .Errorf ("version can't be empty for provider %s" , provider .GetName ())
75
75
}
76
76
77
77
// Check that provider version contains a valid value.
@@ -84,13 +84,23 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
84
84
err .Error (),
85
85
))
86
86
87
- return ctrl.Result {}, fmt .Errorf ("version contains invalid value for provider %s" , provider .GetName ())
87
+ return ctrl.Result {}, true , fmt .Errorf ("version contains invalid value for provider %s" , provider .GetName ())
88
+ }
89
+
90
+ // If desired and installed versions are the same - halt reconciliation
91
+ changed , err := versionChanged (provider )
92
+ if err != nil {
93
+ return ctrl.Result {}, true , fmt .Errorf ("failed to parse installed version: %w" , err )
94
+ }
95
+
96
+ if ! changed {
97
+ return ctrl.Result {}, true , nil
88
98
}
89
99
90
100
// Check that if a predefined provider is being installed, and if it's not - ensure that FetchConfig is specified.
91
101
isPredefinedProvider , err := isPredefinedProvider (provider .GetName (), util .ClusterctlProviderType (provider ))
92
102
if err != nil {
93
- return ctrl.Result {}, fmt .Errorf ("failed to generate a list of predefined providers: %w" , err )
103
+ return ctrl.Result {}, true , fmt .Errorf ("failed to generate a list of predefined providers: %w" , err )
94
104
}
95
105
96
106
if ! isPredefinedProvider {
@@ -102,7 +112,7 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
102
112
"Either Selector or URL must be provided for a not predefined provider" ,
103
113
))
104
114
105
- return ctrl.Result {}, fmt .Errorf ("either selector or URL must be provided for a not predefined provider %s" , provider .GetName ())
115
+ return ctrl.Result {}, true , fmt .Errorf ("either selector or URL must be provided for a not predefined provider %s" , provider .GetName ())
106
116
}
107
117
}
108
118
@@ -115,7 +125,7 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
115
125
"Only one of Selector and URL must be provided, not both" ,
116
126
))
117
127
118
- return ctrl.Result {}, fmt .Errorf ("only one of Selector and URL must be provided for provider %s" , provider .GetName ())
128
+ return ctrl.Result {}, true , fmt .Errorf ("only one of Selector and URL must be provided for provider %s" , provider .GetName ())
119
129
}
120
130
121
131
// Validate that provided github token works and has repository access.
@@ -124,7 +134,7 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
124
134
key := types.NamespacedName {Namespace : provider .GetNamespace (), Name : provider .GetSpec ().SecretName }
125
135
126
136
if err := c .Get (ctx , key , secret ); err != nil {
127
- return ctrl.Result {}, fmt .Errorf ("failed to get providers secret: %w" , err )
137
+ return ctrl.Result {}, true , fmt .Errorf ("failed to get providers secret: %w" , err )
128
138
}
129
139
130
140
if token , ok := secret .Data [configclient .GitHubTokenVariable ]; ok {
@@ -139,13 +149,13 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
139
149
invalidGithubTokenMessage ,
140
150
))
141
151
142
- return ctrl.Result {}, fmt .Errorf ("failed to validate provided github token: %w" , err )
152
+ return ctrl.Result {}, true , fmt .Errorf ("failed to validate provided github token: %w" , err )
143
153
}
144
154
}
145
155
}
146
156
147
157
if err := c .List (ctx , providerList .GetObject ()); err != nil {
148
- return ctrl.Result {}, fmt .Errorf ("failed to list providers: %w" , err )
158
+ return ctrl.Result {}, true , fmt .Errorf ("failed to list providers: %w" , err )
149
159
}
150
160
151
161
// Check that no more than one instance of the provider is installed.
@@ -168,7 +178,7 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
168
178
preflightFalseCondition .Message = moreThanOneCoreProviderInstanceExistsMessage
169
179
conditions .Set (provider , preflightFalseCondition )
170
180
171
- return ctrl.Result {}, fmt .Errorf ("only one instance of CoreProvider is allowed" )
181
+ return ctrl.Result {}, true , fmt .Errorf ("only one instance of CoreProvider is allowed" )
172
182
}
173
183
174
184
// For any other provider we should check that instances with similar name exist in any namespace
@@ -177,15 +187,15 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
177
187
log .Info (preflightFalseCondition .Message )
178
188
conditions .Set (provider , preflightFalseCondition )
179
189
180
- return ctrl.Result {}, fmt .Errorf ("only one %s provider is allowed in the cluster" , p .GetName ())
190
+ return ctrl.Result {}, true , fmt .Errorf ("only one %s provider is allowed in the cluster" , p .GetName ())
181
191
}
182
192
}
183
193
184
194
// Wait for core provider to be ready before we install other providers.
185
195
if ! util .IsCoreProvider (provider ) {
186
196
ready , err := coreProviderIsReady (ctx , c )
187
197
if err != nil {
188
- return ctrl.Result {}, fmt .Errorf ("failed to get coreProvider ready condition: %w" , err )
198
+ return ctrl.Result {}, true , fmt .Errorf ("failed to get coreProvider ready condition: %w" , err )
189
199
}
190
200
191
201
if ! ready {
@@ -197,15 +207,15 @@ func PreflightChecks(ctx context.Context, c client.Client, provider genericprovi
197
207
waitingForCoreProviderReadyMessage ,
198
208
))
199
209
200
- return ctrl.Result {RequeueAfter : preflightFailedRequeueAfter }, nil
210
+ return ctrl.Result {RequeueAfter : preflightFailedRequeueAfter }, true , nil
201
211
}
202
212
}
203
213
204
214
conditions .Set (provider , conditions .TrueCondition (operatorv1 .PreflightCheckCondition ))
205
215
206
216
log .Info ("Preflight checks passed" )
207
217
208
- return ctrl.Result {}, nil
218
+ return ctrl.Result {}, false , nil
209
219
}
210
220
211
221
// coreProviderIsReady returns true if the core provider is ready.
@@ -242,3 +252,26 @@ func isPredefinedProvider(providerName string, providerType clusterctlv1.Provide
242
252
243
253
return err == nil , nil
244
254
}
255
+
256
+ // versionChanged try to get installed version from provider status and decide if it has changed.
257
+ func versionChanged (provider genericprovider.GenericProvider ) (bool , error ) {
258
+ installedVersion := provider .GetStatus ().InstalledVersion
259
+ if installedVersion == nil {
260
+ return true , nil
261
+ }
262
+
263
+ currentVersion , err := version .ParseSemantic (* installedVersion )
264
+ if err != nil {
265
+ return false , err
266
+ }
267
+
268
+ res , err := currentVersion .Compare (provider .GetSpec ().Version )
269
+ if err != nil {
270
+ return false , err
271
+ }
272
+
273
+ // we need to delete installed components if versions are different
274
+ versionChanged := res != 0
275
+
276
+ return versionChanged , nil
277
+ }
0 commit comments