@@ -25,6 +25,7 @@ import (
2525 "github.com/pkg/errors"
2626 corev1 "k8s.io/api/core/v1"
2727 apierrors "k8s.io/apimachinery/pkg/api/errors"
28+ "k8s.io/apimachinery/pkg/types"
2829 "k8s.io/klog/v2"
2930 ctrl "sigs.k8s.io/controller-runtime"
3031 "sigs.k8s.io/controller-runtime/pkg/builder"
@@ -167,11 +168,11 @@ func (r *DockerMachineReconciler) Reconcile(ctx context.Context, req ctrl.Reques
167168
168169 // Handle deleted machines
169170 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 )
171172 }
172173
173174 // 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 )
175176 // Requeue if the reconcile failed because the ClusterCacheTracker was locked for
176177 // the current cluster because of concurrent access.
177178 if errors .Is (err , remote .ErrClusterLocked ) {
@@ -204,7 +205,7 @@ func patchDockerMachine(ctx context.Context, patchHelper *patch.Helper, dockerMa
204205 )
205206}
206207
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 ) {
208209 log := ctrl .LoggerFrom (ctx )
209210
210211 // 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 *
271272 // we should only do this once, as reconfiguration more or less ensures
272273 // node ref setting fails
273274 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 {
275280 return ctrl.Result {}, errors .Wrap (err , "failed to update DockerCluster.loadbalancer configuration" )
276281 }
277282 dockerMachine .Status .LoadBalancerConfigured = true
@@ -390,7 +395,7 @@ func (r *DockerMachineReconciler) reconcileNormal(ctx context.Context, cluster *
390395 return ctrl.Result {}, nil
391396}
392397
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 {
394399 // Set the ContainerProvisionedCondition reporting delete is started, and issue a patch in order to make
395400 // this visible to the users.
396401 // 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 *
411416
412417 // if the deleted machine is a control-plane node, remove it from the load balancer configuration;
413418 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 {
415424 return errors .Wrap (err , "failed to update DockerCluster.loadbalancer configuration" )
416425 }
417426 }
@@ -510,6 +519,25 @@ func (r *DockerMachineReconciler) getBootstrapData(ctx context.Context, machine
510519 return base64 .StdEncoding .EncodeToString (value ), bootstrapv1 .Format (format ), nil
511520}
512521
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+
513541// setMachineAddress gets the address from the container corresponding to a docker node and sets it on the Machine object.
514542func setMachineAddress (ctx context.Context , dockerMachine * infrav1.DockerMachine , externalMachine * docker.Machine ) error {
515543 machineAddresses , err := externalMachine .Address (ctx )
0 commit comments