Skip to content

Commit 34a8a7b

Browse files
committed
chore: add stress test
- Stress test tests 1,000 Namespaces, CofnigMaps, & CronTabs (CR) - Stress test is a new test suite with its own make entrypoint - Refactor shared test code so the e2e and stress tests can both use it - Update test client QPS to 20 (from 5)
1 parent d84328f commit 34a8a7b

28 files changed

+1110
-535
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ test-e2e: $(MYGOBIN)/ginkgo $(MYGOBIN)/kind
6363
kind delete cluster --name=cli-utils-e2e && kind create cluster --name=cli-utils-e2e
6464
$(GOPATH)/bin/ginkgo ./test/e2e/...
6565

66+
test-stress: $(MYGOBIN)/ginkgo $(MYGOBIN)/kind
67+
kind delete cluster --name=cli-utils-e2e && kind create cluster --name=cli-utils-e2e
68+
$(GOPATH)/bin/ginkgo -v ./test/stress/... -- -v 5
69+
6670
vet:
6771
go vet ./...
6872

test/e2e/apply_and_destroy_test.go

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,24 @@ import (
1717
"sigs.k8s.io/cli-utils/pkg/kstatus/status"
1818
"sigs.k8s.io/cli-utils/pkg/object"
1919
"sigs.k8s.io/cli-utils/pkg/testutil"
20+
"sigs.k8s.io/cli-utils/test/e2e/e2eutil"
21+
"sigs.k8s.io/cli-utils/test/e2e/invconfig"
2022
"sigs.k8s.io/controller-runtime/pkg/client"
2123
)
2224

23-
func applyAndDestroyTest(ctx context.Context, c client.Client, invConfig InventoryConfig, inventoryName, namespaceName string) {
25+
func applyAndDestroyTest(ctx context.Context, c client.Client, invConfig invconfig.InventoryConfig, inventoryName, namespaceName string) {
2426
By("Apply resources")
2527
applier := invConfig.ApplierFactoryFunc()
2628
inventoryID := fmt.Sprintf("%s-%s", inventoryName, namespaceName)
2729

28-
inventoryInfo := createInventoryInfo(invConfig, inventoryName, namespaceName, inventoryID)
30+
inventoryInfo := invconfig.CreateInventoryInfo(invConfig, inventoryName, namespaceName, inventoryID)
2931

30-
deployment1Obj := withNamespace(manifestToUnstructured(deployment1), namespaceName)
32+
deployment1Obj := e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(deployment1), namespaceName)
3133
resources := []*unstructured.Unstructured{
3234
deployment1Obj,
3335
}
3436

35-
applierEvents := runCollect(applier.Run(ctx, inventoryInfo, resources, apply.ApplierOptions{
37+
applierEvents := e2eutil.RunCollect(applier.Run(ctx, inventoryInfo, resources, apply.ApplierOptions{
3638
ReconcileTimeout: 2 * time.Minute,
3739
EmitStatusEvents: true,
3840
}))
@@ -184,7 +186,7 @@ func applyAndDestroyTest(ctx context.Context, c client.Client, invConfig Invento
184186
Expect(received).To(testutil.Equal(expEvents))
185187

186188
By("Verify deployment created")
187-
assertUnstructuredExists(ctx, c, deployment1Obj)
189+
e2eutil.AssertUnstructuredExists(ctx, c, deployment1Obj)
188190

189191
By("Verify inventory")
190192
invConfig.InvSizeVerifyFunc(ctx, c, inventoryName, namespaceName, inventoryID, 1, 1)
@@ -193,7 +195,7 @@ func applyAndDestroyTest(ctx context.Context, c client.Client, invConfig Invento
193195
destroyer := invConfig.DestroyerFactoryFunc()
194196

195197
options := apply.DestroyerOptions{InventoryPolicy: inventory.PolicyAdoptIfNoInventory}
196-
destroyerEvents := runCollect(destroyer.Run(ctx, inventoryInfo, options))
198+
destroyerEvents := e2eutil.RunCollect(destroyer.Run(ctx, inventoryInfo, options))
197199

198200
expEvents = []testutil.ExpEvent{
199201
{
@@ -288,16 +290,5 @@ func applyAndDestroyTest(ctx context.Context, c client.Client, invConfig Invento
288290
Expect(testutil.EventsToExpEvents(destroyerEvents)).To(testutil.Equal(expEvents))
289291

290292
By("Verify deployment deleted")
291-
assertUnstructuredDoesNotExist(ctx, c, deployment1Obj)
292-
}
293-
294-
func createInventoryInfo(invConfig InventoryConfig, inventoryName, namespaceName, inventoryID string) inventory.Info {
295-
switch invConfig.Strategy {
296-
case inventory.NameStrategy:
297-
return invConfig.InvWrapperFunc(invConfig.FactoryFunc(inventoryName, namespaceName, randomString("inventory-")))
298-
case inventory.LabelStrategy:
299-
return invConfig.InvWrapperFunc(invConfig.FactoryFunc(randomString("inventory-"), namespaceName, inventoryID))
300-
default:
301-
panic(fmt.Errorf("unknown inventory strategy %q", invConfig.Strategy))
302-
}
293+
e2eutil.AssertUnstructuredDoesNotExist(ctx, c, deployment1Obj)
303294
}

test/e2e/continue_on_error_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,25 @@ import (
1616
"sigs.k8s.io/cli-utils/pkg/apply/event"
1717
"sigs.k8s.io/cli-utils/pkg/object"
1818
"sigs.k8s.io/cli-utils/pkg/testutil"
19+
"sigs.k8s.io/cli-utils/test/e2e/e2eutil"
20+
"sigs.k8s.io/cli-utils/test/e2e/invconfig"
1921
"sigs.k8s.io/controller-runtime/pkg/client"
2022
)
2123

22-
func continueOnErrorTest(ctx context.Context, c client.Client, invConfig InventoryConfig, inventoryName, namespaceName string) {
24+
func continueOnErrorTest(ctx context.Context, c client.Client, invConfig invconfig.InventoryConfig, inventoryName, namespaceName string) {
2325
By("apply an invalid CRD")
2426
applier := invConfig.ApplierFactoryFunc()
2527

2628
inv := invConfig.InvWrapperFunc(invConfig.FactoryFunc(inventoryName, namespaceName, "test"))
2729

28-
invalidCrdObj := manifestToUnstructured(invalidCrd)
29-
pod1Obj := withNamespace(manifestToUnstructured(pod1), namespaceName)
30+
invalidCrdObj := e2eutil.ManifestToUnstructured(invalidCrd)
31+
pod1Obj := e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod1), namespaceName)
3032
resources := []*unstructured.Unstructured{
3133
invalidCrdObj,
3234
pod1Obj,
3335
}
3436

35-
applierEvents := runCollect(applier.Run(ctx, inv, resources, apply.ApplierOptions{}))
37+
applierEvents := e2eutil.RunCollect(applier.Run(ctx, inv, resources, apply.ApplierOptions{}))
3638

3739
expEvents := []testutil.ExpEvent{
3840
{
@@ -167,8 +169,8 @@ func continueOnErrorTest(ctx context.Context, c client.Client, invConfig Invento
167169
Expect(receivedEvents).To(testutil.Equal(expEvents))
168170

169171
By("Verify pod1 created")
170-
assertUnstructuredExists(ctx, c, pod1Obj)
172+
e2eutil.AssertUnstructuredExists(ctx, c, pod1Obj)
171173

172174
By("Verify CRD not created")
173-
assertUnstructuredDoesNotExist(ctx, c, invalidCrdObj)
175+
e2eutil.AssertUnstructuredDoesNotExist(ctx, c, invalidCrdObj)
174176
}

test/e2e/crd_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,27 @@ import (
1616
"sigs.k8s.io/cli-utils/pkg/inventory"
1717
"sigs.k8s.io/cli-utils/pkg/object"
1818
"sigs.k8s.io/cli-utils/pkg/testutil"
19+
"sigs.k8s.io/cli-utils/test/e2e/e2eutil"
20+
"sigs.k8s.io/cli-utils/test/e2e/invconfig"
1921
"sigs.k8s.io/controller-runtime/pkg/client"
2022
)
2123

2224
//nolint:dupl // expEvents similar to mutation tests
23-
func crdTest(ctx context.Context, _ client.Client, invConfig InventoryConfig, inventoryName, namespaceName string) {
25+
func crdTest(ctx context.Context, _ client.Client, invConfig invconfig.InventoryConfig, inventoryName, namespaceName string) {
2426
By("apply a set of resources that includes both a crd and a cr")
2527
applier := invConfig.ApplierFactoryFunc()
2628

2729
inv := invConfig.InvWrapperFunc(invConfig.FactoryFunc(inventoryName, namespaceName, "test"))
2830

29-
crdObj := manifestToUnstructured(crd)
30-
crObj := manifestToUnstructured(cr)
31+
crdObj := e2eutil.ManifestToUnstructured(crd)
32+
crObj := e2eutil.ManifestToUnstructured(cr)
3133

3234
resources := []*unstructured.Unstructured{
3335
crObj,
3436
crdObj,
3537
}
3638

37-
applierEvents := runCollect(applier.Run(ctx, inv, resources, apply.ApplierOptions{
39+
applierEvents := e2eutil.RunCollect(applier.Run(ctx, inv, resources, apply.ApplierOptions{
3840
ReconcileTimeout: 2 * time.Minute,
3941
EmitStatusEvents: false,
4042
}))
@@ -215,7 +217,7 @@ func crdTest(ctx context.Context, _ client.Client, invConfig InventoryConfig, in
215217
By("destroy the resources, including the crd")
216218
destroyer := invConfig.DestroyerFactoryFunc()
217219
options := apply.DestroyerOptions{InventoryPolicy: inventory.PolicyAdoptIfNoInventory}
218-
destroyerEvents := runCollect(destroyer.Run(ctx, inv, options))
220+
destroyerEvents := e2eutil.RunCollect(destroyer.Run(ctx, inv, options))
219221

220222
expEvents = []testutil.ExpEvent{
221223
{

test/e2e/customprovider/provider.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,6 @@ spec:
3636
openAPIV3Schema:
3737
description: Example for cli-utils e2e tests
3838
properties:
39-
apiVersion:
40-
type: string
41-
kind:
42-
type: string
43-
metadata:
44-
type: object
4539
spec:
4640
properties:
4741
objects:

test/e2e/deletion_prevention_test.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,85 +14,87 @@ import (
1414
"sigs.k8s.io/cli-utils/pkg/apply"
1515
"sigs.k8s.io/cli-utils/pkg/common"
1616
"sigs.k8s.io/cli-utils/pkg/inventory"
17+
"sigs.k8s.io/cli-utils/test/e2e/e2eutil"
18+
"sigs.k8s.io/cli-utils/test/e2e/invconfig"
1719
"sigs.k8s.io/controller-runtime/pkg/client"
1820
)
1921

20-
func deletionPreventionTest(ctx context.Context, c client.Client, invConfig InventoryConfig, inventoryName, namespaceName string) {
22+
func deletionPreventionTest(ctx context.Context, c client.Client, invConfig invconfig.InventoryConfig, inventoryName, namespaceName string) {
2123
By("Apply resources")
2224
applier := invConfig.ApplierFactoryFunc()
2325
inventoryID := fmt.Sprintf("%s-%s", inventoryName, namespaceName)
2426

25-
inventoryInfo := createInventoryInfo(invConfig, inventoryName, namespaceName, inventoryID)
27+
inventoryInfo := invconfig.CreateInventoryInfo(invConfig, inventoryName, namespaceName, inventoryID)
2628

2729
resources := []*unstructured.Unstructured{
28-
withNamespace(manifestToUnstructured(deployment1), namespaceName),
29-
withAnnotation(withNamespace(manifestToUnstructured(pod1), namespaceName), common.OnRemoveAnnotation, common.OnRemoveKeep),
30-
withAnnotation(withNamespace(manifestToUnstructured(pod2), namespaceName), common.LifecycleDeleteAnnotation, common.PreventDeletion),
30+
e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(deployment1), namespaceName),
31+
e2eutil.WithAnnotation(e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod1), namespaceName), common.OnRemoveAnnotation, common.OnRemoveKeep),
32+
e2eutil.WithAnnotation(e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod2), namespaceName), common.LifecycleDeleteAnnotation, common.PreventDeletion),
3133
}
3234

33-
runCollect(applier.Run(ctx, inventoryInfo, resources, apply.ApplierOptions{
35+
e2eutil.RunCollect(applier.Run(ctx, inventoryInfo, resources, apply.ApplierOptions{
3436
ReconcileTimeout: 2 * time.Minute,
3537
}))
3638

3739
By("Verify deployment created")
38-
obj := assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(deployment1), namespaceName))
40+
obj := e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(deployment1), namespaceName))
3941
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(inventoryInfo.ID()))
4042

4143
By("Verify pod1 created")
42-
obj = assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(pod1), namespaceName))
44+
obj = e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod1), namespaceName))
4345
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(inventoryInfo.ID()))
4446

4547
By("Verify pod2 created")
46-
obj = assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(pod2), namespaceName))
48+
obj = e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod2), namespaceName))
4749
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(inventoryInfo.ID()))
4850

4951
By("Verify the inventory size is 3")
5052
invConfig.InvSizeVerifyFunc(ctx, c, inventoryName, namespaceName, inventoryID, 3, 3)
5153

5254
By("Dry-run apply resources")
5355
resources = []*unstructured.Unstructured{
54-
withNamespace(manifestToUnstructured(deployment1), namespaceName),
56+
e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(deployment1), namespaceName),
5557
}
5658

57-
runCollect(applier.Run(ctx, inventoryInfo, resources, apply.ApplierOptions{
59+
e2eutil.RunCollect(applier.Run(ctx, inventoryInfo, resources, apply.ApplierOptions{
5860
ReconcileTimeout: 2 * time.Minute,
5961
DryRunStrategy: common.DryRunClient,
6062
}))
6163

6264
By("Verify deployment still exists and has the config.k8s.io/owning-inventory annotation")
63-
obj = assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(deployment1), namespaceName))
65+
obj = e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(deployment1), namespaceName))
6466
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(inventoryInfo.ID()))
6567

6668
By("Verify pod1 still exits and does not have the config.k8s.io/owning-inventory annotation")
67-
obj = assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(pod1), namespaceName))
69+
obj = e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod1), namespaceName))
6870
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(inventoryInfo.ID()))
6971

7072
By("Verify pod2 still exits and does not have the config.k8s.io/owning-inventory annotation")
71-
obj = assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(pod2), namespaceName))
73+
obj = e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod2), namespaceName))
7274
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(inventoryInfo.ID()))
7375

7476
By("Verify the inventory size is still 3")
7577
invConfig.InvSizeVerifyFunc(ctx, c, inventoryName, namespaceName, inventoryID, 3, 3)
7678

7779
By("Apply resources")
7880
resources = []*unstructured.Unstructured{
79-
withNamespace(manifestToUnstructured(deployment1), namespaceName),
81+
e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(deployment1), namespaceName),
8082
}
8183

82-
runCollect(applier.Run(ctx, inventoryInfo, resources, apply.ApplierOptions{
84+
e2eutil.RunCollect(applier.Run(ctx, inventoryInfo, resources, apply.ApplierOptions{
8385
ReconcileTimeout: 2 * time.Minute,
8486
}))
8587

8688
By("Verify deployment still exists and has the config.k8s.io/owning-inventory annotation")
87-
obj = assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(deployment1), namespaceName))
89+
obj = e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(deployment1), namespaceName))
8890
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(inventoryInfo.ID()))
8991

9092
By("Verify pod1 still exits and does not have the config.k8s.io/owning-inventory annotation")
91-
obj = assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(pod1), namespaceName))
93+
obj = e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod1), namespaceName))
9294
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(""))
9395

9496
By("Verify pod2 still exits and does not have the config.k8s.io/owning-inventory annotation")
95-
obj = assertUnstructuredExists(ctx, c, withNamespace(manifestToUnstructured(pod2), namespaceName))
97+
obj = e2eutil.AssertUnstructuredExists(ctx, c, e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod2), namespaceName))
9698
Expect(obj.GetAnnotations()[inventory.OwningInventoryKey]).To(Equal(""))
9799

98100
By("Verify the inventory size is 1")

test/e2e/dependency_filter_test.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,20 @@ import (
1515
"sigs.k8s.io/cli-utils/pkg/object"
1616
"sigs.k8s.io/cli-utils/pkg/object/validation"
1717
"sigs.k8s.io/cli-utils/pkg/testutil"
18+
"sigs.k8s.io/cli-utils/test/e2e/e2eutil"
19+
"sigs.k8s.io/cli-utils/test/e2e/invconfig"
1820
"sigs.k8s.io/controller-runtime/pkg/client"
1921
)
2022

2123
//nolint:dupl // expEvents similar to other tests
22-
func dependencyFilterTest(ctx context.Context, c client.Client, invConfig InventoryConfig, inventoryName, namespaceName string) {
24+
func dependencyFilterTest(ctx context.Context, c client.Client, invConfig invconfig.InventoryConfig, inventoryName, namespaceName string) {
2325
By("apply resources in order based on depends-on annotation")
2426
applier := invConfig.ApplierFactoryFunc()
2527

2628
inv := invConfig.InvWrapperFunc(invConfig.FactoryFunc(inventoryName, namespaceName, "test"))
2729

28-
pod1Obj := withDependsOn(withNamespace(manifestToUnstructured(pod1), namespaceName), fmt.Sprintf("/namespaces/%s/Pod/pod2", namespaceName))
29-
pod2Obj := withNamespace(manifestToUnstructured(pod2), namespaceName)
30+
pod1Obj := e2eutil.WithDependsOn(e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod1), namespaceName), fmt.Sprintf("/namespaces/%s/Pod/pod2", namespaceName))
31+
pod2Obj := e2eutil.WithNamespace(e2eutil.ManifestToUnstructured(pod2), namespaceName)
3032

3133
// Dependency order: pod1 -> pod2
3234
// Apply order: pod2, pod1
@@ -37,11 +39,11 @@ func dependencyFilterTest(ctx context.Context, c client.Client, invConfig Invent
3739

3840
// Cleanup
3941
defer func(ctx context.Context, c client.Client) {
40-
deleteUnstructuredIfExists(ctx, c, pod1Obj)
41-
deleteUnstructuredIfExists(ctx, c, pod2Obj)
42+
e2eutil.DeleteUnstructuredIfExists(ctx, c, pod1Obj)
43+
e2eutil.DeleteUnstructuredIfExists(ctx, c, pod2Obj)
4244
}(ctx, c)
4345

44-
applierEvents := runCollect(applier.Run(ctx, inv, resources, apply.ApplierOptions{
46+
applierEvents := e2eutil.RunCollect(applier.Run(ctx, inv, resources, apply.ApplierOptions{
4547
EmitStatusEvents: false,
4648
}))
4749

@@ -219,14 +221,14 @@ func dependencyFilterTest(ctx context.Context, c client.Client, invConfig Invent
219221
Expect(testutil.EventsToExpEvents(applierEvents)).To(testutil.Equal(expEvents))
220222

221223
By("verify pod1 created and ready")
222-
result := assertUnstructuredExists(ctx, c, pod1Obj)
224+
result := e2eutil.AssertUnstructuredExists(ctx, c, pod1Obj)
223225
podIP, found, err := object.NestedField(result.Object, "status", "podIP")
224226
Expect(err).NotTo(HaveOccurred())
225227
Expect(found).To(BeTrue())
226228
Expect(podIP).NotTo(BeEmpty()) // use podIP as proxy for readiness
227229

228230
By("verify pod2 created and ready")
229-
result = assertUnstructuredExists(ctx, c, pod2Obj)
231+
result = e2eutil.AssertUnstructuredExists(ctx, c, pod2Obj)
230232
podIP, found, err = object.NestedField(result.Object, "status", "podIP")
231233
Expect(err).NotTo(HaveOccurred())
232234
Expect(found).To(BeTrue())
@@ -237,7 +239,7 @@ func dependencyFilterTest(ctx context.Context, c client.Client, invConfig Invent
237239
pod1Obj,
238240
}
239241

240-
applierEvents = runCollect(applier.Run(ctx, inv, resources, apply.ApplierOptions{
242+
applierEvents = e2eutil.RunCollect(applier.Run(ctx, inv, resources, apply.ApplierOptions{
241243
EmitStatusEvents: false,
242244
ValidationPolicy: validation.SkipInvalid,
243245
}))
@@ -398,13 +400,13 @@ func dependencyFilterTest(ctx context.Context, c client.Client, invConfig Invent
398400
Expect(testutil.EventsToExpEvents(applierEvents)).To(testutil.Equal(expEvents))
399401

400402
By("verify pod1 not deleted")
401-
result = assertUnstructuredExists(ctx, c, pod1Obj)
403+
result = e2eutil.AssertUnstructuredExists(ctx, c, pod1Obj)
402404
ts, found, err := object.NestedField(result.Object, "metadata", "deletionTimestamp")
403405
Expect(err).NotTo(HaveOccurred())
404406
Expect(found).To(BeFalse(), "deletionTimestamp found: ", ts)
405407

406408
By("verify pod2 not deleted")
407-
result = assertUnstructuredExists(ctx, c, pod2Obj)
409+
result = e2eutil.AssertUnstructuredExists(ctx, c, pod2Obj)
408410
ts, found, err = object.NestedField(result.Object, "metadata", "deletionTimestamp")
409411
Expect(err).NotTo(HaveOccurred())
410412
Expect(found).To(BeFalse(), "deletionTimestamp found: ", ts)

0 commit comments

Comments
 (0)