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