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  }