github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/backups/create.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  	"github.com/juju/errors"
     8  	"github.com/juju/replicaset"
     9  
    10  	"github.com/juju/juju/apiserver/params"
    11  	"github.com/juju/juju/mongo"
    12  	"github.com/juju/juju/state/backups"
    13  )
    14  
    15  var waitUntilReady = replicaset.WaitUntilReady
    16  
    17  // Create is the API method that requests juju to create a new backup
    18  // of its state.  It returns the metadata for that backup.
    19  func (a *API) Create(args params.BackupsCreateArgs) (p params.BackupsMetadataResult, err error) {
    20  	backupsMethods, closer := newBackups(a.backend)
    21  	defer closer.Close()
    22  
    23  	session := a.backend.MongoSession().Copy()
    24  	defer session.Close()
    25  
    26  	// Don't go if HA isn't ready.
    27  	err = waitUntilReady(session, 60)
    28  	if err != nil {
    29  		return p, errors.Annotatef(err, "HA not ready; try again later")
    30  	}
    31  
    32  	mgoInfo := a.backend.MongoConnectionInfo()
    33  	v, err := a.backend.MongoVersion()
    34  	if err != nil {
    35  		return p, errors.Annotatef(err, "discovering mongo version")
    36  	}
    37  	mongoVersion, err := mongo.NewVersion(v)
    38  	if err != nil {
    39  		return p, errors.Trace(err)
    40  	}
    41  	dbInfo, err := backups.NewDBInfo(mgoInfo, session, mongoVersion)
    42  	if err != nil {
    43  		return p, errors.Trace(err)
    44  	}
    45  	mSeries, err := a.backend.MachineSeries(a.machineID)
    46  	if err != nil {
    47  		return p, errors.Trace(err)
    48  	}
    49  
    50  	meta, err := backups.NewMetadataState(a.backend, a.machineID, mSeries)
    51  	if err != nil {
    52  		return p, errors.Trace(err)
    53  	}
    54  	meta.Notes = args.Notes
    55  
    56  	err = backupsMethods.Create(meta, a.paths, dbInfo)
    57  	if err != nil {
    58  		return p, errors.Trace(err)
    59  	}
    60  
    61  	return ResultFromMetadata(meta), nil
    62  }