@@ -189,6 +189,23 @@ func (s *Service) Reconcile(ctx context.Context) (res reconcile.Result, err erro
189
189
return res , nil
190
190
}
191
191
192
+ // implements setting rate limit on hcloudmachine.
193
+ func handleRateLimit (hm * infrav1.HCloudMachine , err error , functionName string , errMsg string ) error {
194
+ // returns error if not a rate limit exceeded error
195
+ if ! hcloud .IsError (err , hcloud .ErrorCodeRateLimitExceeded ) {
196
+ return fmt .Errorf ("%s: %w" , errMsg , err )
197
+ }
198
+
199
+ // does not return error if machine is running and does not have a deletion timestamp
200
+ if hm .Status .Ready && hm .DeletionTimestamp .IsZero () {
201
+ return nil
202
+ }
203
+
204
+ // check for a rate limit exceeded error if the machine is not running or if machine has a deletion timestamp
205
+ hcloudutil .HandleRateLimitExceeded (hm , err , functionName )
206
+ return fmt .Errorf ("%s: %w" , errMsg , err )
207
+ }
208
+
192
209
// Delete implements delete method of server.
193
210
func (s * Service ) Delete (ctx context.Context ) (res reconcile.Result , err error ) {
194
211
server , err := s .findServer (ctx )
@@ -246,12 +263,11 @@ func (s *Service) reconcileNetworkAttachment(ctx context.Context, server *hcloud
246
263
ID : s .scope .HetznerCluster .Status .Network .ID ,
247
264
},
248
265
}); err != nil {
249
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "AttachServerToNetwork" )
250
266
// check if network status is old and server is in fact already attached
251
267
if hcloud .IsError (err , hcloud .ErrorCodeServerAlreadyAttached ) {
252
268
return nil
253
269
}
254
- return fmt . Errorf ( " failed to attach server to network: %w" , err )
270
+ return handleRateLimit ( s . scope . HCloudMachine , err , "AttachServerToNetwork" , " failed to attach server to network" )
255
271
}
256
272
257
273
return nil
@@ -308,11 +324,11 @@ func (s *Service) reconcileLoadBalancerAttachment(ctx context.Context, server *h
308
324
}
309
325
310
326
if err := s .scope .HCloudClient .AddTargetServerToLoadBalancer (ctx , opts , loadBalancer ); err != nil {
311
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "AddTargetServerToLoadBalancer" )
312
327
if hcloud .IsError (err , hcloud .ErrorCodeTargetAlreadyDefined ) {
313
328
return reconcile.Result {}, nil
314
329
}
315
- return reconcile.Result {}, fmt .Errorf ("failed to add server %s with ID %d as target to load balancer: %w" , server .Name , server .ID , err )
330
+ errMsg := fmt .Sprintf ("failed to add server %s with ID %d as target to load balancer" , server .Name , server .ID )
331
+ return reconcile.Result {}, handleRateLimit (s .scope .HCloudMachine , err , "AddTargetServerToLoadBalancer" , errMsg )
316
332
}
317
333
318
334
record .Eventf (
@@ -429,8 +445,7 @@ func (s *Service) createServer(ctx context.Context) (*hcloud.Server, error) {
429
445
// get all ssh keys that are stored in HCloud API
430
446
sshKeysAPI , err := s .scope .HCloudClient .ListSSHKeys (ctx , hcloud.SSHKeyListOpts {})
431
447
if err != nil {
432
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "ListSSHKeys" )
433
- return nil , fmt .Errorf ("failed listing ssh heys from hcloud: %w" , err )
448
+ return nil , handleRateLimit (s .scope .HCloudMachine , err , "ListSSHKeys" , "failed listing ssh keys from hcloud" )
434
449
}
435
450
436
451
// find matching keys and store them
@@ -479,8 +494,8 @@ func (s *Service) createServer(ctx context.Context) (*hcloud.Server, error) {
479
494
s .scope .Name (),
480
495
err ,
481
496
)
482
- err = errors . Join ( errServerCreateNotPossible , err )
483
- return nil , fmt . Errorf ( "failed to create HCloud server %s: %w" , s .scope .HCloudMachine . Name , err )
497
+ errMsg := fmt . Sprintf ( "failed to create HCloud server %s" , s . scope . HCloudMachine . Name )
498
+ return nil , handleRateLimit ( s .scope .HCloudMachine , err , "CreateServer" , errMsg )
484
499
}
485
500
486
501
// set ssh keys to status
@@ -497,8 +512,7 @@ func (s *Service) getServerImage(ctx context.Context) (*hcloud.Image, error) {
497
512
// Get server type so we can filter for images with correct architecture
498
513
serverType , err := s .scope .HCloudClient .GetServerType (ctx , string (s .scope .HCloudMachine .Spec .Type ))
499
514
if err != nil {
500
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "GetServerType" )
501
- return nil , fmt .Errorf ("failed to get server type in HCloud: %w" , err )
515
+ return nil , handleRateLimit (s .scope .HCloudMachine , err , "GetServerType" , "failed to get server type in HCloud" )
502
516
}
503
517
if serverType == nil {
504
518
conditions .MarkFalse (
@@ -522,8 +536,7 @@ func (s *Service) getServerImage(ctx context.Context) (*hcloud.Image, error) {
522
536
523
537
images , err := s .scope .HCloudClient .ListImages (ctx , listOpts )
524
538
if err != nil {
525
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "ListImages" )
526
- return nil , fmt .Errorf ("failed to list images by label in HCloud: %w" , err )
539
+ return nil , handleRateLimit (s .scope .HCloudMachine , err , "ListImages" , "failed to list images by label in HCloud" )
527
540
}
528
541
529
542
// query for an existing image by name.
@@ -533,8 +546,7 @@ func (s *Service) getServerImage(ctx context.Context) (*hcloud.Image, error) {
533
546
}
534
547
imagesByName , err := s .scope .HCloudClient .ListImages (ctx , listOpts )
535
548
if err != nil {
536
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "ListImages" )
537
- return nil , fmt .Errorf ("failed to list images by name in HCloud: %w" , err )
549
+ return nil , handleRateLimit (s .scope .HCloudMachine , err , "ListImages" , "failed to list images by name in HCloud" )
538
550
}
539
551
540
552
images = append (images , imagesByName ... )
@@ -577,12 +589,11 @@ func (s *Service) handleServerStatusOff(ctx context.Context, server *hcloud.Serv
577
589
if time .Now ().Before (serverAvailableCondition .LastTransitionTime .Time .Add (serverOffTimeout )) {
578
590
// Not yet timed out, try again to power on
579
591
if err := s .scope .HCloudClient .PowerOnServer (ctx , server ); err != nil {
580
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "PowerOnServer" )
581
592
if hcloud .IsError (err , hcloud .ErrorCodeLocked ) {
582
593
// if server is locked, we just retry again
583
594
return reconcile.Result {RequeueAfter : 30 * time .Second }, nil
584
595
}
585
- return reconcile.Result {}, fmt . Errorf ( " failed to power on server: %w" , err )
596
+ return reconcile.Result {}, handleRateLimit ( s . scope . HCloudMachine , err , "PowerOnServer" , " failed to power on server" )
586
597
}
587
598
} else {
588
599
// Timed out. Set failure reason
@@ -592,12 +603,11 @@ func (s *Service) handleServerStatusOff(ctx context.Context, server *hcloud.Serv
592
603
} else {
593
604
// No condition set yet. Try to power server on.
594
605
if err := s .scope .HCloudClient .PowerOnServer (ctx , server ); err != nil {
595
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "PowerOnServer" )
596
606
if hcloud .IsError (err , hcloud .ErrorCodeLocked ) {
597
607
// if server is locked, we just retry again
598
608
return reconcile.Result {RequeueAfter : 30 * time .Second }, nil
599
609
}
600
- return reconcile.Result {}, fmt . Errorf ( " failed to power on server: %w" , err )
610
+ return reconcile.Result {}, handleRateLimit ( s . scope . HCloudMachine , err , "PowerOnServer" , " failed to power on server" )
601
611
}
602
612
conditions .MarkFalse (
603
613
s .scope .HCloudMachine ,
@@ -619,8 +629,7 @@ func (s *Service) handleDeleteServerStatusRunning(ctx context.Context, server *h
619
629
620
630
if s .scope .HasServerAvailableCondition () {
621
631
if err := s .scope .HCloudClient .ShutdownServer (ctx , server ); err != nil {
622
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "ShutdownServer" )
623
- return reconcile.Result {}, fmt .Errorf ("failed to shutdown server: %w" , err )
632
+ return reconcile.Result {}, handleRateLimit (s .scope .HCloudMachine , err , "ShutdownServer" , "failed to shutdown server" )
624
633
}
625
634
626
635
conditions .MarkFalse (s .scope .HCloudMachine ,
@@ -635,9 +644,8 @@ func (s *Service) handleDeleteServerStatusRunning(ctx context.Context, server *h
635
644
636
645
// timeout for shutdown has been reached - delete server
637
646
if err := s .scope .HCloudClient .DeleteServer (ctx , server ); err != nil {
638
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "DeleteServer" )
639
647
record .Warnf (s .scope .HCloudMachine , "FailedDeleteHCloudServer" , "Failed to delete HCloud server %s" , s .scope .Name ())
640
- return reconcile.Result {}, fmt . Errorf ( " failed to delete server: %w" , err )
648
+ return reconcile.Result {}, handleRateLimit ( s . scope . HCloudMachine , err , "DeleteServer" , " failed to delete server" )
641
649
}
642
650
643
651
record .Eventf (s .scope .HCloudMachine , "HCloudServerDeleted" , "HCloud server %s deleted" , s .scope .Name ())
@@ -647,9 +655,8 @@ func (s *Service) handleDeleteServerStatusRunning(ctx context.Context, server *h
647
655
func (s * Service ) handleDeleteServerStatusOff (ctx context.Context , server * hcloud.Server ) (res reconcile.Result , err error ) {
648
656
// server is off and can be deleted
649
657
if err := s .scope .HCloudClient .DeleteServer (ctx , server ); err != nil {
650
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "DeleteServer" )
651
658
record .Warnf (s .scope .HCloudMachine , "FailedDeleteHCloudServer" , "Failed to delete HCloud server %s" , s .scope .Name ())
652
- return reconcile.Result {}, fmt . Errorf ( " failed to delete server: %w" , err )
659
+ return reconcile.Result {}, handleRateLimit ( s . scope . HCloudMachine , err , "DeleteServer" , " failed to delete server" )
653
660
}
654
661
655
662
record .Eventf (s .scope .HCloudMachine , "HCloudServerDeleted" , "HCloud server %s deleted" , s .scope .Name ())
@@ -660,12 +667,12 @@ func (s *Service) deleteServerOfLoadBalancer(ctx context.Context, server *hcloud
660
667
lb := & hcloud.LoadBalancer {ID : s .scope .HetznerCluster .Status .ControlPlaneLoadBalancer .ID }
661
668
662
669
if err := s .scope .HCloudClient .DeleteTargetServerOfLoadBalancer (ctx , lb , server ); err != nil {
663
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "DeleteTargetServerOfLoadBalancer" )
664
670
// do not return an error in case the target was not found
665
671
if strings .Contains (err .Error (), "load_balancer_target_not_found" ) {
666
672
return nil
667
673
}
668
- return fmt .Errorf ("failed to delete server %s with ID %d as target of load balancer %s with ID %d: %w" , server .Name , server .ID , lb .Name , lb .ID , err )
674
+ errMsg := fmt .Sprintf ("failed to delete server %s with ID %d as target of load balancer %s with ID %d" , server .Name , server .ID , lb .Name , lb .ID )
675
+ return handleRateLimit (s .scope .HCloudMachine , err , "DeleteTargetServerOfLoadBalancer" , errMsg )
669
676
}
670
677
record .Eventf (
671
678
s .scope .HetznerCluster ,
@@ -685,8 +692,8 @@ func (s *Service) findServer(ctx context.Context) (*hcloud.Server, error) {
685
692
if err == nil {
686
693
server , err = s .scope .HCloudClient .GetServer (ctx , serverID )
687
694
if err != nil {
688
- hcloudutil . HandleRateLimitExceeded ( s . scope . HCloudMachine , err , "GetServer" )
689
- return nil , fmt . Errorf ( "failed to get server %d: %w" , serverID , err )
695
+ errMsg := fmt . Sprintf ( "failed to get server %d" , serverID )
696
+ return nil , handleRateLimit ( s . scope . HCloudMachine , err , "GetServer" , errMsg )
690
697
}
691
698
692
699
// if server has been found, return it
@@ -702,8 +709,7 @@ func (s *Service) findServer(ctx context.Context) (*hcloud.Server, error) {
702
709
703
710
servers , err := s .scope .HCloudClient .ListServers (ctx , opts )
704
711
if err != nil {
705
- hcloudutil .HandleRateLimitExceeded (s .scope .HCloudMachine , err , "ListServers" )
706
- return nil , fmt .Errorf ("failed to list servers: %w" , err )
712
+ return nil , handleRateLimit (s .scope .HCloudMachine , err , "ListServers" , "failed to list servers" )
707
713
}
708
714
709
715
if len (servers ) > 1 {
0 commit comments