Add optional OpenStack metadata support

This commit is contained in:
Frode Nordahl
2019-10-07 13:34:04 +02:00
parent 52522348af
commit f7932f08f1
10 changed files with 569 additions and 49 deletions

View File

@@ -3,28 +3,13 @@ import subprocess
import charmhelpers.core as ch_core
import charms_openstack.adapters
import charms_openstack.charm
OVS_ETCDIR = '/etc/openvswitch'
@charms_openstack.adapters.config_property
def cluster_local_addr(cls):
"""Address the ``ovsdb-server`` processes should be bound to.
:param cls: charms_openstack.adapters.ConfigurationAdapter derived class
instance. Charm class instance is at cls.charm_instance.
:type: cls: charms_openstack.adapters.ConfiguartionAdapter
:returns: IP address selected for cluster communication on local unit.
:rtype: str
"""
# XXX this should probably be made space aware
# for addr in cls.charm_instance.get_local_addresses():
# return addr
return ch_core.hookenv.unit_get('private-address')
@charms_openstack.adapters.config_property
def ovn_key(cls):
return os.path.join(OVS_ETCDIR, 'key_host')
@@ -41,16 +26,67 @@ def ovn_ca_cert(cls):
'{}.crt'.format(cls.charm_instance.name))
class OVNControllerCharm(charms_openstack.charm.OpenStackCharm):
class NeutronPluginRelationAdapter(
charms_openstack.adapters.OpenStackRelationAdapter):
@property
def metadata_shared_secret(self):
return self.relation.get_or_create_shared_secret()
class OVNChassisCharmRelationAdapters(
charms_openstack.adapters.OpenStackRelationAdapters):
relation_adapters = {
'nova_compute': NeutronPluginRelationAdapter,
}
class OVNChassisCharm(charms_openstack.charm.OpenStackCharm):
release = 'stein'
name = 'ovn-controller'
name = 'ovn-chassis'
packages = ['ovn-host']
services = ['ovn-host']
adapters_class = OVNChassisCharmRelationAdapters
required_relations = ['certificates', 'ovsdb']
restart_map = {
'/etc/default/ovn-host': 'ovn-host',
'/etc/default/ovn-host': ['ovn-host'],
}
python_version = 3
# Name of unitdata key with information on whether to enable metadata
metadata_kv_key = 'ovn-chassis-enable-metadata'
def __init__(self, **kwargs):
enable_metadata = ch_core.unitdata.kv().get(
self.metadata_kv_key, False)
print(enable_metadata)
if enable_metadata:
# XXX for Train onwards, we should use the
# ``networking-ovn-metadata-agent`` package
metadata_agent = 'networking-ovn-metadata-agent'
self.packages.extend(['python3-networking-ovn', 'haproxy'])
self.services.append(metadata_agent)
self.restart_map.update({
'/etc/neutron/'
'networking_ovn_metadata_agent.ini': [metadata_agent],
'/etc/init.d/''networking-ovn-metadata-agent': [
metadata_agent],
'/lib/systemd/system/networking-ovn-metadata-agent.service': (
[metadata_agent]),
})
self.permission_override_map = {
'/etc/init.d/networking-ovn-metadata-agent': 0o755,
}
super().__init__(**kwargs)
def disable_metadata(self):
db = ch_core.unitdata.kv()
db.unset(self.metadata_kv_key)
db.flush()
def enable_metadata(self):
db = ch_core.unitdata.kv()
db.set(self.metadata_kv_key, True)
db.flush()
def run(self, *args):
cp = subprocess.run(
@@ -61,7 +97,7 @@ class OVNControllerCharm(charms_openstack.charm.OpenStackCharm):
def configure_tls(self, certificates_interface=None):
"""Override default handler prepare certs per OVNs taste."""
# The default handler in ``OpenStackCharm`` class does the CA only
tls_objects = super().configure_tls(
tls_objects = self.get_certs_and_keys(
certificates_interface=certificates_interface)
for tls_object in tls_objects:
@@ -92,5 +128,5 @@ class OVNControllerCharm(charms_openstack.charm.OpenStackCharm):
'external-ids:ovn-encap-type=geneve')
self.run('ovs-vsctl', 'set', 'open', '.',
'external-ids:ovn-encap-ip={}'
.format(cluster_local_addr(None)))
.format(ovsdb_interface.cluster_local_addr))
self.restart_all()