Skip to content

Commit 0ca9c57

Browse files
committed
[csc] Populate the ConfigMap with operator artifacts
On creation of a CatalogSourceConfig object with a list of packagies IDs, query the internal datastore for CSVs, CRDs and packages for each ID and add them to a ConfigMap's data section in a format understood by OLM. - Updated the Dockerfile to install root CA certificates.
1 parent c54163f commit 0ca9c57

File tree

6 files changed

+67
-16
lines changed

6 files changed

+67
-16
lines changed

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ COPY . .
55
RUN make osbs-build
66

77
FROM alpine:3.6
8+
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
89
RUN useradd marketplace-operator
910
USER marketplace-operator
1011
COPY --from=builder /go/src/github.com/operator-framework/operator-marketplace/tmp/_output/bin/marketplace-operator /usr/bin

deploy/catalogsourceconfig.cr.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ metadata:
44
name: "example"
55
spec:
66
targetNamespace: "global"
7+
packages: "operators/marketplace-operators"
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package catalogsourceconfig
22

3-
func NewHandler() Handler {
4-
return &handler{}
3+
import (
4+
"github.com/operator-framework/operator-marketplace/pkg/operatorsource"
5+
)
6+
7+
func NewHandler(r operatorsource.DatastoreReader) Handler {
8+
return &handler{reader: r}
59
}

pkg/catalogsourceconfig/handler.go

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ package catalogsourceconfig
22

33
import (
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
1628
type Handler interface {
1729
Handle(ctx context.Context, event sdk.Event) error
1830
}
1931

2032
type handler struct {
33+
reader opsrc.DatastoreReader
2134
}
2235

2336
var 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
68114
func 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
}

pkg/stub/handler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import (
1313
)
1414

1515
func NewHandler() sdk.Handler {
16-
opsrcHandler, _ := operatorsource.NewHandler()
17-
cscHandler := catalogsourceconfig.NewHandler()
16+
opsrcHandler, reader := operatorsource.NewHandler()
17+
cscHandler := catalogsourceconfig.NewHandler(reader)
1818
return &Handler{
1919
operatorSourceHandler: opsrcHandler,
2020
catalogSourceConfigHandler: cscHandler,

tmp/build/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
FROM alpine:3.6
22

3+
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
34
RUN adduser -D marketplace-operator
45
USER marketplace-operator
56

0 commit comments

Comments
 (0)