Charmed-Kubernetes/kubernetes-worker/hooks/relations/mount/requires.py

72 lines
2.5 KiB
Python

from charms.reactive import when, when_not
from charms.reactive import set_flag, clear_flag
from charms.reactive import Endpoint
class MountRequires(Endpoint):
@when('endpoint.{endpoint_name}.joined')
def joined(self):
set_flag(self.expand_name('{endpoint_name}.joined'))
@when('endpoint.{endpoint_name}.changed')
def changed(self):
if any(unit.received_raw['mountpoint']
for unit in self.all_joined_units):
set_flag(self.expand_name('{endpoint_name}.available'))
@when_not('endpoint.{endpoint_name}.joined')
def broken(self):
clear_flag(self.expand_name('{endpoint_name}.joined'))
clear_flag(self.expand_name('{endpoint_name}.available'))
def set_export_name(self, export_name):
for relation in self.relations:
relation.to_publish_raw['export_name'] = export_name
def mounts(self):
"""
Returns a list of available mounts and their associated data.
The return value is a list of dicts of the following form::
[
{
'mount_name': name_of_mount,
'mounts': [
{
'hostname': hostname,
'mountpoint': mountpoint,
'fstype': mounttype,
'options': options
},
# ...
],
},
# ...
]
"""
mounts = {}
for relation in self.relations:
for unit in relation.joined_units:
mount_name = unit.received_raw.get(
'export_name', relation.application_name)
mount = mounts.setdefault(mount_name, {
'mount_name': mount_name,
'mounts': [],
})
data = unit.received_raw
mountpoint = data['mountpoint']
fstype = data['fstype']
options = data['options']
host = data['hostname'] or \
data['private-address']
if host and mountpoint and fstype and options:
mount['mounts'].append({
'hostname': host,
'mountpoint': mountpoint,
'fstype': fstype,
'options': options
})
return [m for m in mounts.values() if m['mounts']]