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