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

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package crosscontroller
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/loggo"
     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/watcher"
    14  )
    15  
    16  var logger = loggo.GetLogger("juju.api.crosscontroller")
    17  
    18  // Client provides access to the CrossController API facade.
    19  type Client struct {
    20  	base.ClientFacade
    21  	facade base.FacadeCaller
    22  }
    23  
    24  // NewClient creates a new client-side CrossModelRelations facade.
    25  func NewClient(caller base.APICallCloser) *Client {
    26  	frontend, backend := base.NewClientFacade(caller, "CrossController")
    27  	return &Client{
    28  		ClientFacade: frontend,
    29  		facade:       backend,
    30  	}
    31  }
    32  
    33  // ControllerInfo contains the information about the controller that will be
    34  // returned by the ControllerInfo method.
    35  type ControllerInfo struct {
    36  	Addrs  []string
    37  	CACert string
    38  }
    39  
    40  // ControllerInfo returns the remote controller's API information.
    41  func (c *Client) ControllerInfo() (*ControllerInfo, error) {
    42  	var results params.ControllerAPIInfoResults
    43  	if err := c.facade.FacadeCall("ControllerInfo", nil, &results); err != nil {
    44  		return nil, errors.Trace(err)
    45  	}
    46  	if len(results.Results) != 1 {
    47  		return nil, errors.Errorf("expected 1 result, got %d", len(results.Results))
    48  	}
    49  	if err := results.Results[0].Error; err != nil {
    50  		return nil, errors.Trace(err)
    51  	}
    52  	info := results.Results[0]
    53  	return &ControllerInfo{
    54  		Addrs:  info.Addresses,
    55  		CACert: info.CACert,
    56  	}, nil
    57  }
    58  
    59  // WatchControllerInfo returns a watcher that is notified when the remote
    60  // controller's API information changes.
    61  func (c *Client) WatchControllerInfo() (watcher.NotifyWatcher, error) {
    62  	var results params.NotifyWatchResults
    63  	if err := c.facade.FacadeCall("WatchControllerInfo", nil, &results); err != nil {
    64  		return nil, errors.Trace(err)
    65  	}
    66  	if len(results.Results) != 1 {
    67  		return nil, errors.Errorf("expected 1 result, got %d", len(results.Results))
    68  	}
    69  	if err := results.Results[0].Error; err != nil {
    70  		return nil, errors.Trace(err)
    71  	}
    72  	w := apiwatcher.NewNotifyWatcher(c.facade.RawAPICaller(), results.Results[0])
    73  	return w, nil
    74  }