github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/backups/export_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package backups 5 6 import ( 7 "bytes" 8 "io" 9 "io/ioutil" 10 "time" 11 12 "github.com/juju/errors" 13 "github.com/juju/testing" 14 "github.com/juju/utils/filestorage" 15 16 "github.com/juju/juju/state" 17 ) 18 19 var ( 20 Create = create 21 FileTimestamp = fileTimestamp 22 23 TestGetFilesToBackUp = &getFilesToBackUp 24 GetDBDumper = &getDBDumper 25 RunCreate = &runCreate 26 FinishMeta = &finishMeta 27 StoreArchiveRef = &storeArchive 28 GetMongodumpPath = &getMongodumpPath 29 GetMongorestorePath = &getMongorestorePath 30 RunCommand = &runCommandFn 31 ReplaceableFolders = &replaceableFolders 32 MongoInstalledVersion = &mongoInstalledVersion 33 ) 34 35 var _ filestorage.DocStorage = (*backupsDocStorage)(nil) 36 var _ filestorage.RawFileStorage = (*backupBlobStorage)(nil) 37 38 func getBackupDBWrapper(st *state.State) *storageDBWrapper { 39 modelUUID := st.ModelTag().Id() 40 db := st.MongoSession().DB(storageDBName) 41 return newStorageDBWrapper(db, storageMetaName, modelUUID) 42 } 43 44 // NewBackupID creates a new backup ID based on the metadata. 45 func NewBackupID(meta *Metadata) string { 46 doc := newStorageMetaDoc(meta) 47 return newStorageID(&doc) 48 } 49 50 // GetBackupMetadata returns the metadata retrieved from storage. 51 func GetBackupMetadata(st *state.State, id string) (*Metadata, error) { 52 db := getBackupDBWrapper(st) 53 defer db.Close() 54 doc, err := getStorageMetadata(db, id) 55 if err != nil { 56 return nil, errors.Trace(err) 57 } 58 return docAsMetadata(doc), nil 59 } 60 61 // AddBackupMetadata adds the metadata to storage. 62 func AddBackupMetadata(st *state.State, meta *Metadata) (string, error) { 63 db := getBackupDBWrapper(st) 64 defer db.Close() 65 doc := newStorageMetaDoc(meta) 66 return addStorageMetadata(db, &doc) 67 } 68 69 // AddBackupMetadataID adds the metadata to storage, using the given 70 // backup ID. 71 func AddBackupMetadataID(st *state.State, meta *Metadata, id string) error { 72 restore := testing.PatchValue(&newStorageID, func(*storageMetaDoc) string { 73 return id 74 }) 75 defer restore() 76 77 db := getBackupDBWrapper(st) 78 defer db.Close() 79 doc := newStorageMetaDoc(meta) 80 _, err := addStorageMetadata(db, &doc) 81 return errors.Trace(err) 82 } 83 84 // SetBackupStoredTime stores the time of when the identified backup archive 85 // file was stored. 86 func SetBackupStoredTime(st *state.State, id string, stored time.Time) error { 87 db := getBackupDBWrapper(st) 88 defer db.Close() 89 return setStorageStoredTime(db, id, stored) 90 } 91 92 // ExposeCreateResult extracts the values in a create() result. 93 func ExposeCreateResult(result *createResult) (io.ReadCloser, int64, string) { 94 return result.archiveFile, result.size, result.checksum 95 } 96 97 // NewTestCreateArgs builds a new args value for create() calls. 98 func NewTestCreateArgs(filesToBackUp []string, db DBDumper, metar io.Reader) *createArgs { 99 args := createArgs{ 100 filesToBackUp: filesToBackUp, 101 db: db, 102 metadataReader: metar, 103 } 104 return &args 105 } 106 107 // ExposeCreateResult extracts the values in a create() args value. 108 func ExposeCreateArgs(args *createArgs) ([]string, DBDumper) { 109 return args.filesToBackUp, args.db 110 } 111 112 // NewTestCreateResult builds a new create() result. 113 func NewTestCreateResult(file io.ReadCloser, size int64, checksum string) *createResult { 114 result := createResult{ 115 archiveFile: file, 116 size: size, 117 checksum: checksum, 118 } 119 return &result 120 } 121 122 // NewTestCreate builds a new replacement for create() with the given result. 123 func NewTestCreate(result *createResult) (*createArgs, func(*createArgs) (*createResult, error)) { 124 var received createArgs 125 126 if result == nil { 127 archiveFile := ioutil.NopCloser(bytes.NewBufferString("<archive>")) 128 result = NewTestCreateResult(archiveFile, 10, "<checksum>") 129 } 130 131 testCreate := func(args *createArgs) (*createResult, error) { 132 received = *args 133 return result, nil 134 } 135 136 return &received, testCreate 137 } 138 139 // NewTestCreate builds a new replacement for create() with the given failure. 140 func NewTestCreateFailure(failure string) func(*createArgs) (*createResult, error) { 141 return func(*createArgs) (*createResult, error) { 142 return nil, errors.New(failure) 143 } 144 } 145 146 // NewTestMetaFinisher builds a new replacement for finishMetadata with 147 // the given failure. 148 func NewTestMetaFinisher(failure string) func(*Metadata, *createResult) error { 149 return func(*Metadata, *createResult) error { 150 if failure == "" { 151 return nil 152 } 153 return errors.New(failure) 154 } 155 } 156 157 // NewTestArchiveStorer builds a new replacement for StoreArchive with 158 // the given failure. 159 func NewTestArchiveStorer(failure string) func(filestorage.FileStorage, *Metadata, io.Reader) error { 160 return func(filestorage.FileStorage, *Metadata, io.Reader) error { 161 if failure == "" { 162 return nil 163 } 164 return errors.New(failure) 165 } 166 } 167 168 // Export for patching in tests 169 var RestorePath = &getMongorestorePath