@@ -25,6 +25,7 @@ import (
25
25
"github.com/pkg/errors"
26
26
corev1 "k8s.io/api/core/v1"
27
27
apierrors "k8s.io/apimachinery/pkg/api/errors"
28
+ "k8s.io/apimachinery/pkg/types"
28
29
"k8s.io/klog/v2"
29
30
ctrl "sigs.k8s.io/controller-runtime"
30
31
"sigs.k8s.io/controller-runtime/pkg/builder"
@@ -167,11 +168,11 @@ func (r *DockerMachineReconciler) Reconcile(ctx context.Context, req ctrl.Reques
167
168
168
169
// Handle deleted machines
169
170
if ! dockerMachine .ObjectMeta .DeletionTimestamp .IsZero () {
170
- return ctrl.Result {}, r .reconcileDelete (ctx , machine , dockerMachine , externalMachine , externalLoadBalancer )
171
+ return ctrl.Result {}, r .reconcileDelete (ctx , dockerCluster , machine , dockerMachine , externalMachine , externalLoadBalancer )
171
172
}
172
173
173
174
// Handle non-deleted machines
174
- res , err := r .reconcileNormal (ctx , cluster , machine , dockerMachine , externalMachine , externalLoadBalancer )
175
+ res , err := r .reconcileNormal (ctx , cluster , dockerCluster , machine , dockerMachine , externalMachine , externalLoadBalancer )
175
176
// Requeue if the reconcile failed because the ClusterCacheTracker was locked for
176
177
// the current cluster because of concurrent access.
177
178
if errors .Is (err , remote .ErrClusterLocked ) {
@@ -204,7 +205,7 @@ func patchDockerMachine(ctx context.Context, patchHelper *patch.Helper, dockerMa
204
205
)
205
206
}
206
207
207
- func (r * DockerMachineReconciler ) reconcileNormal (ctx context.Context , cluster * clusterv1.Cluster , machine * clusterv1.Machine , dockerMachine * infrav1.DockerMachine , externalMachine * docker.Machine , externalLoadBalancer * docker.LoadBalancer ) (res ctrl.Result , retErr error ) {
208
+ func (r * DockerMachineReconciler ) reconcileNormal (ctx context.Context , cluster * clusterv1.Cluster , dockerCluster * infrav1. DockerCluster , machine * clusterv1.Machine , dockerMachine * infrav1.DockerMachine , externalMachine * docker.Machine , externalLoadBalancer * docker.LoadBalancer ) (res ctrl.Result , retErr error ) {
208
209
log := ctrl .LoggerFrom (ctx )
209
210
210
211
// Check if the infrastructure is ready, otherwise return and wait for the cluster object to be updated
@@ -271,7 +272,11 @@ func (r *DockerMachineReconciler) reconcileNormal(ctx context.Context, cluster *
271
272
// we should only do this once, as reconfiguration more or less ensures
272
273
// node ref setting fails
273
274
if util .IsControlPlaneMachine (machine ) && ! dockerMachine .Status .LoadBalancerConfigured {
274
- if err := externalLoadBalancer .UpdateConfiguration (ctx ); err != nil {
275
+ unsafeLoadBalancerConfigTemplate , err := r .getUnsafeLoadBalancerConfigTemplate (ctx , dockerCluster )
276
+ if err != nil {
277
+ return ctrl.Result {}, errors .Wrap (err , "failed to retrieve HAProxy configuration from CustomHAProxyConfigTemplateRef" )
278
+ }
279
+ if err := externalLoadBalancer .UpdateConfiguration (ctx , unsafeLoadBalancerConfigTemplate ); err != nil {
275
280
return ctrl.Result {}, errors .Wrap (err , "failed to update DockerCluster.loadbalancer configuration" )
276
281
}
277
282
dockerMachine .Status .LoadBalancerConfigured = true
@@ -390,7 +395,7 @@ func (r *DockerMachineReconciler) reconcileNormal(ctx context.Context, cluster *
390
395
return ctrl.Result {}, nil
391
396
}
392
397
393
- func (r * DockerMachineReconciler ) reconcileDelete (ctx context.Context , machine * clusterv1.Machine , dockerMachine * infrav1.DockerMachine , externalMachine * docker.Machine , externalLoadBalancer * docker.LoadBalancer ) error {
398
+ func (r * DockerMachineReconciler ) reconcileDelete (ctx context.Context , dockerCluster * infrav1. DockerCluster , machine * clusterv1.Machine , dockerMachine * infrav1.DockerMachine , externalMachine * docker.Machine , externalLoadBalancer * docker.LoadBalancer ) error {
394
399
// Set the ContainerProvisionedCondition reporting delete is started, and issue a patch in order to make
395
400
// this visible to the users.
396
401
// NB. The operation in docker is fast, so there is the chance the user will not notice the status change;
@@ -411,7 +416,11 @@ func (r *DockerMachineReconciler) reconcileDelete(ctx context.Context, machine *
411
416
412
417
// if the deleted machine is a control-plane node, remove it from the load balancer configuration;
413
418
if util .IsControlPlaneMachine (machine ) {
414
- if err := externalLoadBalancer .UpdateConfiguration (ctx ); err != nil {
419
+ unsafeLoadBalancerConfigTemplate , err := r .getUnsafeLoadBalancerConfigTemplate (ctx , dockerCluster )
420
+ if err != nil {
421
+ return errors .Wrap (err , "failed to retrieve HAProxy configuration from CustomHAProxyConfigTemplateRef" )
422
+ }
423
+ if err := externalLoadBalancer .UpdateConfiguration (ctx , unsafeLoadBalancerConfigTemplate ); err != nil {
415
424
return errors .Wrap (err , "failed to update DockerCluster.loadbalancer configuration" )
416
425
}
417
426
}
@@ -510,6 +519,25 @@ func (r *DockerMachineReconciler) getBootstrapData(ctx context.Context, machine
510
519
return base64 .StdEncoding .EncodeToString (value ), bootstrapv1 .Format (format ), nil
511
520
}
512
521
522
+ func (r * DockerMachineReconciler ) getUnsafeLoadBalancerConfigTemplate (ctx context.Context , dockerCluster * infrav1.DockerCluster ) (string , error ) {
523
+ if dockerCluster .Spec .LoadBalancer .CustomHAProxyConfigTemplateRef == nil {
524
+ return "" , nil
525
+ }
526
+ var cm * corev1.ConfigMap
527
+ key := types.NamespacedName {
528
+ Name : dockerCluster .Spec .LoadBalancer .CustomHAProxyConfigTemplateRef .Name ,
529
+ Namespace : dockerCluster .Namespace ,
530
+ }
531
+ if err := r .Get (ctx , key , cm ); err != nil {
532
+ return "" , errors .Wrapf (err , "failed to retrieve custom HAProxy configuration ConfigMap %s" , key )
533
+ }
534
+ template , ok := cm .Data ["value" ]
535
+ if ! ok {
536
+ return "" , fmt .Errorf ("expected key \" value\" to exist in ConfigMap %s" , key )
537
+ }
538
+ return template , nil
539
+ }
540
+
513
541
// setMachineAddress gets the address from the container corresponding to a docker node and sets it on the Machine object.
514
542
func setMachineAddress (ctx context.Context , dockerMachine * infrav1.DockerMachine , externalMachine * docker.Machine ) error {
515
543
machineAddresses , err := externalMachine .Address (ctx )
0 commit comments