Skip to content

Commit 2fdbd1a

Browse files
committed
harden hypervisor node status updates
1 parent 17d7b6c commit 2fdbd1a

File tree

1 file changed

+18
-20
lines changed

1 file changed

+18
-20
lines changed

internal/controller/node_controller.go

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const LabelMetalNodeName = "kubernetes.metal.cloud.sap/name"
4646

4747
// +kubebuilder:rbac:groups="",resources=nodes,verbs=get;list;watch
4848
// +kubebuilder:rbac:groups="",resources=nodes/status,verbs=get
49+
// +kubebuilder:rbac:groups=kvm.cloud.sap,resources=hypervisors,verbs=get;list;watch;create;update;patch;delete
4950

5051
func (r *NodeReconciler) getNode(ctx context.Context) (*v1.Node, error) {
5152
// Fetch the Node we're current running on
@@ -111,30 +112,27 @@ func (r *NodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.
111112
}); err != nil {
112113
return ctrl.Result{}, fmt.Errorf("failed creating hypervisor: %w", err)
113114
}
115+
return ctrl.Result{}, nil
116+
}
114117

115-
// fetch hypervisor
116-
hv := &kvmv1alpha1.Hypervisor{}
117-
if err = r.Get(ctx, types.NamespacedName{Name: node.Name, Namespace: namespace}, hv); err != nil {
118-
return ctrl.Result{}, fmt.Errorf("failed fetching hypervisor: %w", err)
118+
if node.ObjectMeta.DeletionTimestamp != nil {
119+
// node is being deleted, cleanup hypervisor
120+
if err = r.Delete(ctx, &hypervisors.Items[0]); client.IgnoreNotFound(err) != nil {
121+
return ctrl.Result{}, fmt.Errorf("failed cleanup up hypervisor: %w", err)
119122
}
123+
return ctrl.Result{}, nil
124+
}
120125

121-
hv.Status.Node = types.NodeName(node.Name)
122-
if name, ok := node.Labels[LabelMetalNodeName]; ok {
123-
hv.Status.Node = types.NodeName(name)
124-
}
126+
hv := hypervisors.Items[0].DeepCopy()
127+
hv.Status.Node = types.NodeName(node.Name)
128+
if name, ok := node.Labels[LabelMetalNodeName]; ok {
129+
hv.Status.Node = types.NodeName(name)
130+
}
125131

126-
// Update Status
127-
err = r.Status().Update(ctx, hv)
128-
if err != nil {
129-
return ctrl.Result{}, fmt.Errorf("failed updating hypervisor status: %w", err)
130-
}
131-
} else {
132-
if node.ObjectMeta.DeletionTimestamp != nil {
133-
// node is being deleted, cleanup hypervisor
134-
if err = r.Delete(ctx, &hypervisors.Items[0]); client.IgnoreNotFound(err) != nil {
135-
return ctrl.Result{}, fmt.Errorf("failed cleanup up hypervisor: %w", err)
136-
}
137-
}
132+
// Update Status
133+
err = r.Status().Patch(ctx, hv, client.MergeFrom(&hypervisors.Items[0]))
134+
if err != nil {
135+
return ctrl.Result{}, fmt.Errorf("failed patching hypervisor status: %w", err)
138136
}
139137

140138
return ctrl.Result{}, nil

0 commit comments

Comments
 (0)