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