Skip to content

Commit c9cca1d

Browse files
authored
Merge pull request #1301 from mercedes-benz/seanschneeweiss/transient-errors
🐛 openstackmachine: do not set transient error message and reason
2 parents dc64e9a + b9689c6 commit c9cca1d

File tree

3 files changed

+32
-59
lines changed

3 files changed

+32
-59
lines changed

api/v1alpha6/openstackmachine_types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package v1alpha6
1919
import (
2020
corev1 "k8s.io/api/core/v1"
2121
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22+
"k8s.io/utils/pointer"
2223
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
2324
"sigs.k8s.io/cluster-api/errors"
2425
)
@@ -174,6 +175,12 @@ func (r *OpenStackMachine) SetConditions(conditions clusterv1.Conditions) {
174175
r.Status.Conditions = conditions
175176
}
176177

178+
// SetFailure sets the OpenStackMachine status failure reason and failure message.
179+
func (r *OpenStackMachine) SetFailure(failureReason errors.MachineStatusError, failureMessage error) {
180+
r.Status.FailureReason = &failureReason
181+
r.Status.FailureMessage = pointer.StringPtr(failureMessage.Error())
182+
}
183+
177184
func init() {
178185
SchemeBuilder.Register(&OpenStackMachine{}, &OpenStackMachineList{})
179186
}

controllers/openstackmachine_controller.go

Lines changed: 24 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ package controllers
1919
import (
2020
"context"
2121
"encoding/base64"
22+
"errors"
2223
"fmt"
2324
"reflect"
2425
"time"
2526

2627
"github.com/go-logr/logr"
27-
"github.com/pkg/errors"
2828
corev1 "k8s.io/api/core/v1"
2929
apierrors "k8s.io/apimachinery/pkg/api/errors"
3030
"k8s.io/apimachinery/pkg/types"
@@ -261,27 +261,28 @@ func (r *OpenStackMachineReconciler) reconcileDelete(ctx context.Context, scope
261261
if instanceStatus != nil {
262262
instanceNS, err := instanceStatus.NetworkStatus()
263263
if err != nil {
264-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("error getting network status for OpenStack instance %s with ID %s: %v", instanceStatus.Name(), instanceStatus.ID(), err))
264+
openStackMachine.SetFailure(
265+
capierrors.UpdateMachineError,
266+
fmt.Errorf("get network status for OpenStack instance %s with ID %s: %v", instanceStatus.Name(), instanceStatus.ID(), err),
267+
)
265268
return ctrl.Result{}, nil
266269
}
267270

268271
addresses := instanceNS.Addresses()
269272
for _, address := range addresses {
270273
if address.Type == corev1.NodeExternalIP {
271274
if err = networkingService.DeleteFloatingIP(openStackMachine, address.Address); err != nil {
272-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("error deleting Openstack floating IP: %v", err))
273275
conditions.MarkFalse(openStackMachine, infrav1.APIServerIngressReadyCondition, infrav1.FloatingIPErrorReason, clusterv1.ConditionSeverityError, "Deleting floating IP failed: %v", err)
274-
return ctrl.Result{}, nil
276+
return ctrl.Result{}, fmt.Errorf("delete floating IP %q: %w", address.Address, err)
275277
}
276278
}
277279
}
278280
}
279281
}
280282

281283
if err := computeService.DeleteInstance(openStackMachine, instanceStatus, openStackMachine.Name, openStackMachine.Spec.RootVolume); err != nil {
282-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("error deleting OpenStack instance %s with ID %s: %v", instanceStatus.Name(), instanceStatus.ID(), err))
283284
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceDeleteFailedReason, clusterv1.ConditionSeverityError, "Deleting instance failed: %v", err)
284-
return ctrl.Result{}, nil
285+
return ctrl.Result{}, fmt.Errorf("delete instance: %w", err)
285286
}
286287

287288
controllerutil.RemoveFinalizer(openStackMachine, infrav1.MachineFinalizer)
@@ -338,14 +339,14 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
338339

339340
instanceStatus, err := r.getOrCreate(scope.Logger, cluster, openStackCluster, machine, openStackMachine, computeService, userData)
340341
if err != nil {
341-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("OpenStack instance cannot be created: %v", err))
342342
// Conditions set in getOrCreate
343343
return ctrl.Result{}, err
344344
}
345345

346346
// Set an error message if we couldn't find the instance.
347347
if instanceStatus == nil {
348-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.New("OpenStack instance cannot be found"))
348+
err = errors.New("OpenStack instance not found")
349+
openStackMachine.SetFailure(capierrors.UpdateMachineError, err)
349350
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceNotFoundReason, clusterv1.ConditionSeverityError, "")
350351
return ctrl.Result{}, nil
351352
}
@@ -360,26 +361,27 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
360361

361362
instanceNS, err := instanceStatus.NetworkStatus()
362363
if err != nil {
363-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("Unable to get network status for OpenStack instance %s with ID %s: %v", instanceStatus.Name(), instanceStatus.ID(), err))
364-
return ctrl.Result{}, nil
364+
return ctrl.Result{}, fmt.Errorf("get network status: %w", err)
365365
}
366366

367367
addresses := instanceNS.Addresses()
368368
openStackMachine.Status.Addresses = addresses
369369

370370
switch instanceStatus.State() {
371371
case infrav1.InstanceStateActive:
372-
scope.Logger.Info("Machine instance is ACTIVE", "instance-id", instanceStatus.ID())
372+
scope.Logger.Info("Machine instance state is ACTIVE", "instance-id", instanceStatus.ID())
373373
conditions.MarkTrue(openStackMachine, infrav1.InstanceReadyCondition)
374374
openStackMachine.Status.Ready = true
375375
case infrav1.InstanceStateError:
376376
// Error is unexpected, thus we report error and never retry
377-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("OpenStack instance state %q is unexpected", instanceStatus.State()))
377+
scope.Logger.Info("Machine instance state is ERROR", "instance-id", instanceStatus.ID())
378+
err = fmt.Errorf("instance state %q is unexpected", instanceStatus.State())
379+
openStackMachine.SetFailure(capierrors.UpdateMachineError, err)
378380
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceStateErrorReason, clusterv1.ConditionSeverityError, "")
379381
return ctrl.Result{}, nil
380382
case infrav1.InstanceStateDeleted:
381383
// we should avoid further actions for DELETED VM
382-
scope.Logger.Info("Instance state is DELETED, no actions")
384+
scope.Logger.Info("Machine instance state is DELETED, no actions")
383385
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceDeletedReason, clusterv1.ConditionSeverityError, "")
384386
return ctrl.Result{}, nil
385387
default:
@@ -398,9 +400,8 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
398400
if openStackCluster.Spec.APIServerLoadBalancer.Enabled {
399401
err = r.reconcileLoadBalancerMember(scope, openStackCluster, machine, openStackMachine, instanceNS, clusterName)
400402
if err != nil {
401-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("LoadBalancerMember cannot be reconciled: %v", err))
402403
conditions.MarkFalse(openStackMachine, infrav1.APIServerIngressReadyCondition, infrav1.LoadBalancerMemberErrorReason, clusterv1.ConditionSeverityError, "Reconciling load balancer member failed: %v", err)
403-
return ctrl.Result{}, nil
404+
return ctrl.Result{}, fmt.Errorf("reconcile load balancer member: %w", err)
404405
}
405406
} else if !openStackCluster.Spec.DisableAPIServerFloatingIP {
406407
floatingIPAddress := openStackCluster.Spec.ControlPlaneEndpoint.Host
@@ -409,26 +410,22 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
409410
}
410411
fp, err := networkingService.GetOrCreateFloatingIP(openStackMachine, openStackCluster, clusterName, floatingIPAddress)
411412
if err != nil {
412-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("Floating IP cannot be got or created: %v", err))
413413
conditions.MarkFalse(openStackMachine, infrav1.APIServerIngressReadyCondition, infrav1.FloatingIPErrorReason, clusterv1.ConditionSeverityError, "Floating IP cannot be obtained or created: %v", err)
414-
return ctrl.Result{}, nil
414+
return ctrl.Result{}, fmt.Errorf("get or create floating IP %q: %w", floatingIPAddress, err)
415415
}
416416
port, err := computeService.GetManagementPort(openStackCluster, instanceStatus)
417417
if err != nil {
418-
err = errors.Errorf("getting management port for control plane machine %s: %v", machine.Name, err)
419-
handleUpdateMachineError(scope.Logger, openStackMachine, err)
420418
conditions.MarkFalse(openStackMachine, infrav1.APIServerIngressReadyCondition, infrav1.FloatingIPErrorReason, clusterv1.ConditionSeverityError, "Obtaining management port for control plane machine failed: %v", err)
421-
return ctrl.Result{}, nil
419+
return ctrl.Result{}, fmt.Errorf("get management port for control plane machine: %w", err)
422420
}
423421

424422
if fp.PortID != "" {
425423
scope.Logger.Info("Floating IP already associated to a port:", "id", fp.ID, "fixed ip", fp.FixedIP, "portID", port.ID)
426424
} else {
427425
err = networkingService.AssociateFloatingIP(openStackMachine, fp, port.ID)
428426
if err != nil {
429-
handleUpdateMachineError(scope.Logger, openStackMachine, errors.Errorf("Floating IP cannot be associated: %v", err))
430427
conditions.MarkFalse(openStackMachine, infrav1.APIServerIngressReadyCondition, infrav1.FloatingIPErrorReason, clusterv1.ConditionSeverityError, "Associating floating IP failed: %v", err)
431-
return ctrl.Result{}, nil
428+
return ctrl.Result{}, fmt.Errorf("associate floating IP %q with port %q: %w", fp.FloatingIP, port.ID, err)
432429
}
433430
}
434431
}
@@ -445,30 +442,19 @@ func (r *OpenStackMachineReconciler) getOrCreate(logger logr.Logger, cluster *cl
445442
}
446443

447444
if instanceStatus == nil {
445+
instanceSpec := machineToInstanceSpec(openStackCluster, machine, openStackMachine, userData)
448446
logger.Info("Machine not exist, Creating Machine", "Machine", openStackMachine.Name)
449-
instanceSpec, err := machineToInstanceSpec(openStackCluster, machine, openStackMachine, userData)
450-
if err != nil {
451-
err = errors.Errorf("machine spec is invalid: %v", err)
452-
handleUpdateMachineError(logger, openStackMachine, err)
453-
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InvalidMachineSpecReason, clusterv1.ConditionSeverityError, err.Error())
454-
return nil, err
455-
}
456-
457447
instanceStatus, err = computeService.CreateInstance(openStackMachine, openStackCluster, instanceSpec, cluster.Name)
458448
if err != nil {
459449
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceCreateFailedReason, clusterv1.ConditionSeverityError, err.Error())
460-
return nil, errors.Errorf("error creating Openstack instance: %v", err)
450+
return nil, fmt.Errorf("create OpenStack instance: %w", err)
461451
}
462452
}
463453

464454
return instanceStatus, nil
465455
}
466456

467-
func machineToInstanceSpec(openStackCluster *infrav1.OpenStackCluster, machine *clusterv1.Machine, openStackMachine *infrav1.OpenStackMachine, userData string) (*compute.InstanceSpec, error) {
468-
if openStackMachine == nil {
469-
return nil, fmt.Errorf("create Options need be specified to create instace")
470-
}
471-
457+
func machineToInstanceSpec(openStackCluster *infrav1.OpenStackCluster, machine *clusterv1.Machine, openStackMachine *infrav1.OpenStackMachine, userData string) *compute.InstanceSpec {
472458
instanceSpec := compute.InstanceSpec{
473459
Name: openStackMachine.Name,
474460
Image: openStackMachine.Spec.Image,
@@ -530,15 +516,7 @@ func machineToInstanceSpec(openStackCluster *infrav1.OpenStackCluster, machine *
530516
instanceSpec.Networks = openStackMachine.Spec.Networks
531517
instanceSpec.Ports = openStackMachine.Spec.Ports
532518

533-
return &instanceSpec, nil
534-
}
535-
536-
func handleUpdateMachineError(logger logr.Logger, openstackMachine *infrav1.OpenStackMachine, message error) {
537-
err := capierrors.UpdateMachineError
538-
openstackMachine.Status.FailureReason = &err
539-
openstackMachine.Status.FailureMessage = pointer.StringPtr(message.Error())
540-
// TODO remove if this error is logged redundantly
541-
logger.Error(fmt.Errorf("%s", string(err)), message.Error())
519+
return &instanceSpec
542520
}
543521

544522
func (r *OpenStackMachineReconciler) reconcileLoadBalancerMember(scope *scope.Scope, openStackCluster *infrav1.OpenStackCluster, machine *clusterv1.Machine, openStackMachine *infrav1.OpenStackMachine, instanceNS *compute.InstanceNetworkStatus, clusterName string) error {
@@ -591,7 +569,7 @@ func (r *OpenStackMachineReconciler) getBootstrapData(ctx context.Context, machi
591569
secret := &corev1.Secret{}
592570
key := types.NamespacedName{Namespace: machine.Namespace, Name: *machine.Spec.Bootstrap.DataSecretName}
593571
if err := r.Client.Get(ctx, key, secret); err != nil {
594-
return "", errors.Wrapf(err, "failed to retrieve bootstrap data secret for Openstack Machine %s/%s", machine.Namespace, openStackMachine.Name)
572+
return "", fmt.Errorf("failed to retrieve bootstrap data secret for Openstack Machine %s/%s: %w", machine.Namespace, openStackMachine.Name, err)
595573
}
596574

597575
value, ok := secret.Data["value"]

controllers/openstackmachine_controller_test.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,13 @@ func Test_machineToInstanceSpec(t *testing.T) {
119119
machine func() *clusterv1.Machine
120120
openStackMachine func() *infrav1.OpenStackMachine
121121
wantInstanceSpec func() *compute.InstanceSpec
122-
wantErr bool
123122
}{
124123
{
125124
name: "Defaults",
126125
openStackCluster: getDefaultOpenStackCluster,
127126
machine: getDefaultMachine,
128127
openStackMachine: getDefaultOpenStackMachine,
129128
wantInstanceSpec: getDefaultInstanceSpec,
130-
wantErr: false,
131129
},
132130
{
133131
name: "Control plane security group",
@@ -149,7 +147,6 @@ func Test_machineToInstanceSpec(t *testing.T) {
149147
i.SecurityGroups = []infrav1.SecurityGroupParam{{UUID: controlPlaneSecurityGroupUUID}}
150148
return i
151149
},
152-
wantErr: false,
153150
},
154151
{
155152
name: "Worker security group",
@@ -165,7 +162,6 @@ func Test_machineToInstanceSpec(t *testing.T) {
165162
i.SecurityGroups = []infrav1.SecurityGroupParam{{UUID: workerSecurityGroupUUID}}
166163
return i
167164
},
168-
wantErr: false,
169165
},
170166
{
171167
name: "Extra security group",
@@ -188,7 +184,6 @@ func Test_machineToInstanceSpec(t *testing.T) {
188184
}
189185
return i
190186
},
191-
wantErr: false,
192187
},
193188
{
194189
name: "Tags",
@@ -208,18 +203,11 @@ func Test_machineToInstanceSpec(t *testing.T) {
208203
i.Tags = []string{"machine-tag", "duplicate-tag", "cluster-tag"}
209204
return i
210205
},
211-
wantErr: false,
212206
},
213207
}
214208
for _, tt := range tests {
215209
t.Run(tt.name, func(t *testing.T) {
216-
got, err := machineToInstanceSpec(tt.openStackCluster(), tt.machine(), tt.openStackMachine(), "user-data")
217-
if tt.wantErr {
218-
Expect(err).To(HaveOccurred())
219-
} else {
220-
Expect(err).NotTo(HaveOccurred())
221-
}
222-
210+
got := machineToInstanceSpec(tt.openStackCluster(), tt.machine(), tt.openStackMachine(), "user-data")
223211
Expect(got).To(Equal(tt.wantInstanceSpec()))
224212
})
225213
}

0 commit comments

Comments
 (0)