github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 11 "github.com/juju/juju/api/base" 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/core/constraints" 14 "github.com/juju/juju/mongo" 15 ) 16 17 var logger = loggo.GetLogger("juju.api.highavailability") 18 19 // Client provides access to the high availability service, used to manage controllers. 20 type Client struct { 21 base.ClientFacade 22 facade base.FacadeCaller 23 } 24 25 // NewClient returns a new HighAvailability client. 26 func NewClient(caller base.APICallCloser) *Client { 27 frontend, backend := base.NewClientFacade(caller, "HighAvailability") 28 return &Client{ClientFacade: frontend, facade: backend} 29 } 30 31 // EnableHA ensures the availability of Juju controllers. 32 func (c *Client) EnableHA( 33 numControllers int, cons constraints.Value, placement []string, 34 ) (params.ControllersChanges, error) { 35 36 var results params.ControllersChangeResults 37 arg := params.ControllersSpecs{ 38 Specs: []params.ControllersSpec{{ 39 NumControllers: numControllers, 40 Constraints: cons, 41 Placement: placement, 42 }}} 43 44 err := c.facade.FacadeCall("EnableHA", arg, &results) 45 if err != nil { 46 return params.ControllersChanges{}, err 47 } 48 if len(results.Results) != 1 { 49 return params.ControllersChanges{}, errors.Errorf("expected 1 result, got %d", len(results.Results)) 50 } 51 result := results.Results[0] 52 if result.Error != nil { 53 return params.ControllersChanges{}, result.Error 54 } 55 return result.Result, nil 56 } 57 58 // MongoUpgradeMode will make all Slave members of the HA 59 // to shut down their mongo server. 60 func (c *Client) MongoUpgradeMode(v mongo.Version) (params.MongoUpgradeResults, error) { 61 arg := params.UpgradeMongoParams{ 62 Target: params.MongoVersion{ 63 Major: v.Major, 64 Minor: v.Minor, 65 Patch: v.Patch, 66 StorageEngine: string(v.StorageEngine), 67 }, 68 } 69 results := params.MongoUpgradeResults{} 70 if err := c.facade.FacadeCall("StopHAReplicationForUpgrade", arg, &results); err != nil { 71 return results, errors.Annotate(err, "can not enter mongo upgrade mode") 72 } 73 return results, nil 74 } 75 76 // ResumeHAReplicationAfterUpgrade makes all members part of HA again. 77 func (c *Client) ResumeHAReplicationAfterUpgrade(members []replicaset.Member) error { 78 arg := params.ResumeReplicationParams{ 79 Members: members, 80 } 81 if err := c.facade.FacadeCall("ResumeHAReplicationAfterUpgrad", arg, nil); err != nil { 82 return errors.Annotate(err, "can not resume ha") 83 } 84 return nil 85 }