From d048e2a3e80f3938b9cc03abc9360f32cc1e8ed2 Mon Sep 17 00:00:00 2001 From: Mihalkin Grigoriy Aleksandrovich Date: Sun, 14 Apr 2019 01:48:17 +0300 Subject: [PATCH] envtest can load multiple CRDs from single file --- Gopkg.lock | 1 + pkg/envtest/crd.go | 55 ++++++++++++++++++++++++++++------- pkg/envtest/envtest_test.go | 26 +++++++++++++++++ pkg/envtest/multiplecrds.yaml | 25 ++++++++++++++++ 4 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 pkg/envtest/multiplecrds.yaml diff --git a/Gopkg.lock b/Gopkg.lock index fe6f143a7d..742613fd65 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -968,6 +968,7 @@ "k8s.io/apimachinery/pkg/util/sets", "k8s.io/apimachinery/pkg/util/uuid", "k8s.io/apimachinery/pkg/util/wait", + "k8s.io/apimachinery/pkg/util/yaml", "k8s.io/apimachinery/pkg/watch", "k8s.io/client-go/discovery", "k8s.io/client-go/dynamic", diff --git a/pkg/envtest/crd.go b/pkg/envtest/crd.go index 28d8b7c10c..209c59abf2 100644 --- a/pkg/envtest/crd.go +++ b/pkg/envtest/crd.go @@ -17,6 +17,9 @@ limitations under the License. package envtest import ( + "bufio" + "bytes" + "io" "io/ioutil" "os" "path/filepath" @@ -28,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" + k8syaml "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/rest" ) @@ -202,23 +206,52 @@ func readCRDs(path string) ([]*apiextensionsv1beta1.CustomResourceDefinition, er continue } - // Unmarshal the file into a struct - b, err := ioutil.ReadFile(filepath.Join(path, file.Name())) + // Unmarshal CRDs from file into structs + docs, err := readDocuments(filepath.Join(path, file.Name())) if err != nil { return nil, err } - crd := &apiextensionsv1beta1.CustomResourceDefinition{} - if err = yaml.Unmarshal(b, crd); err != nil { - return nil, err - } - // Check that it is actually a CRD - if crd.Spec.Names.Kind == "" || crd.Spec.Group == "" { - continue + for _, doc := range docs { + crd := &apiextensionsv1beta1.CustomResourceDefinition{} + if err = yaml.Unmarshal(doc, crd); err != nil { + return nil, err + } + + // Check that it is actually a CRD + if crd.Spec.Names.Kind == "" || crd.Spec.Group == "" { + continue + } + crds = append(crds, crd) } - log.V(1).Info("read CRD from file", "file", file) - crds = append(crds, crd) + log.V(1).Info("read CRDs from file", "file", file) } return crds, nil } + +// readDocuments reads documents from file +func readDocuments(fp string) ([][]byte, error) { + b, err := ioutil.ReadFile(fp) + if err != nil { + return nil, err + } + + docs := [][]byte{} + reader := k8syaml.NewYAMLReader(bufio.NewReader(bytes.NewReader(b))) + for { + // Read document + doc, err := reader.Read() + if err != nil { + if err == io.EOF { + break + } + + return nil, err + } + + docs = append(docs, doc) + } + + return docs, nil +} diff --git a/pkg/envtest/envtest_test.go b/pkg/envtest/envtest_test.go index 65e22f342d..108a8feb8b 100644 --- a/pkg/envtest/envtest_test.go +++ b/pkg/envtest/envtest_test.go @@ -76,6 +76,16 @@ var _ = Describe("Test", func() { Expect(err).NotTo(HaveOccurred()) Expect(crd.Spec.Names.Kind).To(Equal("Baz")) + crd = &v1beta1.CustomResourceDefinition{} + err = c.Get(context.TODO(), types.NamespacedName{Name: "captains.crew.example.com"}, crd) + Expect(err).NotTo(HaveOccurred()) + Expect(crd.Spec.Names.Kind).To(Equal("Captain")) + + crd = &v1beta1.CustomResourceDefinition{} + err = c.Get(context.TODO(), types.NamespacedName{Name: "firstmates.crew.example.com"}, crd) + Expect(err).NotTo(HaveOccurred()) + Expect(crd.Spec.Names.Kind).To(Equal("FirstMate")) + err = WaitForCRDs(env.Config, []*v1beta1.CustomResourceDefinition{ { Spec: v1beta1.CustomResourceDefinitionSpec{ @@ -92,6 +102,22 @@ var _ = Describe("Test", func() { Names: v1beta1.CustomResourceDefinitionNames{ Plural: "foos", }}, + }, + { + Spec: v1beta1.CustomResourceDefinitionSpec{ + Group: "crew.example.com", + Version: "v1beta1", + Names: v1beta1.CustomResourceDefinitionNames{ + Plural: "captains", + }}, + }, + { + Spec: v1beta1.CustomResourceDefinitionSpec{ + Group: "crew.example.com", + Version: "v1beta1", + Names: v1beta1.CustomResourceDefinitionNames{ + Plural: "firstmates", + }}, }}, CRDInstallOptions{maxTime: 50 * time.Millisecond, pollInterval: 15 * time.Millisecond}, ) diff --git a/pkg/envtest/multiplecrds.yaml b/pkg/envtest/multiplecrds.yaml new file mode 100644 index 0000000000..2148eca204 --- /dev/null +++ b/pkg/envtest/multiplecrds.yaml @@ -0,0 +1,25 @@ +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: captains.crew.example.com +spec: + group: crew.example.com + names: + kind: Captain + plural: captains + scope: Namespaced + version: "v1beta1" +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: firstmates.crew.example.com +spec: + group: crew.example.com + names: + kind: FirstMate + plural: firstmates + scope: Namespaced + version: "v1beta1" +--- \ No newline at end of file