Skip to content

Commit 60ce72d

Browse files
committed
e2e: Only dump resources on node1
We were calling DumpOpenStack* in the 'all nodes' argument to SynchronizedBeforeSuite, but only running the checks in the 'node 1' argument to SynchronizedAfterSuite. This is inefficient if we run with more than 1 node, as only data dumped by node 1 will be checked. This change moves the checks to a DeferCleanup() node called from the creation node, so the cleanup will only run where it was created. We also refactor CheckResourceCleanup to return error so we can return its output directly to DeferCleanup.
1 parent 5aaceac commit 60ce72d

File tree

1 file changed

+27
-38
lines changed

1 file changed

+27
-38
lines changed

test/e2e/suites/e2e/e2e_suite_test.go

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ limitations under the License.
2020
package e2e
2121

2222
import (
23+
"errors"
2324
"os"
2425
"testing"
2526

@@ -31,20 +32,14 @@ import (
3132
. "github.com/onsi/ginkgo/v2"
3233
. "github.com/onsi/gomega"
3334
"k8s.io/klog/v2"
34-
"k8s.io/utils/ptr"
3535
ctrl "sigs.k8s.io/controller-runtime"
3636

3737
"sigs.k8s.io/cluster-api-provider-openstack/test/e2e/shared"
3838
)
3939

4040
var (
41-
e2eCtx *shared.E2EContext
42-
initialServers []servers.Server
43-
initialNetworks []networks.Network
44-
initialSecurityGroups []groups.SecGroup
45-
initialLoadBalancers []loadbalancers.LoadBalancer
46-
initialVolumes []volumes.Volume
47-
err error
41+
e2eCtx *shared.E2EContext
42+
err error
4843
)
4944

5045
func init() {
@@ -66,38 +61,50 @@ func TestE2E(t *testing.T) {
6661

6762
var _ = SynchronizedBeforeSuite(func() []byte {
6863
data := shared.Node1BeforeSuite(e2eCtx)
69-
return data
70-
}, func(data []byte) {
71-
shared.AllNodesBeforeSuite(e2eCtx, data)
72-
initialServers, err = shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{})
64+
65+
initialServers, err := shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{})
7366
Expect(err).NotTo(HaveOccurred())
74-
initialNetworks, err = shared.DumpOpenStackNetworks(e2eCtx, networks.ListOpts{})
67+
initialNetworks, err := shared.DumpOpenStackNetworks(e2eCtx, networks.ListOpts{})
7568
Expect(err).NotTo(HaveOccurred())
76-
initialSecurityGroups, err = shared.DumpOpenStackSecurityGroups(e2eCtx, groups.ListOpts{})
69+
initialSecurityGroups, err := shared.DumpOpenStackSecurityGroups(e2eCtx, groups.ListOpts{})
7770
Expect(err).NotTo(HaveOccurred())
78-
initialLoadBalancers, err = shared.DumpOpenStackLoadBalancers(e2eCtx, loadbalancers.ListOpts{})
71+
initialLoadBalancers, err := shared.DumpOpenStackLoadBalancers(e2eCtx, loadbalancers.ListOpts{})
7972
Expect(err).NotTo(HaveOccurred())
80-
initialVolumes, err = shared.DumpOpenStackVolumes(e2eCtx, volumes.ListOpts{})
73+
initialVolumes, err := shared.DumpOpenStackVolumes(e2eCtx, volumes.ListOpts{})
8174
Expect(err).NotTo(HaveOccurred())
75+
76+
DeferCleanup(func() error {
77+
return errors.Join(
78+
CheckResourceCleanup(shared.DumpOpenStackServers, servers.ListOpts{}, initialServers),
79+
CheckResourceCleanup(shared.DumpOpenStackNetworks, networks.ListOpts{}, initialNetworks),
80+
CheckResourceCleanup(shared.DumpOpenStackSecurityGroups, groups.ListOpts{}, initialSecurityGroups),
81+
CheckResourceCleanup(shared.DumpOpenStackLoadBalancers, loadbalancers.ListOpts{}, initialLoadBalancers),
82+
CheckResourceCleanup(shared.DumpOpenStackVolumes, volumes.ListOpts{}, initialVolumes),
83+
)
84+
})
85+
86+
return data
87+
}, func(data []byte) {
88+
shared.AllNodesBeforeSuite(e2eCtx, data)
8289
})
8390

8491
// CheckResourceCleanup checks if all resources created during the test are cleaned up by comparing the resources
8592
// before and after the test.
8693
// The function f is used to list the resources of type T, whose list opts is of type L.
8794
// The list of resources is then compared to the initialResources, using the ConsistOfIDs custom matcher.
88-
func CheckResourceCleanup[T any, L any](f func(*shared.E2EContext, L) ([]T, error), l L, initialResources []T) *string {
95+
func CheckResourceCleanup[T any, L any](f func(*shared.E2EContext, L) ([]T, error), l L, initialResources []T) error {
8996
endResources, err := f(e2eCtx, l)
9097
if err != nil {
91-
return ptr.To(err.Error())
98+
return err
9299
}
93100

94101
matcher := ConsistOfIDs(initialResources)
95102
success, err := matcher.Match(endResources)
96103
if err != nil {
97-
return ptr.To(err.Error())
104+
return err
98105
}
99106
if !success {
100-
return ptr.To(matcher.FailureMessage(endResources))
107+
return errors.New(matcher.FailureMessage(endResources))
101108
}
102109

103110
return nil
@@ -106,23 +113,5 @@ func CheckResourceCleanup[T any, L any](f func(*shared.E2EContext, L) ([]T, erro
106113
var _ = SynchronizedAfterSuite(func() {
107114
shared.AllNodesAfterSuite(e2eCtx)
108115
}, func() {
109-
failed := false
110-
for _, error := range []*string{
111-
CheckResourceCleanup(shared.DumpOpenStackServers, servers.ListOpts{}, initialServers),
112-
CheckResourceCleanup(shared.DumpOpenStackNetworks, networks.ListOpts{}, initialNetworks),
113-
CheckResourceCleanup(shared.DumpOpenStackSecurityGroups, groups.ListOpts{}, initialSecurityGroups),
114-
CheckResourceCleanup(shared.DumpOpenStackLoadBalancers, loadbalancers.ListOpts{}, initialLoadBalancers),
115-
CheckResourceCleanup(shared.DumpOpenStackVolumes, volumes.ListOpts{}, initialVolumes),
116-
} {
117-
if error != nil {
118-
GinkgoWriter.Println(*error)
119-
failed = true
120-
}
121-
}
122-
123116
shared.Node1AfterSuite(e2eCtx)
124-
125-
if failed {
126-
Fail("Not all resources were cleaned up")
127-
}
128117
})

0 commit comments

Comments
 (0)