github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  	"gopkg.in/juju/names.v2"
    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, _ := caller.ModelTag()
    30  	frontend, backend := base.NewClientFacade(caller, "HighAvailability")
    31  	return &Client{ClientFacade: frontend, facade: backend, modelTag: modelTag}
    32  }
    33  
    34  // EnableHA ensures the availability of Juju controllers.
    35  func (c *Client) EnableHA(
    36  	numControllers int, cons constraints.Value, placement []string,
    37  ) (params.ControllersChanges, error) {
    38  
    39  	var results params.ControllersChangeResults
    40  	arg := params.ControllersSpecs{
    41  		Specs: []params.ControllersSpec{{
    42  			ModelTag:       c.modelTag.String(),
    43  			NumControllers: numControllers,
    44  			Constraints:    cons,
    45  			Placement:      placement,
    46  		}}}
    47  
    48  	err := c.facade.FacadeCall("EnableHA", arg, &results)
    49  	if err != nil {
    50  		return params.ControllersChanges{}, err
    51  	}
    52  	if len(results.Results) != 1 {
    53  		return params.ControllersChanges{}, errors.Errorf("expected 1 result, got %d", len(results.Results))
    54  	}
    55  	result := results.Results[0]
    56  	if result.Error != nil {
    57  		return params.ControllersChanges{}, result.Error
    58  	}
    59  	return result.Result, nil
    60  }
    61  
    62  // MongoUpgradeMode will make all Slave members of the HA
    63  // to shut down their mongo server.
    64  func (c *Client) MongoUpgradeMode(v mongo.Version) (params.MongoUpgradeResults, error) {
    65  	arg := params.UpgradeMongoParams{
    66  		Target: params.MongoVersion{
    67  			Major:         v.Major,
    68  			Minor:         v.Minor,
    69  			Patch:         v.Patch,
    70  			StorageEngine: string(v.StorageEngine),
    71  		},
    72  	}
    73  	results := params.MongoUpgradeResults{}
    74  	if err := c.facade.FacadeCall("StopHAReplicationForUpgrade", arg, &results); err != nil {
    75  		return results, errors.Annotate(err, "cannnot enter mongo upgrade mode")
    76  	}
    77  	return results, nil
    78  }
    79  
    80  // ResumeHAReplicationAfterUpgrade makes all members part of HA again.
    81  func (c *Client) ResumeHAReplicationAfterUpgrade(members []replicaset.Member) error {
    82  	arg := params.ResumeReplicationParams{
    83  		Members: members,
    84  	}
    85  	if err := c.facade.FacadeCall("ResumeHAReplicationAfterUpgrad", arg, nil); err != nil {
    86  		return errors.Annotate(err, "cannnot resume ha")
    87  	}
    88  	return nil
    89  }