github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/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/mgo/v3" 9 "github.com/juju/replicaset/v3" 10 11 "github.com/juju/juju/rpc/params" 12 "github.com/juju/juju/state/backups" 13 ) 14 15 var waitUntilReady = func(s *mgo.Session, timeout int) error { 16 return replicaset.WaitUntilReady(s, timeout) 17 } 18 19 // Create is the API method that requests juju to create a new backup 20 // of its state. 21 func (a *API) Create(args params.BackupsCreateArgs) (params.BackupsMetadataResult, error) { 22 backupsMethods := newBackups(a.paths) 23 24 session := a.backend.MongoSession().Copy() 25 defer session.Close() 26 27 result := params.BackupsMetadataResult{} 28 // Don't go if HA isn't ready. 29 err := waitUntilReady(session, 60) 30 if err != nil { 31 return result, errors.Annotatef(err, "HA not ready; try again later") 32 } 33 34 mgoInfo, err := mongoInfo(a.paths.DataDir, a.machineID) 35 if err != nil { 36 return result, errors.Annotatef(err, "getting mongo info") 37 } 38 dbInfo, err := backups.NewDBInfo(mgoInfo, sessionShim{session}) 39 if err != nil { 40 return result, errors.Trace(err) 41 } 42 mBase, err := a.backend.MachineBase(a.machineID) 43 if err != nil { 44 return result, errors.Trace(err) 45 } 46 47 meta, err := backups.NewMetadataState(a.backend, a.machineID, mBase.DisplayString()) 48 if err != nil { 49 return result, errors.Trace(err) 50 } 51 meta.Notes = args.Notes 52 meta.Controller.MachineID = a.machineID 53 m, err := a.backend.Machine(a.machineID) 54 if err != nil { 55 return result, errors.Trace(err) 56 } 57 instanceID, err := m.InstanceId() 58 if err != nil { 59 return result, errors.Trace(err) 60 } 61 meta.Controller.MachineInstanceID = string(instanceID) 62 63 nodes, err := a.backend.ControllerNodes() 64 if err != nil { 65 return result, errors.Trace(err) 66 } 67 meta.Controller.HANodes = int64(len(nodes)) 68 69 fileName, err := backupsMethods.Create(meta, dbInfo) 70 if err != nil { 71 return result, errors.Trace(err) 72 } 73 74 result = CreateResult(meta, fileName) 75 return result, nil 76 }