@@ -137,33 +137,11 @@ func (dr *DeletionRoutine) handle(ctx context.Context, key string) (err error) {
137
137
Status : offloadingv1beta1 .DrainingConditionStatusType ,
138
138
}})
139
139
140
- var node * corev1.Node
141
- node , err = getters .GetNodeFromVirtualNode (ctx , dr .vnr .Client , vn )
142
- if client .IgnoreNotFound (err ) != nil {
143
- err = fmt .Errorf ("error getting node: %w" , err )
140
+ if err = dr .deleteVirtualKubelet (ctx , vn ); err != nil {
141
+ err = fmt .Errorf ("error deleting node and Virtual Kubelet: %w" , err )
144
142
return err
145
143
}
146
144
147
- if node != nil {
148
- if ! * vn .Spec .CreateNode {
149
- // We need to ensure that the current pods will no recreate the node after deleting it.
150
- var found bool
151
- if found , err = vkutils .CheckVirtualKubeletFlagsConsistence (
152
- ctx , dr .vnr .Client , vn , createNodeFalseFlag ); err != nil || ! found {
153
- if err == nil {
154
- err = fmt .Errorf ("virtual kubelet pods are still running with arg %s" , createNodeFalseFlag .String ())
155
- return err
156
- }
157
- err = fmt .Errorf ("error checking virtual kubelet pods: %w" , err )
158
- return err
159
- }
160
- }
161
- if err = dr .deleteNode (ctx , node , vn ); err != nil {
162
- err = fmt .Errorf ("error deleting node: %w" , err )
163
- return err
164
- }
165
- }
166
-
167
145
if ! vn .DeletionTimestamp .IsZero () {
168
146
// VirtualNode resource is being deleted.
169
147
if err = dr .vnr .ensureNamespaceMapAbsence (ctx , vn ); err != nil {
@@ -188,19 +166,28 @@ func (dr *DeletionRoutine) handle(ctx context.Context, key string) (err error) {
188
166
return nil
189
167
}
190
168
191
- // deleteNode deletes the Node created by VirtualNode.
192
- func (dr * DeletionRoutine ) deleteNode (ctx context.Context , node * corev1.Node , vn * offloadingv1beta1.VirtualNode ) error {
193
- if err := cordonNode (ctx , dr .vnr .Client , node ); err != nil {
194
- return fmt .Errorf ("error cordoning node: %w" , err )
169
+ // deleteVirtualKubelet deletes the Node and the VirtualKubelet deployment related to the given VirtualNode.
170
+ func (dr * DeletionRoutine ) deleteVirtualKubelet (ctx context.Context , vn * offloadingv1beta1.VirtualNode ) error {
171
+ // Check if the Node resource exists to make sure that we are not in a case in which it should not exist.
172
+ node , err := getters .GetNodeFromVirtualNode (ctx , dr .vnr .Client , vn )
173
+ if client .IgnoreNotFound (err ) != nil {
174
+ err = fmt .Errorf ("error getting node: %w" , err )
175
+ return err
195
176
}
196
177
197
- klog .Infof ("Node %s cordoned" , node .Name )
178
+ if node != nil {
179
+ if err := cordonNode (ctx , dr .vnr .Client , node ); err != nil {
180
+ return fmt .Errorf ("error cordoning node: %w" , err )
181
+ }
198
182
199
- if err := client .IgnoreNotFound (drainNode (ctx , dr .vnr .Client , vn )); err != nil {
200
- return fmt .Errorf ("error draining node: %w" , err )
201
- }
183
+ klog .Infof ("Node %s cordoned" , node .Name )
202
184
203
- klog .Infof ("Node %s drained" , node .Name )
185
+ if err := client .IgnoreNotFound (drainNode (ctx , dr .vnr .Client , vn )); err != nil {
186
+ return fmt .Errorf ("error draining node: %w" , err )
187
+ }
188
+
189
+ klog .Infof ("Node %s drained" , node .Name )
190
+ }
204
191
205
192
if ! vn .DeletionTimestamp .IsZero () {
206
193
ForgeCondition (vn ,
@@ -214,18 +201,38 @@ func (dr *DeletionRoutine) deleteNode(ctx context.Context, node *corev1.Node, vn
214
201
return fmt .Errorf ("error deleting virtual kubelet deployment: %w" , err )
215
202
}
216
203
}
204
+
205
+ // Even node is nil we make sure that no Node resource has been created before the deletion of the VK deployment.
217
206
klog .Infof ("VirtualKubelet deployment %s deleted" , vn .Name )
218
207
208
+ var nodeToDelete * corev1.Node
209
+
210
+ if node != nil {
211
+ nodeToDelete = node
212
+ } else {
213
+ nodeToDelete , err = getters .GetNodeFromVirtualNode (ctx , dr .vnr .Client , vn )
214
+ if client .IgnoreNotFound (err ) != nil {
215
+ err = fmt .Errorf ("error getting node before deletion: %w" , err )
216
+ return err
217
+ }
218
+ }
219
+
219
220
ForgeCondition (vn ,
220
221
VnConditionMap {
221
222
offloadingv1beta1 .NodeConditionType : VnCondition {
222
223
Status : offloadingv1beta1 .DeletingConditionStatusType ,
223
224
},
224
225
})
225
- if err := client .IgnoreNotFound (dr .vnr .Client .Delete (ctx , node , & client.DeleteOptions {})); err != nil {
226
- return fmt .Errorf ("error deleting node: %w" , err )
226
+
227
+ if nodeToDelete != nil {
228
+ if err := client .IgnoreNotFound (dr .vnr .Client .Delete (ctx , nodeToDelete , & client.DeleteOptions {})); err != nil {
229
+ return fmt .Errorf ("error deleting node: %w" , err )
230
+ }
231
+
232
+ klog .Infof ("Node %s deleted" , node .Name )
233
+ } else {
234
+ klog .Infof ("Node of VirtualNode %s already deleted" , vn .Name )
227
235
}
228
236
229
- klog .Infof ("Node %s deleted" , node .Name )
230
237
return nil
231
238
}
0 commit comments