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