github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/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/loggo"
     8  
     9  	"github.com/juju/juju/apiserver/common"
    10  	"github.com/juju/juju/apiserver/facade"
    11  	"github.com/juju/juju/apiserver/params"
    12  	"github.com/juju/juju/state"
    13  	"github.com/juju/juju/state/watcher"
    14  )
    15  
    16  var logger = loggo.GetLogger("juju.apiserver.crosscontroller")
    17  
    18  type localControllerInfoFunc func() ([]string, string, error)
    19  type watchLocalControllerInfoFunc func() state.NotifyWatcher
    20  
    21  // CrossControllerAPI provides access to the CrossModelRelations API facade.
    22  type CrossControllerAPI struct {
    23  	resources                facade.Resources
    24  	localControllerInfo      localControllerInfoFunc
    25  	watchLocalControllerInfo watchLocalControllerInfoFunc
    26  }
    27  
    28  // NewStateCrossControllerAPI creates a new server-side CrossModelRelations API facade
    29  // backed by global state.
    30  func NewStateCrossControllerAPI(ctx facade.Context) (*CrossControllerAPI, error) {
    31  	st := ctx.State()
    32  	return NewCrossControllerAPI(
    33  		ctx.Resources(),
    34  		func() ([]string, string, error) { return common.StateControllerInfo(st) },
    35  		st.WatchAPIHostPortsForClients,
    36  	)
    37  }
    38  
    39  // NewCrossControllerAPI returns a new server-side CrossControllerAPI facade.
    40  func NewCrossControllerAPI(
    41  	resources facade.Resources,
    42  	localControllerInfo localControllerInfoFunc,
    43  	watchLocalControllerInfo watchLocalControllerInfoFunc,
    44  ) (*CrossControllerAPI, error) {
    45  	return &CrossControllerAPI{
    46  		resources:                resources,
    47  		localControllerInfo:      localControllerInfo,
    48  		watchLocalControllerInfo: watchLocalControllerInfo,
    49  	}, nil
    50  }
    51  
    52  // WatchControllerInfo creates a watcher that notifies when the API info
    53  // for the controller changes.
    54  func (api *CrossControllerAPI) WatchControllerInfo() (params.NotifyWatchResults, error) {
    55  	results := params.NotifyWatchResults{
    56  		Results: make([]params.NotifyWatchResult, 1),
    57  	}
    58  	w := api.watchLocalControllerInfo()
    59  	if _, ok := <-w.Changes(); !ok {
    60  		results.Results[0].Error = common.ServerError(watcher.EnsureErr(w))
    61  		return results, nil
    62  	}
    63  	results.Results[0].NotifyWatcherId = api.resources.Register(w)
    64  	return results, nil
    65  }
    66  
    67  // ControllerInfo returns the API info for the controller.
    68  func (api *CrossControllerAPI) ControllerInfo() (params.ControllerAPIInfoResults, error) {
    69  	results := params.ControllerAPIInfoResults{
    70  		Results: make([]params.ControllerAPIInfoResult, 1),
    71  	}
    72  	addrs, caCert, err := api.localControllerInfo()
    73  	if err != nil {
    74  		results.Results[0].Error = common.ServerError(err)
    75  		return results, nil
    76  	}
    77  	results.Results[0].Addresses = addrs
    78  	results.Results[0].CACert = caCert
    79  	return results, nil
    80  }