diff --git a/api/kubernetes/cli/rbac.go b/api/kubernetes/cli/rbac.go index edea808f9..9758812d1 100644 --- a/api/kubernetes/cli/rbac.go +++ b/api/kubernetes/cli/rbac.go @@ -2,6 +2,7 @@ package cli import ( "context" + "time" "github.com/portainer/portainer/api/internal/randomstring" @@ -133,10 +134,34 @@ func createRoleBinding(roleBindingClient rbacv1types.RoleBindingInterface, clust APIGroup: "rbac.authorization.k8s.io", }, } - _, err := roleBindingClient.Create(context.Background(), clusterRoleBinding, metav1.CreateOptions{}) + roleBinding, err := roleBindingClient.Create(context.Background(), clusterRoleBinding, metav1.CreateOptions{}) + if err != nil { + log.Error().Err(err).Msg("Error creating role binding: " + clusterRoleBindingName) + return err + } + + // Retry checkRoleBinding a maximum of 5 times with a 100ms wait after each attempt + maxRetries := 5 + for i := 0; i < maxRetries; i++ { + err = checkRoleBinding(roleBindingClient, roleBinding.Name) + time.Sleep(100 * time.Millisecond) // Wait for 100ms, even if the check passes + if err == nil { + break + } + } + return err } +func checkRoleBinding(roleBindingClient rbacv1types.RoleBindingInterface, name string) error { + _, err := roleBindingClient.Get(context.Background(), name, metav1.GetOptions{}) + if err != nil { + log.Error().Err(err).Msg("Error finding rolebinding: " + name) + return err + } + return nil +} + func deleteRoleBinding(roleBindingClient rbacv1types.RoleBindingInterface, name string) { err := roleBindingClient.Delete(context.Background(), name, metav1.DeleteOptions{}) if err != nil {