Skip to content

Commit 1e6686e

Browse files
authored
Merge pull request kubernetes#81864 from jpbetz/crd-conformance
Promote CRD e2e tests to conformance
2 parents bc089a3 + c7919e6 commit 1e6686e

File tree

5 files changed

+149
-29
lines changed

5 files changed

+149
-29
lines changed

test/conformance/testdata/conformance.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
test/e2e/apimachinery/aggregator.go: "Should be able to support the 1.10 Sample API Server using the current Aggregator"
2+
test/e2e/apimachinery/crd_conversion_webhook.go: "should be able to convert from CR v1 to CR v2"
3+
test/e2e/apimachinery/crd_conversion_webhook.go: "should be able to convert a non homogeneous list of CRs"
4+
test/e2e/apimachinery/crd_publish_openapi.go: "works for CRD with validation schema"
5+
test/e2e/apimachinery/crd_publish_openapi.go: "works for CRD without validation schema"
6+
test/e2e/apimachinery/crd_publish_openapi.go: "works for CRD preserving unknown fields at the schema root"
7+
test/e2e/apimachinery/crd_publish_openapi.go: "works for CRD preserving unknown fields in an embedded object"
8+
test/e2e/apimachinery/crd_publish_openapi.go: "works for multiple CRDs of different groups"
9+
test/e2e/apimachinery/crd_publish_openapi.go: "works for multiple CRDs of same group but different versions"
10+
test/e2e/apimachinery/crd_publish_openapi.go: "works for multiple CRDs of same group and version but different kinds"
11+
test/e2e/apimachinery/crd_publish_openapi.go: "updates the published spec when one version gets renamed"
12+
test/e2e/apimachinery/crd_publish_openapi.go: "removes definition from spec when one version gets changed to not be served"
13+
test/e2e/apimachinery/crd_watch.go: "watch on custom resource definition objects"
214
test/e2e/apimachinery/custom_resource_definition.go: "creating/deleting custom resource definition objects works"
15+
test/e2e/apimachinery/custom_resource_definition.go: "listing custom resource definition objects works"
16+
test/e2e/apimachinery/custom_resource_definition.go: "getting/updating/patching custom resource definition status sub-resource works"
317
test/e2e/apimachinery/garbage_collector.go: "should delete pods created by rc when not orphaning"
418
test/e2e/apimachinery/garbage_collector.go: "should orphan pods created by rc if delete options say so"
519
test/e2e/apimachinery/garbage_collector.go: "should delete RS created by deployment when not orphaning"

test/e2e/apimachinery/crd_conversion_webhook.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ var alternativeAPIVersions = []apiextensionsv1.CustomResourceDefinitionVersion{
113113
},
114114
}
115115

116-
var _ = SIGDescribe("CustomResourceConversionWebhook", func() {
116+
var _ = SIGDescribe("CustomResourceConversionWebhook [Privileged:ClusterAdmin]", func() {
117117
var context *certContext
118118
f := framework.NewDefaultFramework("crd-webhook")
119119
servicePort := int32(9443)
@@ -137,7 +137,13 @@ var _ = SIGDescribe("CustomResourceConversionWebhook", func() {
137137
cleanCRDWebhookTest(client, namespaceName)
138138
})
139139

140-
ginkgo.It("Should be able to convert from CR v1 to CR v2", func() {
140+
/*
141+
Release : v1.16
142+
Testname: Custom Resource Definition Conversion Webhook, conversion custom resource
143+
Description: Register a conversion webhook and a custom resource definition. Create a v1 custom
144+
resource. Attempts to read it at v2 MUST succeed.
145+
*/
146+
framework.ConformanceIt("should be able to convert from CR v1 to CR v2", func() {
141147
testcrd, err := crd.CreateMultiVersionTestCRD(f, "stable.example.com", func(crd *apiextensionsv1.CustomResourceDefinition) {
142148
crd.Spec.Versions = apiVersions
143149
crd.Spec.Conversion = &apiextensionsv1.CustomResourceConversion{
@@ -164,7 +170,14 @@ var _ = SIGDescribe("CustomResourceConversionWebhook", func() {
164170
testCustomResourceConversionWebhook(f, testcrd.Crd, testcrd.DynamicClients)
165171
})
166172

167-
ginkgo.It("Should be able to convert a non homogeneous list of CRs", func() {
173+
/*
174+
Release : v1.16
175+
Testname: Custom Resource Definition Conversion Webhook, convert mixed version list
176+
Description: Register a conversion webhook and a custom resource definition. Create a custom resource stored at
177+
v1. Change the custom resource definition storage to v2. Create a custom resource stored at v2. Attempt to list
178+
the custom resources at v2; the list result MUST contain both custom resources at v2.
179+
*/
180+
framework.ConformanceIt("should be able to convert a non homogeneous list of CRs", func() {
168181
testcrd, err := crd.CreateMultiVersionTestCRD(f, "stable.example.com", func(crd *apiextensionsv1.CustomResourceDefinition) {
169182
crd.Spec.Versions = apiVersions
170183
crd.Spec.Conversion = &apiextensionsv1.CustomResourceConversion{

test/e2e/apimachinery/crd_publish_openapi.go

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,20 @@ var (
4949
metaPattern = `"kind":"%s","apiVersion":"%s/%s","metadata":{"name":"%s"}`
5050
)
5151

52-
var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
52+
var _ = SIGDescribe("CustomResourcePublishOpenAPI [Privileged:ClusterAdmin]", func() {
5353
f := framework.NewDefaultFramework("crd-publish-openapi")
5454

55-
ginkgo.It("works for CRD with validation schema", func() {
55+
/*
56+
Release: v1.16
57+
Testname: Custom Resource OpenAPI Publish, with validation schema
58+
Description: Register a custom resource definition with a validating schema consisting of objects, arrays and
59+
primitives. Attempt to create and apply a change a custom resource using valid properties, via kubectl;
60+
client-side validation MUST pass. Attempt both operations with unknown properties and without required
61+
properties; client-side validation MUST reject the operations. Attempt kubectl explain; the output MUST
62+
explain the custom resource properties. Attempt kubectl explain on custom resource properties; the output MUST
63+
explain the nested custom resource properties.
64+
*/
65+
framework.ConformanceIt("works for CRD with validation schema", func() {
5666
crd, err := setupCRD(f, schemaFoo, "foo", "v1")
5767
if err != nil {
5868
e2elog.Failf("%v", err)
@@ -120,7 +130,14 @@ var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
120130
}
121131
})
122132

123-
ginkgo.It("works for CRD without validation schema", func() {
133+
/*
134+
Release: v1.16
135+
Testname: Custom Resource OpenAPI Publish, with x-preserve-unknown-fields in object
136+
Description: Register a custom resource definition with x-preserve-unknown-fields in the top level object.
137+
Attempt to create and apply a change a custom resource, via kubectl; client-side validation MUST accept unknown
138+
properties. Attempt kubectl explain; the output MUST contain a valid DESCRIPTION stanza.
139+
*/
140+
framework.ConformanceIt("works for CRD without validation schema", func() {
124141
crd, err := setupCRD(f, nil, "empty", "v1")
125142
if err != nil {
126143
e2elog.Failf("%v", err)
@@ -154,7 +171,14 @@ var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
154171
}
155172
})
156173

157-
ginkgo.It("works for CRD preserving unknown fields at the schema root", func() {
174+
/*
175+
Release: v1.16
176+
Testname: Custom Resource OpenAPI Publish, with x-preserve-unknown-fields at root
177+
Description: Register a custom resource definition with x-preserve-unknown-fields in the schema root.
178+
Attempt to create and apply a change a custom resource, via kubectl; client-side validation MUST accept unknown
179+
properties. Attempt kubectl explain; the output MUST show the custom resource KIND.
180+
*/
181+
framework.ConformanceIt("works for CRD preserving unknown fields at the schema root", func() {
158182
crd, err := setupCRDAndVerifySchema(f, schemaPreserveRoot, nil, "unknown-at-root", "v1")
159183
if err != nil {
160184
e2elog.Failf("%v", err)
@@ -188,7 +212,15 @@ var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
188212
}
189213
})
190214

191-
ginkgo.It("works for CRD preserving unknown fields in an embedded object", func() {
215+
/*
216+
Release: v1.16
217+
Testname: Custom Resource OpenAPI Publish, with x-preserve-unknown-fields in embedded object
218+
Description: Register a custom resource definition with x-preserve-unknown-fields in an embedded object.
219+
Attempt to create and apply a change a custom resource, via kubectl; client-side validation MUST accept unknown
220+
properties. Attempt kubectl explain; the output MUST show that x-preserve-unknown-properties is used on the
221+
nested field.
222+
*/
223+
framework.ConformanceIt("works for CRD preserving unknown fields in an embedded object", func() {
192224
crd, err := setupCRDAndVerifySchema(f, schemaPreserveNested, nil, "unknown-in-nested", "v1")
193225
if err != nil {
194226
e2elog.Failf("%v", err)
@@ -222,7 +254,13 @@ var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
222254
}
223255
})
224256

225-
ginkgo.It("works for multiple CRDs of different groups", func() {
257+
/*
258+
Release: v1.16
259+
Testname: Custom Resource OpenAPI Publish, varying groups
260+
Description: Register multiple custom resource definitions spanning different groups and versions;
261+
OpenAPI definitions MUST be published for custom resource definitions.
262+
*/
263+
framework.ConformanceIt("works for multiple CRDs of different groups", func() {
226264
ginkgo.By("CRs in different groups (two CRDs) show up in OpenAPI documentation")
227265
crdFoo, err := setupCRD(f, schemaFoo, "foo", "v1")
228266
if err != nil {
@@ -249,7 +287,13 @@ var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
249287
}
250288
})
251289

252-
ginkgo.It("works for multiple CRDs of same group but different versions", func() {
290+
/*
291+
Release: v1.16
292+
Testname: Custom Resource OpenAPI Publish, varying versions
293+
Description: Register a custom resource definition with multiple versions; OpenAPI definitions MUST be published
294+
for custom resource definitions.
295+
*/
296+
framework.ConformanceIt("works for multiple CRDs of same group but different versions", func() {
253297
ginkgo.By("CRs in the same group but different versions (one multiversion CRD) show up in OpenAPI documentation")
254298
crdMultiVer, err := setupCRD(f, schemaFoo, "multi-ver", "v2", "v3")
255299
if err != nil {
@@ -291,7 +335,13 @@ var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
291335
}
292336
})
293337

294-
ginkgo.It("works for multiple CRDs of same group and version but different kinds", func() {
338+
/*
339+
Release: v1.16
340+
Testname: Custom Resource OpenAPI Publish, varying kinds
341+
Description: Register multiple custom resource definitions in the same group and version but spanning different kinds;
342+
OpenAPI definitions MUST be published for custom resource definitions.
343+
*/
344+
framework.ConformanceIt("works for multiple CRDs of same group and version but different kinds", func() {
295345
ginkgo.By("CRs in the same group and version but different kinds (two CRDs) show up in OpenAPI documentation")
296346
crdFoo, err := setupCRD(f, schemaFoo, "common-group", "v6")
297347
if err != nil {
@@ -318,7 +368,14 @@ var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
318368
}
319369
})
320370

321-
ginkgo.It("updates the published spec when one versin gets renamed", func() {
371+
/*
372+
Release: v1.16
373+
Testname: Custom Resource OpenAPI Publish, version rename
374+
Description: Register a custom resource definition with multiple versions; OpenAPI definitions MUST be published
375+
for custom resource definitions. Rename one of the versions of the custom resource definition via a patch;
376+
OpenAPI definitions MUST update to reflect the rename.
377+
*/
378+
framework.ConformanceIt("updates the published spec when one version gets renamed", func() {
322379
ginkgo.By("set up a multi version CRD")
323380
crdMultiVer, err := setupCRD(f, schemaFoo, "multi-ver", "v2", "v3")
324381
if err != nil {
@@ -362,7 +419,14 @@ var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
362419
}
363420
})
364421

365-
ginkgo.It("removes definition from spec when one versin gets changed to not be served", func() {
422+
/*
423+
Release: v1.16
424+
Testname: Custom Resource OpenAPI Publish, stop serving version
425+
Description: Register a custom resource definition with multiple versions. OpenAPI definitions MUST be published
426+
for custom resource definitions. Update the custom resource definition to not serve one of the versions. OpenAPI
427+
definitions MUST be updated to not contain the version that is no longer served.
428+
*/
429+
framework.ConformanceIt("removes definition from spec when one version gets changed to not be served", func() {
366430
ginkgo.By("set up a multi version CRD")
367431
crd, err := setupCRD(f, schemaFoo, "multi-to-single-ver", "v5", "v6alpha1")
368432
if err != nil {

test/e2e/apimachinery/crd_watch.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2828
"k8s.io/apimachinery/pkg/runtime/schema"
29+
"k8s.io/apimachinery/pkg/types"
2930
"k8s.io/apimachinery/pkg/watch"
3031
"k8s.io/client-go/dynamic"
3132
"k8s.io/kubernetes/test/e2e/framework"
@@ -34,17 +35,18 @@ import (
3435
"github.com/onsi/ginkgo"
3536
)
3637

37-
var _ = SIGDescribe("CustomResourceDefinition Watch", func() {
38+
var _ = SIGDescribe("CustomResourceDefinition Watch [Privileged:ClusterAdmin]", func() {
3839

3940
f := framework.NewDefaultFramework("crd-watch")
4041

4142
ginkgo.Context("CustomResourceDefinition Watch", func() {
4243
/*
43-
Testname: crd-watch
44-
Description: Create a Custom Resource Definition and make sure
45-
watches observe events on create/delete.
44+
Release: v1.16
45+
Testname: Custom Resource Definition, watch
46+
Description: Create a Custom Resource Definition. Attempt to watch it; the watch MUST observe create,
47+
modify and delete events.
4648
*/
47-
ginkgo.It("watch on custom resource definition objects", func() {
49+
framework.ConformanceIt("watch on custom resource definition objects", func() {
4850

4951
const (
5052
watchCRNameA = "name1"
@@ -99,6 +101,18 @@ var _ = SIGDescribe("CustomResourceDefinition Watch", func() {
99101
expectEvent(watchB, watch.Added, testCrB)
100102
expectNoEvent(watchA, watch.Added, testCrB)
101103

104+
ginkgo.By("Modifying first CR")
105+
err = patchCustomResource(noxuResourceClient, watchCRNameA)
106+
framework.ExpectNoError(err, "failed to patch custom resource: %s", watchCRNameA)
107+
expectEvent(watchA, watch.Modified, nil)
108+
expectNoEvent(watchB, watch.Modified, nil)
109+
110+
ginkgo.By("Modifying second CR")
111+
err = patchCustomResource(noxuResourceClient, watchCRNameB)
112+
framework.ExpectNoError(err, "failed to patch custom resource: %s", watchCRNameB)
113+
expectEvent(watchB, watch.Modified, nil)
114+
expectNoEvent(watchA, watch.Modified, nil)
115+
102116
ginkgo.By("Deleting first CR")
103117
err = deleteCustomResource(noxuResourceClient, watchCRNameA)
104118
framework.ExpectNoError(err, "failed to delete custom resource: %s", watchCRNameA)
@@ -152,6 +166,15 @@ func instantiateCustomResource(instanceToCreate *unstructured.Unstructured, clie
152166
return createdInstance, nil
153167
}
154168

169+
func patchCustomResource(client dynamic.ResourceInterface, name string) error {
170+
_, err := client.Patch(
171+
name,
172+
types.JSONPatchType,
173+
[]byte(`[{ "op": "add", "path": "/dummy", "value": "test" }]`),
174+
metav1.PatchOptions{})
175+
return err
176+
}
177+
155178
func deleteCustomResource(client dynamic.ResourceInterface, name string) error {
156179
return client.Delete(name, &metav1.DeleteOptions{})
157180
}

test/e2e/apimachinery/custom_resource_definition.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,17 @@ import (
3535
e2elog "k8s.io/kubernetes/test/e2e/framework/log"
3636
)
3737

38-
var _ = SIGDescribe("CustomResourceDefinition resources", func() {
38+
var _ = SIGDescribe("CustomResourceDefinition resources [Privileged:ClusterAdmin]", func() {
3939

40-
f := framework.NewDefaultFramework("custom-resource-definition")
40+
framework.NewDefaultFramework("custom-resource-definition")
4141

4242
ginkgo.Context("Simple CustomResourceDefinition", func() {
4343
/*
4444
Release : v1.9
4545
Testname: Custom Resource Definition, create
46-
Description: Create a API extension client, define a random custom resource definition, create the custom resource. API server MUST be able to create the custom resource.
46+
Description: Create a API extension client and define a random custom resource definition.
47+
Create the custom resource definition and then delete it. The creation and deletion MUST
48+
be successful.
4749
*/
4850
framework.ConformanceIt("creating/deleting custom resource definition objects works ", func() {
4951

@@ -55,7 +57,7 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
5557
randomDefinition := fixtures.NewRandomNameV1CustomResourceDefinition(v1.ClusterScoped)
5658

5759
// Create CRD and waits for the resource to be recognized and available.
58-
randomDefinition, err = fixtures.CreateNewV1CustomResourceDefinition(randomDefinition, apiExtensionClient, f.DynamicClient)
60+
randomDefinition, err = fixtures.CreateNewV1CustomResourceDefinitionWatchUnsafe(randomDefinition, apiExtensionClient)
5961
framework.ExpectNoError(err, "creating CustomResourceDefinition")
6062

6163
defer func() {
@@ -67,9 +69,12 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
6769
/*
6870
Release : v1.16
6971
Testname: Custom Resource Definition, list
70-
Description: Create a API extension client, define 10 random custom resource definitions and list them using a label selector. API server MUST be able to list the custom resource definitions and delete them via delete collection.
72+
Description: Create a API extension client, define 10 labeled custom resource definitions and list them using
73+
a label selector; the list result MUST contain only the labeled custom resource definitions. Delete the labeled
74+
custom resource definitions via delete collection; the delete MUST be successful and MUST delete only the
75+
labeled custom resource definitions.
7176
*/
72-
ginkgo.It("listing custom resource definition objects works ", func() {
77+
framework.ConformanceIt("listing custom resource definition objects works ", func() {
7378
testListSize := 10
7479
config, err := framework.LoadConfig()
7580
framework.ExpectNoError(err, "loading config")
@@ -84,14 +89,14 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
8489
for i := 0; i < testListSize; i++ {
8590
crd := fixtures.NewRandomNameV1CustomResourceDefinition(v1.ClusterScoped)
8691
crd.Labels = map[string]string{"e2e-list-test-uuid": testUUID}
87-
crd, err = fixtures.CreateNewV1CustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
92+
crd, err = fixtures.CreateNewV1CustomResourceDefinitionWatchUnsafe(crd, apiExtensionClient)
8893
framework.ExpectNoError(err, "creating CustomResourceDefinition")
8994
crds[i] = crd
9095
}
9196

9297
// Create a crd w/o the label to ensure the label selector matching works correctly
9398
crd := fixtures.NewRandomNameV1CustomResourceDefinition(v1.ClusterScoped)
94-
crd, err = fixtures.CreateNewV1CustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
99+
crd, err = fixtures.CreateNewV1CustomResourceDefinitionWatchUnsafe(crd, apiExtensionClient)
95100
framework.ExpectNoError(err, "creating CustomResourceDefinition")
96101
defer func() {
97102
err = fixtures.DeleteV1CustomResourceDefinition(crd, apiExtensionClient)
@@ -126,9 +131,10 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
126131
/*
127132
Release : v1.16
128133
Testname: Custom Resource Definition, status sub-resource
129-
Description: Create a API extension client, create a custom resource definition and then read, update and patch its status sub-resource. API server MUST be able to perform the operations against the status sub-resource.
134+
Description: Create a custom resource definition. Attempt to read, update and patch its status sub-resource;
135+
all mutating sub-resource operations MUST be visible to subsequent reads.
130136
*/
131-
ginkgo.It("getting/updating/patching custom resource definition status sub-resource works ", func() {
137+
framework.ConformanceIt("getting/updating/patching custom resource definition status sub-resource works ", func() {
132138
config, err := framework.LoadConfig()
133139
framework.ExpectNoError(err, "loading config")
134140
apiExtensionClient, err := clientset.NewForConfig(config)
@@ -140,7 +146,7 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
140146

141147
// Create CRD and waits for the resource to be recognized and available.
142148
crd := fixtures.NewRandomNameV1CustomResourceDefinition(v1.ClusterScoped)
143-
crd, err = fixtures.CreateNewV1CustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
149+
crd, err = fixtures.CreateNewV1CustomResourceDefinitionWatchUnsafe(crd, apiExtensionClient)
144150
framework.ExpectNoError(err, "creating CustomResourceDefinition")
145151
defer func() {
146152
err = fixtures.DeleteV1CustomResourceDefinition(crd, apiExtensionClient)

0 commit comments

Comments
 (0)