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  }