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

Commit 96bd35f

Browse files
committed
Support public clusters
1 parent a9fb1e3 commit 96bd35f

File tree

3 files changed

+48
-27
lines changed

3 files changed

+48
-27
lines changed

api/v1beta1/scalewaycluster_webhook.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,14 @@ func (r *ScalewayCluster) enforceImmutability(old *ScalewayCluster) error {
267267
allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "scalewaySecretName"), r.Spec.ScalewaySecretName, "field is immutable"))
268268
}
269269

270+
if r.Spec.Network == nil {
271+
r.Spec.Network = &NetworkSpec{}
272+
}
273+
274+
if old.Spec.Network == nil {
275+
old.Spec.Network = &NetworkSpec{}
276+
}
277+
270278
if !reflect.DeepEqual(r.Spec.Network.PrivateNetwork, old.Spec.Network.PrivateNetwork) {
271279
allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "network", "privateNetwork"), r.Spec.Network.PrivateNetwork, "field is immutable"))
272280
}

internal/service/scaleway/instance/instance.go

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ var (
2525
ErrInstanceNotStoppedYet = errors.New("instance is being stopped")
2626
)
2727

28+
var errMachineHasNoIP = errors.New("machine has no IP")
29+
2830
type Service struct {
2931
*scope.Machine
3032
}
@@ -203,7 +205,7 @@ func (s *Service) getMachineIPs(ctx context.Context, server *instance.Server, pn
203205
}
204206

205207
if m.External == nil && m.Internal == nil {
206-
return nil, errors.New("machine has no IP")
208+
return nil, errMachineHasNoIP
207209
}
208210

209211
return m, nil
@@ -344,15 +346,9 @@ func (s *Service) ensureLoadBalancerACL(ctx context.Context, publicIP *string) e
344346
return nil
345347
}
346348

347-
func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *instance.Server, pnic *instance.PrivateNIC, deletion bool) (*machineIPs, error) {
348-
// TODO: getMachineIPs out of this method
349-
ips, err := s.getMachineIPs(ctx, server, pnic)
350-
if err != nil {
351-
return nil, err
352-
}
353-
349+
func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *instance.Server, pnic *instance.PrivateNIC, ips *machineIPs, deletion bool) error {
354350
if !util.IsControlPlaneMachine(s.Machine.Machine) {
355-
return ips, nil
351+
return nil
356352
}
357353

358354
backend, err := s.ScalewayClient.FindLoadBalancerBackendByNames(
@@ -362,7 +358,7 @@ func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *in
362358
loadbalancer.ControlPlaneBackendName,
363359
)
364360
if err != nil {
365-
return nil, fmt.Errorf("failed to find load balancer backend: %w", err)
361+
return fmt.Errorf("failed to find load balancer backend: %w", err)
366362
}
367363

368364
switch {
@@ -373,7 +369,7 @@ func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *in
373369
BackendID: backend.ID,
374370
ServerIP: []string{ips.NodeIP()},
375371
}); err != nil {
376-
return nil, err
372+
return err
377373
}
378374
}
379375
case !deletion && !slices.Contains(backend.Pool, ips.NodeIP()):
@@ -382,11 +378,11 @@ func (s *Service) ensureControlPlaneLoadBalancer(ctx context.Context, server *in
382378
BackendID: backend.ID,
383379
ServerIP: []string{ips.NodeIP()},
384380
}); err != nil {
385-
return nil, err
381+
return err
386382
}
387383
}
388384

389-
return ips, nil
385+
return nil
390386
}
391387

392388
func (s *Service) Reconcile(ctx context.Context) error {
@@ -405,11 +401,15 @@ func (s *Service) Reconcile(ctx context.Context) error {
405401
return err
406402
}
407403

408-
machineIPs, err := s.ensureControlPlaneLoadBalancer(ctx, server, pnic, false)
404+
machineIPs, err := s.getMachineIPs(ctx, server, pnic)
409405
if err != nil {
410406
return err
411407
}
412408

409+
if err := s.ensureControlPlaneLoadBalancer(ctx, server, pnic, machineIPs, false); err != nil {
410+
return err
411+
}
412+
413413
if err := s.ensureLoadBalancerACL(ctx, machineIPs.External); err != nil {
414414
return err
415415
}
@@ -474,9 +474,16 @@ func (s *Service) Delete(ctx context.Context) error {
474474
}
475475
}
476476

477-
_, err := s.ensureControlPlaneLoadBalancer(ctx, server, pnic, true)
478-
if err != nil && !errors.Is(err, client.ErrNoItemFound) {
479-
return err
477+
machineIPs, err := s.getMachineIPs(ctx, server, pnic)
478+
if err != nil && !errors.Is(err, errMachineHasNoIP) {
479+
return fmt.Errorf("failed to get machine IPs for control-plane machine: %w", err)
480+
}
481+
482+
if machineIPs != nil {
483+
err = s.ensureControlPlaneLoadBalancer(ctx, server, pnic, machineIPs, true)
484+
if err != nil && !errors.Is(err, client.ErrNoItemFound) {
485+
return err
486+
}
480487
}
481488
}
482489

internal/service/scaleway/loadbalancer/loadbalancer.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ func (s *Service) getOrCreateLB(ctx context.Context, zone scw.Zone) (*lb.LB, err
6666
return loadbalancer, nil
6767
}
6868

69-
func (s *Service) ensurePrivateNetwork(ctx context.Context, loadbalancer *lb.LB, pnID string) error {
70-
if !s.HasPrivateNetwork() {
69+
func (s *Service) ensurePrivateNetwork(ctx context.Context, loadbalancer *lb.LB, pnID *string) error {
70+
if pnID == nil {
7171
return nil
7272
}
7373

@@ -80,14 +80,14 @@ func (s *Service) ensurePrivateNetwork(ctx context.Context, loadbalancer *lb.LB,
8080
}
8181

8282
found := slices.IndexFunc(lbPNs.PrivateNetwork, func(lbPN *lb.PrivateNetwork) bool {
83-
return lbPN.PrivateNetworkID == pnID
83+
return lbPN.PrivateNetworkID == *pnID
8484
})
8585

8686
if found == -1 {
8787
if _, err := s.ScalewayClient.LoadBalancer.AttachPrivateNetwork(&lb.ZonedAPIAttachPrivateNetworkRequest{
8888
Zone: loadbalancer.Zone,
8989
LBID: loadbalancer.ID,
90-
PrivateNetworkID: pnID,
90+
PrivateNetworkID: *pnID,
9191
IpamConfig: &lb.PrivateNetworkIpamConfig{},
9292
}, scw.WithContext(ctx)); err != nil {
9393
return err
@@ -239,7 +239,7 @@ func (s *Service) ensureACL(ctx context.Context, frontendID, name string, ips []
239239
return nil
240240
}
241241

242-
func (s *Service) ensureACLs(ctx context.Context, frontend *lb.Frontend, pnID string) error {
242+
func (s *Service) ensureACLs(ctx context.Context, frontend *lb.Frontend, pnID *string) error {
243243
// Set the Allowed Ranges ACL.
244244
var (
245245
allowedRanges []string
@@ -256,8 +256,8 @@ func (s *Service) ensureACLs(ctx context.Context, frontend *lb.Frontend, pnID st
256256
}
257257

258258
// Set the Public Gateway ACL.
259-
if s.HasPrivateNetwork() {
260-
gws, err := s.ScalewayClient.FindGatewaysByPrivateNetworkID(ctx, s.Zones(s.ScalewayClient.VPCGW.Zones()), pnID)
259+
if pnID != nil && s.HasPrivateNetwork() {
260+
gws, err := s.ScalewayClient.FindGatewaysByPrivateNetworkID(ctx, s.Zones(s.ScalewayClient.VPCGW.Zones()), *pnID)
261261
if err != nil {
262262
return err
263263
}
@@ -294,9 +294,15 @@ func (s *Service) Reconcile(ctx context.Context) error {
294294
return ErrLoadBalancerNotReady
295295
}
296296

297-
pnID, err := s.PrivateNetworkID()
298-
if err != nil {
299-
return err
297+
var pnID *string
298+
299+
if s.HasPrivateNetwork() {
300+
tmpPNID, err := s.PrivateNetworkID()
301+
if err != nil {
302+
return err
303+
}
304+
305+
pnID = &tmpPNID
300306
}
301307

302308
if err := s.ensurePrivateNetwork(ctx, loadbalancer, pnID); err != nil {

0 commit comments

Comments
 (0)