@@ -5,12 +5,14 @@ package taints
55
66import  (
77	"context" 
8+ 	"fmt" 
89	"strings" 
910
1011	"github.com/samber/lo" 
1112	v1 "k8s.io/api/core/v1" 
1213	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" 
1314	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 
15+ 	"k8s.io/apimachinery/pkg/runtime" 
1416	bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" 
1517	runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1" 
1618	ctrl "sigs.k8s.io/controller-runtime" 
@@ -48,6 +50,10 @@ func newTaintsWorkerPatchHandler(
4850	}
4951}
5052
53+ type  KubeletRegisterOptions  struct  {
54+ 	RegisterWithTaints  []v1.Taint  `json:"registerWithTaints,omitempty"` 
55+ }
56+ 
5157func  (h  * taintsWorkerPatchHandler ) Mutate (
5258	ctx  context.Context ,
5359	obj  * unstructured.Unstructured ,
@@ -103,25 +109,36 @@ func (h *taintsWorkerPatchHandler) Mutate(
103109
104110	if  err  :=  patches .MutateIfApplicable (
105111		obj , vars , & holderRef ,
106- 		selectors .WorkersConfigTemplateSelector (eksbootstrapv1 .GroupVersion .String (), "EKSConfigTemplate " ), log ,
107- 		func (obj  * eksbootstrapv1.EKSConfigTemplate ) error  {
112+ 		selectors .WorkersConfigTemplateSelector (eksbootstrapv1 .GroupVersion .String (), "NodeadmConfigTemplate " ), log ,
113+ 		func (obj  * eksbootstrapv1.NodeadmConfigTemplate ) error  {
108114			log .WithValues (
109115				"patchedObjectKind" , obj .GetObjectKind ().GroupVersionKind ().String (),
110116				"patchedObjectName" , ctrlclient .ObjectKeyFromObject (obj ),
111- 			).Info ("adding taints to worker node EKS config template" )
112- 			if  obj .Spec .Template .Spec .KubeletExtraArgs  ==  nil  {
113- 				obj .Spec .Template .Spec .KubeletExtraArgs  =  make (map [string ]string , 1 )
117+ 			).Info ("adding taints to worker NodeadmConfig template" )
118+ 			kubeletOptions  :=  obj .Spec .Template .Spec .Kubelet 
119+ 			var  runtimeConfigFromNodeadm  * runtime.RawExtension 
120+ 			var  flags  []string 
121+ 			newTaints  :=  toEKSConfigTaints (taintsVar )
122+ 			hasRegisterTaintsFlag  :=  false 
123+ 			if  kubeletOptions  !=  nil  {
124+ 				runtimeConfigFromNodeadm  =  kubeletOptions .Config 
125+ 				for  _ , flag  :=  range  kubeletOptions .Flags  {
126+ 					if  strings .HasPrefix (flag , "--register-with-taints=" ) {
127+ 						hasRegisterTaintsFlag  =  true 
128+ 						existingTaints  :=  strings .Split (flag , "--register-with-taints=" )
129+ 						flags  =  append (flags , fmt .Sprintf ("--register-with-taints=%s,%s" , existingTaints , newTaints ))
130+ 						continue 
131+ 					}
132+ 					flags  =  append (flags , flag )
133+ 				}
114134			}
115- 
116- 			existingTaintsFlagValue  :=  obj .Spec .Template .Spec .KubeletExtraArgs ["register-with-taints" ]
117- 
118- 			newTaintsFlagValue  :=  toEKSConfigTaints (taintsVar )
119- 
120- 			if  existingTaintsFlagValue  !=  ""  {
121- 				newTaintsFlagValue  =  existingTaintsFlagValue  +  ","  +  newTaintsFlagValue 
135+ 			if  ! hasRegisterTaintsFlag  {
136+ 				flags  =  append (flags , fmt .Sprintf ("--register-with-taints=%s" , newTaints ))
137+ 			}
138+ 			obj .Spec .Template .Spec .Kubelet  =  & eksbootstrapv1.KubeletOptions {
139+ 				Flags :  flags ,
140+ 				Config : runtimeConfigFromNodeadm ,
122141			}
123- 
124- 			obj .Spec .Template .Spec .KubeletExtraArgs ["register-with-taints" ] =  newTaintsFlagValue 
125142			return  nil 
126143		}); err  !=  nil  {
127144		return  err 
0 commit comments