@@ -24,7 +24,8 @@ import (
2424 "strings"
2525
2626 "github.com/blang/semver"
27- "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
27+ apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
28+ apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
2829 "sigs.k8s.io/yaml"
2930
3031 "github.com/operator-framework/operator-sdk/internal/util/projutil"
@@ -66,65 +67,96 @@ func PluginKeyToOperatorType(pluginKey string) projutil.OperatorType {
6667 return ""
6768}
6869
69- // WriteCRDs writes each CustomResourceDefinition in crds to w.
70- func WriteCRDs (w io.Writer , crds ... v1beta1. CustomResourceDefinition ) error {
71- for _ , crd := range crds {
72- if err := writeCRD (w , crd ); err != nil {
70+ // WriteObjects writes each object in objs to w.
71+ func WriteObjects (w io.Writer , objs ... interface {} ) error {
72+ for _ , obj := range objs {
73+ if err := writeObject (w , obj ); err != nil {
7374 return err
7475 }
7576 }
7677 return nil
7778}
7879
79- // WriteCRDFiles creates dir then writes each CustomResourceDefinition in crds
80- // to a file in dir.
81- func WriteCRDFiles (dir string , crds ... v1beta1.CustomResourceDefinition ) error {
80+ // WriteObjectsToFiles creates dir then writes each object in objs to a file in dir.
81+ func WriteObjectsToFiles (dir string , objs ... interface {}) error {
8282 if err := os .MkdirAll (dir , 0755 ); err != nil {
8383 return err
8484 }
85- for _ , crd := range crds {
86- if err := writeCRDFile (dir , crd , makeCRDFileName (crd )); err != nil {
85+
86+ seenFiles := make (map [string ]struct {})
87+ for _ , obj := range objs {
88+ var fileName string
89+ switch t := obj .(type ) {
90+ case apiextv1.CustomResourceDefinition :
91+ fileName = makeCRDFileName (t .Spec .Group , t .Spec .Names .Plural )
92+ case apiextv1beta1.CustomResourceDefinition :
93+ fileName = makeCRDFileName (t .Spec .Group , t .Spec .Names .Plural )
94+ default :
95+ return fmt .Errorf ("unknown object type: %T" , t )
96+ }
97+
98+ if _ , hasFile := seenFiles [fileName ]; hasFile {
99+ return fmt .Errorf ("duplicate file cannot be written: %s" , fileName )
100+ }
101+ if err := writeObjectToFile (dir , obj , fileName ); err != nil {
87102 return err
88103 }
104+ seenFiles [fileName ] = struct {}{}
89105 }
90106 return nil
91107}
92108
93- func makeCRDFileName (crd v1beta1. CustomResourceDefinition ) string {
94- return fmt .Sprintf ("%s_%s.yaml" , crd . Spec . Group , crd . Spec . Names . Plural )
109+ func makeCRDFileName (group , resource string ) string {
110+ return fmt .Sprintf ("%s_%s.yaml" , group , resource )
95111}
96112
97- // WriteCRDFilesLegacy creates dir then writes each CustomResourceDefinition
98- // in crds to a file in legacy format in dir.
99- func WriteCRDFilesLegacy (dir string , crds ... v1beta1. CustomResourceDefinition ) error {
113+ // WriteObjectsToFilesLegacy creates dir then writes each object in objs to a
114+ // file in legacy format in dir.
115+ func WriteObjectsToFilesLegacy (dir string , objs ... interface {} ) error {
100116 if err := os .MkdirAll (dir , 0755 ); err != nil {
101117 return err
102118 }
103- for _ , crd := range crds {
104- if err := writeCRDFile (dir , crd , makeCRDFileNameLegacy (crd )); err != nil {
119+
120+ seenFiles := make (map [string ]struct {})
121+ for _ , obj := range objs {
122+ var fileName string
123+ switch t := obj .(type ) {
124+ case apiextv1.CustomResourceDefinition :
125+ fileName = makeCRDFileNameLegacy (t .Spec .Group , t .Spec .Names .Plural )
126+ case apiextv1beta1.CustomResourceDefinition :
127+ fileName = makeCRDFileNameLegacy (t .Spec .Group , t .Spec .Names .Plural )
128+ default :
129+ return fmt .Errorf ("unknown object type: %T" , t )
130+ }
131+
132+ if _ , hasFile := seenFiles [fileName ]; hasFile {
133+ return fmt .Errorf ("duplicate file cannot be written: %s" , fileName )
134+ }
135+ if err := writeObjectToFile (dir , obj , fileName ); err != nil {
105136 return err
106137 }
138+ seenFiles [fileName ] = struct {}{}
107139 }
108140 return nil
109141}
110142
111- func makeCRDFileNameLegacy (crd v1beta1. CustomResourceDefinition ) string {
112- return fmt .Sprintf ("%s_%s_crd.yaml" , crd . Spec . Group , crd . Spec . Names . Plural )
143+ func makeCRDFileNameLegacy (group , resource string ) string {
144+ return fmt .Sprintf ("%s_%s_crd.yaml" , group , resource )
113145}
114146
115- // writeCRDFile marshals crd to bytes and writes them to dir in file.
116- func writeCRDFile (dir string , crd v1beta1. CustomResourceDefinition , file string ) error {
117- f , err := os .Create (filepath .Join (dir , file ))
147+ // writeObjectToFile marshals crd to bytes and writes them to dir in file.
148+ func writeObjectToFile (dir string , obj interface {}, fileName string ) error {
149+ f , err := os .Create (filepath .Join (dir , fileName ))
118150 if err != nil {
119151 return err
120152 }
121153 defer f .Close ()
122- return writeCRD (f , crd )
154+ return writeObject (f , obj )
123155}
124156
125- // writeCRD marshals crd to bytes and writes them to w.
126- func writeCRD (w io.Writer , crd v1beta1. CustomResourceDefinition ) error {
127- b , err := yaml .Marshal (crd )
157+ // writeObject marshals crd to bytes and writes them to w.
158+ func writeObject (w io.Writer , obj interface {} ) error {
159+ b , err := yaml .Marshal (obj )
128160 if err != nil {
129161 return err
130162 }
0 commit comments