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