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