github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/backups/db_restore_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package backups_test 5 6 import ( 7 "errors" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 "gopkg.in/mgo.v2" 12 "gopkg.in/mgo.v2/bson" 13 14 "github.com/juju/juju/mongo" 15 "github.com/juju/juju/state/backups" 16 "github.com/juju/juju/testing" 17 ) 18 19 var _ = gc.Suite(&mongoRestoreSuite{}) 20 21 type mongoRestoreSuite struct { 22 testing.BaseSuite 23 } 24 25 func (s *mongoRestoreSuite) TestRestoreDatabase24(c *gc.C) { 26 s.PatchValue(backups.GetMongorestorePath, func() (string, error) { return "/a/fake/mongorestore", nil }) 27 var ranCommand string 28 var ranWithArgs []string 29 fakeRunCommand := func(c string, args ...string) error { 30 ranCommand = c 31 ranWithArgs = args 32 return nil 33 } 34 args := backups.RestorerArgs{ 35 Version: mongo.Mongo24, 36 TagUser: "machine-0", 37 TagUserPassword: "fakePassword", 38 RunCommandFn: fakeRunCommand, 39 StartMongo: func() error { return nil }, 40 StopMongo: func() error { return nil }, 41 } 42 43 s.PatchValue(backups.MongoInstalledVersion, func() mongo.Version { return mongo.Mongo24 }) 44 restorer, err := backups.NewDBRestorer(args) 45 c.Assert(err, jc.ErrorIsNil) 46 err = restorer.Restore("fakePath", nil) 47 c.Assert(err, jc.ErrorIsNil) 48 49 c.Assert(ranCommand, gc.Equals, "/a/fake/mongorestore") 50 c.Assert(ranWithArgs, gc.DeepEquals, []string{"--drop", "--journal", "--oplogReplay", "--dbpath", "/var/lib/juju/db", "fakePath"}) 51 } 52 53 type mongoDb struct { 54 user *mgo.User 55 } 56 57 func (m *mongoDb) UpsertUser(u *mgo.User) error { 58 m.user = u 59 return nil 60 } 61 62 type mongoSession struct { 63 closed bool 64 cmd []bson.D 65 } 66 67 func (m *mongoSession) Run(cmd interface{}, result interface{}) error { 68 bsoncmd, ok := cmd.(bson.D) 69 if !ok { 70 return errors.New("unexpected cmd") 71 } 72 m.cmd = append(m.cmd, bsoncmd) 73 return nil 74 } 75 76 func (m *mongoSession) Close() { 77 m.closed = true 78 } 79 80 func (m *mongoSession) DB(_ string) *mgo.Database { 81 return nil 82 } 83 84 func (s *mongoRestoreSuite) TestRestoreDatabase32(c *gc.C) { 85 s.PatchValue(backups.GetMongorestorePath, func() (string, error) { return "/a/fake/mongorestore", nil }) 86 var ranCommand string 87 var ranWithArgs []string 88 fakeRunCommand := func(c string, args ...string) error { 89 ranCommand = c 90 ranWithArgs = args 91 return nil 92 } 93 mgoDb := &mongoDb{} 94 mgoSession := &mongoSession{} 95 96 args := backups.RestorerArgs{ 97 DialInfo: &mgo.DialInfo{ 98 Username: "fakeUsername", 99 Password: "fakePassword", 100 Addrs: []string{"127.0.0.1"}, 101 }, 102 Version: mongo.Mongo32wt, 103 TagUser: "machine-0", 104 TagUserPassword: "fakePassword", 105 GetDB: func(string, backups.MongoSession) backups.MongoDB { return mgoDb }, 106 NewMongoSession: func(dialInfo *mgo.DialInfo) (backups.MongoSession, error) { 107 return mgoSession, nil 108 }, 109 RunCommandFn: fakeRunCommand, 110 } 111 s.PatchValue(backups.MongoInstalledVersion, func() mongo.Version { return mongo.Mongo32wt }) 112 restorer, err := backups.NewDBRestorer(args) 113 c.Assert(err, jc.ErrorIsNil) 114 err = restorer.Restore("fakePath", nil) 115 c.Assert(err, jc.ErrorIsNil) 116 117 c.Assert(ranCommand, gc.Equals, "/a/fake/mongorestore") 118 c.Assert(ranWithArgs, gc.DeepEquals, []string{"--ssl", "--authenticationDatabase", "admin", "--host", "127.0.0.1", "--username", "fakeUsername", "--password", "fakePassword", "--drop", "--oplogReplay", "--batchSize", "10", "fakePath"}) 119 user := &mgo.User{Username: "machine-0", Password: "fakePassword"} 120 c.Assert(mgoDb.user, gc.DeepEquals, user) 121 c.Assert(mgoSession.closed, jc.IsTrue) 122 mgoSessionCmd := []bson.D{ 123 bson.D{ 124 bson.DocElem{Name: "createRole", Value: "oploger"}, 125 bson.DocElem{Name: "privileges", Value: []bson.D{ 126 bson.D{ 127 bson.DocElem{Name: "resource", Value: bson.M{"anyResource": true}}, 128 bson.DocElem{Name: "actions", Value: []string{"anyAction"}}}}}, 129 bson.DocElem{Name: "roles", Value: []string{}}}, 130 bson.D{ 131 bson.DocElem{Name: "grantRolesToUser", Value: "fakeUsername"}, 132 bson.DocElem{Name: "roles", Value: []string{"oploger"}}}, 133 bson.D{ 134 bson.DocElem{Name: "grantRolesToUser", Value: "admin"}, 135 bson.DocElem{Name: "roles", Value: []string{"oploger"}}}} 136 c.Assert(mgoSession.cmd, gc.DeepEquals, mgoSessionCmd) 137 } 138 139 func (s *mongoRestoreSuite) TestRestoreFailsOnOlderMongo(c *gc.C) { 140 s.PatchValue(backups.GetMongorestorePath, func() (string, error) { return "/a/fake/mongorestore", nil }) 141 args := backups.RestorerArgs{ 142 DialInfo: &mgo.DialInfo{ 143 Username: "fakeUsername", 144 Password: "fakePassword", 145 Addrs: []string{"127.0.0.1"}, 146 }, 147 Version: mongo.Mongo32wt, 148 TagUser: "machine-0", 149 TagUserPassword: "fakePassword", 150 } 151 s.PatchValue(backups.MongoInstalledVersion, func() mongo.Version { return mongo.Mongo24 }) 152 _, err := backups.NewDBRestorer(args) 153 c.Assert(err, gc.ErrorMatches, "restore mongo version 3.2/wiredTiger into version 2.4/mmapv1 not supported") 154 }