Repository: FoundationDB/fdb-kubernetes-operator
Pull request #1156 (2022-04-01 07:22:34)

Update ginkgo version to v2
# Description

*Please include a summary of the change and which issue is addressed. If this change resolves an issue, please include the issue number in the description.*

## Type of change

*Please select one of the options below.*

- New feature (non-breaking change which adds functionality)

## Discussion

Fixes: https://github.com/FoundationDB/fdb-kubernetes-operator/issues/1126

## Testing

Locally.

## Documentation

-

## Follow-up

-


foundationdb-ci: 
### AWS CodeBuild CI Report for Linux CentOS 7

* CodeBuild project: fdb-kubernetes-operator-pr
* Commit ID: 3c7cd107e50baa0349e15f4cd0e04b99d48071b7
* Result: FAILED
* Error: `Error while executing command: make -C tests -kj prOperator. Reason: exit status 2`
* [Build Logs](https://d1e0l78xbkh3xa.cloudfront.net/build-logs/fdb-kubernetes-operator/fdb-kubernetes-operator-pr/e3202da1-8a34-4b1b-9221-c44fe5876a9d.gz) (available for 30 days)

foundationdb-ci: 
### AWS CodeBuild CI Report for Linux CentOS 7

* CodeBuild project: fdb-kubernetes-operator-pr
* Commit ID: 7d005cd632282c7cccfc20a9460eb5a68f5718bc
* Result: FAILED
* Error: `Error while executing command: make -C tests -kj prOperator. Reason: exit status 2`
* [Build Logs](https://d1e0l78xbkh3xa.cloudfront.net/build-logs/fdb-kubernetes-operator/fdb-kubernetes-operator-pr/9394119c-c528-4f9b-9802-2b0b0e8ccbe7.gz) (available for 30 days)

foundationdb-ci: 
### AWS CodeBuild CI Report for Linux CentOS 7

* CodeBuild project: fdb-kubernetes-operator-pr
* Commit ID: 7d005cd632282c7cccfc20a9460eb5a68f5718bc
* Result: SUCCEEDED
* Error: `N/A`
* [Build Logs](https://d1e0l78xbkh3xa.cloudfront.net/build-logs/fdb-kubernetes-operator/fdb-kubernetes-operator-pr/04ac31b2-5a12-470a-acde-35d111e67322.gz) (available for 30 days)

foundationdb-ci: 
### AWS CodeBuild CI Report for Linux CentOS 7

* CodeBuild project: fdb-kubernetes-operator-pr
* Commit ID: b94ee3b81b18687ca28d6caf49280a1b8de8a7f7
* Result: SUCCEEDED
* Error: `N/A`
* [Build Logs](https://d1e0l78xbkh3xa.cloudfront.net/build-logs/fdb-kubernetes-operator/fdb-kubernetes-operator-pr/17041ea7-d5be-4868-8423-a2078387a1a6.gz) (available for 30 days)


Patch:
diff --git a/Makefile b/Makefile
index ac6da2c6..461d0d99 100644
--- a/Makefile
+++ b/Makefile
@@ -37,7 +37,6 @@ GORELEASER_PKG=github.com/goreleaser/goreleaser@v1.6.3
 GORELEASER=$(GOBIN)/goreleaser
 BUILD_DEPS?=
 BUILDER?="docker"
-GINKGO_PARALLEL=8
 
 define godep
 BUILD_DEPS+=$(1)
@@ -91,7 +90,7 @@ cover.out: ${GO_ALL} ${MANIFESTS}
 
 test:
 ifneq "$(SKIP_TEST)" "1"
-	go test ${go_test_flags} ./... -coverprofile cover.out --ginkgo.parallel.total $(GINKGO_PARALLEL)
+	go test ${go_test_flags} ./... -coverprofile cover.out
 endif
 
 # Build manager binary
diff --git a/controllers/remove_process_groups.go b/controllers/remove_process_groups.go
index 0f09b881..64b96c6d 100644
--- a/controllers/remove_process_groups.go
+++ b/controllers/remove_process_groups.go
@@ -135,9 +135,8 @@ func removeProcessGroup(ctx context.Context, r *FoundationDBClusterReconciler, c
 		return err
 	}
 
-	if len(pods) == 1 {
+	if len(pods) == 1 && pods[0].DeletionTimestamp.IsZero() {
 		err = r.PodLifecycleManager.DeletePod(ctx, r, pods[0])
-
 		if err != nil {
 			return err
 		}
@@ -150,7 +149,7 @@ func removeProcessGroup(ctx context.Context, r *FoundationDBClusterReconciler, c
 	if err != nil {
 		return err
 	}
-	if len(pvcs.Items) == 1 {
+	if len(pvcs.Items) == 1 && pvcs.Items[0].DeletionTimestamp.IsZero() {
 		err = r.Delete(ctx, &pvcs.Items[0])
 		if err != nil {
 			return err
@@ -164,7 +163,7 @@ func removeProcessGroup(ctx context.Context, r *FoundationDBClusterReconciler, c
 	if err != nil {
 		return err
 	}
-	if len(services.Items) == 1 {
+	if len(services.Items) == 1 && services.Items[0].DeletionTimestamp.IsZero() {
 		err = r.Delete(ctx, &services.Items[0])
 		if err != nil {
 			return err
@@ -334,10 +333,12 @@ func (r *FoundationDBClusterReconciler) removeProcessGroups(ctx context.Context,
 	logger := log.WithValues("namespace", cluster.Namespace, "cluster", cluster.Name, "reconciler", "removeProcessGroups")
 	r.Recorder.Event(cluster, corev1.EventTypeNormal, "RemovingProcesses", fmt.Sprintf("Removing pods: %v", processGroupsToRemove))
 
-	for _, id := range processGroupsToRemove {
+	processGroups := append(processGroupsToRemove, terminatingProcessGroups...)
+
+	for _, id := range processGroups {
 		err := removeProcessGroup(ctx, r, cluster, id)
 		if err != nil {
-			logger.Error(err, "Error during remove Pod", "processGroupID", id)
+			logger.Error(err, "Error during remove process group", "processGroupID", id)
 			continue
 		}
 	}
@@ -345,10 +346,10 @@ func (r *FoundationDBClusterReconciler) removeProcessGroups(ctx context.Context,
 	removedProcessGroups := make(map[string]bool)
 	// We have to check if the currently removed process groups are completely removed.
 	// In addition, we have to check if one of the terminating process groups has been cleaned up.
-	for _, id := range append(processGroupsToRemove, terminatingProcessGroups...) {
+	for _, id := range processGroups {
 		removed, include, err := confirmRemoval(ctx, r, cluster, id)
 		if err != nil {
-			logger.Error(err, "Error during confirm Pod removal", "processGroupID", id)
+			logger.Error(err, "Error during confirm process group removal", "processGroupID", id)
 			continue
 		}
 
diff --git a/go.mod b/go.mod
index 5bd9573a..aef1bc73 100644
--- a/go.mod
+++ b/go.mod
@@ -9,8 +9,8 @@ require (
 	github.com/go-logr/logr v0.4.0
 	github.com/google/go-cmp v0.5.5
 	github.com/hashicorp/go-retryablehttp v0.6.8
-	github.com/onsi/ginkgo v1.16.4
-	github.com/onsi/gomega v1.14.0
+	github.com/onsi/ginkgo/v2 v2.1.3
+	github.com/onsi/gomega v1.17.0
 	github.com/prometheus/client_golang v1.11.0
 	github.com/prometheus/common v0.26.0
 	github.com/spf13/cobra v1.1.1
@@ -75,7 +75,6 @@ require (
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.1 // indirect
 	github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
-	github.com/nxadm/tail v1.4.8 // indirect
 	github.com/pelletier/go-toml v1.2.0 // indirect
 	github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
 	github.com/pkg/errors v0.9.1 // indirect
@@ -104,7 +103,6 @@ require (
 	google.golang.org/protobuf v1.26.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/ini.v1 v1.51.0 // indirect
-	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
 	k8s.io/apiextensions-apiserver v0.21.3 // indirect
diff --git a/go.sum b/go.sum
index e929ae51..506ce4c6 100644
--- a/go.sum
+++ b/go.sum
@@ -258,6 +258,7 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI
 github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
@@ -312,6 +313,7 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
 github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
@@ -407,12 +409,15 @@ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
 github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=
+github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.14.0 h1:ep6kpPVwmr/nTbklSx2nrLNSIO62DoYAhnPNIMhK8gI=
 github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
+github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
diff --git a/kubectl-fdb/cmd/analyze.go b/kubectl-fdb/cmd/analyze.go
index 2597ebb0..9822ec4e 100644
--- a/kubectl-fdb/cmd/analyze.go
+++ b/kubectl-fdb/cmd/analyze.go
@@ -198,7 +198,7 @@ func printStatement(cmd *cobra.Command, line string, mesType messageType) {
 
 	if mesType == warnMessage {
 		color.Set(color.FgYellow)
-		cmd.Printf("⚠ %s\n", line)
+		cmd.PrintErrf("⚠ %s\n", line)
 		color.Unset()
 		return
 	}
@@ -247,21 +247,24 @@ func analyzeCluster(cmd *cobra.Command, kubeClient client.Client, clusterName st
 	// We could add here more fields from cluster.Status.Generations and check if they are present.
 	var failedProcessGroups []string
 	processGroupMap := map[string]fdbv1beta2.None{}
+	removedProcessGroups := map[string]fdbv1beta2.None{}
+
 	// 3. Check for issues in processGroupID
 	processGroupIssue := false
 	var ignoredConditions int
 	for _, processGroup := range cluster.Status.ProcessGroups {
 		processGroupMap[processGroup.ProcessGroupID] = fdbv1beta2.None{}
 
-		if len(processGroup.ProcessGroupConditions) == 0 {
-			continue
-		}
-
 		// Skip if the processGroup should be removed
 		// or should we check for how long they are marked as removed e.g. stuck in removal?
 		if processGroup.IsMarkedForRemoval() {
 			statement := fmt.Sprintf("ProcessGroup: %s is marked for removal, excluded state: %t", processGroup.ProcessGroupID, processGroup.IsExcluded())
-			printStatement(cmd, statement, errorMessage)
+			removedProcessGroups[processGroup.ProcessGroupID] = fdbv1beta2.None{}
+			printStatement(cmd, statement, warnMessage)
+			continue
+		}
+
+		if len(processGroup.ProcessGroupConditions) == 0 {
 			continue
 		}
 
@@ -315,6 +318,24 @@ func analyzeCluster(cmd *cobra.Command, kubeClient client.Client, clusterName st
 
 	processGroupIDLabel := cluster.GetProcessGroupIDLabel()
 	for _, pod := range pods.Items {
+		// Skip Pods that are marked for removal those will probably be in a terminating state.
+		if _, ok := removedProcessGroups[pod.Labels[cluster.GetProcessGroupIDLabel()]]; ok {
+			continue
+		}
+
+		if pod.DeletionTimestamp != nil && pod.DeletionTimestamp.Add(5*time.Minute).Before(time.Now()) {
+			podIssue = true
+			statement := fmt.Sprintf("Pod %s/%s has been stuck in terminating since %s", namespace, pod.Name, pod.DeletionTimestamp)
+			printStatement(cmd, statement, errorMessage)
+
+			// The process groups that should be deleted, so we can safely replace it
+			if autoFix {
+				failedProcessGroups = append(failedProcessGroups, pod.Labels[cluster.GetProcessGroupIDLabel()])
+			}
+
+			continue
+		}
+
 		if pod.Status.Phase != corev1.PodRunning {
 			podIssue = true
 			statement := fmt.Sprintf("Pod %s/%s has unexpected Phase %s with Reason: %s", namespace, pod.Name, pod.Status.Phase, pod.Status.Reason)
@@ -341,17 +362,6 @@ func analyzeCluster(cmd *cobra.Command, kubeClient client.Client, clusterName st
 			killPods = append(killPods, pod)
 		}
 
-		if pod.DeletionTimestamp != nil && pod.DeletionTimestamp.Add(5*time.Minute).Before(time.Now()) {
-			podIssue = true
-			statement := fmt.Sprintf("Pod %s/%s has been stuck in terminating since %s", namespace, pod.Name, pod.DeletionTimestamp)
-			printStatement(cmd, statement, errorMessage)
-
-			// The process groups that should be deleted, so we can safely replace it
-			if autoFix {
-				failedProcessGroups = append(failedProcessGroups, pod.Labels[cluster.GetProcessGroupIDLabel()])
-			}
-		}
-
 		id := pod.Labels[processGroupIDLabel]
 		if _, ok := processGroupMap[id]; !ok {
 			podIssue = true


Test patch:
diff --git a/api/v1beta1/foundationdb_custom_parameter_test.go b/api/v1beta1/foundationdb_custom_parameter_test.go
index 1c5614d7..2a700923 100644
--- a/api/v1beta1/foundationdb_custom_parameter_test.go
+++ b/api/v1beta1/foundationdb_custom_parameter_test.go
@@ -23,8 +23,7 @@ package v1beta1
 import (
 	"errors"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta1/foundationdb_status_test.go b/api/v1beta1/foundationdb_status_test.go
index 8498894d..ddca0ad7 100644
--- a/api/v1beta1/foundationdb_status_test.go
+++ b/api/v1beta1/foundationdb_status_test.go
@@ -26,7 +26,7 @@ import (
 	"os"
 	"path/filepath"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta1/foundationdb_version_test.go b/api/v1beta1/foundationdb_version_test.go
index adc601cc..b6e21ae1 100644
--- a/api/v1beta1/foundationdb_version_test.go
+++ b/api/v1beta1/foundationdb_version_test.go
@@ -21,8 +21,7 @@
 package v1beta1
 
 import (
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta1/foundationdbbackup_types_test.go b/api/v1beta1/foundationdbbackup_types_test.go
index d5653d8a..cc5a8c27 100644
--- a/api/v1beta1/foundationdbbackup_types_test.go
+++ b/api/v1beta1/foundationdbbackup_types_test.go
@@ -21,8 +21,7 @@
 package v1beta1
 
 import (
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
diff --git a/api/v1beta1/foundationdbcluster_types_test.go b/api/v1beta1/foundationdbcluster_types_test.go
index 3f12ba23..66245896 100644
--- a/api/v1beta1/foundationdbcluster_types_test.go
+++ b/api/v1beta1/foundationdbcluster_types_test.go
@@ -32,8 +32,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/pointer"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta1/foundationdbrestore_types_test.go b/api/v1beta1/foundationdbrestore_types_test.go
index 5b85a260..4e33ae30 100644
--- a/api/v1beta1/foundationdbrestore_types_test.go
+++ b/api/v1beta1/foundationdbrestore_types_test.go
@@ -21,8 +21,7 @@
 package v1beta1
 
 import (
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
diff --git a/api/v1beta1/suite_test.go b/api/v1beta1/suite_test.go
index 0ec4291b..4c0cc718 100644
--- a/api/v1beta1/suite_test.go
+++ b/api/v1beta1/suite_test.go
@@ -19,7 +19,7 @@ package v1beta1
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta2/foundationdb_custom_parameter_test.go b/api/v1beta2/foundationdb_custom_parameter_test.go
index 4c8f5a06..fa27358f 100644
--- a/api/v1beta2/foundationdb_custom_parameter_test.go
+++ b/api/v1beta2/foundationdb_custom_parameter_test.go
@@ -23,8 +23,7 @@ package v1beta2
 import (
 	"errors"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta2/foundationdb_database_configuration_test.go b/api/v1beta2/foundationdb_database_configuration_test.go
index ad79d498..c404be82 100644
--- a/api/v1beta2/foundationdb_database_configuration_test.go
+++ b/api/v1beta2/foundationdb_database_configuration_test.go
@@ -21,7 +21,7 @@
 package v1beta2
 
 import (
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta2/foundationdb_status_test.go b/api/v1beta2/foundationdb_status_test.go
index 45ecbac3..84183642 100644
--- a/api/v1beta2/foundationdb_status_test.go
+++ b/api/v1beta2/foundationdb_status_test.go
@@ -26,7 +26,7 @@ import (
 	"os"
 	"path/filepath"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta2/foundationdb_version_test.go b/api/v1beta2/foundationdb_version_test.go
index 17d81e54..aa559d1e 100644
--- a/api/v1beta2/foundationdb_version_test.go
+++ b/api/v1beta2/foundationdb_version_test.go
@@ -21,8 +21,7 @@
 package v1beta2
 
 import (
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta2/foundationdbbackup_types_test.go b/api/v1beta2/foundationdbbackup_types_test.go
index cb1717a1..0c03fd53 100644
--- a/api/v1beta2/foundationdbbackup_types_test.go
+++ b/api/v1beta2/foundationdbbackup_types_test.go
@@ -21,8 +21,7 @@
 package v1beta2
 
 import (
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
diff --git a/api/v1beta2/foundationdbcluster_types_test.go b/api/v1beta2/foundationdbcluster_types_test.go
index 90a9851a..55e792ed 100644
--- a/api/v1beta2/foundationdbcluster_types_test.go
+++ b/api/v1beta2/foundationdbcluster_types_test.go
@@ -32,8 +32,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/pointer"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/api/v1beta2/foundationdbrestore_types_test.go b/api/v1beta2/foundationdbrestore_types_test.go
index 1a358805..cbf02490 100644
--- a/api/v1beta2/foundationdbrestore_types_test.go
+++ b/api/v1beta2/foundationdbrestore_types_test.go
@@ -21,8 +21,7 @@
 package v1beta2
 
 import (
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
diff --git a/api/v1beta2/suite_test.go b/api/v1beta2/suite_test.go
index 7524e357..47f92612 100644
--- a/api/v1beta2/suite_test.go
+++ b/api/v1beta2/suite_test.go
@@ -19,7 +19,7 @@ package v1beta2
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/controllers/add_pods_test.go b/controllers/add_pods_test.go
index c0940e7b..cab78abc 100644
--- a/controllers/add_pods_test.go
+++ b/controllers/add_pods_test.go
@@ -27,7 +27,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 )
diff --git a/controllers/add_process_groups_test.go b/controllers/add_process_groups_test.go
index 8a47db06..098811cc 100644
--- a/controllers/add_process_groups_test.go
+++ b/controllers/add_process_groups_test.go
@@ -26,7 +26,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/controllers/add_pvcs_test.go b/controllers/add_pvcs_test.go
index bb91e552..5a15fadb 100644
--- a/controllers/add_pvcs_test.go
+++ b/controllers/add_pvcs_test.go
@@ -27,7 +27,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 )
diff --git a/controllers/add_services_test.go b/controllers/add_services_test.go
index 91e4144c..6f483caf 100644
--- a/controllers/add_services_test.go
+++ b/controllers/add_services_test.go
@@ -27,7 +27,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/types"
diff --git a/controllers/admin_client_mock_test.go b/controllers/admin_client_mock_test.go
index 0870ce19..c148c26e 100644
--- a/controllers/admin_client_mock_test.go
+++ b/controllers/admin_client_mock_test.go
@@ -26,8 +26,7 @@ import (
 
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
diff --git a/controllers/admin_client_test.go b/controllers/admin_client_test.go
index 70ea5c13..d65397ee 100644
--- a/controllers/admin_client_test.go
+++ b/controllers/admin_client_test.go
@@ -28,7 +28,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 	"k8s.io/utils/pointer"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
diff --git a/controllers/backup_controller_test.go b/controllers/backup_controller_test.go
index 1150ac14..ebc696c6 100644
--- a/controllers/backup_controller_test.go
+++ b/controllers/backup_controller_test.go
@@ -25,7 +25,7 @@ import (
 
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	"context"
diff --git a/controllers/bounce_processes_test.go b/controllers/bounce_processes_test.go
index f23fd122..a00afaf8 100644
--- a/controllers/bounce_processes_test.go
+++ b/controllers/bounce_processes_test.go
@@ -26,7 +26,7 @@ import (
 	"time"
 
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
diff --git a/controllers/change_coordinators_test.go b/controllers/change_coordinators_test.go
index 9da4a19e..2fbf6faa 100644
--- a/controllers/change_coordinators_test.go
+++ b/controllers/change_coordinators_test.go
@@ -32,7 +32,7 @@ import (
 	"k8s.io/utils/pointer"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/controllers/choose_removals_test.go b/controllers/choose_removals_test.go
index 09ac0225..c46c9819 100644
--- a/controllers/choose_removals_test.go
+++ b/controllers/choose_removals_test.go
@@ -26,7 +26,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/controllers/cluster_controller_test.go b/controllers/cluster_controller_test.go
index 60226965..0aebdf48 100644
--- a/controllers/cluster_controller_test.go
+++ b/controllers/cluster_controller_test.go
@@ -40,7 +40,7 @@ import (
 	"github.com/prometheus/common/expfmt"
 	"sigs.k8s.io/controller-runtime/pkg/metrics"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	gomegatypes "github.com/onsi/gomega/types"
 
diff --git a/controllers/delete_pods_for_buggification_test.go b/controllers/delete_pods_for_buggification_test.go
index 4d7ef1b5..66168c3b 100644
--- a/controllers/delete_pods_for_buggification_test.go
+++ b/controllers/delete_pods_for_buggification_test.go
@@ -26,7 +26,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
diff --git a/controllers/exclude_processes_test.go b/controllers/exclude_processes_test.go
index ac25b16e..e796f346 100644
--- a/controllers/exclude_processes_test.go
+++ b/controllers/exclude_processes_test.go
@@ -26,7 +26,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/controllers/lock_client_test.go b/controllers/lock_client_test.go
index df347dd4..2830c4c6 100644
--- a/controllers/lock_client_test.go
+++ b/controllers/lock_client_test.go
@@ -25,7 +25,7 @@ import (
 
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
diff --git a/controllers/metrics_test.go b/controllers/metrics_test.go
index c743c620..e45fc76c 100644
--- a/controllers/metrics_test.go
+++ b/controllers/metrics_test.go
@@ -24,7 +24,7 @@ import (
 	"time"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
diff --git a/controllers/remove_process_groups_test.go b/controllers/remove_process_groups_test.go
index 1c64ad5e..4466b9e4 100644
--- a/controllers/remove_process_groups_test.go
+++ b/controllers/remove_process_groups_test.go
@@ -28,7 +28,7 @@ import (
 
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
@@ -84,8 +84,10 @@ var _ = Describe("remove_process_groups", func() {
 	})
 
 	When("removing a process group", func() {
+		var removedProcessGroup *fdbv1beta2.ProcessGroupStatus
+
 		BeforeEach(func() {
-			removedProcessGroup := cluster.Status.ProcessGroups[0]
+			removedProcessGroup = cluster.Status.ProcessGroups[0]
 			marked, processGroup := fdbv1beta2.MarkProcessGroupForRemoval(cluster.Status.ProcessGroups, removedProcessGroup.ProcessGroupID, removedProcessGroup.ProcessClass, removedProcessGroup.Addresses[0])
 			Expect(marked).To(BeTrue())
 			Expect(processGroup).To(BeNil())
@@ -99,6 +101,11 @@ var _ = Describe("remove_process_groups", func() {
 			When("the cluster is fully replicated", func() {
 				It("should successfully remove that process group", func() {
 					Expect(result).To(BeNil())
+					// Ensure resources are deleted
+					removed, include, err := confirmRemoval(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeTrue())
+					Expect(include).To(BeTrue())
 				})
 			})
 
@@ -112,6 +119,11 @@ var _ = Describe("remove_process_groups", func() {
 				It("should not remove that process group", func() {
 					Expect(result).NotTo(BeNil())
 					Expect(result.message).To(Equal("Removals cannot proceed because cluster has degraded fault tolerance"))
+					// Ensure resources are not deleted
+					removed, include, err := confirmRemoval(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeFalse())
+					Expect(include).To(BeFalse())
 				})
 			})
 
@@ -125,6 +137,11 @@ var _ = Describe("remove_process_groups", func() {
 				It("should not remove that process group", func() {
 					Expect(result).NotTo(BeNil())
 					Expect(result.message).To(Equal("Removals cannot proceed because cluster has degraded fault tolerance"))
+					// Ensure resources are not deleted
+					removed, include, err := confirmRemoval(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeFalse())
+					Expect(include).To(BeFalse())
 				})
 			})
 
@@ -144,35 +161,50 @@ var _ = Describe("remove_process_groups", func() {
 				It("should not remove that process group", func() {
 					Expect(result).NotTo(BeNil())
 					Expect(result.message).To(Equal("Removals cannot proceed because cluster has degraded fault tolerance"))
+					// Ensure resources are not deleted
+					removed, include, err := confirmRemoval(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeFalse())
+					Expect(include).To(BeFalse())
 				})
 			})
 		})
 
 		When("Removing multiple process groups", func() {
 			var initialCnt int
-			var removedProcessGroup *fdbv1beta2.ProcessGroupStatus
+			var secondRemovedProcessGroup *fdbv1beta2.ProcessGroupStatus
 
 			BeforeEach(func() {
 				initialCnt = len(cluster.Status.ProcessGroups)
-				removedProcessGroup = cluster.Status.ProcessGroups[1]
-				marked, processGroup := fdbv1beta2.MarkProcessGroupForRemoval(cluster.Status.ProcessGroups, removedProcessGroup.ProcessGroupID, removedProcessGroup.ProcessClass, removedProcessGroup.Addresses[0])
+				secondRemovedProcessGroup = cluster.Status.ProcessGroups[1]
+				marked, processGroup := fdbv1beta2.MarkProcessGroupForRemoval(cluster.Status.ProcessGroups, secondRemovedProcessGroup.ProcessGroupID, secondRemovedProcessGroup.ProcessClass, removedProcessGroup.Addresses[0])
 				Expect(marked).To(BeTrue())
 				Expect(processGroup).To(BeNil())
 				// Exclude the process group
 				adminClient, err := newMockAdminClientUncast(cluster, k8sClient)
 				Expect(err).NotTo(HaveOccurred())
-				adminClient.ExcludedAddresses = append(adminClient.ExcludedAddresses, removedProcessGroup.Addresses...)
+				adminClient.ExcludedAddresses = append(adminClient.ExcludedAddresses, secondRemovedProcessGroup.Addresses...)
 			})
 
 			It("should remove only one process group", func() {
 				Expect(result).To(BeNil())
 				Expect(initialCnt - len(cluster.Status.ProcessGroups)).To(BeNumerically("==", 1))
+				// Ensure resources are deleted
+				removed, include, err := confirmRemoval(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+				Expect(err).To(BeNil())
+				Expect(removed).To(BeTrue())
+				Expect(include).To(BeTrue())
+				// Ensure resources are not deleted
+				removed, include, err = confirmRemoval(context.Background(), clusterReconciler, cluster, secondRemovedProcessGroup.ProcessGroupID)
+				Expect(err).To(BeNil())
+				Expect(removed).To(BeFalse())
+				Expect(include).To(BeFalse())
 			})
 
 			When("a process group is marked as terminating and all resources are removed it should be removed", func() {
 				BeforeEach(func() {
-					removedProcessGroup.ProcessGroupConditions = append(removedProcessGroup.ProcessGroupConditions, fdbv1beta2.NewProcessGroupCondition(fdbv1beta2.ResourcesTerminating))
-					err := removeProcessGroup(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+					secondRemovedProcessGroup.ProcessGroupConditions = append(secondRemovedProcessGroup.ProcessGroupConditions, fdbv1beta2.NewProcessGroupCondition(fdbv1beta2.ResourcesTerminating))
+					err := removeProcessGroup(context.Background(), clusterReconciler, cluster, secondRemovedProcessGroup.ProcessGroupID)
 					Expect(err).NotTo(HaveOccurred())
 					// Sleep here to prevent some timeing issues.
 					time.Sleep(10 * time.Microsecond)
@@ -181,12 +213,45 @@ var _ = Describe("remove_process_groups", func() {
 				It("should remove the process group and the terminated process group", func() {
 					Expect(result).To(BeNil())
 					Expect(initialCnt - len(cluster.Status.ProcessGroups)).To(BeNumerically("==", 2))
+					// Ensure resources are deleted
+					removed, include, err := confirmRemoval(context.Background(), clusterReconciler, cluster, secondRemovedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeTrue())
+					Expect(include).To(BeTrue())
+					// Ensure resources are deleted
+					removed, include, err = confirmRemoval(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeTrue())
+					Expect(include).To(BeTrue())
+				})
+			})
+
+			When("a process group is marked as terminating and the resources are not removed", func() {
+				BeforeEach(func() {
+					secondRemovedProcessGroup.ProcessGroupConditions = append(secondRemovedProcessGroup.ProcessGroupConditions, fdbv1beta2.NewProcessGroupCondition(fdbv1beta2.ResourcesTerminating))
+					// Sleep here to prevent some timeing issues.
+					time.Sleep(10 * time.Microsecond)
+				})
+
+				It("should remove the process group and the terminated process group", func() {
+					Expect(result).To(BeNil())
+					Expect(initialCnt - len(cluster.Status.ProcessGroups)).To(BeNumerically("==", 2))
+					// Ensure resources are deleted
+					removed, include, err := confirmRemoval(context.Background(), clusterReconciler, cluster, secondRemovedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeTrue())
+					Expect(include).To(BeTrue())
+					// Ensure resources are deleted
+					removed, include, err = confirmRemoval(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeTrue())
+					Expect(include).To(BeTrue())
 				})
 			})
 
 			When("a process group is marked as terminating and not fully removed", func() {
 				BeforeEach(func() {
-					removedProcessGroup.ProcessGroupConditions = append(removedProcessGroup.ProcessGroupConditions, fdbv1beta2.NewProcessGroupCondition(fdbv1beta2.ResourcesTerminating))
+					secondRemovedProcessGroup.ProcessGroupConditions = append(secondRemovedProcessGroup.ProcessGroupConditions, fdbv1beta2.NewProcessGroupCondition(fdbv1beta2.ResourcesTerminating))
 					// Set the wait time to the default value
 					cluster.Spec.AutomationOptions.WaitBetweenRemovalsSeconds = pointer.Int(60)
 				})
@@ -195,6 +260,16 @@ var _ = Describe("remove_process_groups", func() {
 					Expect(result).NotTo(BeNil())
 					Expect(result.message).To(HavePrefix("not allowed to remove process groups, waiting:"))
 					Expect(initialCnt - len(cluster.Status.ProcessGroups)).To(BeNumerically("==", 0))
+					// Ensure resources are not deleted
+					removed, include, err := confirmRemoval(context.Background(), clusterReconciler, cluster, removedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeFalse())
+					Expect(include).To(BeFalse())
+					// Ensure resources are deleted
+					removed, include, err = confirmRemoval(context.Background(), clusterReconciler, cluster, secondRemovedProcessGroup.ProcessGroupID)
+					Expect(err).To(BeNil())
+					Expect(removed).To(BeFalse())
+					Expect(include).To(BeFalse())
 				})
 			})
 		})
diff --git a/controllers/replace_failed_process_groups_test.go b/controllers/replace_failed_process_groups_test.go
index 9c40b440..9be14b24 100644
--- a/controllers/replace_failed_process_groups_test.go
+++ b/controllers/replace_failed_process_groups_test.go
@@ -31,7 +31,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/controllers/restore_controller_test.go b/controllers/restore_controller_test.go
index 4e452371..8d5291bb 100644
--- a/controllers/restore_controller_test.go
+++ b/controllers/restore_controller_test.go
@@ -22,7 +22,7 @@ package controllers
 
 import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	"context"
diff --git a/controllers/suite_test.go b/controllers/suite_test.go
index cd361eb6..e73e50c6 100644
--- a/controllers/suite_test.go
+++ b/controllers/suite_test.go
@@ -29,7 +29,7 @@ import (
 
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
@@ -40,7 +40,8 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/kubernetes/scheme"
 	ctrl "sigs.k8s.io/controller-runtime"
-	"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
+
+	//"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
 	logf "sigs.k8s.io/controller-runtime/pkg/log"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -58,12 +59,10 @@ var restoreReconciler *FoundationDBRestoreReconciler
 func TestAPIs(t *testing.T) {
 	RegisterFailHandler(Fail)
 	SetDefaultEventuallyTimeout(10 * time.Second)
-	RunSpecsWithDefaultAndCustomReporters(t,
-		"Controller Suite",
-		[]Reporter{printer.NewlineReporter{}})
+	RunSpecs(t, "FDB Controllers")
 }
 
-var _ = BeforeSuite(func(done Done) {
+var _ = BeforeSuite(func() {
 	logf.SetLogger(zap.New(zap.UseDevMode(true), zap.WriteTo(GinkgoWriter)))
 
 	err := scheme.AddToScheme(scheme.Scheme)
@@ -72,7 +71,6 @@ var _ = BeforeSuite(func(done Done) {
 	Expect(err).NotTo(HaveOccurred())
 
 	// +kubebuilder:scaffold:scheme
-
 	k8sClient = &mockclient.MockClient{}
 
 	clusterReconciler = createTestClusterReconciler()
@@ -91,9 +89,7 @@ var _ = BeforeSuite(func(done Done) {
 		Recorder:               k8sClient,
 		DatabaseClientProvider: mockDatabaseClientProvider{},
 	}
-
-	close(done)
-}, 60)
+})
 
 var _ = AfterSuite(func() {
 	By("tearing down the test environment")
diff --git a/controllers/update_labels_test.go b/controllers/update_labels_test.go
index dc5eee00..055c482b 100644
--- a/controllers/update_labels_test.go
+++ b/controllers/update_labels_test.go
@@ -22,8 +22,7 @@ package controllers
 
 import (
 	fdbtypes "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/equality"
diff --git a/controllers/update_lock_configuration_test.go b/controllers/update_lock_configuration_test.go
index 07b102f3..c12161fc 100644
--- a/controllers/update_lock_configuration_test.go
+++ b/controllers/update_lock_configuration_test.go
@@ -26,7 +26,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/controllers/update_pod_config_test.go b/controllers/update_pod_config_test.go
index 315cf9fa..c01e60de 100644
--- a/controllers/update_pod_config_test.go
+++ b/controllers/update_pod_config_test.go
@@ -26,7 +26,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 	corev1 "k8s.io/api/core/v1"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
diff --git a/controllers/update_pods_test.go b/controllers/update_pods_test.go
index 288bd912..dfdd4602 100644
--- a/controllers/update_pods_test.go
+++ b/controllers/update_pods_test.go
@@ -27,8 +27,7 @@ import (
 	"k8s.io/utils/pointer"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
diff --git a/controllers/update_sidecar_versions_test.go b/controllers/update_sidecar_versions_test.go
index 0e4b795f..3feb3399 100644
--- a/controllers/update_sidecar_versions_test.go
+++ b/controllers/update_sidecar_versions_test.go
@@ -23,8 +23,7 @@ package controllers
 import (
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 )
diff --git a/controllers/update_status_test.go b/controllers/update_status_test.go
index b36c88cb..3e3e28f0 100644
--- a/controllers/update_status_test.go
+++ b/controllers/update_status_test.go
@@ -30,7 +30,7 @@ import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/internal"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/types"
diff --git a/fdbclient/admin_client_test.go b/fdbclient/admin_client_test.go
index a4344441..28c8a0f1 100644
--- a/fdbclient/admin_client_test.go
+++ b/fdbclient/admin_client_test.go
@@ -24,9 +24,7 @@ import (
 	"net"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/fdbclient/suite_test.go b/fdbclient/suite_test.go
index ddfef70f..f6e76f01 100644
--- a/fdbclient/suite_test.go
+++ b/fdbclient/suite_test.go
@@ -23,7 +23,7 @@ package fdbclient
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/configmap_helper_test.go b/internal/configmap_helper_test.go
index f47ac87c..c88c3ed3 100644
--- a/internal/configmap_helper_test.go
+++ b/internal/configmap_helper_test.go
@@ -26,7 +26,7 @@ import (
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
 	monitorapi "github.com/apple/foundationdb/fdbkubernetesmonitor/api"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
diff --git a/internal/deprecations_test.go b/internal/deprecations_test.go
index 7b680733..2a63bbe8 100644
--- a/internal/deprecations_test.go
+++ b/internal/deprecations_test.go
@@ -22,7 +22,7 @@ package internal
 
 import (
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
diff --git a/internal/error_helper_test.go b/internal/error_helper_test.go
index f359d9fc..e873fc47 100644
--- a/internal/error_helper_test.go
+++ b/internal/error_helper_test.go
@@ -27,8 +27,7 @@ import (
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/fault_tolerance_test.go b/internal/fault_tolerance_test.go
index 52f18fa3..3a5421fe 100644
--- a/internal/fault_tolerance_test.go
+++ b/internal/fault_tolerance_test.go
@@ -21,8 +21,7 @@
 package internal
 
 import (
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/fdb_status_helper_test.go b/internal/fdb_status_helper_test.go
index 30952de6..8b195b30 100644
--- a/internal/fdb_status_helper_test.go
+++ b/internal/fdb_status_helper_test.go
@@ -23,8 +23,7 @@ package internal
 import (
 	"fmt"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/foundationdb_status_test.go b/internal/foundationdb_status_test.go
index 8f128d66..41b15fb7 100644
--- a/internal/foundationdb_status_test.go
+++ b/internal/foundationdb_status_test.go
@@ -22,8 +22,7 @@ package internal
 
 import (
 	"github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/log_file_cleaner_test.go b/internal/log_file_cleaner_test.go
index 309df957..3bcac586 100644
--- a/internal/log_file_cleaner_test.go
+++ b/internal/log_file_cleaner_test.go
@@ -24,8 +24,7 @@ import (
 	"os"
 	"time"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/monitor_conf_test.go b/internal/monitor_conf_test.go
index 95ff3397..23fc7210 100644
--- a/internal/monitor_conf_test.go
+++ b/internal/monitor_conf_test.go
@@ -26,7 +26,7 @@ import (
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
 	monitorapi "github.com/apple/foundationdb/fdbkubernetesmonitor/api"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/utils/pointer"
diff --git a/internal/pod_client_test.go b/internal/pod_client_test.go
index 7e22f835..4e790fab 100644
--- a/internal/pod_client_test.go
+++ b/internal/pod_client_test.go
@@ -22,7 +22,7 @@ package internal
 
 import (
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/pod_models_test.go b/internal/pod_models_test.go
index 4a4f9981..a3370bbe 100644
--- a/internal/pod_models_test.go
+++ b/internal/pod_models_test.go
@@ -24,8 +24,7 @@ import (
 	"fmt"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
diff --git a/internal/removals/remove_test.go b/internal/removals/remove_test.go
index 0f67232d..dd7fb5b4 100644
--- a/internal/removals/remove_test.go
+++ b/internal/removals/remove_test.go
@@ -24,8 +24,7 @@ import (
 	"fmt"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/removals/suite_test.go b/internal/removals/suite_test.go
index 5910e5ea..0d693a6c 100644
--- a/internal/removals/suite_test.go
+++ b/internal/removals/suite_test.go
@@ -23,7 +23,7 @@ package removals
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/replacements/replacements_test.go b/internal/replacements/replacements_test.go
index a2393c85..9ab7c2ee 100644
--- a/internal/replacements/replacements_test.go
+++ b/internal/replacements/replacements_test.go
@@ -31,7 +31,7 @@ import (
 	"github.com/go-logr/logr"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
diff --git a/internal/replacements/suite_test.go b/internal/replacements/suite_test.go
index c0a5ee1e..aeed1b0c 100644
--- a/internal/replacements/suite_test.go
+++ b/internal/replacements/suite_test.go
@@ -3,7 +3,7 @@ package replacements
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/internal/suite_test.go b/internal/suite_test.go
index 6426815d..919a1425 100644
--- a/internal/suite_test.go
+++ b/internal/suite_test.go
@@ -23,7 +23,7 @@ package internal
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/kubectl-fdb/cmd/analyze_test.go b/kubectl-fdb/cmd/analyze_test.go
index 54f4f175..358701f0 100644
--- a/kubectl-fdb/cmd/analyze_test.go
+++ b/kubectl-fdb/cmd/analyze_test.go
@@ -34,8 +34,7 @@ import (
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
@@ -247,7 +246,7 @@ var _ = Describe("[plugin] analyze cluster", func() {
 					podList: getPodList(clusterName, namespace, corev1.PodStatus{
 						Phase: corev1.PodRunning,
 					}, nil),
-					ExpectedErrMsg: "✖ ProcessGroup: instance-1 is marked for removal, excluded state: false",
+					ExpectedErrMsg: "⚠ ProcessGroup: instance-1 is marked for removal, excluded state: false",
 					ExpectedStdouMsg: `Checking cluster: test/test
 ✔ Cluster is available
 ✔ Cluster is fully replicated
@@ -345,6 +344,40 @@ var _ = Describe("[plugin] analyze cluster", func() {
 					AutoFix:   false,
 					HasErrors: true,
 				}),
+			Entry("Pod is stuck in terminating and marked for removal",
+				testCase{
+					cluster: getCluster(clusterName, namespace, true, true, true, 0, []*fdbv1beta2.ProcessGroupStatus{
+						{
+							ProcessGroupID:     "instance-1",
+							RemovalTimestamp:   &metav1.Time{Time: time.Now()},
+							ExclusionTimestamp: &metav1.Time{Time: time.Now()},
+						},
+					}),
+					podList: getPodList(clusterName, namespace, corev1.PodStatus{
+						Phase: corev1.PodRunning,
+						ContainerStatuses: []corev1.ContainerStatus{
+							{
+								Name:  "test",
+								Ready: false,
+								State: corev1.ContainerState{
+									Terminated: &corev1.ContainerStateTerminated{
+										ExitCode:   127,
+										FinishedAt: metav1.Time{Time: time.Now().Add(-1 * time.Hour)},
+									},
+								},
+							},
+						},
+					}, &metav1.Time{Time: time.Now().Add(-1 * time.Hour)}),
+					ExpectedErrMsg: "⚠ ProcessGroup: instance-1 is marked for removal, excluded state: true",
+					ExpectedStdouMsg: `Checking cluster: test/test
+✔ Cluster is available
+✔ Cluster is fully replicated
+✔ Cluster is reconciled
+✔ ProcessGroups are all in ready condition
+✔ Pods are all running and available`,
+					AutoFix:   false,
+					HasErrors: true,
+				}),
 			Entry("Missing Pods",
 				testCase{
 					cluster: getCluster(clusterName, namespace, true, true, true, 0, []*fdbv1beta2.ProcessGroupStatus{
@@ -390,12 +423,11 @@ var _ = Describe("[plugin] analyze cluster", func() {
 					podList: getPodList(clusterName, namespace, corev1.PodStatus{
 						Phase: corev1.PodRunning,
 					}, nil),
-					ExpectedErrMsg: fmt.Sprintf("✖ ProcessGroup: instance-1 has the following condition: MissingProcesses since %s", time.Unix(time.Now().Unix(), 0).String()),
+					ExpectedErrMsg: fmt.Sprintf("✖ ProcessGroup: instance-1 has the following condition: MissingProcesses since %s\n⚠ ignored 1 conditions", time.Unix(time.Now().Unix(), 0).String()),
 					ExpectedStdouMsg: `Checking cluster: test/test
 ✔ Cluster is available
 ✔ Cluster is fully replicated
 ✔ Cluster is reconciled
-⚠ ignored 1 conditions
 ✔ Pods are all running and available`,
 					AutoFix:           false,
 					HasErrors:         true,
diff --git a/kubectl-fdb/cmd/configuration_test.go b/kubectl-fdb/cmd/configuration_test.go
index e027c376..a634ee08 100644
--- a/kubectl-fdb/cmd/configuration_test.go
+++ b/kubectl-fdb/cmd/configuration_test.go
@@ -24,7 +24,7 @@ import (
 	ctx "context"
 
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
diff --git a/kubectl-fdb/cmd/cordon_test.go b/kubectl-fdb/cmd/cordon_test.go
index 6e938663..4ab9ed06 100644
--- a/kubectl-fdb/cmd/cordon_test.go
+++ b/kubectl-fdb/cmd/cordon_test.go
@@ -33,8 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/kubectl-fdb/cmd/deprecation_test.go b/kubectl-fdb/cmd/deprecation_test.go
index 52a6a638..e952d139 100644
--- a/kubectl-fdb/cmd/deprecation_test.go
+++ b/kubectl-fdb/cmd/deprecation_test.go
@@ -39,8 +39,7 @@ import (
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/kubectl-fdb/cmd/exec_test.go b/kubectl-fdb/cmd/exec_test.go
index b1faf9de..51a9eae2 100644
--- a/kubectl-fdb/cmd/exec_test.go
+++ b/kubectl-fdb/cmd/exec_test.go
@@ -28,8 +28,7 @@ import (
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/kubectl-fdb/cmd/fix_coordinator_ips_test.go b/kubectl-fdb/cmd/fix_coordinator_ips_test.go
index 5353ce6a..687527b4 100644
--- a/kubectl-fdb/cmd/fix_coordinator_ips_test.go
+++ b/kubectl-fdb/cmd/fix_coordinator_ips_test.go
@@ -28,8 +28,7 @@ import (
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/kubectl-fdb/cmd/k8s_client_test.go b/kubectl-fdb/cmd/k8s_client_test.go
index 4c404f35..0033870b 100644
--- a/kubectl-fdb/cmd/k8s_client_test.go
+++ b/kubectl-fdb/cmd/k8s_client_test.go
@@ -30,8 +30,7 @@ import (
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/kubectl-fdb/cmd/remove_process_group_test.go b/kubectl-fdb/cmd/remove_process_group_test.go
index 8e0c3074..b38054cf 100644
--- a/kubectl-fdb/cmd/remove_process_group_test.go
+++ b/kubectl-fdb/cmd/remove_process_group_test.go
@@ -31,8 +31,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/kubectl-fdb/cmd/restart_test.go b/kubectl-fdb/cmd/restart_test.go
index 722942f7..89f37994 100644
--- a/kubectl-fdb/cmd/restart_test.go
+++ b/kubectl-fdb/cmd/restart_test.go
@@ -23,7 +23,7 @@ package cmd
 import (
 	"bytes"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	"k8s.io/cli-runtime/pkg/genericclioptions"
 )
diff --git a/kubectl-fdb/cmd/root_test.go b/kubectl-fdb/cmd/root_test.go
index 6229f00f..d34b0145 100644
--- a/kubectl-fdb/cmd/root_test.go
+++ b/kubectl-fdb/cmd/root_test.go
@@ -23,7 +23,7 @@ package cmd
 import (
 	"bytes"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	"k8s.io/cli-runtime/pkg/genericclioptions"
 )
diff --git a/kubectl-fdb/cmd/suite_test.go b/kubectl-fdb/cmd/suite_test.go
index 5b5eecd6..f27ab7d1 100644
--- a/kubectl-fdb/cmd/suite_test.go
+++ b/kubectl-fdb/cmd/suite_test.go
@@ -3,7 +3,7 @@ package cmd
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/kubectl-fdb/cmd/version_test.go b/kubectl-fdb/cmd/version_test.go
index 19e6a3fa..20ace339 100644
--- a/kubectl-fdb/cmd/version_test.go
+++ b/kubectl-fdb/cmd/version_test.go
@@ -35,8 +35,7 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/mock-kubernetes-client/client/client_test.go b/mock-kubernetes-client/client/client_test.go
index 761d112a..cc8fc8cf 100644
--- a/mock-kubernetes-client/client/client_test.go
+++ b/mock-kubernetes-client/client/client_test.go
@@ -35,7 +35,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/uuid"
 	ctrlClient "sigs.k8s.io/controller-runtime/pkg/client"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/mock-kubernetes-client/client/suite_test.go b/mock-kubernetes-client/client/suite_test.go
index cebca778..84e68307 100644
--- a/mock-kubernetes-client/client/suite_test.go
+++ b/mock-kubernetes-client/client/suite_test.go
@@ -3,7 +3,7 @@ package client
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/pkg/podmanager/pod_lifecycle_manager_test.go b/pkg/podmanager/pod_lifecycle_manager_test.go
index 56bced39..b813b06d 100644
--- a/pkg/podmanager/pod_lifecycle_manager_test.go
+++ b/pkg/podmanager/pod_lifecycle_manager_test.go
@@ -22,8 +22,7 @@ package podmanager
 
 import (
 	fdbv1beta2 "github.com/FoundationDB/fdb-kubernetes-operator/api/v1beta2"
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/ginkgo/extensions/table"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
diff --git a/pkg/podmanager/suite_test.go b/pkg/podmanager/suite_test.go
index 25b529b9..c2f6b253 100644
--- a/pkg/podmanager/suite_test.go
+++ b/pkg/podmanager/suite_test.go
@@ -23,7 +23,7 @@ package podmanager
 import (
 	"testing"
 
-	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )