Skip to content

Commit eae89ba

Browse files
authored
Merge pull request #752 from vincepri/support-testenv-crdv1
⚠ Add testenv support for CRDv1/CRDv1beta1 + update to k8s 1.16.4
2 parents 7f899c3 + eb9e87f commit eae89ba

File tree

8 files changed

+292
-144
lines changed

8 files changed

+292
-144
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: 80 additions & 37 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
119130
}
120-
for _, ver := range crd.Spec.Versions {
121-
if ver.Served {
122-
gvs = append(gvs, schema.GroupVersion{Group: crd.Spec.Group, Version: ver.Name})
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
138+
}
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,26 +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 existingCrd, err := cs.ApiextensionsV1beta1().CustomResourceDefinitions().Get(crd.Name, metav1.GetOptions{}); err != nil {
225-
if !apierrors.IsNotFound(err) {
254+
for _, crd := range runtimeListToUnstructured(crds) {
255+
log.V(1).Info("installing CRD", "crd", crd.GetName())
256+
existingCrd := crd.DeepCopy()
257+
err := cs.Get(context.TODO(), client.ObjectKey{Name: crd.GetName()}, existingCrd)
258+
switch {
259+
case apierrors.IsNotFound(err):
260+
if err := cs.Create(context.TODO(), crd); err != nil {
226261
return err
227262
}
228-
if _, err := cs.ApiextensionsV1beta1().CustomResourceDefinitions().Create(crd); err != nil {
229-
return err
230-
}
231-
} else {
232-
log.V(1).Info("CRD already exists, updating", "crd", crd.Name)
233-
crd.ResourceVersion = existingCrd.ResourceVersion
234-
if _, err := cs.ApiextensionsV1beta1().CustomResourceDefinitions().Update(crd); err != nil {
263+
case err != nil:
264+
return err
265+
default:
266+
log.V(1).Info("CRD already exists, updating", "crd", crd.GetName())
267+
crd.SetResourceVersion(existingCrd.GetResourceVersion())
268+
if err := cs.Update(context.TODO(), crd); err != nil {
235269
return err
236270
}
237271
}
@@ -240,11 +274,11 @@ func CreateCRDs(config *rest.Config, crds []*apiextensionsv1beta1.CustomResource
240274
}
241275

242276
// renderCRDs iterate through options.Paths and extract all CRD files.
243-
func renderCRDs(options *CRDInstallOptions) ([]*apiextensionsv1beta1.CustomResourceDefinition, error) {
277+
func renderCRDs(options *CRDInstallOptions) ([]runtime.Object, error) {
244278
var (
245279
err error
246280
info os.FileInfo
247-
crds []*apiextensionsv1beta1.CustomResourceDefinition
281+
crds []*unstructured.Unstructured
248282
files []os.FileInfo
249283
)
250284

@@ -274,18 +308,18 @@ func renderCRDs(options *CRDInstallOptions) ([]*apiextensionsv1beta1.CustomResou
274308
}
275309

276310
// If CRD already in the list, skip it.
277-
if existsCRDs(crds, crdList) {
311+
if existsUnstructured(crds, crdList) {
278312
continue
279313
}
280314
crds = append(crds, crdList...)
281315
}
282316

283-
return crds, nil
317+
return unstructuredListToRuntime(crds), nil
284318
}
285319

286320
// readCRDs reads the CRDs from files and Unmarshals them into structs
287-
func readCRDs(basePath string, files []os.FileInfo) ([]*apiextensionsv1beta1.CustomResourceDefinition, error) {
288-
var crds []*apiextensionsv1beta1.CustomResourceDefinition
321+
func readCRDs(basePath string, files []os.FileInfo) ([]*unstructured.Unstructured, error) {
322+
var crds []*unstructured.Unstructured
289323

290324
// White list the file extensions that may contain CRDs
291325
crdExts := sets.NewString(".json", ".yaml", ".yml")
@@ -303,13 +337,22 @@ func readCRDs(basePath string, files []os.FileInfo) ([]*apiextensionsv1beta1.Cus
303337
}
304338

305339
for _, doc := range docs {
306-
crd := &apiextensionsv1beta1.CustomResourceDefinition{}
340+
crd := &unstructured.Unstructured{}
307341
if err = yaml.Unmarshal(doc, crd); err != nil {
308342
return nil, err
309343
}
310344

311345
// Check that it is actually a CRD
312-
if crd.Spec.Names.Kind == "" || crd.Spec.Group == "" {
346+
crdKind, _, err := unstructured.NestedString(crd.Object, "spec", "names", "kind")
347+
if err != nil {
348+
return nil, err
349+
}
350+
crdGroup, _, err := unstructured.NestedString(crd.Object, "spec", "group")
351+
if err != nil {
352+
return nil, err
353+
}
354+
355+
if crd.GetKind() != "CustomResourceDefinition" || crdKind == "" || crdGroup == "" {
313356
continue
314357
}
315358
crds = append(crds, crd)

0 commit comments

Comments
 (0)