github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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 11 "github.com/juju/juju/api/base" 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/constraints" 14 ) 15 16 var logger = loggo.GetLogger("juju.api.highavailability") 17 18 // Client provides access to the high availability service, used to manage state servers. 19 type Client struct { 20 base.ClientFacade 21 facade base.FacadeCaller 22 environTag names.EnvironTag 23 } 24 25 // NewClient returns a new HighAvailability client. 26 func NewClient(caller base.APICallCloser) *Client { 27 environTag, err := caller.EnvironTag() 28 if err != nil { 29 logger.Errorf("ignoring invalid environment tag: %v", err) 30 } 31 frontend, backend := base.NewClientFacade(caller, "HighAvailability") 32 return &Client{ClientFacade: frontend, facade: backend, environTag: environTag} 33 } 34 35 // EnsureAvailability ensures the availability of Juju state servers. 36 func (c *Client) EnsureAvailability( 37 numStateServers int, cons constraints.Value, series string, placement []string, 38 ) (params.StateServersChanges, error) { 39 40 var results params.StateServersChangeResults 41 arg := params.StateServersSpecs{ 42 Specs: []params.StateServersSpec{{ 43 EnvironTag: c.environTag.String(), 44 NumStateServers: numStateServers, 45 Constraints: cons, 46 Series: series, 47 Placement: placement, 48 }}} 49 50 var err error 51 // We need to retain compatibility with older Juju deployments without the new HighAvailability facade. 52 if c.facade.BestAPIVersion() < 1 { 53 if len(placement) > 0 { 54 return params.StateServersChanges{}, errors.Errorf("placement directives not supported with this version of Juju") 55 } 56 caller := c.facade.RawAPICaller() 57 err = caller.APICall("Client", caller.BestFacadeVersion("Client"), "", "EnsureAvailability", arg, &results) 58 } else { 59 err = c.facade.FacadeCall("EnsureAvailability", arg, &results) 60 } 61 62 if err != nil { 63 return params.StateServersChanges{}, err 64 } 65 if len(results.Results) != 1 { 66 return params.StateServersChanges{}, errors.Errorf("expected 1 result, got %d", len(results.Results)) 67 } 68 result := results.Results[0] 69 if result.Error != nil { 70 return params.StateServersChanges{}, result.Error 71 } 72 return result.Result, nil 73 }