@@ -24,7 +24,8 @@ import (
24
24
"strings"
25
25
26
26
"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"
28
29
"sigs.k8s.io/yaml"
29
30
30
31
"github.com/operator-framework/operator-sdk/internal/util/projutil"
@@ -66,65 +67,96 @@ func PluginKeyToOperatorType(pluginKey string) projutil.OperatorType {
66
67
return ""
67
68
}
68
69
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 {
73
74
return err
74
75
}
75
76
}
76
77
return nil
77
78
}
78
79
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 {
82
82
if err := os .MkdirAll (dir , 0755 ); err != nil {
83
83
return err
84
84
}
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 {
87
102
return err
88
103
}
104
+ seenFiles [fileName ] = struct {}{}
89
105
}
90
106
return nil
91
107
}
92
108
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 )
95
111
}
96
112
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 {
100
116
if err := os .MkdirAll (dir , 0755 ); err != nil {
101
117
return err
102
118
}
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 {
105
136
return err
106
137
}
138
+ seenFiles [fileName ] = struct {}{}
107
139
}
108
140
return nil
109
141
}
110
142
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 )
113
145
}
114
146
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 ))
118
150
if err != nil {
119
151
return err
120
152
}
121
153
defer f .Close ()
122
- return writeCRD (f , crd )
154
+ return writeObject (f , obj )
123
155
}
124
156
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 )
128
160
if err != nil {
129
161
return err
130
162
}
0 commit comments