Skip to content

Commit 368fcb8

Browse files
committedApr 16, 2020
fix(registry) Update the addDependencies to add requiredAPIs
RequiredAPIs information in CSV will be extracted and added to dependencies table as gvk type dependency when operator is loaded into the registry DB. Signed-off-by: Vu Dinh <[email protected]>
1 parent f170e90 commit 368fcb8

9 files changed

+117
-19
lines changed
 

‎configmap.example.yaml

+17-2
Original file line numberDiff line numberDiff line change
@@ -6341,6 +6341,23 @@ data:
63416341
fieldRef:
63426342
fieldPath: metadata.name
63436343
customresourcedefinitions:
6344+
required:
6345+
- name: etcdclusters.etcd.database.coreos.com
6346+
version: v1beta2
6347+
kind: EtcdCluster
6348+
displayName: etcd Cluster
6349+
description: Represents a cluster of etcd nodes.
6350+
resources:
6351+
- kind: Service
6352+
version: v1
6353+
- kind: Pod
6354+
version: v1
6355+
specDescriptors:
6356+
- description: The desired number of member Pods for the etcd cluster.
6357+
displayName: Size
6358+
path: size
6359+
x-descriptors:
6360+
- 'urn:alm:descriptor:com.tectonic.ui:podCount'
63446361
owned:
63456362
- name: etcdclusters.etcd.database.coreos.com
63466363
version: v1beta2
@@ -7264,5 +7281,3 @@ data:
72647281
channels:
72657282
- name: alpha
72667283
currentCSV: prometheusoperator.0.22.2
7267-
7268-

‎pkg/registry/populator_test.go

+15-3
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ func TestQuerierForImage(t *testing.T) {
121121
Type: "olm.gvk",
122122
Value: `{"group":"testapi.coreos.com","kind":"testapi","type":"olm.gvk","version":"v1"}`,
123123
},
124+
{
125+
Type: "olm.gvk",
126+
Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","type":"olm.gvk","version":"v1beta2"}`,
127+
},
124128
},
125129
ProvidedApis: []*api.GroupVersionKind{
126130
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdCluster", Plural: "etcdclusters"},
@@ -403,6 +407,10 @@ func TestQuerierForDependencies(t *testing.T) {
403407
Type: "olm.gvk",
404408
Value: `{"group":"testapi.coreos.com","kind":"testapi","type":"olm.gvk","version":"v1"}`,
405409
},
410+
{
411+
Type: "olm.gvk",
412+
Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","type":"olm.gvk","version":"v1beta2"}`,
413+
},
406414
}
407415

408416
type operatorbundle struct {
@@ -450,6 +458,10 @@ func TestListBundles(t *testing.T) {
450458
Type: "olm.gvk",
451459
Value: `{"group":"testapi.coreos.com","kind":"testapi","type":"olm.gvk","version":"v1"}`,
452460
},
461+
{
462+
Type: "olm.gvk",
463+
Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","type":"olm.gvk","version":"v1beta2"}`,
464+
},
453465
}
454466

455467
dependencies := []*api.Dependency{}
@@ -477,7 +489,7 @@ func CheckInvariants(t *testing.T, db *sql.DB) {
477489
func CheckChannelHeadsHaveDescriptions(t *testing.T, db *sql.DB) {
478490
// check channel heads have csv / bundle
479491
rows, err := db.Query(`
480-
select operatorbundle.name,length(operatorbundle.csv),length(operatorbundle.bundle) from operatorbundle
492+
select operatorbundle.name,length(operatorbundle.csv),length(operatorbundle.bundle) from operatorbundle
481493
join channel on channel.head_operatorbundle_name = operatorbundle.name`)
482494
require.NoError(t, err)
483495

@@ -496,7 +508,7 @@ func CheckChannelHeadsHaveDescriptions(t *testing.T, db *sql.DB) {
496508
func CheckBundlesHaveContentsIfNoPath(t *testing.T, db *sql.DB) {
497509
// check that any bundle entry has csv/bundle content unpacked if there is no bundlepath
498510
rows, err := db.Query(`
499-
select name,length(csv),length(bundle) from operatorbundle
511+
select name,length(csv),length(bundle) from operatorbundle
500512
where bundlepath="" or bundlepath=null`)
501513
require.NoError(t, err)
502514

@@ -510,4 +522,4 @@ func CheckBundlesHaveContentsIfNoPath(t *testing.T, db *sql.DB) {
510522
require.NotZero(t, csvlen.Int64, "length of csv for %s should not be zero, it has no bundle path", name.String)
511523
require.NotZero(t, bundlelen.Int64, "length of bundle for %s should not be zero, it has no bundle path", name.String)
512524
}
513-
}
525+
}

‎pkg/registry/types.go

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ var (
1111
ErrPackageNotInDatabase = errors.New("Package not in database")
1212
)
1313

14+
const (
15+
GVKType = "olm.gvk"
16+
PackageType = "olm.package"
17+
)
18+
1419
// APIKey stores GroupVersionKind for use as map keys
1520
type APIKey struct {
1621
Group string

‎pkg/server/server_test.go

+30
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ func TestGetBundle(t *testing.T) {
148148
"{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
149149
},
150150
BundlePath: "",
151+
Dependencies: []*api.Dependency{
152+
{
153+
Type: "olm.gvk",
154+
Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","type":"olm.gvk","version":"v1beta2"}`,
155+
},
156+
},
151157
ProvidedApis: []*api.GroupVersionKind{
152158
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdCluster", Plural: "etcdclusters"},
153159
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdBackup", Plural: "etcdbackups"},
@@ -181,6 +187,12 @@ func TestGetBundleForChannel(t *testing.T) {
181187
"{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
182188
},
183189
BundlePath: "",
190+
Dependencies: []*api.Dependency{
191+
{
192+
Type: "olm.gvk",
193+
Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","type":"olm.gvk","version":"v1beta2"}`,
194+
},
195+
},
184196
ProvidedApis: []*api.GroupVersionKind{
185197
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdCluster", Plural: "etcdclusters"},
186198
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdBackup", Plural: "etcdbackups"},
@@ -264,6 +276,12 @@ func TestGetBundleThatReplaces(t *testing.T) {
264276
"{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
265277
},
266278
BundlePath: "",
279+
Dependencies: []*api.Dependency{
280+
{
281+
Type: "olm.gvk",
282+
Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","type":"olm.gvk","version":"v1beta2"}`,
283+
},
284+
},
267285
ProvidedApis: []*api.GroupVersionKind{
268286
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdCluster", Plural: "etcdclusters"},
269287
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdBackup", Plural: "etcdbackups"},
@@ -297,6 +315,12 @@ func TestGetBundleThatReplacesSynthetic(t *testing.T) {
297315
"{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
298316
},
299317
BundlePath: "",
318+
Dependencies: []*api.Dependency{
319+
{
320+
Type: "olm.gvk",
321+
Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","type":"olm.gvk","version":"v1beta2"}`,
322+
},
323+
},
300324
ProvidedApis: []*api.GroupVersionKind{
301325
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdCluster", Plural: "etcdclusters"},
302326
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdBackup", Plural: "etcdbackups"},
@@ -473,6 +497,12 @@ func TestGetDefaultBundleThatProvides(t *testing.T) {
473497
"{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
474498
},
475499
BundlePath: "",
500+
Dependencies: []*api.Dependency{
501+
{
502+
Type: "olm.gvk",
503+
Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","type":"olm.gvk","version":"v1beta2"}`,
504+
},
505+
},
476506
ProvidedApis: []*api.GroupVersionKind{
477507
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdCluster", Plural: "etcdclusters"},
478508
{Group: "etcd.database.coreos.com", Version: "v1beta2", Kind: "EtcdBackup", Plural: "etcdbackups"},

‎pkg/sqlite/configmap_test.go

+14-8
Large diffs are not rendered by default.

‎pkg/sqlite/directory_test.go

+7-2
Large diffs are not rendered by default.

‎pkg/sqlite/load.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package sqlite
33
import (
44
"context"
55
"database/sql"
6+
"encoding/json"
67
"fmt"
78
"strings"
89

@@ -432,7 +433,7 @@ func (s *SQLLoader) ClearNonHeadBundles() error {
432433
}()
433434

434435
removeNonHeadBundles, err := tx.Prepare(`
435-
update operatorbundle set bundle = null, csv = null
436+
update operatorbundle set bundle = null, csv = null
436437
where (bundlepath != null or bundlepath != "")
437438
and name not in (
438439
select operatorbundle.name from operatorbundle
@@ -692,5 +693,27 @@ func (s *SQLLoader) addDependencies(tx *sql.Tx, bundle *registry.Bundle) error {
692693
}
693694
}
694695

696+
// Look up requiredAPIs in CSV and add them in dependencies table
697+
requiredApis, err := bundle.RequiredAPIs()
698+
if err != nil {
699+
return err
700+
}
701+
702+
for api := range requiredApis {
703+
valueMap := map[string]string{
704+
"type": registry.GVKType,
705+
"group": api.Group,
706+
"version": api.Version,
707+
"kind": api.Kind,
708+
}
709+
value, err := json.Marshal(valueMap)
710+
if err != nil {
711+
return err
712+
}
713+
if _, err := addDep.Exec(registry.GVKType, value, bundle.Name, sqlString(bundleVersion), sqlString(bundle.BundleImage)); err != nil {
714+
return err
715+
}
716+
}
717+
695718
return nil
696719
}

‎pkg/sqlite/migrations/008_dependencies.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ var dependenciesMigration = &Migration{
4242
for bundle, apis := range bundleApis {
4343
for required := range apis.required {
4444
valueMap := map[string]string{
45-
"type": "olm.gvk",
45+
"type": registry.GVKType,
4646
"group": required.Group,
4747
"version": required.Version,
4848
"kind": required.Kind,
@@ -51,7 +51,7 @@ var dependenciesMigration = &Migration{
5151
if err != nil {
5252
return err
5353
}
54-
_, err = tx.ExecContext(ctx, insertRequired, "olm.gvk", value, bundle.CsvName, bundle.Version, bundle.BundlePath)
54+
_, err = tx.ExecContext(ctx, insertRequired, registry.GVKType, value, bundle.CsvName, bundle.Version, bundle.BundlePath)
5555
if err != nil {
5656
return err
5757
}

‎pkg/sqlite/query.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,9 @@ func unique(deps []*api.Dependency) []*api.Dependency {
889889

890890
func (s *SQLQuerier) GetDependenciesForBundle(ctx context.Context, name, version, path string) (dependencies []*api.Dependency, err error) {
891891
depQuery := `SELECT DISTINCT dependencies.type, dependencies.value FROM dependencies
892-
WHERE dependencies.operatorbundle_name=? AND dependencies.operatorbundle_version=? AND dependencies.operatorbundle_path=?`
892+
WHERE dependencies.operatorbundle_name=?
893+
AND (dependencies.operatorbundle_version=? OR dependencies.operatorbundle_version is NULL)
894+
AND (dependencies.operatorbundle_path=? OR dependencies.operatorbundle_path is NULL)`
893895

894896
rows, err := s.db.QueryContext(ctx, depQuery, name, version, path)
895897
if err != nil {

0 commit comments

Comments
 (0)
Please sign in to comment.