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  }