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 }