Skip to content

Commit aa944d6

Browse files
authored
*: handle both v1 and v1beta1 CRD versions (#3121)
1 parent 90c796c commit aa944d6

File tree

14 files changed

+466
-194
lines changed

14 files changed

+466
-194
lines changed

cmd/operator-sdk/generate/bundle/bundle.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,20 @@ func (c bundleCmd) runManifests(cfg *config.Config) (err error) {
164164
return fmt.Errorf("error generating ClusterServiceVersion: %v", err)
165165
}
166166

167+
var objs []interface{}
168+
for _, crd := range col.V1CustomResourceDefinitions {
169+
objs = append(objs, crd)
170+
}
171+
for _, crd := range col.V1beta1CustomResourceDefinitions {
172+
objs = append(objs, crd)
173+
}
167174
if c.stdout {
168-
if err := genutil.WriteCRDs(stdout, col.CustomResourceDefinitions...); err != nil {
175+
if err := genutil.WriteObjects(stdout, objs...); err != nil {
169176
return err
170177
}
171178
} else {
172179
dir := filepath.Join(c.outputDir, bundle.ManifestsDir)
173-
if err := genutil.WriteCRDFiles(dir, col.CustomResourceDefinitions...); err != nil {
180+
if err := genutil.WriteObjectsToFiles(dir, objs...); err != nil {
174181
return err
175182
}
176183
}

cmd/operator-sdk/generate/bundle/bundle_legacy.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,15 @@ func (c bundleCmd) runManifestsLegacy() (err error) {
9393
return fmt.Errorf("error generating ClusterServiceVersion: %v", err)
9494
}
9595

96+
var objs []interface{}
97+
for _, crd := range col.V1CustomResourceDefinitions {
98+
objs = append(objs, crd)
99+
}
100+
for _, crd := range col.V1beta1CustomResourceDefinitions {
101+
objs = append(objs, crd)
102+
}
96103
dir := filepath.Join(c.outputDir, bundle.ManifestsDir)
97-
if err := genutil.WriteCRDFilesLegacy(dir, col.CustomResourceDefinitions...); err != nil {
104+
if err := genutil.WriteObjectsToFilesLegacy(dir, objs...); err != nil {
98105
return err
99106
}
100107

cmd/operator-sdk/generate/internal/genutil.go

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

internal/generate/clusterserviceversion/clusterserviceversion.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/operator-framework/operator-sdk/internal/generate/clusterserviceversion/bases"
3030
"github.com/operator-framework/operator-sdk/internal/generate/collector"
3131
genutil "github.com/operator-framework/operator-sdk/internal/generate/internal"
32+
"github.com/operator-framework/operator-sdk/internal/util/k8sutil"
3233
"github.com/operator-framework/operator-sdk/internal/util/projutil"
3334
)
3435

@@ -263,15 +264,10 @@ func (g Generator) makeBundleBaseGetterLegacy(inputDir, apisDir string, ilvl pro
263264
func (g Generator) makeBaseGetterLegacy(basePath, apisDir string, interactive bool) getBaseFunc {
264265
var gvks []schema.GroupVersionKind
265266
if g.Collector != nil {
266-
for _, crd := range g.Collector.CustomResourceDefinitions {
267-
for _, version := range crd.Spec.Versions {
268-
gvks = append(gvks, schema.GroupVersionKind{
269-
Group: crd.Spec.Group,
270-
Version: version.Name,
271-
Kind: crd.Spec.Names.Kind,
272-
})
273-
}
274-
}
267+
v1crdGVKs := k8sutil.GVKsForV1CustomResourceDefinitions(g.Collector.V1CustomResourceDefinitions...)
268+
gvks = append(gvks, v1crdGVKs...)
269+
v1beta1crdGVKs := k8sutil.GVKsForV1beta1CustomResourceDefinitions(g.Collector.V1beta1CustomResourceDefinitions...)
270+
gvks = append(gvks, v1beta1crdGVKs...)
275271
}
276272

277273
return func() (*operatorsv1alpha1.ClusterServiceVersion, error) {

internal/generate/clusterserviceversion/clusterserviceversion_updaters.go

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"k8s.io/apimachinery/pkg/version"
3232

3333
"github.com/operator-framework/operator-sdk/internal/generate/collector"
34+
"github.com/operator-framework/operator-sdk/internal/util/k8sutil"
3435
)
3536

3637
// ApplyTo applies relevant manifests in c to csv, sorts the applied updates,
@@ -173,24 +174,29 @@ func applyCustomResourceDefinitions(c *collector.Manifests, csv *operatorsv1alph
173174
}
174175
descMap[defKey] = owned
175176
}
176-
for _, crd := range c.CustomResourceDefinitions {
177-
for _, ver := range crd.Spec.Versions {
178-
defKey := registry.DefinitionKey{
179-
Name: crd.GetName(),
180-
Version: ver.Name,
181-
Kind: crd.Spec.Names.Kind,
182-
}
183-
if owned, ownedExists := descMap[defKey]; ownedExists {
184-
ownedDescs = append(ownedDescs, owned)
185-
} else {
186-
ownedDescs = append(ownedDescs, operatorsv1alpha1.CRDDescription{
187-
Name: defKey.Name,
188-
Version: defKey.Version,
189-
Kind: defKey.Kind,
190-
})
191-
}
177+
178+
var defKeys []registry.DefinitionKey
179+
v1crdKeys := k8sutil.DefinitionsForV1CustomResourceDefinitions(c.V1CustomResourceDefinitions...)
180+
defKeys = append(defKeys, v1crdKeys...)
181+
v1beta1crdKeys := k8sutil.DefinitionsForV1beta1CustomResourceDefinitions(c.V1beta1CustomResourceDefinitions...)
182+
defKeys = append(defKeys, v1beta1crdKeys...)
183+
// crdDescriptions don't have a 'group' field.
184+
for i := 0; i < len(defKeys); i++ {
185+
defKeys[i].Group = ""
186+
}
187+
188+
for _, defKey := range defKeys {
189+
if owned, ownedExists := descMap[defKey]; ownedExists {
190+
ownedDescs = append(ownedDescs, owned)
191+
} else {
192+
ownedDescs = append(ownedDescs, operatorsv1alpha1.CRDDescription{
193+
Name: defKey.Name,
194+
Version: defKey.Version,
195+
Kind: defKey.Kind,
196+
})
192197
}
193198
}
199+
194200
csv.Spec.CustomResourceDefinitions.Owned = ownedDescs
195201
}
196202

0 commit comments

Comments
 (0)