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  }