Skip to content

Commit 161f66a

Browse files
Merge pull request #101 from ecordell/relatedimages
Add support for storing and retrieving related images
2 parents 218b1de + addcd23 commit 161f66a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+1771
-4696
lines changed

cmd/configmap-server/main.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"context"
5+
"database/sql"
56
"fmt"
67
"net"
78

@@ -98,11 +99,19 @@ func runCmdFunc(cmd *cobra.Command, args []string) error {
9899
logger.Fatalf("error getting configmap: %s", err)
99100
}
100101

101-
sqlLoader, err := sqlite.NewSQLLiteLoader(sqlite.WithDBName(dbName))
102+
db, err := sql.Open("sqlite3", dbName)
102103
if err != nil {
103104
return err
104105
}
105106

107+
sqlLoader, err := sqlite.NewSQLLiteLoader(db)
108+
if err != nil {
109+
return err
110+
}
111+
if err := sqlLoader.Migrate(context.TODO()); err != nil {
112+
return err
113+
}
114+
106115
configMapPopulator := sqlite.NewSQLLoaderForConfigMap(sqlLoader, *configMap)
107116
if err := configMapPopulator.Populate(); err != nil {
108117
err = fmt.Errorf("error loading manifests from configmap: %s", err)

cmd/initializer/main.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

33
import (
4+
"context"
5+
"database/sql"
46
"fmt"
57

68
"github.com/sirupsen/logrus"
@@ -53,11 +55,19 @@ func runCmdFunc(cmd *cobra.Command, args []string) error {
5355
return err
5456
}
5557

56-
dbLoader, err := sqlite.NewSQLLiteLoader(sqlite.WithDBName(outFilename))
58+
db, err := sql.Open("sqlite3", outFilename)
5759
if err != nil {
5860
return err
5961
}
60-
defer dbLoader.Close()
62+
defer db.Close()
63+
64+
dbLoader, err := sqlite.NewSQLLiteLoader(db)
65+
if err != nil {
66+
return err
67+
}
68+
if err := dbLoader.Migrate(context.TODO()); err != nil {
69+
return err
70+
}
6171

6272
loader := sqlite.NewSQLLoaderForDirectory(dbLoader, manifestDir)
6373
if err := loader.Populate(); err != nil {

cmd/opm/registry/serve.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package registry
22

33
import (
44
"context"
5+
"database/sql"
6+
"fmt"
57
"net"
68

79
"github.com/sirupsen/logrus"
@@ -12,7 +14,6 @@ import (
1214
"github.com/operator-framework/operator-registry/pkg/api"
1315
health "github.com/operator-framework/operator-registry/pkg/api/grpc_health_v1"
1416
"github.com/operator-framework/operator-registry/pkg/lib/log"
15-
"github.com/operator-framework/operator-registry/pkg/registry"
1617
"github.com/operator-framework/operator-registry/pkg/server"
1718
"github.com/operator-framework/operator-registry/pkg/sqlite"
1819
)
@@ -37,7 +38,7 @@ func newRegistryServeCmd() *cobra.Command {
3738
rootCmd.Flags().StringP("database", "d", "bundles.db", "relative path to sqlite db")
3839
rootCmd.Flags().StringP("port", "p", "50051", "port number to serve on")
3940
rootCmd.Flags().StringP("termination-log", "t", "/dev/termination-log", "path to a container termination log file")
40-
41+
rootCmd.Flags().Bool("skip-migrate", false, "do not attempt to migrate to the latest db revision when starting")
4142
return rootCmd
4243

4344
}
@@ -64,15 +65,18 @@ func runRegistryServeCmdFunc(cmd *cobra.Command, args []string) error {
6465

6566
logger := logrus.WithFields(logrus.Fields{"database": dbName, "port": port})
6667

67-
var store registry.Query
68-
store, err = sqlite.NewSQLLiteQuerier(dbName)
68+
db, err := sql.Open("sqlite3", dbName)
6969
if err != nil {
70-
logger.WithError(err).Warnf("failed to load db")
70+
return err
7171
}
72-
if store == nil {
73-
store = registry.NewEmptyQuerier()
72+
73+
// migrate to the latest version
74+
if err := migrate(cmd, db); err != nil {
75+
logger.WithError(err).Warnf("couldn't migrate db")
7476
}
7577

78+
store := sqlite.NewSQLLiteQuerierFromDb(db)
79+
7680
// sanity check that the db is available
7781
tables, err := store.ListTables(context.TODO())
7882
if err != nil {
@@ -98,3 +102,23 @@ func runRegistryServeCmdFunc(cmd *cobra.Command, args []string) error {
98102

99103
return nil
100104
}
105+
106+
func migrate(cmd *cobra.Command, db *sql.DB) error {
107+
shouldSkipMigrate, err := cmd.Flags().GetBool("skip-migrate")
108+
if err != nil {
109+
return err
110+
}
111+
if shouldSkipMigrate {
112+
return nil
113+
}
114+
115+
migrator, err := sqlite.NewSQLLiteMigrator(db)
116+
if err != nil {
117+
return err
118+
}
119+
if migrator == nil {
120+
return fmt.Errorf("failed to load migrator")
121+
}
122+
123+
return migrator.Migrate(context.TODO())
124+
}

cmd/registry-server/main.go

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@ package main
22

33
import (
44
"context"
5+
"database/sql"
6+
"fmt"
57
"net"
68

7-
"github.com/operator-framework/operator-registry/pkg/lib/log"
89
"github.com/sirupsen/logrus"
910
"github.com/spf13/cobra"
1011
"google.golang.org/grpc"
1112
"google.golang.org/grpc/reflection"
1213

14+
"github.com/operator-framework/operator-registry/pkg/lib/log"
15+
1316
"github.com/operator-framework/operator-registry/pkg/api"
1417
health "github.com/operator-framework/operator-registry/pkg/api/grpc_health_v1"
15-
"github.com/operator-framework/operator-registry/pkg/registry"
1618
"github.com/operator-framework/operator-registry/pkg/server"
1719
"github.com/operator-framework/operator-registry/pkg/sqlite"
1820
)
@@ -36,6 +38,7 @@ func init() {
3638
rootCmd.Flags().StringP("database", "d", "bundles.db", "relative path to sqlite db")
3739
rootCmd.Flags().StringP("port", "p", "50051", "port number to serve on")
3840
rootCmd.Flags().StringP("termination-log", "t", "/dev/termination-log", "path to a container termination log file")
41+
rootCmd.Flags().Bool("skip-migrate", false, "do not attempt to migrate to the latest db revision when starting")
3942
if err := rootCmd.Flags().MarkHidden("debug"); err != nil {
4043
logrus.Panic(err.Error())
4144
}
@@ -69,15 +72,18 @@ func runCmdFunc(cmd *cobra.Command, args []string) error {
6972

7073
logger := logrus.WithFields(logrus.Fields{"database": dbName, "port": port})
7174

72-
var store registry.Query
73-
store, err = sqlite.NewSQLLiteQuerier(dbName)
75+
db, err := sql.Open("sqlite3", dbName)
7476
if err != nil {
75-
logger.WithError(err).Warnf("failed to load db")
77+
return err
7678
}
77-
if store == nil {
78-
store = registry.NewEmptyQuerier()
79+
80+
// migrate to the latest version
81+
if err := migrate(cmd, db); err != nil {
82+
logger.WithError(err).Warnf("couldn't migrate db")
7983
}
8084

85+
store := sqlite.NewSQLLiteQuerierFromDb(db)
86+
8187
// sanity check that the db is available
8288
tables, err := store.ListTables(context.TODO())
8389
if err != nil {
@@ -103,3 +109,23 @@ func runCmdFunc(cmd *cobra.Command, args []string) error {
103109

104110
return nil
105111
}
112+
113+
func migrate(cmd *cobra.Command, db *sql.DB) error {
114+
shouldSkipMigrate, err := cmd.Flags().GetBool("skip-migrate")
115+
if err != nil {
116+
return err
117+
}
118+
if shouldSkipMigrate {
119+
return nil
120+
}
121+
122+
migrator, err := sqlite.NewSQLLiteMigrator(db)
123+
if err != nil {
124+
return err
125+
}
126+
if migrator == nil {
127+
return fmt.Errorf("failed to load migrator")
128+
}
129+
130+
return migrator.Migrate(context.TODO())
131+
}

configmap.example.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5710,6 +5710,11 @@ data:
57105710
annotations:
57115711
tectonic-visibility: ocs
57125712
spec:
5713+
relatedImages:
5714+
- name: etcd-v3.4.0
5715+
image: quay.io/coreos/etcd@sha256:3816b6daf9b66d6ced6f0f966314e2d4f894982c6b1493061502f8c2bf86ac84
5716+
- name: etcd-3.4.1
5717+
image: quay.io/coreos/etcd@sha256:49d3d4a81e0d030d3f689e7167f23e120abf955f7d08dbedf3ea246485acee9f
57135718
displayName: etcd
57145719
description: |
57155720
etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.

docs/contributors/add_migration.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Add a new migration
2+
3+
Migrations live in `pkg/sqlite/migrations`.
4+
5+
Create a new file (and tests!) that increments the migration number:
6+
7+
```sh
8+
touch pkg/sqlite/migrations/002_migration_description.go
9+
touch pkg/sqlite/migrations/002_migration_description_test.go
10+
```
11+
12+
Create the migration instance and register it:
13+
14+
```go
15+
package migrations
16+
17+
import (
18+
"context"
19+
"database/sql"
20+
)
21+
22+
// This should increment the value from the previous migration
23+
const MyMigrationKey = 2
24+
25+
26+
var myNewMigration = &Migration{
27+
// The id for this migration
28+
Id: MyMigrationKey,
29+
Up: func(ctx context.Context, tx *sql.Tx) error {
30+
// the up version of this migration
31+
return nil
32+
},
33+
Down: func(ctx context.Context, tx *sql.Tx) error {
34+
// the down version of this migration
35+
return nil
36+
},
37+
}
38+
39+
// Register this migration
40+
func init() {
41+
migrations[MyMigrationKey] = myNewMigration
42+
}
43+
```
44+
45+
See the existing migrations in the `pkg/sqlite/migrations` for examples of migrations and tests.

manifests/etcd/0.9.2/etcdoperator.v0.9.2.clusterserviceversion.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ metadata:
88
tectonic-visibility: ocs
99
alm-examples: '[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":["<etcd-cluster-endpoints>"],"storageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}}]'
1010
spec:
11+
relatedImages:
12+
- name: etcd-v3.4.0
13+
image: quay.io/coreos/etcd@sha256:3816b6daf9b66d6ced6f0f966314e2d4f894982c6b1493061502f8c2bf86ac84
14+
- name: etcd-3.4.1
15+
image: quay.io/coreos/etcd@sha256:49d3d4a81e0d030d3f689e7167f23e120abf955f7d08dbedf3ea246485acee9f
1116
displayName: etcd
1217
description: |
1318
etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.

pkg/appregistry/appregistry.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,7 @@ func (a *AppregistryLoader) Load(csvSources []string, csvPackages string) (regis
100100
errs = append(errs, fmt.Errorf("error loading operator manifests: %s", err))
101101
}
102102

103-
store, err := a.loader.GetStore()
104-
if err != nil {
105-
errs = append(errs, err)
106-
}
103+
store := a.loader.GetStore()
107104

108105
return store, utilerrors.NewAggregate(errs)
109106
}

pkg/appregistry/dbloader.go

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package appregistry
22

33
import (
44
"context"
5+
"database/sql"
56
"fmt"
67
"os"
78

@@ -11,32 +12,35 @@ import (
1112
)
1213

1314
func NewDbLoader(dbName string, logger *logrus.Entry) (*dbLoader, error) {
14-
sqlLoader, err := sqlite.NewSQLLiteLoader(sqlite.WithDBName(dbName))
15+
db, err := sql.Open("sqlite3", dbName)
1516
if err != nil {
1617
return nil, err
1718
}
1819

20+
sqlLoader, err := sqlite.NewSQLLiteLoader(db)
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
if err := sqlLoader.Migrate(context.TODO()); err != nil {
26+
return nil, err
27+
}
28+
1929
return &dbLoader{
2030
loader: sqlLoader,
2131
logger: logger,
22-
dbName: dbName,
32+
db: db,
2333
}, nil
2434
}
2535

2636
type dbLoader struct {
27-
dbName string
28-
37+
db *sql.DB
2938
loader *sqlite.SQLLoader
3039
logger *logrus.Entry
3140
}
3241

33-
func (l *dbLoader) GetStore() (registry.Query, error) {
34-
s, err := sqlite.NewSQLLiteQuerier(l.dbName)
35-
if err != nil {
36-
return nil, fmt.Errorf("failed to load db: %v", err)
37-
}
38-
39-
return s, nil
42+
func (l *dbLoader) GetStore() registry.Query {
43+
return sqlite.NewSQLLiteQuerierFromDb(l.db)
4044
}
4145

4246
// LoadDataToSQLite uses configMaploader to load the downloaded operator
@@ -55,10 +59,7 @@ func (l *dbLoader) LoadFlattenedToSQLite(manifest *RawOperatorManifestData) erro
5559
return err
5660
}
5761

58-
s, err := sqlite.NewSQLLiteQuerier(l.dbName)
59-
if err != nil {
60-
return fmt.Errorf("failed to load db: %v", err)
61-
}
62+
s := sqlite.NewSQLLiteQuerierFromDb(l.db)
6263

6364
// sanity check that the db is available.
6465
tables, err := s.ListTables(context.TODO())
@@ -87,8 +88,9 @@ func (l *dbLoader) LoadBundleDirectoryToSQLite(directory string) error {
8788
return nil
8889
}
8990

90-
func (l *dbLoader) Close() {
91-
if l.loader != nil {
92-
l.loader.Close()
91+
func (l *dbLoader) Close() error {
92+
if l.db != nil {
93+
return l.db.Close()
9394
}
95+
return nil
9496
}

pkg/appregistry/downloader.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ func (d *downloadItem) String() string {
2727
}
2828

2929
type downloader struct {
30-
logger *logrus.Entry
31-
kubeClient kubernetes.Clientset
30+
logger *logrus.Entry
31+
kubeClient kubernetes.Clientset
3232
}
3333

3434
// Download downloads manifest(s) associated with the specified package(s) from

0 commit comments

Comments
 (0)