github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/common/addresses.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common
     5  
     6  import (
     7  	"github.com/juju/juju/apiserver/facade"
     8  	"github.com/juju/juju/apiserver/params"
     9  	"github.com/juju/juju/network"
    10  	"github.com/juju/juju/state"
    11  	"github.com/juju/juju/state/watcher"
    12  )
    13  
    14  // AddressAndCertGetter can be used to find out controller addresses
    15  // and the CA public certificate.
    16  type AddressAndCertGetter interface {
    17  	Addresses() ([]string, error)
    18  	ModelUUID() string
    19  	APIHostPortsForAgents() ([][]network.HostPort, error)
    20  	WatchAPIHostPortsForAgents() state.NotifyWatcher
    21  }
    22  
    23  // APIAddresser implements the APIAddresses method.
    24  // Note that the getter backing for this implies that it is suitable for use by
    25  // agents, which are bound by the configured controller management space.
    26  // It is not suitable for callers requiring *all* available API addresses.
    27  type APIAddresser struct {
    28  	resources facade.Resources
    29  	getter    AddressAndCertGetter
    30  }
    31  
    32  // NewAPIAddresser returns a new APIAddresser that uses the given getter to
    33  // fetch its addresses.
    34  func NewAPIAddresser(getter AddressAndCertGetter, resources facade.Resources) *APIAddresser {
    35  	return &APIAddresser{
    36  		getter:    getter,
    37  		resources: resources,
    38  	}
    39  }
    40  
    41  // APIHostPorts returns the API server addresses.
    42  func (a *APIAddresser) APIHostPorts() (params.APIHostPortsResult, error) {
    43  	servers, err := a.getter.APIHostPortsForAgents()
    44  	if err != nil {
    45  		return params.APIHostPortsResult{}, err
    46  	}
    47  	return params.APIHostPortsResult{
    48  		Servers: params.FromNetworkHostsPorts(servers),
    49  	}, nil
    50  }
    51  
    52  // WatchAPIHostPorts watches the API server addresses.
    53  func (a *APIAddresser) WatchAPIHostPorts() (params.NotifyWatchResult, error) {
    54  	watch := a.getter.WatchAPIHostPortsForAgents()
    55  	if _, ok := <-watch.Changes(); ok {
    56  		return params.NotifyWatchResult{
    57  			NotifyWatcherId: a.resources.Register(watch),
    58  		}, nil
    59  	}
    60  	return params.NotifyWatchResult{}, watcher.EnsureErr(watch)
    61  }
    62  
    63  // APIAddresses returns the list of addresses used to connect to the API.
    64  func (a *APIAddresser) APIAddresses() (params.StringsResult, error) {
    65  	addrs, err := apiAddresses(a.getter)
    66  	if err != nil {
    67  		return params.StringsResult{}, err
    68  	}
    69  	return params.StringsResult{
    70  		Result: addrs,
    71  	}, nil
    72  }
    73  
    74  func apiAddresses(getter APIHostPortsForAgentsGetter) ([]string, error) {
    75  	apiHostPorts, err := getter.APIHostPortsForAgents()
    76  	if err != nil {
    77  		return nil, err
    78  	}
    79  	var addrs = make([]string, 0, len(apiHostPorts))
    80  	for _, hostPorts := range apiHostPorts {
    81  		ordered := network.PrioritizeInternalHostPorts(hostPorts, false)
    82  		for _, addr := range ordered {
    83  			if addr != "" {
    84  				addrs = append(addrs, addr)
    85  			}
    86  		}
    87  	}
    88  	return addrs, nil
    89  }
    90  
    91  // ModelUUID returns the model UUID to connect to the model
    92  // that the current connection is for.
    93  func (a *APIAddresser) ModelUUID() params.StringResult {
    94  	return params.StringResult{Result: a.getter.ModelUUID()}
    95  }
    96  
    97  // StateAddresser implements a common set of methods for getting state
    98  // server addresses, and the CA certificate used to authenticate them.
    99  type StateAddresser struct {
   100  	getter AddressAndCertGetter
   101  }
   102  
   103  // NewStateAddresser returns a new StateAddresser that uses the given
   104  // st value to fetch its addresses.
   105  func NewStateAddresser(getter AddressAndCertGetter) *StateAddresser {
   106  	return &StateAddresser{getter}
   107  }
   108  
   109  // StateAddresses returns the list of addresses used to connect to the state.
   110  func (a *StateAddresser) StateAddresses() (params.StringsResult, error) {
   111  	addrs, err := a.getter.Addresses()
   112  	if err != nil {
   113  		return params.StringsResult{}, err
   114  	}
   115  	return params.StringsResult{
   116  		Result: addrs,
   117  	}, nil
   118  }