@@ -143,8 +143,40 @@ func (a *ACKManaged) UserData(ctx context.Context,
143
143
taints []corev1.Taint ,
144
144
kubeletCfg * v1alpha1.KubeletConfiguration ,
145
145
userData * string ) (string , error ) {
146
+
147
+ attach , err := a .getClusterAttachScripts (ctx )
148
+ if err != nil {
149
+ return "" , err
150
+ }
151
+ ackScript := a .ackBootstrap (attach , labels , taints , kubeletCfg )
152
+ cloudInit := NewCloudInit ()
153
+
154
+ if err := cloudInit .Merge (& ackScript ); err != nil {
155
+ return "" , err
156
+ }
157
+ if err := cloudInit .Merge (userData ); err != nil {
158
+ return "" , err
159
+ }
160
+
161
+ return cloudInit .Script ()
162
+ }
163
+
164
+ func (a * ACKManaged ) FeatureFlags () FeatureFlags {
165
+ if cni , err := a .GetClusterCNI (context .TODO ()); err == nil && cni == ClusterCNITypeFlannel {
166
+ return FeatureFlags {
167
+ PodsPerCoreEnabled : false ,
168
+ SupportsENILimitedPodDensity : false ,
169
+ }
170
+ }
171
+ return FeatureFlags {
172
+ PodsPerCoreEnabled : true ,
173
+ SupportsENILimitedPodDensity : true ,
174
+ }
175
+ }
176
+
177
+ func (a * ACKManaged ) getClusterAttachScripts (ctx context.Context ) (string , error ) {
146
178
if cachedScript , ok := a .cache .Get (a .clusterID ); ok {
147
- return a . resolveUserData ( cachedScript .(string ), labels , taints , kubeletCfg , userData ), nil
179
+ return cachedScript .(string ), nil
148
180
}
149
181
150
182
reqPara := & ackclient.DescribeClusterAttachScriptsRequest {
@@ -174,20 +206,7 @@ func (a *ACKManaged) UserData(ctx context.Context,
174
206
}
175
207
176
208
a .cache .SetDefault (a .clusterID , respStr )
177
- return a .resolveUserData (respStr , labels , taints , kubeletCfg , userData ), nil
178
- }
179
-
180
- func (a * ACKManaged ) FeatureFlags () FeatureFlags {
181
- if cni , err := a .GetClusterCNI (context .TODO ()); err == nil && cni == ClusterCNITypeFlannel {
182
- return FeatureFlags {
183
- PodsPerCoreEnabled : false ,
184
- SupportsENILimitedPodDensity : false ,
185
- }
186
- }
187
- return FeatureFlags {
188
- PodsPerCoreEnabled : true ,
189
- SupportsENILimitedPodDensity : true ,
190
- }
209
+ return respStr , nil
191
210
}
192
211
193
212
// We need to manually retrieve the runtime configuration of the nodepool, with the default node pool prioritized.
@@ -239,21 +258,13 @@ func (a *ACKManaged) getClusterAttachRuntimeConfiguration(ctx context.Context) (
239
258
tea .StringValue (targetNodepool .KubernetesConfig .RuntimeVersion ), nil
240
259
}
241
260
242
- func (a * ACKManaged ) resolveUserData (respStr string , labels map [string ]string , taints []corev1.Taint ,
243
- kubeletCfg * v1alpha1.KubeletConfiguration , userData * string ) string {
244
- preUserData , postUserData := parseCustomUserData (userData )
261
+ func (a * ACKManaged ) ackBootstrap (respStr string , labels map [string ]string , taints []corev1.Taint ,
262
+ kubeletCfg * v1alpha1.KubeletConfiguration ) string {
245
263
246
264
var script bytes.Buffer
247
265
// Add bash script header
248
266
script .WriteString ("#!/bin/bash\n \n " )
249
267
250
- // Insert preUserData if available
251
- if preUserData != "" {
252
- // Pre-userData: scripts to be executed before node registration
253
- script .WriteString ("echo \" Executing preUserData...\" \n " )
254
- script .WriteString (preUserData + "\n \n " )
255
- }
256
-
257
268
// Clean up the input string
258
269
script .WriteString (respStr + " " )
259
270
// Add labels
@@ -264,15 +275,7 @@ func (a *ACKManaged) resolveUserData(respStr string, labels map[string]string, t
264
275
// Add taints
265
276
script .WriteString (fmt .Sprintf ("--taints %s\n \n " , a .formatTaints (taints )))
266
277
267
- // Insert postUserData if available
268
- if postUserData != "" {
269
- // Post-userData: scripts to be executed after node registration
270
- script .WriteString ("echo \" Executing postUserData...\" \n " )
271
- script .WriteString (postUserData + "\n " )
272
- }
273
-
274
- // Encode to base64
275
- return base64 .StdEncoding .EncodeToString (script .Bytes ())
278
+ return script .String ()
276
279
}
277
280
278
281
func (a * ACKManaged ) formatLabels (labels map [string ]string ) string {
@@ -310,16 +313,3 @@ func convertNodeClassKubeletConfigToACKNodeConfig(kubeletCfg *v1alpha1.KubeletCo
310
313
}
311
314
return base64 .StdEncoding .EncodeToString (data )
312
315
}
313
-
314
- const userDataSeparator = "#===USERDATA_SEPARATOR==="
315
-
316
- // By default, the UserData is executed after the node registration is completed.
317
- // If a user requires tasks to be executed both before and after node registration,
318
- // they must split the userdata into preUserData and postUserData using a SEPARATOR.
319
- func parseCustomUserData (userData * string ) (string , string ) {
320
- parts := strings .Split (tea .StringValue (userData ), userDataSeparator )
321
- if len (parts ) == 2 {
322
- return strings .TrimSpace (parts [0 ]), strings .TrimSpace (parts [1 ])
323
- }
324
- return "" , tea .StringValue (userData )
325
- }
0 commit comments