@@ -2,6 +2,10 @@ package catalogsourceconfig
22
33import (
44 "context"
5+ "fmt"
6+ "strings"
7+
8+ opsrc "github.com/operator-framework/operator-marketplace/pkg/operatorsource"
59
610 olm "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
711 "github.com/operator-framework/operator-marketplace/pkg/apis/marketplace/v1alpha1"
@@ -12,12 +16,21 @@ import (
1216 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1317)
1418
19+ // Copied from https://github.com/operator-framework/operator-lifecycle-manager/blob/master/pkg/controller/registry/configmap_loader.go#L18
20+ // TBD: Vendor in the folder once we require more than just these constants from the OLM registry code
21+ const (
22+ ConfigMapCRDName = "customResourceDefinitions"
23+ ConfigMapCSVName = "clusterServiceVersions"
24+ ConfigMapPackageName = "packages"
25+ )
26+
1527// Handler is the interface that wraps the Handle method
1628type Handler interface {
1729 Handle (ctx context.Context , event sdk.Event ) error
1830}
1931
2032type handler struct {
33+ reader opsrc.DatastoreReader
2134}
2235
2336var log * logrus.Entry
@@ -31,13 +44,41 @@ func (h *handler) Handle(ctx context.Context, event sdk.Event) error {
3144 log .Infof ("Deleted" )
3245 return nil
3346 }
34- return createCatalogSource (csc )
47+ data , err := h .createCatalogData (csc )
48+ if err != nil {
49+ return err
50+ }
51+ return createCatalogSource (csc , data )
52+ }
53+
54+ // createCatalogData constructs the ConfigMap data by reading the manifest information of all packages
55+ // from the datasource
56+ func (h * handler ) createCatalogData (csc * v1alpha1.CatalogSourceConfig ) (map [string ]string , error ) {
57+ packageIDs := getPackageIDs (csc .Spec .Packages )
58+ data := make (map [string ]string )
59+ if len (packageIDs ) < 1 {
60+ return data , fmt .Errorf ("No packages specified in CatalogSourceConfig %s/%s" , csc .Namespace , csc .Name )
61+ }
62+
63+ // TBD: Do we create a CatalogSource per package?
64+ for id := range packageIDs {
65+ manifest , err := h .reader .Read (packageIDs [id ])
66+ if err != nil {
67+ log .Errorf ("Error \" %v\" getting manifest for package ID %s" , err , packageIDs [id ])
68+ continue
69+ }
70+ // TODO: Add more error checking
71+ data [ConfigMapCRDName ] += manifest .Manifest .Data .CRDs
72+ data [ConfigMapCSVName ] += manifest .Manifest .Data .CSVs
73+ data [ConfigMapPackageName ] += manifest .Manifest .Data .Packages
74+ }
75+ return data , nil
3576}
3677
3778// createCatalogSource creates a new CatalogSource CR and all the resources it requires
38- func createCatalogSource (cr * v1alpha1.CatalogSourceConfig ) error {
79+ func createCatalogSource (cr * v1alpha1.CatalogSourceConfig , data map [ string ] string ) error {
3980 // Create the ConfigMap that will be used by the CatalogSource
40- catalogConfigMap := newConfigMap (cr )
81+ catalogConfigMap := newConfigMap (cr , data )
4182 log .Infof ("Creating %s ConfigMap" , catalogConfigMap .Name )
4283 err := sdk .Create (catalogConfigMap )
4384 if err != nil && ! errors .IsAlreadyExists (err ) {
@@ -64,6 +105,11 @@ func getLoggerWithCatalogSourceConfigTypeFields(csc *v1alpha1.CatalogSourceConfi
64105 })
65106}
66107
108+ // getPackageIDs returns a list of IDs from a comma separated string of IDs
109+ func getPackageIDs (csIDs string ) []string {
110+ return strings .Split (csIDs , "," )
111+ }
112+
67113// newCatalogSource returns a CatalogSource object
68114func newCatalogSource (cr * v1alpha1.CatalogSourceConfig , configMapName string ) * olm.CatalogSource {
69115 name := v1alpha1 .CatalogSourcePrefix + cr .Name
@@ -80,14 +126,17 @@ func newCatalogSource(cr *v1alpha1.CatalogSourceConfig, configMapName string) *o
80126 },
81127 },
82128 Spec : olm.CatalogSourceSpec {
83- SourceType : "internal" ,
84- ConfigMap : configMapName ,
129+ SourceType : "internal" ,
130+ ConfigMap : configMapName ,
131+ DisplayName : cr .Name ,
132+ // TBD: Where do we get this information from?
133+ Publisher : cr .Name ,
85134 },
86135 }
87136}
88137
89138// newConfigMap returns a new ConfigMap object
90- func newConfigMap (cr * v1alpha1.CatalogSourceConfig ) * corev1.ConfigMap {
139+ func newConfigMap (cr * v1alpha1.CatalogSourceConfig , data map [ string ] string ) * corev1.ConfigMap {
91140 name := v1alpha1 .ConfigMapPrefix + cr .Name
92141 return & corev1.ConfigMap {
93142 TypeMeta : metav1.TypeMeta {
@@ -101,11 +150,6 @@ func newConfigMap(cr *v1alpha1.CatalogSourceConfig) *corev1.ConfigMap {
101150 * metav1 .NewControllerRef (cr , cr .GroupVersionKind ()),
102151 },
103152 },
104- // Dummy placeholder data
105- Data : map [string ]string {
106- "clusterServiceVersions" : "csvs" ,
107- "customResourceDefinitions" : "crds" ,
108- "packages" : "packs" ,
109- },
153+ Data : data ,
110154 }
111155}
0 commit comments