github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/api/highavailability/client.go (about) 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, _ := caller.ModelTag() 30 frontend, backend := base.NewClientFacade(caller, "HighAvailability") 31 return &Client{ClientFacade: frontend, facade: backend, modelTag: modelTag} 32 } 33 34 // EnableHA ensures the availability of Juju controllers. 35 func (c *Client) EnableHA( 36 numControllers int, cons constraints.Value, placement []string, 37 ) (params.ControllersChanges, error) { 38 39 var results params.ControllersChangeResults 40 arg := params.ControllersSpecs{ 41 Specs: []params.ControllersSpec{{ 42 ModelTag: c.modelTag.String(), 43 NumControllers: numControllers, 44 Constraints: cons, 45 Placement: placement, 46 }}} 47 48 err := c.facade.FacadeCall("EnableHA", arg, &results) 49 if err != nil { 50 return params.ControllersChanges{}, err 51 } 52 if len(results.Results) != 1 { 53 return params.ControllersChanges{}, errors.Errorf("expected 1 result, got %d", len(results.Results)) 54 } 55 result := results.Results[0] 56 if result.Error != nil { 57 return params.ControllersChanges{}, result.Error 58 } 59 return result.Result, nil 60 } 61 62 // MongoUpgradeMode will make all Slave members of the HA 63 // to shut down their mongo server. 64 func (c *Client) MongoUpgradeMode(v mongo.Version) (params.MongoUpgradeResults, error) { 65 arg := params.UpgradeMongoParams{ 66 Target: params.MongoVersion{ 67 Major: v.Major, 68 Minor: v.Minor, 69 Patch: v.Patch, 70 StorageEngine: string(v.StorageEngine), 71 }, 72 } 73 results := params.MongoUpgradeResults{} 74 if err := c.facade.FacadeCall("StopHAReplicationForUpgrade", arg, &results); err != nil { 75 return results, errors.Annotate(err, "cannnot enter mongo upgrade mode") 76 } 77 return results, nil 78 } 79 80 // ResumeHAReplicationAfterUpgrade makes all members part of HA again. 81 func (c *Client) ResumeHAReplicationAfterUpgrade(members []replicaset.Member) error { 82 arg := params.ResumeReplicationParams{ 83 Members: members, 84 } 85 if err := c.facade.FacadeCall("ResumeHAReplicationAfterUpgrad", arg, nil); err != nil { 86 return errors.Annotate(err, "cannnot resume ha") 87 } 88 return nil 89 }