Charmed-Kubernetes/kubeapi-load-balancer/hooks/relations/public-address/provides.py

61 lines
2.0 KiB
Python

import json
from charms.reactive import toggle_flag
from charms.reactive import Endpoint
class PublicAdddressProvides(Endpoint):
def manage_flags(self):
toggle_flag(self.expand_name('{endpoint_name}.available'),
self.is_joined)
def set_address_port(self, address, port, relation=None):
if relation is None:
# no relation specified, so send the same data to everyone
relations = self.relations
else:
# specific relation given, so only send the data to that one
relations = [relation]
if type(address) is list:
# build 2 lists to zip together that are the same length
length = len(address)
p = [port] * length
combined = zip(address, p)
clients = [{'public-address': a, 'port': p}
for a, p in combined]
# for backwards compatibility, we just send a single entry
# and have an array of dictionaries in a field of that
# entry for the other entries.
first = clients.pop(0)
first['extended_data'] = json.dumps(clients)
for relation in relations:
relation.to_publish_raw.update(first)
else:
for relation in relations:
relation.to_publish_raw.update({'public-address': address,
'port': port})
@property
def requests(self):
return [Request(rel) for rel in self.relations]
class Request:
def __init__(self, rel):
self.rel = rel
@property
def application_name(self):
return self.rel.application_name
@property
def members(self):
return [(u.received_raw.get('ingress-address',
u.received_raw['private-address']),
u.received_raw.get('port', '6443'))
for u in self.rel.joined_units]
def set_address_port(self, address, port):
self.rel.endpoint.set_address_port(address, port, self.rel)