Skip to content

Commit 09a2101

Browse files
notandyfwiesel
authored andcommitted
hypervisor_controller: use CreateOrPatch to transport node changes
remove legacy Status.node name.
1 parent 4856fa2 commit 09a2101

File tree

4 files changed

+53
-68
lines changed

4 files changed

+53
-68
lines changed

api/v1/hypervisor_types.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ package v1
2020
import (
2121
"k8s.io/apimachinery/pkg/api/resource"
2222
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23-
"k8s.io/apimachinery/pkg/types"
2423
)
2524

2625
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
@@ -148,16 +147,13 @@ type CapabilitiesStatus struct {
148147
type HypervisorStatus struct {
149148
// +kubebuilder:default:=unknown
150149
// Represents the LibVirt version.
151-
LibVirtVersion string `json:"libVirtVersion"`
150+
LibVirtVersion string `json:"libVirtVersion,omitempty"`
152151

153152
// Represents the Operating System status.
154153
OperatingSystem OperatingSystemStatus `json:"operatingSystem,omitempty"`
155154

156155
// Represents the Hypervisor update status.
157-
Update HyperVisorUpdateStatus `json:"updateStatus"`
158-
159-
// Represents the Hypervisor node name.
160-
Node types.NodeName `json:"node"`
156+
Update HyperVisorUpdateStatus `json:"updateStatus,omitempty"`
161157

162158
// Represents the Hypervisor hosted Virtual Machines
163159
Instances []Instance `json:"instances,omitempty"`
@@ -186,10 +182,12 @@ type HypervisorStatus struct {
186182
// +kubebuilder:resource:scope=Cluster,shortName=hv
187183
// +kubebuilder:printcolumn:JSONPath=.metadata.labels.topology\.kubernetes\.io/zone,name="Zone",type="string",priority=2
188184
// +kubebuilder:printcolumn:JSONPath=.metadata.labels.kubernetes\.metal\.cloud\.sap/bb,name="Building Block",type="string",priority=2
185+
// +kubebuilder:printcolumn:JSONPath=.metadata.labels.worker\.garden\.sapcloud\.io/group,name="Group",type="string",priority=2
189186
// +kubebuilder:printcolumn:JSONPath=".status.conditions[?(@.type==\"Ready\")].status",name="Ready",type="string"
190187
// +kubebuilder:printcolumn:JSONPath=".status.conditions[?(@.type==\"Ready\")].reason",name="State",type="string"
191188
// +kubebuilder:printcolumn:JSONPath=".spec.lifecycleEnabled",name="Lifecycle",type="boolean"
192189
// +kubebuilder:printcolumn:JSONPath=".spec.highAvailability",name="High Availability",type="boolean"
190+
// +kubebuilder:printcolumn:JSONPath=".spec.skipTests",name="Skip Tests",type="boolean"
193191
// +kubebuilder:printcolumn:JSONPath=".status.operatingSystem.prettyVersion",name="Version",type="string"
194192
// +kubebuilder:printcolumn:JSONPath=".status.numInstances",name="Instances",type="integer"
195193
// +kubebuilder:printcolumn:JSONPath=".status.operatingSystem.hardwareModel",name="Hardware",type="string",priority=2

charts/openstack-hypervisor-operator/crds/hypervisor-crd.yaml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ spec:
2424
name: Building Block
2525
priority: 2
2626
type: string
27+
- jsonPath: .metadata.labels.worker\.garden\.sapcloud\.io/group
28+
name: Group
29+
priority: 2
30+
type: string
2731
- jsonPath: .status.conditions[?(@.type=="Ready")].status
2832
name: Ready
2933
type: string
@@ -36,6 +40,9 @@ spec:
3640
- jsonPath: .spec.highAvailability
3741
name: High Availability
3842
type: boolean
43+
- jsonPath: .spec.skipTests
44+
name: Skip Tests
45+
type: boolean
3946
- jsonPath: .status.operatingSystem.prettyVersion
4047
name: Version
4148
type: string
@@ -256,9 +263,6 @@ spec:
256263
default: unknown
257264
description: Represents the LibVirt version.
258265
type: string
259-
node:
260-
description: Represents the Hypervisor node name.
261-
type: string
262266
numInstances:
263267
default: 0
264268
description: Represent the num of instances
@@ -328,10 +332,7 @@ spec:
328332
- retry
329333
type: object
330334
required:
331-
- libVirtVersion
332-
- node
333335
- numInstances
334-
- updateStatus
335336
type: object
336337
type: object
337338
served: true

config/crd/bases/kvm.cloud.sap_hypervisors.yaml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ spec:
2525
name: Building Block
2626
priority: 2
2727
type: string
28+
- jsonPath: .metadata.labels.worker\.garden\.sapcloud\.io/group
29+
name: Group
30+
priority: 2
31+
type: string
2832
- jsonPath: .status.conditions[?(@.type=="Ready")].status
2933
name: Ready
3034
type: string
@@ -37,6 +41,9 @@ spec:
3741
- jsonPath: .spec.highAvailability
3842
name: High Availability
3943
type: boolean
44+
- jsonPath: .spec.skipTests
45+
name: Skip Tests
46+
type: boolean
4047
- jsonPath: .status.operatingSystem.prettyVersion
4148
name: Version
4249
type: string
@@ -257,9 +264,6 @@ spec:
257264
default: unknown
258265
description: Represents the LibVirt version.
259266
type: string
260-
node:
261-
description: Represents the Hypervisor node name.
262-
type: string
263267
numInstances:
264268
default: 0
265269
description: Represent the num of instances
@@ -329,10 +333,7 @@ spec:
329333
- retry
330334
type: object
331335
required:
332-
- libVirtVersion
333-
- node
334336
- numInstances
335-
- updateStatus
336337
type: object
337338
type: object
338339
served: true

internal/controller/hypervisor_controller.go

Lines changed: 35 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"fmt"
2323

2424
corev1 "k8s.io/api/core/v1"
25-
k8serrors "k8s.io/apimachinery/pkg/api/errors"
2625
"k8s.io/apimachinery/pkg/api/meta"
2726
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2827
"k8s.io/apimachinery/pkg/labels"
@@ -61,7 +60,6 @@ type HypervisorController struct {
6160
// +kubebuilder:rbac:groups=kvm.cloud.sap,resources=hypervisors/status,verbs=get;list;watch;create;update;patch;delete
6261

6362
func (hv *HypervisorController) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
64-
var lifecycleEnabled, skipTest bool
6563
log := logger.FromContext(ctx).WithName(req.Name)
6664

6765
node := &corev1.Node{}
@@ -71,71 +69,58 @@ func (hv *HypervisorController) Reconcile(ctx context.Context, req ctrl.Request)
7169
}
7270

7371
nodeLabels := labels.Set(node.Labels)
74-
if nodeLabels.Has(labelLifecycleMode) {
75-
lifecycleEnabled = true
76-
skipTest = nodeLabels.Get(labelLifecycleMode) == "skip-test"
77-
}
78-
7972
hypervisor := &kvmv1.Hypervisor{
8073
ObjectMeta: metav1.ObjectMeta{
8174
Name: node.Name,
8275
Labels: map[string]string{},
8376
},
8477
Spec: kvmv1.HypervisorSpec{
85-
LifecycleEnabled: lifecycleEnabled,
86-
SkipTests: skipTest,
8778
HighAvailability: true,
8879
InstallCertificate: true,
8980
},
9081
}
9182

92-
// Transfer Labels
93-
for _, label := range transferLabels {
94-
if nodeLabels.Has(label) {
95-
hypervisor.Labels[label] = nodeLabels.Get(label)
96-
}
97-
}
98-
99-
// Ensure corresponding hypervisor exists
100-
if err := hv.Get(ctx, k8sclient.ObjectKeyFromObject(hypervisor), hypervisor); err != nil {
101-
if k8serrors.IsNotFound(err) {
102-
// attach ownerReference for cascading deletion
103-
if err = controllerutil.SetControllerReference(node, hypervisor, hv.Scheme); err != nil {
104-
return ctrl.Result{}, fmt.Errorf("failed setting controller reference: %w", err)
105-
}
106-
107-
log.Info("Setup hypervisor", "name", node.Name)
108-
if err = hv.Create(ctx, hypervisor); err != nil {
109-
return ctrl.Result{}, err
83+
// Ensure corresponding hypervisor exists or update it
84+
op, err := controllerutil.CreateOrPatch(ctx, hv.Client, hypervisor, func() error {
85+
// Transfer Labels
86+
for _, label := range transferLabels {
87+
if nodeLabels.Has(label) {
88+
hypervisor.Labels[label] = nodeLabels.Get(label)
11089
}
90+
}
11191

112-
// Requeue to update status
113-
return ctrl.Result{RequeueAfter: 0}, nil
92+
if nodeLabels.Has(labelLifecycleMode) {
93+
hypervisor.Spec.LifecycleEnabled = true
94+
hypervisor.Spec.SkipTests = nodeLabels.Get(labelLifecycleMode) == "skip-tests"
11495
}
11596

116-
return ctrl.Result{}, err
117-
}
97+
if err := controllerutil.SetControllerReference(node, hypervisor, hv.Scheme); err != nil {
98+
return fmt.Errorf("failed setting controller reference: %w", err)
99+
}
118100

119-
nodeTerminationCondition := FindNodeStatusCondition(node.Status.Conditions, "Terminating")
120-
if nodeTerminationCondition != nil && nodeTerminationCondition.Status == corev1.ConditionTrue {
121-
// Node might be terminating, propagate condition to hypervisor
122-
meta.SetStatusCondition(&hypervisor.Status.Conditions, metav1.Condition{
123-
Type: kvmv1.ConditionTypeReady,
124-
Status: metav1.ConditionFalse,
125-
Reason: nodeTerminationCondition.Reason,
126-
Message: nodeTerminationCondition.Message,
127-
})
128-
meta.SetStatusCondition(&hypervisor.Status.Conditions, metav1.Condition{
129-
Type: kvmv1.ConditionTypeTerminating,
130-
Status: metav1.ConditionStatus(nodeTerminationCondition.Status),
131-
Reason: nodeTerminationCondition.Reason,
132-
Message: nodeTerminationCondition.Message,
133-
})
134-
135-
// update status
136-
if err := hv.Status().Update(ctx, hypervisor); err != nil {
137-
return ctrl.Result{}, fmt.Errorf("failed to update hypervisor status: %w", err)
101+
nodeTerminationCondition := FindNodeStatusCondition(node.Status.Conditions, "Terminating")
102+
if nodeTerminationCondition != nil && nodeTerminationCondition.Status == corev1.ConditionTrue {
103+
// Node might be terminating, propagate condition to hypervisor
104+
meta.SetStatusCondition(&hypervisor.Status.Conditions, metav1.Condition{
105+
Type: kvmv1.ConditionTypeReady,
106+
Status: metav1.ConditionFalse,
107+
Reason: nodeTerminationCondition.Reason,
108+
Message: nodeTerminationCondition.Message,
109+
})
110+
meta.SetStatusCondition(&hypervisor.Status.Conditions, metav1.Condition{
111+
Type: kvmv1.ConditionTypeTerminating,
112+
Status: metav1.ConditionStatus(nodeTerminationCondition.Status),
113+
Reason: nodeTerminationCondition.Reason,
114+
Message: nodeTerminationCondition.Message,
115+
})
138116
}
117+
118+
return nil
119+
})
120+
if err != nil {
121+
log.Error(err, "Hypervisor reconcile failed")
122+
} else if op != controllerutil.OperationResultNone {
123+
log.Info("Hypervisor successfully reconciled", "operation", op)
139124
}
140125

141126
return ctrl.Result{}, nil

0 commit comments

Comments
 (0)