github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/externalcontrollerupdater/externalcontrollerupdater.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package externalcontrollerupdater
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"gopkg.in/juju/names.v2"
     9  
    10  	"github.com/juju/juju/api/base"
    11  	apiwatcher "github.com/juju/juju/api/watcher"
    12  	"github.com/juju/juju/apiserver/params"
    13  	"github.com/juju/juju/core/crossmodel"
    14  	"github.com/juju/juju/core/watcher"
    15  )
    16  
    17  const Facade = "ExternalControllerUpdater"
    18  
    19  // Client provides access to the ExternalControllerUpdater API facade.
    20  type Client struct {
    21  	facade base.FacadeCaller
    22  }
    23  
    24  // New creates a new client-side ExternalControllerUpdater facade.
    25  func New(caller base.APICaller) *Client {
    26  	return &Client{base.NewFacadeCaller(caller, Facade)}
    27  }
    28  
    29  // WatchExternalControllers watches for the addition and removal of external
    30  // controllers.
    31  func (c *Client) WatchExternalControllers() (watcher.StringsWatcher, error) {
    32  	var results params.StringsWatchResults
    33  	err := c.facade.FacadeCall("WatchExternalControllers", nil, &results)
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  	if n := len(results.Results); n != 1 {
    38  		return nil, errors.Errorf("expected 1 result, got %d", n)
    39  	}
    40  	result := results.Results[0]
    41  	if result.Error != nil {
    42  		return nil, result.Error
    43  	}
    44  	w := apiwatcher.NewStringsWatcher(c.facade.RawAPICaller(), result)
    45  	return w, nil
    46  }
    47  
    48  // ExternalControllerInfo returns the info for the external controller with the specified UUID.
    49  func (c *Client) ExternalControllerInfo(controllerUUID string) (*crossmodel.ControllerInfo, error) {
    50  	if !names.IsValidController(controllerUUID) {
    51  		return nil, errors.NotValidf("controller UUID %q", controllerUUID)
    52  	}
    53  	controllerTag := names.NewControllerTag(controllerUUID)
    54  	args := params.Entities{[]params.Entity{{
    55  		Tag: controllerTag.String(),
    56  	}}}
    57  	var results params.ExternalControllerInfoResults
    58  	err := c.facade.FacadeCall("ExternalControllerInfo", args, &results)
    59  	if err != nil {
    60  		return nil, errors.Trace(err)
    61  	}
    62  	if len(results.Results) != 1 {
    63  		return nil, errors.Errorf("expected 1 result, got %d", len(results.Results))
    64  	}
    65  	result := results.Results[0]
    66  	if result.Error != nil {
    67  		return nil, result.Error
    68  	}
    69  	return &crossmodel.ControllerInfo{
    70  		ControllerTag: controllerTag,
    71  		Alias:         result.Result.Alias,
    72  		Addrs:         result.Result.Addrs,
    73  		CACert:        result.Result.CACert,
    74  	}, nil
    75  }
    76  
    77  // SetExternalControllerInfo saves the given controller info.
    78  func (c *Client) SetExternalControllerInfo(info crossmodel.ControllerInfo) error {
    79  	var results params.ErrorResults
    80  	args := params.SetExternalControllersInfoParams{
    81  		Controllers: []params.SetExternalControllerInfoParams{{
    82  			Info: params.ExternalControllerInfo{
    83  				ControllerTag: info.ControllerTag.String(),
    84  				Alias:         info.Alias,
    85  				Addrs:         info.Addrs,
    86  				CACert:        info.CACert,
    87  			},
    88  		}},
    89  	}
    90  	err := c.facade.FacadeCall("SetExternalControllerInfo", args, &results)
    91  	if err != nil {
    92  		return errors.Trace(err)
    93  	}
    94  	return results.OneError()
    95  }