Skip to content

Commit c45e6d8

Browse files
committed
⚠️ Add testenv support for CRDv1/CRDv1beta1
Signed-off-by: Vince Prignano <[email protected]>
1 parent 8022402 commit c45e6d8

File tree

8 files changed

+226
-106
lines changed

8 files changed

+226
-106
lines changed

hack/check-everything.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ set -e
1919
hack_dir=$(dirname ${BASH_SOURCE})
2020
source ${hack_dir}/common.sh
2121

22-
k8s_version=1.14.1
22+
k8s_version=1.16.4
2323
goarch=amd64
2424
goos="unknown"
2525

pkg/builder/builder_suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func addCRDToEnvironment(env *envtest.Environment, gvks ...schema.GroupVersionKi
8080
plural, singular := meta.UnsafeGuessKindToResource(gvk)
8181
crd := &apiextensionsv1beta1.CustomResourceDefinition{
8282
TypeMeta: metav1.TypeMeta{
83-
APIVersion: "apiextensions.k8s.io",
83+
APIVersion: "apiextensions.k8s.io/v1beta1",
8484
Kind: "CustomResourceDefinition",
8585
},
8686
ObjectMeta: metav1.ObjectMeta{

pkg/envtest/crd.go

Lines changed: 70 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,23 @@ package envtest
1919
import (
2020
"bufio"
2121
"bytes"
22+
"context"
2223
"io"
2324
"io/ioutil"
2425
"os"
2526
"path/filepath"
2627
"time"
2728

28-
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
2929
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
3030
apierrors "k8s.io/apimachinery/pkg/api/errors"
31-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
31+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
32+
"k8s.io/apimachinery/pkg/runtime"
3233
"k8s.io/apimachinery/pkg/runtime/schema"
3334
"k8s.io/apimachinery/pkg/util/sets"
3435
"k8s.io/apimachinery/pkg/util/wait"
3536
k8syaml "k8s.io/apimachinery/pkg/util/yaml"
3637
"k8s.io/client-go/rest"
38+
"sigs.k8s.io/controller-runtime/pkg/client"
3739
"sigs.k8s.io/yaml"
3840
)
3941

@@ -43,7 +45,7 @@ type CRDInstallOptions struct {
4345
Paths []string
4446

4547
// CRDs is a list of CRDs to install
46-
CRDs []*apiextensionsv1beta1.CustomResourceDefinition
48+
CRDs []runtime.Object
4749

4850
// ErrorIfPathMissing will cause an error if a Path does not exist
4951
ErrorIfPathMissing bool
@@ -64,7 +66,7 @@ const defaultPollInterval = 100 * time.Millisecond
6466
const defaultMaxWait = 10 * time.Second
6567

6668
// InstallCRDs installs a collection of CRDs into a cluster by reading the crd yaml files from a directory
67-
func InstallCRDs(config *rest.Config, options CRDInstallOptions) ([]*apiextensionsv1beta1.CustomResourceDefinition, error) {
69+
func InstallCRDs(config *rest.Config, options CRDInstallOptions) ([]runtime.Object, error) {
6870
defaultCRDOptions(&options)
6971

7072
// Read the CRD yamls into options.CRDs
@@ -109,27 +111,57 @@ func defaultCRDOptions(o *CRDInstallOptions) {
109111
}
110112

111113
// WaitForCRDs waits for the CRDs to appear in discovery
112-
func WaitForCRDs(config *rest.Config, crds []*apiextensionsv1beta1.CustomResourceDefinition, options CRDInstallOptions) error {
114+
func WaitForCRDs(config *rest.Config, crds []runtime.Object, options CRDInstallOptions) error {
113115
// Add each CRD to a map of GroupVersion to Resource
114116
waitingFor := map[schema.GroupVersion]*sets.String{}
115-
for _, crd := range crds {
117+
for _, crd := range runtimeListToUnstructured(crds) {
116118
gvs := []schema.GroupVersion{}
117-
if crd.Spec.Version != "" {
118-
gvs = append(gvs, schema.GroupVersion{Group: crd.Spec.Group, Version: crd.Spec.Version})
119+
crdGroup, _, err := unstructured.NestedString(crd.Object, "spec", "group")
120+
if err != nil {
121+
return err
122+
}
123+
crdPlural, _, err := unstructured.NestedString(crd.Object, "spec", "names", "plural")
124+
if err != nil {
125+
return err
126+
}
127+
crdVersion, _, err := unstructured.NestedString(crd.Object, "spec", "version")
128+
if err != nil {
129+
return err
130+
}
131+
if crdVersion != "" {
132+
gvs = append(gvs, schema.GroupVersion{Group: crdGroup, Version: crdVersion})
133+
}
134+
135+
versions, _, err := unstructured.NestedSlice(crd.Object, "spec", "versions")
136+
if err != nil {
137+
return err
119138
}
120-
for _, ver := range crd.Spec.Versions {
121-
if ver.Served {
122-
gvs = append(gvs, schema.GroupVersion{Group: crd.Spec.Group, Version: ver.Name})
139+
for _, version := range versions {
140+
versionMap, ok := version.(map[string]interface{})
141+
if !ok {
142+
continue
143+
}
144+
served, _, err := unstructured.NestedBool(versionMap, "served")
145+
if err != nil {
146+
return err
147+
}
148+
if served {
149+
versionName, _, err := unstructured.NestedString(versionMap, "name")
150+
if err != nil {
151+
return err
152+
}
153+
gvs = append(gvs, schema.GroupVersion{Group: crdGroup, Version: versionName})
123154
}
124155
}
156+
125157
for _, gv := range gvs {
126158
log.V(1).Info("adding API in waitlist", "GV", gv)
127159
if _, found := waitingFor[gv]; !found {
128160
// Initialize the set
129161
waitingFor[gv] = &sets.String{}
130162
}
131163
// Add the Resource
132-
waitingFor[gv].Insert(crd.Spec.Names.Plural)
164+
waitingFor[gv].Insert(crdPlural)
133165
}
134166
}
135167

@@ -192,15 +224,15 @@ func UninstallCRDs(config *rest.Config, options CRDInstallOptions) error {
192224
}
193225

194226
// Delete the CRDs from the apiserver
195-
cs, err := clientset.NewForConfig(config)
227+
cs, err := client.New(config, client.Options{})
196228
if err != nil {
197229
return err
198230
}
199231

200232
// Uninstall each CRD
201-
for _, crd := range options.CRDs {
202-
log.V(1).Info("uninstalling CRD", "crd", crd.Name)
203-
if err := cs.ApiextensionsV1beta1().CustomResourceDefinitions().Delete(crd.Name, &metav1.DeleteOptions{}); err != nil {
233+
for _, crd := range runtimeListToUnstructured(options.CRDs) {
234+
log.V(1).Info("uninstalling CRD", "crd", crd.GetName())
235+
if err := cs.Delete(context.TODO(), crd); err != nil {
204236
// If CRD is not found, we can consider success
205237
if !apierrors.IsNotFound(err) {
206238
return err
@@ -212,28 +244,28 @@ func UninstallCRDs(config *rest.Config, options CRDInstallOptions) error {
212244
}
213245

214246
// CreateCRDs creates the CRDs
215-
func CreateCRDs(config *rest.Config, crds []*apiextensionsv1beta1.CustomResourceDefinition) error {
216-
cs, err := clientset.NewForConfig(config)
247+
func CreateCRDs(config *rest.Config, crds []runtime.Object) error {
248+
cs, err := client.New(config, client.Options{})
217249
if err != nil {
218250
return err
219251
}
220252

221253
// Create each CRD
222-
for _, crd := range crds {
223-
log.V(1).Info("installing CRD", "crd", crd.Name)
224-
if _, err := cs.ApiextensionsV1beta1().CustomResourceDefinitions().Create(crd); err != nil {
254+
for _, crd := range runtimeListToUnstructured(crds) {
255+
log.V(1).Info("installing CRD", "crd", crd.GetName())
256+
if err := cs.Create(context.TODO(), crd); err != nil {
225257
return err
226258
}
227259
}
228260
return nil
229261
}
230262

231263
// renderCRDs iterate through options.Paths and extract all CRD files.
232-
func renderCRDs(options *CRDInstallOptions) ([]*apiextensionsv1beta1.CustomResourceDefinition, error) {
264+
func renderCRDs(options *CRDInstallOptions) ([]runtime.Object, error) {
233265
var (
234266
err error
235267
info os.FileInfo
236-
crds []*apiextensionsv1beta1.CustomResourceDefinition
268+
crds []*unstructured.Unstructured
237269
files []os.FileInfo
238270
)
239271

@@ -263,18 +295,18 @@ func renderCRDs(options *CRDInstallOptions) ([]*apiextensionsv1beta1.CustomResou
263295
}
264296

265297
// If CRD already in the list, skip it.
266-
if existsCRDs(crds, crdList) {
298+
if existsUnstructured(crds, crdList) {
267299
continue
268300
}
269301
crds = append(crds, crdList...)
270302
}
271303

272-
return crds, nil
304+
return unstructuredListToRuntime(crds), nil
273305
}
274306

275307
// readCRDs reads the CRDs from files and Unmarshals them into structs
276-
func readCRDs(basePath string, files []os.FileInfo) ([]*apiextensionsv1beta1.CustomResourceDefinition, error) {
277-
var crds []*apiextensionsv1beta1.CustomResourceDefinition
308+
func readCRDs(basePath string, files []os.FileInfo) ([]*unstructured.Unstructured, error) {
309+
var crds []*unstructured.Unstructured
278310

279311
// White list the file extensions that may contain CRDs
280312
crdExts := sets.NewString(".json", ".yaml", ".yml")
@@ -292,13 +324,22 @@ func readCRDs(basePath string, files []os.FileInfo) ([]*apiextensionsv1beta1.Cus
292324
}
293325

294326
for _, doc := range docs {
295-
crd := &apiextensionsv1beta1.CustomResourceDefinition{}
327+
crd := &unstructured.Unstructured{}
296328
if err = yaml.Unmarshal(doc, crd); err != nil {
297329
return nil, err
298330
}
299331

300332
// Check that it is actually a CRD
301-
if crd.Spec.Names.Kind == "" || crd.Spec.Group == "" {
333+
crdKind, _, err := unstructured.NestedString(crd.Object, "spec", "names", "kind")
334+
if err != nil {
335+
return nil, err
336+
}
337+
crdGroup, _, err := unstructured.NestedString(crd.Object, "spec", "group")
338+
if err != nil {
339+
return nil, err
340+
}
341+
342+
if crd.GetKind() != "CustomResourceDefinition" || crdKind == "" || crdGroup == "" {
302343
continue
303344
}
304345
crds = append(crds, crd)

0 commit comments

Comments
 (0)