Skip to content

Commit 4538610

Browse files
committed
[hypervisor-controller] Transport aggregates/traits only once
This makes it easier to add custom updates to singular Hypervisors
1 parent 4448ced commit 4538610

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

internal/controller/hypervisor_controller.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,9 @@ func (hv *HypervisorController) Reconcile(ctx context.Context, req ctrl.Request)
131131
return ctrl.Result{}, hv.Status().Update(ctx, hypervisor)
132132
}
133133

134-
// transport label/anotations changes
134+
// transport label changes
135135
before := hypervisor.DeepCopy()
136-
updateLabelsAndAnnotations(&node.ObjectMeta, hypervisor)
137-
if !reflect.DeepEqual(before, hypervisor) {
136+
if transportLabels(&node.ObjectMeta, hypervisor) {
138137
return ctrl.Result{}, hv.Patch(ctx, hypervisor, k8sclient.MergeFrom(before))
139138
}
140139

@@ -147,8 +146,10 @@ func (hv *HypervisorController) Reconcile(ctx context.Context, req ctrl.Request)
147146
hypervisor.Spec.SkipTests = nodeLabels.Get(labelLifecycleMode) == "skip-tests"
148147
}
149148

149+
// transport relevant labels
150+
transportLabels(&node.ObjectMeta, hypervisor)
150151
// transport relevant annotations
151-
updateLabelsAndAnnotations(&node.ObjectMeta, hypervisor)
152+
transportAggregatesAndTraits(&node.ObjectMeta, hypervisor)
152153

153154
if err := controllerutil.SetOwnerReference(node, hypervisor, hv.Scheme, controllerutil.WithBlockOwnerDeletion(true)); err != nil {
154155
return ctrl.Result{}, fmt.Errorf("failed setting controller reference: %w", err)
@@ -187,8 +188,9 @@ func (hv *HypervisorController) SetupWithManager(mgr ctrl.Manager) error {
187188
Complete(hv)
188189
}
189190

190-
// updateLabelsAndAnnotations transports relevant annotations from the Node to the Hypervisor spec
191-
func updateLabelsAndAnnotations(node *metav1.ObjectMeta, hypervisor *kvmv1.Hypervisor) {
191+
// transportAggregatesAndTraits transports relevant aggregates/traits from the Node to the Hypervisor spec
192+
func transportAggregatesAndTraits(node *metav1.ObjectMeta, hypervisor *kvmv1.Hypervisor) bool {
193+
before := hypervisor.DeepCopy()
192194
// transport aggregates annotation to hypervisor spec
193195
if aggregates, found := node.Annotations[annotationAggregates]; found {
194196
// split aggregates string
@@ -214,11 +216,17 @@ func updateLabelsAndAnnotations(node *metav1.ObjectMeta, hypervisor *kvmv1.Hyper
214216
}
215217
})
216218
}
219+
return !reflect.DeepEqual(before, hypervisor)
220+
}
217221

222+
// transportLabels transports relevant labels from the Node to the Hypervisor spec
223+
func transportLabels(node *metav1.ObjectMeta, hypervisor *kvmv1.Hypervisor) bool {
224+
before := hypervisor.DeepCopy()
218225
// transfer labels
219226
for _, transferLabel := range transferLabels {
220227
if label, ok := node.Labels[transferLabel]; ok {
221228
hypervisor.Labels[transferLabel] = label
222229
}
223230
}
231+
return !reflect.DeepEqual(before, hypervisor)
224232
}

internal/controller/hypervisor_controller_test.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ var _ = Describe("Hypervisor Controller", func() {
4747
// pregenerate the resource
4848
resource = &corev1.Node{
4949
ObjectMeta: metav1.ObjectMeta{
50-
Name: "other-node",
51-
Labels: map[string]string{corev1.LabelTopologyZone: "test-zone"},
50+
Name: "other-node",
51+
Labels: map[string]string{corev1.LabelTopologyZone: "test-zone"},
52+
Annotations: map[string]string{annotationCustomTraits: "test-trait"},
5253
},
5354
}
5455
})
@@ -83,14 +84,11 @@ var _ = Describe("Hypervisor Controller", func() {
8384
Expect(hypervisor.Labels).ToNot(BeNil())
8485
Expect(hypervisor.Labels[corev1.LabelTopologyZone]).To(Equal("test-zone"))
8586

86-
By("Adding a aggregate annotation to the node and reconciling again")
87+
By("Adding a label annotation to the node and reconciling again")
8788
// Add an aggregate annotation to the node
88-
annotedResource := resource.DeepCopy()
89-
if annotedResource.Annotations == nil {
90-
annotedResource.Annotations = map[string]string{}
91-
}
92-
annotedResource.Annotations[annotationCustomTraits] = "test-trait"
93-
Expect(k8sClient.Patch(ctx, annotedResource, client.Merge)).To(Succeed())
89+
labeledResource := resource.DeepCopy()
90+
labeledResource.Labels["worker.garden.sapcloud.io/group"] = "new-group"
91+
Expect(k8sClient.Patch(ctx, labeledResource, client.Merge)).To(Succeed())
9492

9593
_, err = hypervisorController.Reconcile(ctx, ctrl.Request{
9694
NamespacedName: types.NamespacedName{Name: resource.Name},
@@ -104,6 +102,7 @@ var _ = Describe("Hypervisor Controller", func() {
104102
Expect(updatedHypervisor.Name).To(Equal(resource.Name))
105103
Expect(updatedHypervisor.Spec.CustomTraits).ToNot(BeNil())
106104
Expect(updatedHypervisor.Spec.CustomTraits).To(ContainElement("test-trait"))
105+
Expect(updatedHypervisor.Labels).To(HaveKeyWithValue("worker.garden.sapcloud.io/group", "new-group"))
107106
})
108107
})
109108

0 commit comments

Comments
 (0)