github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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" // Only used for time types. 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 db := st.MongoSession().DB(storageDBName) 40 return newStorageDBWrapper(db, storageMetaName, st.ModelUUID()) 41 } 42 43 // NewBackupID creates a new backup ID based on the metadata. 44 func NewBackupID(meta *Metadata) string { 45 doc := newStorageMetaDoc(meta) 46 return newStorageID(&doc) 47 } 48 49 // GetBackupMetadata returns the metadata retrieved from storage. 50 func GetBackupMetadata(st *state.State, id string) (*Metadata, error) { 51 db := getBackupDBWrapper(st) 52 defer db.Close() 53 doc, err := getStorageMetadata(db, id) 54 if err != nil { 55 return nil, errors.Trace(err) 56 } 57 return docAsMetadata(doc), nil 58 } 59 60 // AddBackupMetadata adds the metadata to storage. 61 func AddBackupMetadata(st *state.State, meta *Metadata) (string, error) { 62 db := getBackupDBWrapper(st) 63 defer db.Close() 64 doc := newStorageMetaDoc(meta) 65 return addStorageMetadata(db, &doc) 66 } 67 68 // AddBackupMetadataID adds the metadata to storage, using the given 69 // backup ID. 70 func AddBackupMetadataID(st *state.State, meta *Metadata, id string) error { 71 restore := testing.PatchValue(&newStorageID, func(*storageMetaDoc) string { 72 return id 73 }) 74 defer restore() 75 76 db := getBackupDBWrapper(st) 77 defer db.Close() 78 doc := newStorageMetaDoc(meta) 79 _, err := addStorageMetadata(db, &doc) 80 return errors.Trace(err) 81 } 82 83 // SetBackupStoredTime stores the time of when the identified backup archive 84 // file was stored. 85 func SetBackupStoredTime(st *state.State, id string, stored time.Time) error { 86 db := getBackupDBWrapper(st) 87 defer db.Close() 88 return setStorageStoredTime(db, id, stored) 89 } 90 91 // ExposeCreateResult extracts the values in a create() result. 92 func ExposeCreateResult(result *createResult) (io.ReadCloser, int64, string, string) { 93 return result.archiveFile, result.size, result.checksum, result.filename 94 } 95 96 // NewTestCreateArgs builds a new args value for create() calls. 97 func NewTestCreateArgs(backupDir string, filesToBackUp []string, db DBDumper, metar io.Reader, noDownload bool) *createArgs { 98 args := createArgs{ 99 backupDir: backupDir, 100 filesToBackUp: filesToBackUp, 101 db: db, 102 metadataReader: metar, 103 noDownload: noDownload, 104 } 105 return &args 106 } 107 108 // ExposeCreateResult extracts the values in a create() args value. 109 func ExposeCreateArgs(args *createArgs) (string, []string, DBDumper) { 110 return args.backupDir, args.filesToBackUp, args.db 111 } 112 113 // NewTestCreateResult builds a new create() result. 114 func NewTestCreateResult(file io.ReadCloser, size int64, checksum, filename string) *createResult { 115 result := createResult{ 116 archiveFile: file, 117 size: size, 118 checksum: checksum, 119 filename: filename, 120 } 121 return &result 122 } 123 124 // NewTestCreate builds a new replacement for create() with the given result. 125 func NewTestCreate(result *createResult) (*createArgs, func(*createArgs) (*createResult, error)) { 126 var received createArgs 127 128 if result == nil { 129 archiveFile := ioutil.NopCloser(bytes.NewBufferString("<archive>")) 130 result = NewTestCreateResult(archiveFile, 10, "<checksum>", "") 131 } 132 133 testCreate := func(args *createArgs) (*createResult, error) { 134 received = *args 135 return result, nil 136 } 137 138 return &received, testCreate 139 } 140 141 // NewTestCreate builds a new replacement for create() with the given failure. 142 func NewTestCreateFailure(failure string) func(*createArgs) (*createResult, error) { 143 return func(*createArgs) (*createResult, error) { 144 return nil, errors.New(failure) 145 } 146 } 147 148 // NewTestMetaFinisher builds a new replacement for finishMetadata with 149 // the given failure. 150 func NewTestMetaFinisher(failure string) func(*Metadata, *createResult) error { 151 return func(*Metadata, *createResult) error { 152 if failure == "" { 153 return nil 154 } 155 return errors.New(failure) 156 } 157 } 158 159 // NewTestArchiveStorer builds a new replacement for StoreArchive with 160 // the given failure. 161 func NewTestArchiveStorer(failure string) func(filestorage.FileStorage, *Metadata, io.Reader) error { 162 return func(filestorage.FileStorage, *Metadata, io.Reader) error { 163 if failure == "" { 164 return nil 165 } 166 return errors.New(failure) 167 } 168 } 169 170 // Export for patching in tests 171 var RestorePath = &getMongorestorePath