Skip to content

Commit e5ca30c

Browse files
authored
Merge pull request kubernetes#81684 from jpbetz/conformance-prep
Prepare admission and CRD e2e tests to be promoted to conformance
2 parents 518ff2a + a5bf6e6 commit e5ca30c

File tree

8 files changed

+243
-95
lines changed

8 files changed

+243
-95
lines changed

staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,38 @@ const (
4343
noxuInstanceNum int64 = 9223372036854775807
4444
)
4545

46+
// NewRandomNameV1CustomResourceDefinition generates a CRD with random name to avoid name conflict in e2e tests
47+
func NewRandomNameV1CustomResourceDefinition(scope apiextensionsv1.ResourceScope) *apiextensionsv1.CustomResourceDefinition {
48+
// ensure the singular doesn't end in an s for now
49+
gName := names.SimpleNameGenerator.GenerateName("foo") + "a"
50+
return &apiextensionsv1.CustomResourceDefinition{
51+
ObjectMeta: metav1.ObjectMeta{Name: gName + "s.mygroup.example.com"},
52+
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
53+
Group: "mygroup.example.com",
54+
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
55+
{
56+
Name: "v1beta1",
57+
Served: true,
58+
Storage: true,
59+
Schema: &apiextensionsv1.CustomResourceValidation{
60+
OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{
61+
XPreserveUnknownFields: pointer.BoolPtr(true),
62+
Type: "object",
63+
},
64+
},
65+
},
66+
},
67+
Names: apiextensionsv1.CustomResourceDefinitionNames{
68+
Plural: gName + "s",
69+
Singular: gName,
70+
Kind: gName,
71+
ListKind: gName + "List",
72+
},
73+
Scope: scope,
74+
},
75+
}
76+
}
77+
4678
// NewRandomNameCustomResourceDefinition generates a CRD with random name to avoid name conflict in e2e tests
4779
func NewRandomNameCustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition {
4880
// ensure the singular doesn't end in an s for now

test/e2e/apimachinery/BUILD

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ go_library(
4242
"//staging/src/k8s.io/api/scheduling/v1:go_default_library",
4343
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
4444
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library",
45-
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
4645
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library",
4746
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
4847
"//staging/src/k8s.io/apiextensions-apiserver/test/integration:go_default_library",

test/e2e/apimachinery/crd_conversion_webhook.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3131
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3232
"k8s.io/apimachinery/pkg/util/intstr"
33-
utilversion "k8s.io/apimachinery/pkg/util/version"
3433
"k8s.io/client-go/dynamic"
3534
clientset "k8s.io/client-go/kubernetes"
3635
"k8s.io/kubernetes/test/e2e/framework"
@@ -54,8 +53,6 @@ const (
5453
roleBindingCRDName = "crd-conversion-webhook-auth-reader"
5554
)
5655

57-
var serverCRDConversionWebhookVersion = utilversion.MustParseSemantic("v1.13.0-alpha")
58-
5956
var apiVersions = []apiextensionsv1.CustomResourceDefinitionVersion{
6057
{
6158
Name: "v1",
@@ -129,9 +126,6 @@ var _ = SIGDescribe("CustomResourceConversionWebhook", func() {
129126
client = f.ClientSet
130127
namespaceName = f.Namespace.Name
131128

132-
// Make sure the relevant provider supports conversion webhook
133-
framework.SkipUnlessServerVersionGTE(serverCRDConversionWebhookVersion, f.ClientSet.Discovery())
134-
135129
ginkgo.By("Setting up server cert")
136130
context = setupServerCert(f.Namespace.Name, serviceCRDName)
137131
createAuthReaderRoleBindingForCRDConversion(f, f.Namespace.Name)

test/e2e/apimachinery/crd_publish_openapi.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
apiequality "k8s.io/apimachinery/pkg/api/equality"
3636
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3737
"k8s.io/apimachinery/pkg/types"
38-
utilversion "k8s.io/apimachinery/pkg/util/version"
3938
"k8s.io/apimachinery/pkg/util/wait"
4039
k8sclientset "k8s.io/client-go/kubernetes"
4140
"k8s.io/client-go/rest"
@@ -47,17 +46,12 @@ import (
4746
)
4847

4948
var (
50-
crdPublishOpenAPIVersion = utilversion.MustParseSemantic("v1.14.0")
51-
metaPattern = `"kind":"%s","apiVersion":"%s/%s","metadata":{"name":"%s"}`
49+
metaPattern = `"kind":"%s","apiVersion":"%s/%s","metadata":{"name":"%s"}`
5250
)
5351

5452
var _ = SIGDescribe("CustomResourcePublishOpenAPI", func() {
5553
f := framework.NewDefaultFramework("crd-publish-openapi")
5654

57-
ginkgo.BeforeEach(func() {
58-
framework.SkipUnlessServerVersionGTE(crdPublishOpenAPIVersion, f.ClientSet.Discovery())
59-
})
60-
6155
ginkgo.It("works for CRD with validation schema", func() {
6256
crd, err := setupCRD(f, schemaFoo, "foo", "v1")
6357
if err != nil {

test/e2e/apimachinery/crd_watch.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ var _ = SIGDescribe("CustomResourceDefinition Watch", func() {
4646
*/
4747
ginkgo.It("watch on custom resource definition objects", func() {
4848

49-
framework.SkipUnlessServerVersionGTE(crdVersion, f.ClientSet.Discovery())
50-
5149
const (
5250
watchCRNameA = "name1"
5351
watchCRNameB = "name2"

test/e2e/apimachinery/custom_resource_definition.go

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package apimachinery
1919
import (
2020
"github.com/onsi/ginkgo"
2121

22-
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
22+
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2323
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
2424
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
2525
"k8s.io/apimachinery/pkg/api/equality"
@@ -29,15 +29,12 @@ import (
2929
"k8s.io/apimachinery/pkg/types"
3030
"k8s.io/apimachinery/pkg/util/diff"
3131
"k8s.io/apimachinery/pkg/util/uuid"
32-
utilversion "k8s.io/apimachinery/pkg/util/version"
3332
"k8s.io/client-go/dynamic"
3433
"k8s.io/client-go/util/retry"
3534
"k8s.io/kubernetes/test/e2e/framework"
3635
e2elog "k8s.io/kubernetes/test/e2e/framework/log"
3736
)
3837

39-
var crdVersion = utilversion.MustParseSemantic("v1.7.0")
40-
4138
var _ = SIGDescribe("CustomResourceDefinition resources", func() {
4239

4340
f := framework.NewDefaultFramework("custom-resource-definition")
@@ -55,14 +52,14 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
5552
apiExtensionClient, err := clientset.NewForConfig(config)
5653
framework.ExpectNoError(err, "initializing apiExtensionClient")
5754

58-
randomDefinition := fixtures.NewRandomNameCustomResourceDefinition(v1beta1.ClusterScoped)
55+
randomDefinition := fixtures.NewRandomNameV1CustomResourceDefinition(v1.ClusterScoped)
5956

6057
// Create CRD and waits for the resource to be recognized and available.
61-
randomDefinition, err = fixtures.CreateNewCustomResourceDefinition(randomDefinition, apiExtensionClient, f.DynamicClient)
58+
randomDefinition, err = fixtures.CreateNewV1CustomResourceDefinition(randomDefinition, apiExtensionClient, f.DynamicClient)
6259
framework.ExpectNoError(err, "creating CustomResourceDefinition")
6360

6461
defer func() {
65-
err = fixtures.DeleteCustomResourceDefinition(randomDefinition, apiExtensionClient)
62+
err = fixtures.DeleteV1CustomResourceDefinition(randomDefinition, apiExtensionClient)
6663
framework.ExpectNoError(err, "deleting CustomResourceDefinition")
6764
}()
6865
})
@@ -83,30 +80,30 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
8380
testUUID := string(uuid.NewUUID())
8481

8582
// Create CRD and wait for the resource to be recognized and available.
86-
crds := make([]*v1beta1.CustomResourceDefinition, testListSize)
83+
crds := make([]*v1.CustomResourceDefinition, testListSize)
8784
for i := 0; i < testListSize; i++ {
88-
crd := fixtures.NewRandomNameCustomResourceDefinition(v1beta1.ClusterScoped)
85+
crd := fixtures.NewRandomNameV1CustomResourceDefinition(v1.ClusterScoped)
8986
crd.Labels = map[string]string{"e2e-list-test-uuid": testUUID}
90-
crd, err = fixtures.CreateNewCustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
87+
crd, err = fixtures.CreateNewV1CustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
9188
framework.ExpectNoError(err, "creating CustomResourceDefinition")
9289
crds[i] = crd
9390
}
9491

9592
// Create a crd w/o the label to ensure the label selector matching works correctly
96-
crd := fixtures.NewRandomNameCustomResourceDefinition(v1beta1.ClusterScoped)
97-
crd, err = fixtures.CreateNewCustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
93+
crd := fixtures.NewRandomNameV1CustomResourceDefinition(v1.ClusterScoped)
94+
crd, err = fixtures.CreateNewV1CustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
9895
framework.ExpectNoError(err, "creating CustomResourceDefinition")
9996
defer func() {
100-
err = fixtures.DeleteCustomResourceDefinition(crd, apiExtensionClient)
97+
err = fixtures.DeleteV1CustomResourceDefinition(crd, apiExtensionClient)
10198
framework.ExpectNoError(err, "deleting CustomResourceDefinition")
10299
}()
103100

104101
selectorListOpts := metav1.ListOptions{LabelSelector: "e2e-list-test-uuid=" + testUUID}
105-
list, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().List(selectorListOpts)
102+
list, err := apiExtensionClient.ApiextensionsV1().CustomResourceDefinitions().List(selectorListOpts)
106103
framework.ExpectNoError(err, "listing CustomResourceDefinitions")
107104
framework.ExpectEqual(len(list.Items), testListSize)
108105
for _, actual := range list.Items {
109-
var expected *v1beta1.CustomResourceDefinition
106+
var expected *v1.CustomResourceDefinition
110107
for _, e := range crds {
111108
if e.Name == actual.Name && e.Namespace == actual.Namespace {
112109
expected = e
@@ -122,7 +119,7 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
122119
// Use delete collection to remove the CRDs
123120
err = fixtures.DeleteCustomResourceDefinitions(selectorListOpts, apiExtensionClient)
124121
framework.ExpectNoError(err, "deleting CustomResourceDefinitions")
125-
_, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(crd.Name, metav1.GetOptions{})
122+
_, err = apiExtensionClient.ApiextensionsV1().CustomResourceDefinitions().Get(crd.Name, metav1.GetOptions{})
126123
framework.ExpectNoError(err, "getting remaining CustomResourceDefinition")
127124
})
128125

@@ -138,20 +135,20 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
138135
framework.ExpectNoError(err, "initializing apiExtensionClient")
139136
dynamicClient, err := dynamic.NewForConfig(config)
140137
framework.ExpectNoError(err, "initializing dynamic client")
141-
gvr := v1beta1.SchemeGroupVersion.WithResource("customresourcedefinitions")
138+
gvr := v1.SchemeGroupVersion.WithResource("customresourcedefinitions")
142139
resourceClient := dynamicClient.Resource(gvr)
143140

144141
// Create CRD and waits for the resource to be recognized and available.
145-
crd := fixtures.NewRandomNameCustomResourceDefinition(v1beta1.ClusterScoped)
146-
crd, err = fixtures.CreateNewCustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
142+
crd := fixtures.NewRandomNameV1CustomResourceDefinition(v1.ClusterScoped)
143+
crd, err = fixtures.CreateNewV1CustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
147144
framework.ExpectNoError(err, "creating CustomResourceDefinition")
148145
defer func() {
149-
err = fixtures.DeleteCustomResourceDefinition(crd, apiExtensionClient)
146+
err = fixtures.DeleteV1CustomResourceDefinition(crd, apiExtensionClient)
150147
framework.ExpectNoError(err, "deleting CustomResourceDefinition")
151148
}()
152149

153-
var updated *v1beta1.CustomResourceDefinition
154-
updateCondition := v1beta1.CustomResourceDefinitionCondition{Message: "updated"}
150+
var updated *v1.CustomResourceDefinition
151+
updateCondition := v1.CustomResourceDefinitionCondition{Message: "updated"}
155152
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
156153
// Use dynamic client to read the status sub-resource since typed client does not expose it.
157154
u, err := resourceClient.Get(crd.GetName(), metav1.GetOptions{}, "status")
@@ -161,14 +158,14 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
161158
e2elog.Failf("Expected CustomResourceDefinition Spec to match status sub-resource Spec, but got:\n%s", diff.ObjectReflectDiff(status.Spec, crd.Spec))
162159
}
163160
status.Status.Conditions = append(status.Status.Conditions, updateCondition)
164-
updated, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().UpdateStatus(status)
161+
updated, err = apiExtensionClient.ApiextensionsV1().CustomResourceDefinitions().UpdateStatus(status)
165162
return err
166163
})
167164
framework.ExpectNoError(err, "updating CustomResourceDefinition status")
168165
expectCondition(updated.Status.Conditions, updateCondition)
169166

170-
patchCondition := v1beta1.CustomResourceDefinitionCondition{Message: "patched"}
171-
patched, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Patch(
167+
patchCondition := v1.CustomResourceDefinitionCondition{Message: "patched"}
168+
patched, err := apiExtensionClient.ApiextensionsV1().CustomResourceDefinitions().Patch(
172169
crd.GetName(),
173170
types.JSONPatchType,
174171
[]byte(`[{"op": "add", "path": "/status/conditions", "value": [{"message": "patched"}]}]`),
@@ -180,14 +177,14 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
180177
})
181178
})
182179

183-
func unstructuredToCRD(obj *unstructured.Unstructured) *v1beta1.CustomResourceDefinition {
184-
crd := new(v1beta1.CustomResourceDefinition)
180+
func unstructuredToCRD(obj *unstructured.Unstructured) *v1.CustomResourceDefinition {
181+
crd := new(v1.CustomResourceDefinition)
185182
err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, crd)
186183
framework.ExpectNoError(err, "converting unstructured to CustomResourceDefinition")
187184
return crd
188185
}
189186

190-
func expectCondition(conditions []v1beta1.CustomResourceDefinitionCondition, expected v1beta1.CustomResourceDefinitionCondition) {
187+
func expectCondition(conditions []v1.CustomResourceDefinitionCondition, expected v1.CustomResourceDefinitionCondition) {
191188
for _, c := range conditions {
192189
if equality.Semantic.DeepEqual(c, expected) {
193190
return

test/e2e/apimachinery/garbage_collector.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
batchv1 "k8s.io/api/batch/v1"
2626
batchv1beta1 "k8s.io/api/batch/v1beta1"
2727
"k8s.io/api/core/v1"
28-
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
28+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2929
apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
3030
apiextensionstestserver "k8s.io/apiextensions-apiserver/test/integration/fixtures"
3131
"k8s.io/apimachinery/pkg/api/errors"
@@ -876,23 +876,25 @@ var _ = SIGDescribe("Garbage collector", func() {
876876

877877
// Create a random custom resource definition and ensure it's available for
878878
// use.
879-
definition := apiextensionstestserver.NewRandomNameCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
879+
definition := apiextensionstestserver.NewRandomNameV1CustomResourceDefinition(apiextensionsv1.ClusterScoped)
880880
defer func() {
881-
err = apiextensionstestserver.DeleteCustomResourceDefinition(definition, apiExtensionClient)
881+
err = apiextensionstestserver.DeleteV1CustomResourceDefinition(definition, apiExtensionClient)
882882
if err != nil && !errors.IsNotFound(err) {
883883
e2elog.Failf("failed to delete CustomResourceDefinition: %v", err)
884884
}
885885
}()
886-
definition, err = apiextensionstestserver.CreateNewCustomResourceDefinition(definition, apiExtensionClient, f.DynamicClient)
886+
definition, err = apiextensionstestserver.CreateNewV1CustomResourceDefinition(definition, apiExtensionClient, f.DynamicClient)
887887
if err != nil {
888888
e2elog.Failf("failed to create CustomResourceDefinition: %v", err)
889889
}
890+
framework.ExpectEqual(len(definition.Spec.Versions), 1, "custom resource definition should have one version")
891+
version := definition.Spec.Versions[0]
890892

891893
// Get a client for the custom resource.
892-
gvr := schema.GroupVersionResource{Group: definition.Spec.Group, Version: definition.Spec.Version, Resource: definition.Spec.Names.Plural}
894+
gvr := schema.GroupVersionResource{Group: definition.Spec.Group, Version: version.Name, Resource: definition.Spec.Names.Plural}
893895
resourceClient := f.DynamicClient.Resource(gvr)
894896

895-
apiVersion := definition.Spec.Group + "/" + definition.Spec.Version
897+
apiVersion := definition.Spec.Group + "/" + version.Name
896898

897899
// Create a custom owner resource.
898900
ownerName := names.SimpleNameGenerator.GenerateName("owner")
@@ -977,23 +979,25 @@ var _ = SIGDescribe("Garbage collector", func() {
977979

978980
// Create a random custom resource definition and ensure it's available for
979981
// use.
980-
definition := apiextensionstestserver.NewRandomNameCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
982+
definition := apiextensionstestserver.NewRandomNameV1CustomResourceDefinition(apiextensionsv1.ClusterScoped)
981983
defer func() {
982-
err = apiextensionstestserver.DeleteCustomResourceDefinition(definition, apiExtensionClient)
984+
err = apiextensionstestserver.DeleteV1CustomResourceDefinition(definition, apiExtensionClient)
983985
if err != nil && !errors.IsNotFound(err) {
984986
e2elog.Failf("failed to delete CustomResourceDefinition: %v", err)
985987
}
986988
}()
987-
definition, err = apiextensionstestserver.CreateNewCustomResourceDefinition(definition, apiExtensionClient, f.DynamicClient)
989+
definition, err = apiextensionstestserver.CreateNewV1CustomResourceDefinition(definition, apiExtensionClient, f.DynamicClient)
988990
if err != nil {
989991
e2elog.Failf("failed to create CustomResourceDefinition: %v", err)
990992
}
993+
framework.ExpectEqual(len(definition.Spec.Versions), 1, "custom resource definition should have one version")
994+
version := definition.Spec.Versions[0]
991995

992996
// Get a client for the custom resource.
993-
gvr := schema.GroupVersionResource{Group: definition.Spec.Group, Version: definition.Spec.Version, Resource: definition.Spec.Names.Plural}
997+
gvr := schema.GroupVersionResource{Group: definition.Spec.Group, Version: version.Name, Resource: definition.Spec.Names.Plural}
994998
resourceClient := f.DynamicClient.Resource(gvr)
995999

996-
apiVersion := definition.Spec.Group + "/" + definition.Spec.Version
1000+
apiVersion := definition.Spec.Group + "/" + version.Name
9971001

9981002
// Create a custom owner resource.
9991003
ownerName := names.SimpleNameGenerator.GenerateName("owner")

0 commit comments

Comments
 (0)