github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/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/names/v5"
     8  
     9  	apiservererrors "github.com/juju/juju/apiserver/errors"
    10  	"github.com/juju/juju/apiserver/facade"
    11  	"github.com/juju/juju/core/crossmodel"
    12  	"github.com/juju/juju/rpc/params"
    13  	"github.com/juju/juju/state"
    14  	"github.com/juju/juju/state/watcher"
    15  )
    16  
    17  // ExternalControllerUpdaterAPI provides access to the CrossModelRelations API facade.
    18  type ExternalControllerUpdaterAPI struct {
    19  	externalControllers state.ExternalControllers
    20  	resources           facade.Resources
    21  }
    22  
    23  // NewAPI creates a new server-side CrossModelRelationsAPI API facade backed
    24  // by the given interfaces.
    25  func NewAPI(
    26  	auth facade.Authorizer,
    27  	resources facade.Resources,
    28  	externalControllers state.ExternalControllers,
    29  ) (*ExternalControllerUpdaterAPI, error) {
    30  	if !auth.AuthController() {
    31  		return nil, apiservererrors.ErrPerm
    32  	}
    33  	return &ExternalControllerUpdaterAPI{
    34  		externalControllers,
    35  		resources,
    36  	}, nil
    37  }
    38  
    39  // WatchExternalControllers watches for the addition and removal of external
    40  // controller records to the local controller's database.
    41  func (api *ExternalControllerUpdaterAPI) WatchExternalControllers() (params.StringsWatchResults, error) {
    42  	w := api.externalControllers.Watch()
    43  	changes, ok := <-w.Changes()
    44  	if !ok {
    45  		return params.StringsWatchResults{
    46  			[]params.StringsWatchResult{{
    47  				Error: apiservererrors.ServerError(watcher.EnsureErr(w)),
    48  			}},
    49  		}, nil
    50  	}
    51  	return params.StringsWatchResults{
    52  		[]params.StringsWatchResult{{
    53  			StringsWatcherId: api.resources.Register(w),
    54  			Changes:          changes,
    55  		}},
    56  	}, nil
    57  }
    58  
    59  // ExternalControllerInfo returns the info for the specified external controllers.
    60  func (s *ExternalControllerUpdaterAPI) ExternalControllerInfo(args params.Entities) (params.ExternalControllerInfoResults, error) {
    61  	result := params.ExternalControllerInfoResults{
    62  		Results: make([]params.ExternalControllerInfoResult, len(args.Entities)),
    63  	}
    64  	for i, entity := range args.Entities {
    65  		controllerTag, err := names.ParseControllerTag(entity.Tag)
    66  		if err != nil {
    67  			result.Results[i].Error = apiservererrors.ServerError(err)
    68  			continue
    69  		}
    70  		controller, err := s.externalControllers.Controller(controllerTag.Id())
    71  		if err != nil {
    72  			result.Results[i].Error = apiservererrors.ServerError(err)
    73  			continue
    74  		}
    75  		info := controller.ControllerInfo()
    76  		result.Results[i].Result = &params.ExternalControllerInfo{
    77  			ControllerTag: controllerTag.String(),
    78  			Alias:         info.Alias,
    79  			Addrs:         info.Addrs,
    80  			CACert:        info.CACert,
    81  		}
    82  	}
    83  	return result, nil
    84  }
    85  
    86  // SetExternalControllerInfo saves the info for the specified external controllers.
    87  func (s *ExternalControllerUpdaterAPI) SetExternalControllerInfo(args params.SetExternalControllersInfoParams) (params.ErrorResults, error) {
    88  	result := params.ErrorResults{
    89  		Results: make([]params.ErrorResult, len(args.Controllers)),
    90  	}
    91  	for i, arg := range args.Controllers {
    92  		controllerTag, err := names.ParseControllerTag(arg.Info.ControllerTag)
    93  		if err != nil {
    94  			result.Results[i].Error = apiservererrors.ServerError(err)
    95  			continue
    96  		}
    97  		if _, err := s.externalControllers.Save(crossmodel.ControllerInfo{
    98  			ControllerTag: controllerTag,
    99  			Alias:         arg.Info.Alias,
   100  			Addrs:         arg.Info.Addrs,
   101  			CACert:        arg.Info.CACert,
   102  		}); err != nil {
   103  			result.Results[i].Error = apiservererrors.ServerError(err)
   104  			continue
   105  		}
   106  	}
   107  	return result, nil
   108  }