github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/names" 10 "github.com/juju/replicaset" 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, series string, 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 Series: series, 49 Placement: placement, 50 }}} 51 52 err := c.facade.FacadeCall("EnableHA", arg, &results) 53 if err != nil { 54 return params.ControllersChanges{}, err 55 } 56 if len(results.Results) != 1 { 57 return params.ControllersChanges{}, errors.Errorf("expected 1 result, got %d", len(results.Results)) 58 } 59 result := results.Results[0] 60 if result.Error != nil { 61 return params.ControllersChanges{}, result.Error 62 } 63 return result.Result, nil 64 } 65 66 // MongoUpgradeMode will make all Slave members of the HA 67 // to shut down their mongo server. 68 func (c *Client) MongoUpgradeMode(v mongo.Version) (params.MongoUpgradeResults, error) { 69 arg := params.UpgradeMongoParams{ 70 Target: v, 71 } 72 results := params.MongoUpgradeResults{} 73 if err := c.facade.FacadeCall("StopHAReplicationForUpgrade", arg, &results); err != nil { 74 return results, errors.Annotate(err, "cannnot enter mongo upgrade mode") 75 } 76 return results, nil 77 } 78 79 // ResumeHAReplicationAfterUpgrade makes all members part of HA again. 80 func (c *Client) ResumeHAReplicationAfterUpgrade(members []replicaset.Member) error { 81 arg := params.ResumeReplicationParams{ 82 Members: members, 83 } 84 if err := c.facade.FacadeCall("ResumeHAReplicationAfterUpgrad", arg, nil); err != nil { 85 return errors.Annotate(err, "cannnot resume ha") 86 } 87 return nil 88 }