github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/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 "launchpad.net/juju-core/state/api/params" 8 ) 9 10 // AddressAndCertGetter can be used to find out 11 // state server addresses and the CA public certificate. 12 type AddressAndCertGetter interface { 13 Addresses() ([]string, error) 14 APIAddresses() ([]string, error) 15 CACert() []byte 16 } 17 18 // APIAddresser implements the APIAddresses method 19 type APIAddresser struct { 20 getter AddressAndCertGetter 21 } 22 23 // NewAPIAddresser returns a new APIAddresser that uses the given getter to 24 // fetch its addresses. 25 func NewAPIAddresser(getter AddressAndCertGetter) *APIAddresser { 26 return &APIAddresser{getter} 27 } 28 29 // APIAddresses returns the list of addresses used to connect to the API. 30 func (a *APIAddresser) APIAddresses() (params.StringsResult, error) { 31 addrs, err := a.getter.APIAddresses() 32 if err != nil { 33 return params.StringsResult{}, err 34 } 35 return params.StringsResult{ 36 Result: addrs, 37 }, nil 38 } 39 40 // StateAddresser implements a common set of methods for getting state 41 // server addresses, and the CA certificate used to authenticate them. 42 type StateAddresser struct { 43 getter AddressAndCertGetter 44 } 45 46 // NewAddresser returns a new StateAddresser that uses the given 47 // st value to fetch its addresses. 48 func NewStateAddresser(getter AddressAndCertGetter) *StateAddresser { 49 return &StateAddresser{getter} 50 } 51 52 // StateAddresses returns the list of addresses used to connect to the state. 53 func (a *StateAddresser) StateAddresses() (params.StringsResult, error) { 54 addrs, err := a.getter.Addresses() 55 if err != nil { 56 return params.StringsResult{}, err 57 } 58 return params.StringsResult{ 59 Result: addrs, 60 }, nil 61 } 62 63 // CACert returns the certificate used to validate the state connection. 64 // Note: there is an open bug that Uniter (which uses only APIAddresser) should 65 // add CACert to its interface. When it does, this API si likely to move to 66 // APIAddresser instead of StateAddresser. (All other users of StateAddresser 67 // already also expose APIAddresser) 68 func (a *StateAddresser) CACert() params.BytesResult { 69 return params.BytesResult{ 70 Result: a.getter.CACert(), 71 } 72 }