60 lines
1.7 KiB
Markdown
60 lines
1.7 KiB
Markdown
# Overview
|
|
|
|
This interface layer implements a public address protocol useful for load
|
|
balancers and their subordinates. The load balancers (providers) set their
|
|
own public address and port, which is then available to the subordinates
|
|
(requirers).
|
|
|
|
# Usage
|
|
|
|
## Provides
|
|
|
|
By providing the `public-address` interface, your charm is providing an HTTP
|
|
server that can load-balance for another HTTP based service.
|
|
|
|
Your charm need only provide the address and port on which it is serving its
|
|
content, as soon as the `{relation_name}.available` state is set:
|
|
|
|
```python
|
|
from charmhelpers.core import hookenv
|
|
@when('website.available')
|
|
def configure_website(website):
|
|
website.set_address_port(hookenv.unit_get('public-address'), hookenv.config('port'))
|
|
```
|
|
|
|
## Requires
|
|
|
|
By requiring the `public-address` interface, your charm is consuming one or
|
|
more HTTP servers, to load-balance a set of servers, etc.
|
|
|
|
Your charm should respond to the `{relation_name}.available` state, which
|
|
indicates that there is at least one HTTP server connected.
|
|
|
|
The `get_addresses_ports()` method returns a list of available addresses and
|
|
ports.
|
|
|
|
The return value is a list of dicts of the following form:
|
|
|
|
```python
|
|
[
|
|
{
|
|
'public-address': address_of_host,
|
|
'port': port_for_host,
|
|
},
|
|
# ...
|
|
]
|
|
```
|
|
|
|
A trivial example of handling this interface would be:
|
|
|
|
```python
|
|
from charmhelpers.core import hookenv
|
|
@when('loadbalancer.available')
|
|
def update_reverse_proxy_config(loadbalancer):
|
|
hosts = loadbalancer.get_addresses_ports()
|
|
for host in hosts:
|
|
hookenv.log('The loadbalancer for this unit is {}:{}'.format(
|
|
host['public-address'],
|
|
host['port']))
|
|
```
|