Skip to content

Commit 963728d

Browse files
committed
feat(api): return version and skiprange in bundle
1 parent 0a888bc commit 963728d

13 files changed

+362
-93
lines changed

pkg/api/registry.pb.go

Lines changed: 61 additions & 44 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/api/registry.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ message Bundle{
4646
string bundlePath = 6;
4747
repeated GroupVersionKind providedApis = 7;
4848
repeated GroupVersionKind requiredApis = 8;
49+
string version = 9;
50+
string skipRange = 10;
4951
}
5052

5153
message ChannelEntry{

pkg/sqlite/migrations/000_init.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import (
77

88
var InitMigrationKey = 0
99

10+
func init() {
11+
registerMigration(InitMigrationKey, initMigration)
12+
}
13+
1014
var initMigration = &Migration{
1115
Id: InitMigrationKey,
1216
Up: func(ctx context.Context, tx *sql.Tx) error {
@@ -72,7 +76,3 @@ var initMigration = &Migration{
7276
return err
7377
},
7478
}
75-
76-
func init() {
77-
migrations[InitMigrationKey] = initMigration
78-
}

pkg/sqlite/migrations/001_related_images.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
const RelatedImagesMigrationKey = 1
1515

1616
func init() {
17-
migrations[RelatedImagesMigrationKey] = relatedImagesMigration
17+
registerMigration(RelatedImagesMigrationKey, relatedImagesMigration)
1818
}
1919

2020
// listBundles returns a list of operatorbundles as strings

pkg/sqlite/migrations/002_bundle_path.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const BundlePathMigrationKey = 2
99

1010
// Register this migration
1111
func init() {
12-
migrations[BundlePathMigrationKey] = bundlePathMigration
12+
registerMigration(BundlePathMigrationKey, bundlePathMigration)
1313
}
1414

1515
var bundlePathMigration = &Migration{
@@ -23,13 +23,13 @@ var bundlePathMigration = &Migration{
2323
return err
2424
},
2525
Down: func(ctx context.Context, tx *sql.Tx) error {
26-
foreingKeyOff := `PRAGMA foreign_keys = 0`
26+
foreignKeyOff := `PRAGMA foreign_keys = 0`
2727
createTempTable := `CREATE TABLE operatorbundle_backup (name TEXT,csv TEXT,bundle TEXT)`
2828
backupTargetTable := `INSERT INTO operatorbundle_backup SELECT name,csv,bundle FROM operatorbundle`
2929
dropTargetTable := `DROP TABLE operatorbundle`
3030
renameBackUpTable := `ALTER TABLE operatorbundle_backup RENAME TO operatorbundle;`
31-
foreingKeyOn := `PRAGMA foreign_keys = 1`
32-
_, err := tx.ExecContext(ctx, foreingKeyOff)
31+
foreignKeyOn := `PRAGMA foreign_keys = 1`
32+
_, err := tx.ExecContext(ctx, foreignKeyOff)
3333
if err != nil {
3434
return err
3535
}
@@ -49,7 +49,7 @@ var bundlePathMigration = &Migration{
4949
if err != nil {
5050
return err
5151
}
52-
_, err = tx.ExecContext(ctx, foreingKeyOn)
52+
_, err = tx.ExecContext(ctx, foreignKeyOn)
5353
return err
5454
},
5555
}

pkg/sqlite/migrations/003_required_apis.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const RequiredApiMigrationKey = 3
1313

1414
// Register this migration
1515
func init() {
16-
migrations[RequiredApiMigrationKey] = requiredApiMigration
16+
registerMigration(RequiredApiMigrationKey, requiredApiMigration)
1717
}
1818

1919
var requiredApiMigration = &Migration{

pkg/sqlite/migrations/003_required_apis_test.go

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@ package migrations_test
22

33
import (
44
"context"
5+
"database/sql"
56
"testing"
67

78
"github.com/stretchr/testify/require"
89

9-
"github.com/operator-framework/operator-registry/pkg/api"
10-
"github.com/operator-framework/operator-registry/pkg/sqlite"
1110
"github.com/operator-framework/operator-registry/pkg/sqlite/migrations"
1211
)
1312

@@ -35,20 +34,31 @@ func TestRequiredApisUp(t *testing.T) {
3534
require.NoError(t, tx.Commit())
3635

3736
// check that no required apis were extracted.
38-
querier := sqlite.NewSQLLiteQuerierFromDb(db)
39-
provided, required, err := querier.GetApisForEntry(context.TODO(), 1)
37+
requiredQuery := `SELECT DISTINCT api.group_name, api.version, api.kind, api.plural FROM api
38+
INNER JOIN api_requirer ON (api.group_name=api_requirer.group_name AND api.version=api_requirer.version AND api.kind=api_requirer.kind)
39+
WHERE api_requirer.channel_entry_id=?`
40+
// check that no required apis were extracted.
41+
_, err = db.Query(requiredQuery, 1)
4042
require.Error(t, err)
41-
require.Nil(t, provided)
42-
require.Nil(t, required)
4343

4444
// Up the migration with backfill
4545
err = migrator.Up(context.TODO(), migrations.Only(migrations.RequiredApiMigrationKey))
4646
require.NoError(t, err)
4747

4848
// check that required apis were extracted
49-
bundle, err := querier.GetBundleForChannel(context.TODO(), "etcd", "alpha")
49+
rows, err := db.Query(requiredQuery, 1)
5050
require.NoError(t, err)
51-
require.Equal(t, []*api.GroupVersionKind{{Group:"etcd.database.coreos.com", Version: "v1beta2", Kind:"EtcdCluster", Plural:"etcdclusters"}}, bundle.RequiredApis)
51+
var group sql.NullString
52+
var version sql.NullString
53+
var kind sql.NullString
54+
var plural sql.NullString
55+
rows.Next()
56+
require.NoError(t, rows.Scan(&group, &version, &kind, &plural))
57+
require.Equal(t, group.String, "etcd.database.coreos.com")
58+
require.Equal(t, version.String, "v1beta2")
59+
require.Equal(t, kind.String, "EtcdCluster")
60+
require.Equal(t, plural.String, "etcdclusters")
61+
require.NoError(t, rows.Close())
5262
}
5363

5464
func TestRequiredApisDown(t *testing.T) {
@@ -64,19 +74,29 @@ func TestRequiredApisDown(t *testing.T) {
6474
require.NoError(t, err)
6575

6676
// check that required apis were extracted from existing bundles
67-
querier := sqlite.NewSQLLiteQuerierFromDb(db)
68-
provided, required, err := querier.GetApisForEntry(context.TODO(), 1)
77+
requiredQuery := `SELECT DISTINCT api.group_name, api.version, api.kind, api.plural FROM api
78+
INNER JOIN api_requirer ON (api.group_name=api_requirer.group_name AND api.version=api_requirer.version AND api.kind=api_requirer.kind)
79+
WHERE api_requirer.channel_entry_id=?`
80+
81+
rows, err := db.Query(requiredQuery, 1)
6982
require.NoError(t, err)
70-
require.Equal(t, provided, []*api.GroupVersionKind{})
71-
require.Equal(t, []*api.GroupVersionKind{{Group:"etcd.database.coreos.com", Version: "v1beta2", Kind:"EtcdCluster", Plural:"etcdclusters"}}, required)
83+
var group sql.NullString
84+
var version sql.NullString
85+
var kind sql.NullString
86+
var plural sql.NullString
87+
rows.Next()
88+
require.NoError(t, rows.Scan(&group, &version, &kind, &plural))
89+
require.Equal(t, group.String, "etcd.database.coreos.com")
90+
require.Equal(t, version.String, "v1beta2")
91+
require.Equal(t, kind.String, "EtcdCluster")
92+
require.Equal(t, plural.String, "etcdclusters")
93+
require.NoError(t, rows.Close())
7294

7395
// run down migration
7496
err = migrator.Down(context.TODO(), migrations.Only(migrations.RequiredApiMigrationKey))
7597
require.NoError(t, err)
7698

7799
// check that no required apis were extracted.
78-
provided, required, err = querier.GetApisForEntry(context.TODO(), 1)
100+
_, err = db.Query(requiredQuery, 1)
79101
require.Error(t, err)
80-
require.Nil(t, provided)
81-
require.Nil(t, required)
82102
}

pkg/sqlite/migrations/004_cascade_delete.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ var CascadeDeleteMigrationKey = 4
99

1010
// Register this migration
1111
func init() {
12-
migrations[CascadeDeleteMigrationKey] = cascadeDeleteMigration
12+
registerMigration(CascadeDeleteMigrationKey, cascadeDeleteMigration)
1313
}
1414

1515
var cascadeDeleteMigration = &Migration{
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package migrations
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
7+
"github.com/sirupsen/logrus"
8+
)
9+
10+
const VersionSkipRangeMigrationKey = 5
11+
const SkipRangeAnnotationKey = "olm.skipRange"
12+
13+
// Register this migration
14+
func init() {
15+
registerMigration(VersionSkipRangeMigrationKey, versionSkipRangeMigration)
16+
}
17+
18+
var versionSkipRangeMigration = &Migration{
19+
Id: VersionSkipRangeMigrationKey,
20+
Up: func(ctx context.Context, tx *sql.Tx) error {
21+
sql := `
22+
ALTER TABLE operatorbundle
23+
ADD COLUMN skiprange TEXT;
24+
25+
ALTER TABLE operatorbundle
26+
ADD COLUMN version TEXT;
27+
`
28+
_, err := tx.ExecContext(ctx, sql)
29+
if err != nil {
30+
return err
31+
}
32+
33+
bundles, err := listBundles(ctx, tx)
34+
if err != nil {
35+
return err
36+
}
37+
for _, bundle := range bundles {
38+
if err := extractVersioning(ctx, tx, bundle); err != nil {
39+
logrus.Warnf("error backfilling related images: %v", err)
40+
continue
41+
}
42+
}
43+
return err
44+
},
45+
Down: func(ctx context.Context, tx *sql.Tx) error {
46+
foreignKeyOff := `PRAGMA foreign_keys = 0`
47+
createTempTable := `CREATE TABLE operatorbundle_backup (name TEXT, csv TEXT, bundle TEXT, bundlepath TEXT)`
48+
backupTargetTable := `INSERT INTO operatorbundle_backup SELECT name, csv, bundle, bundlepath FROM operatorbundle`
49+
dropTargetTable := `DROP TABLE operatorbundle`
50+
renameBackUpTable := `ALTER TABLE operatorbundle_backup RENAME TO operatorbundle;`
51+
foreignKeyOn := `PRAGMA foreign_keys = 1`
52+
_, err := tx.ExecContext(ctx, foreignKeyOff)
53+
if err != nil {
54+
return err
55+
}
56+
_, err = tx.ExecContext(ctx, createTempTable)
57+
if err != nil {
58+
return err
59+
}
60+
_, err = tx.ExecContext(ctx, backupTargetTable)
61+
if err != nil {
62+
return err
63+
}
64+
_, err = tx.ExecContext(ctx, dropTargetTable)
65+
if err != nil {
66+
return err
67+
}
68+
_, err = tx.ExecContext(ctx, renameBackUpTable)
69+
if err != nil {
70+
return err
71+
}
72+
_, err = tx.ExecContext(ctx, foreignKeyOn)
73+
return err
74+
},
75+
}
76+
77+
func extractVersioning(ctx context.Context, tx *sql.Tx, name string) error {
78+
addSql := `insert into operatorbundle(version, skiprange) values(?,?)`
79+
csv, err := getCSV(ctx, tx, name)
80+
if err != nil {
81+
logrus.Warnf("error backfilling versioning: %v", err)
82+
return err
83+
}
84+
skiprange, ok := csv.Annotations[SkipRangeAnnotationKey]
85+
if !ok {
86+
skiprange = ""
87+
}
88+
version, err := csv.GetVersion()
89+
if err != nil {
90+
version = ""
91+
}
92+
_, err = tx.ExecContext(ctx, addSql, version, skiprange)
93+
return err
94+
}

0 commit comments

Comments
 (0)