@@ -8,57 +8,127 @@ import (
88
99 "sigs.k8s.io/controller-runtime/pkg/client"
1010 "sigs.k8s.io/yaml"
11+
12+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
13+ "github.com/operator-framework/operator-registry/alpha/property"
14+
15+ "github.com/operator-framework/operator-controller/internal/operator-controller/rukpak/bundle/source"
16+ registry "github.com/operator-framework/operator-controller/internal/operator-controller/rukpak/operator-registry"
1117)
1218
1319const (
1420 BundlePathAnnotations = "metadata/annotations.yaml"
1521 BundlePathProperties = "metadata/properties.yaml"
1622 BundlePathManifests = "manifests"
17- BundlePathCSV = BundlePathManifests + "/csv.yaml"
1823)
1924
20- func NewBundleFS () fstest.MapFS {
21- annotationsYml := `
22- annotations:
23- operators.operatorframework.io.bundle.mediatype.v1: registry+v1
24- operators.operatorframework.io.bundle.package.v1: test
25- `
26-
27- propertiesYml := `
28- properties:
29- - type: "from-file-key"
30- value: "from-file-value"
31- `
32-
33- csvYml := `
34- apiVersion: operators.operatorframework.io/v1alpha1
35- kind: ClusterServiceVersion
36- metadata:
37- name: test.v1.0.0
38- annotations:
39- olm.properties: '[{"type":"from-csv-annotations-key", "value":"from-csv-annotations-value"}]'
40- spec:
41- installModes:
42- - type: AllNamespaces
43- supported: true
44- `
45-
46- return fstest.MapFS {
47- BundlePathAnnotations : & fstest.MapFile {Data : []byte (strings .Trim (annotationsYml , "\n " ))},
48- BundlePathProperties : & fstest.MapFile {Data : []byte (strings .Trim (propertiesYml , "\n " ))},
49- BundlePathCSV : & fstest.MapFile {Data : []byte (strings .Trim (csvYml , "\n " ))},
25+ // BundleFSBuilder builds a registry+v1 bundle filesystem
26+ type BundleFSBuilder struct {
27+ annotations * registry.Annotations
28+ properties []property.Property
29+ resources map [string ]client.Object
30+ }
31+
32+ func NewBundleFSBuilder () * BundleFSBuilder {
33+ return & BundleFSBuilder {}
34+ }
35+
36+ // WithPackageName is an option for NewBundleFS used to set the package name annotation in the
37+ // bundle filesystem metadata/annotations.yaml file
38+ func (b * BundleFSBuilder ) WithPackageName (packageName string ) * BundleFSBuilder {
39+ if b .annotations == nil {
40+ b .annotations = & registry.Annotations {}
5041 }
42+ b .annotations .PackageName = packageName
43+ return b
5144}
5245
53- func AddManifest (bundleFS fstest.MapFS , obj client.Object ) error {
54- gvk := obj .GetObjectKind ().GroupVersionKind ()
55- manifestName := fmt .Sprintf ("%s%s_%s_%s%s.yaml" , gvk .Group , gvk .Version , gvk .Kind , obj .GetNamespace (), obj .GetName ())
56- bytes , err := yaml .Marshal (obj )
57- if err != nil {
58- return err
46+ // WithChannels is an option for NewBundleFS used to set the channels annotation in the
47+ // bundle filesystem metadata/annotations.yaml file
48+ func (b * BundleFSBuilder ) WithChannels (channels ... string ) * BundleFSBuilder {
49+ if b .annotations == nil {
50+ b .annotations = & registry.Annotations {}
5951 }
60- bundleFS [filepath .Join (BundlePathManifests , manifestName )] = & fstest.MapFile {
61- Data : bytes ,
52+ b .annotations .Channels = strings .Join (channels , "," )
53+ return b
54+ }
55+
56+ // WithDefaultChannel is an option for NewBundleFS used to set the channel annotation in the
57+ // bundle filesystem metadata/annotations.yaml file
58+ func (b * BundleFSBuilder ) WithDefaultChannel (channel string ) * BundleFSBuilder {
59+ if b .annotations == nil {
60+ b .annotations = & registry.Annotations {}
61+ }
62+ b .annotations .DefaultChannelName = channel
63+ return b
64+ }
65+
66+ // WithBundleProperty is an options for NewBundleFS used to add a property to the list of properties
67+ // in the bundle filesystem metadata/properties.yaml file
68+ func (b * BundleFSBuilder ) WithBundleProperty (propertyType string , value string ) * BundleFSBuilder {
69+ b .properties = append (b .properties , property.Property {
70+ Type : propertyType ,
71+ Value : []byte (`"` + value + `"` ),
72+ })
73+ return b
74+ }
75+
76+ // WithBundleResource is an option for NewBundleFS use to add the yaml representation of resource to the
77+ // path manifests/<resourceName>.yaml on the bundles filesystem
78+ func (b * BundleFSBuilder ) WithBundleResource (resourceName string , resource client.Object ) * BundleFSBuilder {
79+ if b .resources == nil {
80+ b .resources = make (map [string ]client.Object )
6281 }
63- return nil
82+ b .resources [resourceName ] = resource
83+ return b
84+ }
85+
86+ // WithCSV is an optiona for NewBundleFS used to add the yaml representation of csv to the
87+ // path manifests/csv.yaml on the bundle filesystem
88+ func (b * BundleFSBuilder ) WithCSV (csv v1alpha1.ClusterServiceVersion ) * BundleFSBuilder {
89+ if b .resources == nil {
90+ b .resources = make (map [string ]client.Object )
91+ }
92+ b .resources ["csv.yaml" ] = & csv
93+ return b
94+ }
95+
96+ // Build creates a registry+v1 bundle filesystem with the applied options
97+ // By default, an empty registry+v1 bundle filesystem will be returned
98+ func (b * BundleFSBuilder ) Build () fstest.MapFS {
99+ bundleFS := fstest.MapFS {}
100+
101+ // Add annotations metadata
102+ if b .annotations != nil {
103+ annotationsYml , err := yaml .Marshal (registry.AnnotationsFile {
104+ Annotations : * b .annotations ,
105+ })
106+ if err != nil {
107+ panic (fmt .Errorf ("error building bundle fs: %w" , err ))
108+ }
109+ bundleFS [BundlePathAnnotations ] = & fstest.MapFile {Data : annotationsYml }
110+ }
111+
112+ // Add property metadata
113+ if len (b .properties ) > 0 {
114+ propertiesYml , err := yaml .Marshal (source.RegistryV1Properties {
115+ Properties : b .properties ,
116+ })
117+ if err != nil {
118+ panic (fmt .Errorf ("error building bundle fs: %w" , err ))
119+ }
120+ bundleFS [BundlePathProperties ] = & fstest.MapFile {Data : propertiesYml }
121+ }
122+
123+ // Add resources
124+ for name , obj := range b .resources {
125+ resourcePath := filepath .Join (BundlePathManifests , name )
126+ resourceYml , err := yaml .Marshal (obj )
127+ if err != nil {
128+ panic (fmt .Errorf ("error building bundle fs: %w" , err ))
129+ }
130+ bundleFS [resourcePath ] = & fstest.MapFile {Data : resourceYml }
131+ }
132+
133+ return bundleFS
64134}
0 commit comments