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