github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/client/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  //
    20  // NOTE(hml) this provides backwards compatibility for facade version 1.
    21  func (a *API) Create(args params.BackupsCreateArgs) (params.BackupsMetadataResult, error) {
    22  	args.KeepCopy = true
    23  	args.NoDownload = true
    24  
    25  	apiv2 := APIv2{a}
    26  	result, err := apiv2.Create(args)
    27  	if err != nil {
    28  		return result, errors.Trace(err)
    29  	}
    30  	return result, nil
    31  }
    32  
    33  func (a *APIv2) Create(args params.BackupsCreateArgs) (params.BackupsMetadataResult, error) {
    34  	backupsMethods, closer := newBackups(a.backend)
    35  	defer closer.Close()
    36  
    37  	session := a.backend.MongoSession().Copy()
    38  	defer session.Close()
    39  
    40  	result := params.BackupsMetadataResult{}
    41  	// Don't go if HA isn't ready.
    42  	err := waitUntilReady(session, 60)
    43  	if err != nil {
    44  		return result, errors.Annotatef(err, "HA not ready; try again later")
    45  	}
    46  
    47  	mgoInfo, err := mongoInfo(a.paths.DataDir, a.machineID)
    48  	if err != nil {
    49  		return result, errors.Annotatef(err, "getting mongo info")
    50  	}
    51  	v, err := a.backend.MongoVersion()
    52  	if err != nil {
    53  		return result, errors.Annotatef(err, "discovering mongo version")
    54  	}
    55  	mongoVersion, err := mongo.NewVersion(v)
    56  	if err != nil {
    57  		return result, errors.Trace(err)
    58  	}
    59  	dbInfo, err := backups.NewDBInfo(mgoInfo, session, mongoVersion)
    60  	if err != nil {
    61  		return result, errors.Trace(err)
    62  	}
    63  	mSeries, err := a.backend.MachineSeries(a.machineID)
    64  	if err != nil {
    65  		return result, errors.Trace(err)
    66  	}
    67  
    68  	meta, err := backups.NewMetadataState(a.backend, a.machineID, mSeries)
    69  	if err != nil {
    70  		return result, errors.Trace(err)
    71  	}
    72  	meta.Notes = args.Notes
    73  
    74  	fileName, err := backupsMethods.Create(meta, a.paths, dbInfo, args.KeepCopy, args.NoDownload)
    75  	if err != nil {
    76  		return result, errors.Trace(err)
    77  	}
    78  
    79  	result = CreateResult(meta, fileName)
    80  	return result, nil
    81  }