Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 7fe5514

Browse files
committed
Create instances with routed IPs
1 parent db30535 commit 7fe5514

File tree

1 file changed

+49
-32
lines changed

1 file changed

+49
-32
lines changed

pkg/service/scaleway/instance/instance.go

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"errors"
77
"fmt"
8+
"text/template"
89

910
"github.com/Tomy2e/cluster-api-provider-scaleway/pkg/scope"
1011
"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) {
5152

5253
if ip == nil {
5354
ipResp, err := s.ScalewayClient.Instance.CreateIP(&instance.CreateIPRequest{
55+
Type: instance.IPTypeRoutedIPv4,
5456
Zone: s.Zone(),
5557
Tags: s.Tags(),
5658
})
@@ -88,19 +90,15 @@ func (s *Service) getOrCreateServer(ctx context.Context, ip *instance.IP) (*inst
8890
}
8991
}
9092

91-
bootType := instance.BootTypeLocal
9293
req := &instance.CreateServerRequest{
9394
Zone: s.Zone(),
9495
Name: s.Name(),
95-
BootType: &bootType,
9696
CommercialType: s.ScalewayMachine.Spec.Type,
9797
DynamicIPRequired: scw.BoolPtr(false),
98-
RoutedIPEnabled: scw.BoolPtr(false), // TODO: ip mobility
99-
EnableIPv6: true,
98+
RoutedIPEnabled: scw.BoolPtr(true),
10099
Image: imageID,
101100
Volumes: map[string]*instance.VolumeServerTemplate{
102101
"0": {
103-
//Name: "CAPS System Volume",
104102
Size: scw.SizePtr(rootSize),
105103
VolumeType: instance.VolumeVolumeTypeBSSD,
106104
Boot: scw.BoolPtr(true),
@@ -159,7 +157,10 @@ type machineIPs struct {
159157
External *string
160158
}
161159

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 {
163164
if m.Internal != nil {
164165
return *m.Internal
165166
}
@@ -195,11 +196,23 @@ func (s *Service) getMachineIPs(ctx context.Context, server *instance.Server, pn
195196
return m, nil
196197
}
197198

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)
201213
}
202-
return bytes.ReplaceAll(data, []byte("{{ MachineIP }}"), []byte(machineIPs.IP()))
214+
215+
return render.Bytes(), nil
203216
}
204217

205218
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,
221234
return err
222235
}
223236

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+
}
225244

226245
if err := s.ScalewayClient.Instance.SetServerUserData(&instance.SetServerUserDataRequest{
227246
Zone: server.Zone,
@@ -264,7 +283,7 @@ func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *in
264283
loadbalancer.ControlPlaneBackendName,
265284
)
266285
if err != nil {
267-
return nil, err
286+
return nil, fmt.Errorf("failed to find load balancer backend: %w", err)
268287
}
269288

270289
ips, err := s.getMachineIPs(ctx, server, pnic)
@@ -273,21 +292,21 @@ func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *in
273292
}
274293

275294
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()) {
278297
if _, err := s.ScalewayClient.LoadBalancer.RemoveBackendServers(&lb.ZonedAPIRemoveBackendServersRequest{
279298
Zone: s.Cluster.LoadBalancerZone(),
280299
BackendID: backend.ID,
281-
ServerIP: []string{ips.IP()},
300+
ServerIP: []string{ips.NodeIP()},
282301
}); err != nil {
283302
return nil, err
284303
}
285304
}
286-
case !deletion && !slices.Contains(backend.Pool, ips.IP()):
305+
case !deletion && !slices.Contains(backend.Pool, ips.NodeIP()):
287306
if _, err := s.ScalewayClient.LoadBalancer.AddBackendServers(&lb.ZonedAPIAddBackendServersRequest{
288307
Zone: s.Cluster.LoadBalancerZone(),
289308
BackendID: backend.ID,
290-
ServerIP: []string{ips.IP()},
309+
ServerIP: []string{ips.NodeIP()},
291310
}); err != nil {
292311
return nil, err
293312
}
@@ -329,21 +348,18 @@ func (s *Service) Reconcile(ctx context.Context) error {
329348

330349
s.ScalewayMachine.Status.Addresses = []v1beta1.MachineAddress{}
331350

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+
}
340357

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+
})
347363
}
348364

349365
return nil
@@ -375,7 +391,8 @@ func (s *Service) Delete(ctx context.Context) error {
375391
}
376392
}
377393

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) {
379396
return err
380397
}
381398
}

0 commit comments

Comments
 (0)