~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/api/highavailability/client.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2014 Canonical Ltd.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package highavailability
 
5
 
 
6
import (
 
7
        "github.com/juju/errors"
 
8
        "github.com/juju/loggo"
 
9
        "github.com/juju/replicaset"
 
10
        "gopkg.in/juju/names.v2"
 
11
 
 
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"
 
16
)
 
17
 
 
18
var logger = loggo.GetLogger("juju.api.highavailability")
 
19
 
 
20
// Client provides access to the high availability service, used to manage controllers.
 
21
type Client struct {
 
22
        base.ClientFacade
 
23
        facade   base.FacadeCaller
 
24
        modelTag names.ModelTag
 
25
}
 
26
 
 
27
// NewClient returns a new HighAvailability client.
 
28
func NewClient(caller base.APICallCloser) *Client {
 
29
        modelTag, err := caller.ModelTag()
 
30
        if err != nil {
 
31
                logger.Errorf("ignoring invalid model tag: %v", err)
 
32
        }
 
33
        frontend, backend := base.NewClientFacade(caller, "HighAvailability")
 
34
        return &Client{ClientFacade: frontend, facade: backend, modelTag: modelTag}
 
35
}
 
36
 
 
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) {
 
41
 
 
42
        var results params.ControllersChangeResults
 
43
        arg := params.ControllersSpecs{
 
44
                Specs: []params.ControllersSpec{{
 
45
                        ModelTag:       c.modelTag.String(),
 
46
                        NumControllers: numControllers,
 
47
                        Constraints:    cons,
 
48
                        Placement:      placement,
 
49
                }}}
 
50
 
 
51
        err := c.facade.FacadeCall("EnableHA", arg, &results)
 
52
        if err != nil {
 
53
                return params.ControllersChanges{}, err
 
54
        }
 
55
        if len(results.Results) != 1 {
 
56
                return params.ControllersChanges{}, errors.Errorf("expected 1 result, got %d", len(results.Results))
 
57
        }
 
58
        result := results.Results[0]
 
59
        if result.Error != nil {
 
60
                return params.ControllersChanges{}, result.Error
 
61
        }
 
62
        return result.Result, nil
 
63
}
 
64
 
 
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{
 
69
                Target: v,
 
70
        }
 
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")
 
74
        }
 
75
        return results, nil
 
76
}
 
77
 
 
78
// ResumeHAReplicationAfterUpgrade makes all members part of HA again.
 
79
func (c *Client) ResumeHAReplicationAfterUpgrade(members []replicaset.Member) error {
 
80
        arg := params.ResumeReplicationParams{
 
81
                Members: members,
 
82
        }
 
83
        if err := c.facade.FacadeCall("ResumeHAReplicationAfterUpgrad", arg, nil); err != nil {
 
84
                return errors.Annotate(err, "cannnot resume ha")
 
85
        }
 
86
        return nil
 
87
}