5
5
"context"
6
6
"errors"
7
7
"fmt"
8
+ "text/template"
8
9
9
10
"github.com/Tomy2e/cluster-api-provider-scaleway/pkg/scope"
10
11
"github.com/Tomy2e/cluster-api-provider-scaleway/pkg/service/scaleway/client"
@@ -51,6 +52,7 @@ func (s *Service) getOrCreateIP(ctx context.Context) (*instance.IP, error) {
51
52
52
53
if ip == nil {
53
54
ipResp , err := s .ScalewayClient .Instance .CreateIP (& instance.CreateIPRequest {
55
+ Type : instance .IPTypeRoutedIPv4 ,
54
56
Zone : s .Zone (),
55
57
Tags : s .Tags (),
56
58
})
@@ -88,19 +90,15 @@ func (s *Service) getOrCreateServer(ctx context.Context, ip *instance.IP) (*inst
88
90
}
89
91
}
90
92
91
- bootType := instance .BootTypeLocal
92
93
req := & instance.CreateServerRequest {
93
94
Zone : s .Zone (),
94
95
Name : s .Name (),
95
- BootType : & bootType ,
96
96
CommercialType : s .ScalewayMachine .Spec .Type ,
97
97
DynamicIPRequired : scw .BoolPtr (false ),
98
- RoutedIPEnabled : scw .BoolPtr (false ), // TODO: ip mobility
99
- EnableIPv6 : true ,
98
+ RoutedIPEnabled : scw .BoolPtr (true ),
100
99
Image : imageID ,
101
100
Volumes : map [string ]* instance.VolumeServerTemplate {
102
101
"0" : {
103
- //Name: "CAPS System Volume",
104
102
Size : scw .SizePtr (rootSize ),
105
103
VolumeType : instance .VolumeVolumeTypeBSSD ,
106
104
Boot : scw .BoolPtr (true ),
@@ -159,7 +157,10 @@ type machineIPs struct {
159
157
External * string
160
158
}
161
159
162
- func (m * machineIPs ) IP () string {
160
+ // NodeIP returns the main IP of the node. This IP will be used for communications
161
+ // between the LoadBalancer and the control-plane nodes. It can also be used as an
162
+ // IP to advertise in the cluster.
163
+ func (m * machineIPs ) NodeIP () string {
163
164
if m .Internal != nil {
164
165
return * m .Internal
165
166
}
@@ -195,11 +196,23 @@ func (s *Service) getMachineIPs(ctx context.Context, server *instance.Server, pn
195
196
return m , nil
196
197
}
197
198
198
- func patchBootstrapData (data []byte , machineIPs * machineIPs ) []byte {
199
- if machineIPs == nil {
200
- return data
199
+ type bootstrapValues struct {
200
+ NodeIP string
201
+ ProviderID string
202
+ }
203
+
204
+ func patchBootstrapData (data []byte , values * bootstrapValues ) ([]byte , error ) {
205
+ tmpl , err := template .New ("bootstrap" ).Delims ("[[[" , "]]]" ).Parse (string (data ))
206
+ if err != nil {
207
+ return nil , fmt .Errorf ("unable to parse bootstrap data template: %w" , err )
208
+ }
209
+ render := bytes.Buffer {}
210
+
211
+ if err := tmpl .Execute (& render , values ); err != nil {
212
+ return nil , fmt .Errorf ("failed to execute bootstrap data template: %w" , err )
201
213
}
202
- return bytes .ReplaceAll (data , []byte ("{{ MachineIP }}" ), []byte (machineIPs .IP ()))
214
+
215
+ return render .Bytes (), nil
203
216
}
204
217
205
218
func (s * Service ) ensureCloudInit (ctx context.Context , server * instance.Server , machineIPs * machineIPs ) error {
@@ -221,7 +234,13 @@ func (s *Service) ensureCloudInit(ctx context.Context, server *instance.Server,
221
234
return err
222
235
}
223
236
224
- bootstrapData = patchBootstrapData (bootstrapData , machineIPs )
237
+ bootstrapData , err = patchBootstrapData (bootstrapData , & bootstrapValues {
238
+ NodeIP : machineIPs .NodeIP (),
239
+ ProviderID : s .ProviderID (server .ID ),
240
+ })
241
+ if err != nil {
242
+ return err
243
+ }
225
244
226
245
if err := s .ScalewayClient .Instance .SetServerUserData (& instance.SetServerUserDataRequest {
227
246
Zone : server .Zone ,
@@ -264,7 +283,7 @@ func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *in
264
283
loadbalancer .ControlPlaneBackendName ,
265
284
)
266
285
if err != nil {
267
- return nil , err
286
+ return nil , fmt . Errorf ( "failed to find load balancer backend: %w" , err )
268
287
}
269
288
270
289
ips , err := s .getMachineIPs (ctx , server , pnic )
@@ -273,21 +292,21 @@ func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *in
273
292
}
274
293
275
294
switch {
276
- case deletion && slices .Contains (backend .Pool , ips .IP ()):
277
- if slices .Contains (backend .Pool , ips .IP ()) {
295
+ case deletion && slices .Contains (backend .Pool , ips .NodeIP ()):
296
+ if slices .Contains (backend .Pool , ips .NodeIP ()) {
278
297
if _ , err := s .ScalewayClient .LoadBalancer .RemoveBackendServers (& lb.ZonedAPIRemoveBackendServersRequest {
279
298
Zone : s .Cluster .LoadBalancerZone (),
280
299
BackendID : backend .ID ,
281
- ServerIP : []string {ips .IP ()},
300
+ ServerIP : []string {ips .NodeIP ()},
282
301
}); err != nil {
283
302
return nil , err
284
303
}
285
304
}
286
- case ! deletion && ! slices .Contains (backend .Pool , ips .IP ()):
305
+ case ! deletion && ! slices .Contains (backend .Pool , ips .NodeIP ()):
287
306
if _ , err := s .ScalewayClient .LoadBalancer .AddBackendServers (& lb.ZonedAPIAddBackendServersRequest {
288
307
Zone : s .Cluster .LoadBalancerZone (),
289
308
BackendID : backend .ID ,
290
- ServerIP : []string {ips .IP ()},
309
+ ServerIP : []string {ips .NodeIP ()},
291
310
}); err != nil {
292
311
return nil , err
293
312
}
@@ -329,21 +348,18 @@ func (s *Service) Reconcile(ctx context.Context) error {
329
348
330
349
s .ScalewayMachine .Status .Addresses = []v1beta1.MachineAddress {}
331
350
332
- // TODO: make sure it's never nil.
333
- if machineIPs != nil {
334
- if machineIPs .External != nil {
335
- s .ScalewayMachine .Status .Addresses = append (s .ScalewayMachine .Status .Addresses , v1beta1.MachineAddress {
336
- Type : v1beta1 .MachineExternalIP ,
337
- Address : * machineIPs .External ,
338
- })
339
- }
351
+ if machineIPs .External != nil {
352
+ s .ScalewayMachine .Status .Addresses = append (s .ScalewayMachine .Status .Addresses , v1beta1.MachineAddress {
353
+ Type : v1beta1 .MachineExternalIP ,
354
+ Address : * machineIPs .External ,
355
+ })
356
+ }
340
357
341
- if machineIPs .Internal != nil {
342
- s .ScalewayMachine .Status .Addresses = append (s .ScalewayMachine .Status .Addresses , v1beta1.MachineAddress {
343
- Type : v1beta1 .MachineInternalIP ,
344
- Address : * machineIPs .Internal ,
345
- })
346
- }
358
+ if machineIPs .Internal != nil {
359
+ s .ScalewayMachine .Status .Addresses = append (s .ScalewayMachine .Status .Addresses , v1beta1.MachineAddress {
360
+ Type : v1beta1 .MachineInternalIP ,
361
+ Address : * machineIPs .Internal ,
362
+ })
347
363
}
348
364
349
365
return nil
@@ -375,7 +391,8 @@ func (s *Service) Delete(ctx context.Context) error {
375
391
}
376
392
}
377
393
378
- if _ , err := s .ensureControlPlaneLoadBalancer (ctx , server , pnic , true ); err != nil {
394
+ _ , err := s .ensureControlPlaneLoadBalancer (ctx , server , pnic , true )
395
+ if err != nil && ! errors .Is (err , client .ErrNoItemFound ) {
379
396
return err
380
397
}
381
398
}
0 commit comments