The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/3668
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === This branch drops any mention of the Daemon structure in db.go, and is a step towards making the db functionality self-contained (in order to put it in a separate db/ package).
From 4f4cd90f07f1cadd98484811494b0ae323c60cb5 Mon Sep 17 00:00:00 2001 From: Free Ekanayaka <[email protected]> Date: Wed, 16 Aug 2017 11:36:03 +0000 Subject: [PATCH] Drop dependencies on Daemon in db.go This branch drops any mention of the Daemon structure in db.go, and is a step towards making the db functionality self-contained (in order to put it in a separate db/ package). Signed-off-by: Free Ekanayaka <[email protected]> --- lxd/.dir-locals.el | 3 +++ lxd/daemon.go | 9 +-------- lxd/db.go | 12 ++++++++++++ lxd/db_test.go | 46 +++++++++++++++++----------------------------- 4 files changed, 33 insertions(+), 37 deletions(-) create mode 100644 lxd/.dir-locals.el diff --git a/lxd/.dir-locals.el b/lxd/.dir-locals.el new file mode 100644 index 000000000..9bebcc48c --- /dev/null +++ b/lxd/.dir-locals.el @@ -0,0 +1,3 @@ +;;; Directory Local Variables +;;; For more information see (info "(emacs) Directory Variables") +((go-mode . ((go-test-args . "-tags libsqlite3")))) diff --git a/lxd/daemon.go b/lxd/daemon.go index 0e5c3e306..c3e1f547f 100644 --- a/lxd/daemon.go +++ b/lxd/daemon.go @@ -1405,17 +1405,10 @@ func (s *lxdHttpServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) { // Create a database connection and perform any updates needed. func initializeDbObject(d *Daemon, path string) error { - var openPath string var err error - timeout := 5 // TODO - make this command-line configurable? - - // These are used to tune the transaction BEGIN behavior instead of using the - // similar "locking_mode" pragma (locking for the whole database connection). - openPath = fmt.Sprintf("%s?_busy_timeout=%d&_txlock=exclusive", path, timeout*1000) - // Open the database. If the file doesn't exist it is created. - d.db, err = sql.Open("sqlite3_with_fk", openPath) + d.db, err = openDb(path) if err != nil { return err } diff --git a/lxd/db.go b/lxd/db.go index 974e48349..a0978bd1b 100644 --- a/lxd/db.go +++ b/lxd/db.go @@ -224,6 +224,18 @@ func init() { sql.Register("sqlite3_with_fk", &sqlite3.SQLiteDriver{ConnectHook: enableForeignKeys}) } +// Open the database with the correct parameters for LXD. +func openDb(path string) (*sql.DB, error) { + timeout := 5 // TODO - make this command-line configurable? + + // These are used to tune the transaction BEGIN behavior instead of using the + // similar "locking_mode" pragma (locking for the whole database connection). + openPath := fmt.Sprintf("%s?_busy_timeout=%d&_txlock=exclusive", path, timeout*1000) + + // Open the database. If the file doesn't exist it is created. + return sql.Open("sqlite3_with_fk", openPath) +} + // Create the initial (current) schema for a given SQLite DB connection. func createDb(db *sql.DB) (err error) { latestVersion := dbGetSchema(db) diff --git a/lxd/db_test.go b/lxd/db_test.go index 304408883..fd55c32b3 100644 --- a/lxd/db_test.go +++ b/lxd/db_test.go @@ -37,6 +37,8 @@ type dbTestSuite struct { func (s *dbTestSuite) SetupTest() { s.db = s.CreateTestDb() + _, err := s.db.Exec(DB_FIXTURES) + s.Nil(err) } func (s *dbTestSuite) TearDownTest() { @@ -44,7 +46,7 @@ func (s *dbTestSuite) TearDownTest() { } // Initialize a test in-memory DB. -func (s *dbTestSuite) CreateTestDb() (db *sql.DB) { +func (s *dbTestSuite) CreateTestDb() *sql.DB { // Setup logging if main() hasn't been called/when testing if logger.Log == nil { var err error @@ -52,15 +54,12 @@ func (s *dbTestSuite) CreateTestDb() (db *sql.DB) { s.Nil(err) } - var err error - d := &Daemon{MockMode: true} - err = initializeDbObject(d, ":memory:") + db, err := openDb(":memory:") s.Nil(err) - db = d.db + s.Nil(createDb(db)) + s.Nil(dbUpdatesApplyAll(db, false, nil)) + return db - _, err = db.Exec(DB_FIXTURES) - s.Nil(err) - return // db is a named output param } func TestDBTestSuite(t *testing.T) { @@ -162,18 +161,12 @@ func (s *dbTestSuite) Test_deleting_an_image_cascades_on_related_tables() { } func (s *dbTestSuite) Test_initializing_db_is_idempotent() { - var db *sql.DB - var err error - // This calls "createDb" once already. - d := &Daemon{MockMode: true} - err = initializeDbObject(d, ":memory:") - db = d.db + db := s.CreateTestDb() defer db.Close() // Let's call it a second time. - err = createDb(db) - s.Nil(err) + s.Nil(createDb(db)) } func (s *dbTestSuite) Test_get_schema_returns_0_on_uninitialized_db() { @@ -193,9 +186,8 @@ func (s *dbTestSuite) Test_running_dbUpdateFromV6_adds_on_delete_cascade() { var err error var count int - d := &Daemon{MockMode: true} - err = initializeDbObject(d, ":memory:") - defer d.db.Close() + db := s.CreateTestDb() + defer db.Close() statements := ` CREATE TABLE IF NOT EXISTS containers ( @@ -219,28 +211,28 @@ CREATE TABLE IF NOT EXISTS containers_config ( INSERT INTO containers (name, architecture, type) VALUES ('thename', 1, 1); INSERT INTO containers_config (container_id, key, value) VALUES (1, 'thekey', 'thevalue');` - _, err = d.db.Exec(statements) + _, err = db.Exec(statements) s.Nil(err) // Run the upgrade from V6 code - err = dbUpdateFromV6(5, 6, d.db) + err = dbUpdateFromV6(5, 6, db) s.Nil(err) // Make sure the inserted data is still there. statements = `SELECT count(*) FROM containers_config;` - err = d.db.QueryRow(statements).Scan(&count) + err = db.QueryRow(statements).Scan(&count) s.Nil(err) s.Equal(count, 1, "There should be exactly one entry in containers_config!") // Drop the container. statements = `DELETE FROM containers WHERE name = 'thename';` - _, err = d.db.Exec(statements) + _, err = db.Exec(statements) s.Nil(err) // Make sure there are 0 container_profiles entries left. statements = `SELECT count(*) FROM containers_profiles;` - err = d.db.QueryRow(statements).Scan(&count) + err = db.QueryRow(statements).Scan(&count) s.Nil(err) s.Equal(count, 0, "Deleting a container didn't delete the profile association!") } @@ -321,11 +313,7 @@ INSERT INTO containers_config (container_id, key, value) VALUES (1, 'thekey', 't // The "foreign key" on containers_config now points to nothing. // Let's run the schema upgrades. - d := &Daemon{MockMode: true} - d.db = db - daemonConfigInit(db) - - err = dbUpdatesApplyAll(d.db, false, nil) + err = dbUpdatesApplyAll(db, false, nil) s.Nil(err) result := dbGetSchema(db)
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
