Skip to content

Commit

Permalink
extract the retry mechanism into a separate method
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Shitrit <[email protected]>
  • Loading branch information
mshitrit committed Jul 18, 2024
1 parent a7df091 commit 5bc18b5
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 18 deletions.
18 changes: 1 addition & 17 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
pkgruntime "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/wait"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"

// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
Expand Down Expand Up @@ -142,22 +141,7 @@ func main() {
os.Exit(1)
}

interval := 2 * time.Second // retry every 2 seconds
timeout := 10 * time.Second // for a period of 10 seconds

ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()

// Using wait.PollUntilContextTimeout to retry InitOutOfServiceTaintFlags in case there is a temporary network issue.
// Since the last internal error returned by InitOutOfServiceTaintFlags also indicates whether polling succeed or not, there is no need to also keep the context error returned by PollUntilContextTimeout.
_ = wait.PollUntilContextTimeout(ctx, interval, timeout, true, func(ctx context.Context) (bool, error) {
if err = utils.InitOutOfServiceTaintFlags(mgr.GetConfig()); err != nil {
return false, nil // Keep retrying
}
return true, nil // Success
})

if err != nil {
if err := utils.InitOutOfServiceTaintFlagsWithRetry(context.Background(), mgr.GetConfig()); err != nil {
setupLog.Error(err, "unable to verify out-of-service taint support. out-of-service taint isn't supported")
}

Expand Down
23 changes: 22 additions & 1 deletion pkg/utils/taints.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package utils

import (
"context"
"fmt"
"regexp"
"strconv"
"time"

v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apimachinery/pkg/version"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
Expand Down Expand Up @@ -54,7 +57,25 @@ func DeleteTaint(taints []v1.Taint, taintToDelete *v1.Taint) ([]v1.Taint, bool)
return newTaints, deleted
}

func InitOutOfServiceTaintFlags(config *rest.Config) error {
// InitOutOfServiceTaintFlagsWithRetry tries to initialize the OutOfService flags based on k8s version, in case it fails (potentially due to network issues) it will retry for a limited number of times
func InitOutOfServiceTaintFlagsWithRetry(ctx context.Context, config *rest.Config) error {

var err error
interval := 2 * time.Second // retry every 2 seconds
timeout := 10 * time.Second // for a period of 10 seconds

// Since the last internal error returned by InitOutOfServiceTaintFlags also indicates whether polling succeed or not, there is no need to also keep the context error returned by PollUntilContextTimeout.
// Using wait.PollUntilContextTimeout to retry initOutOfServiceTaintFlags in case there is a temporary network issue.
_ = wait.PollUntilContextTimeout(ctx, interval, timeout, true, func(ctx context.Context) (bool, error) {
if err = initOutOfServiceTaintFlags(config); err != nil {
return false, nil // Keep retrying
}
return true, nil // Success
})
return err
}

func initOutOfServiceTaintFlags(config *rest.Config) error {
if cs, err := kubernetes.NewForConfig(config); err != nil || cs == nil {
if cs == nil {
err = fmt.Errorf("k8s client set is nil")
Expand Down

0 comments on commit 5bc18b5

Please sign in to comment.