1
// Copyright 2014 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
4
package highavailability
7
"github.com/juju/errors"
8
"github.com/juju/loggo"
9
"github.com/juju/replicaset"
10
"gopkg.in/juju/names.v2"
12
"github.com/juju/juju/api/base"
13
"github.com/juju/juju/apiserver/params"
14
"github.com/juju/juju/constraints"
15
"github.com/juju/juju/mongo"
18
var logger = loggo.GetLogger("juju.api.highavailability")
20
// Client provides access to the high availability service, used to manage controllers.
23
facade base.FacadeCaller
24
modelTag names.ModelTag
27
// NewClient returns a new HighAvailability client.
28
func NewClient(caller base.APICallCloser) *Client {
29
modelTag, err := caller.ModelTag()
31
logger.Errorf("ignoring invalid model tag: %v", err)
33
frontend, backend := base.NewClientFacade(caller, "HighAvailability")
34
return &Client{ClientFacade: frontend, facade: backend, modelTag: modelTag}
37
// EnableHA ensures the availability of Juju controllers.
38
func (c *Client) EnableHA(
39
numControllers int, cons constraints.Value, placement []string,
40
) (params.ControllersChanges, error) {
42
var results params.ControllersChangeResults
43
arg := params.ControllersSpecs{
44
Specs: []params.ControllersSpec{{
45
ModelTag: c.modelTag.String(),
46
NumControllers: numControllers,
51
err := c.facade.FacadeCall("EnableHA", arg, &results)
53
return params.ControllersChanges{}, err
55
if len(results.Results) != 1 {
56
return params.ControllersChanges{}, errors.Errorf("expected 1 result, got %d", len(results.Results))
58
result := results.Results[0]
59
if result.Error != nil {
60
return params.ControllersChanges{}, result.Error
62
return result.Result, nil
65
// MongoUpgradeMode will make all Slave members of the HA
66
// to shut down their mongo server.
67
func (c *Client) MongoUpgradeMode(v mongo.Version) (params.MongoUpgradeResults, error) {
68
arg := params.UpgradeMongoParams{
71
results := params.MongoUpgradeResults{}
72
if err := c.facade.FacadeCall("StopHAReplicationForUpgrade", arg, &results); err != nil {
73
return results, errors.Annotate(err, "cannnot enter mongo upgrade mode")
78
// ResumeHAReplicationAfterUpgrade makes all members part of HA again.
79
func (c *Client) ResumeHAReplicationAfterUpgrade(members []replicaset.Member) error {
80
arg := params.ResumeReplicationParams{
83
if err := c.facade.FacadeCall("ResumeHAReplicationAfterUpgrad", arg, nil); err != nil {
84
return errors.Annotate(err, "cannnot resume ha")