Make it a proper neutron-api plugin
This removes the need for a special neutron-api fork. Validated that the content of /etc/neutron/ remained equivalent after this change. Func-Test-PR: https://github.com/openstack-charmers/zaza-openstack-tests/pull/371 Change-Id: If17aeca06ef71310b1b918a1fa9a555a636b03f8
This commit is contained in:
parent
a8368987f9
commit
9fa03e8a64
|
@ -1,6 +1,4 @@
|
||||||
- project:
|
- project:
|
||||||
# NOTE(lourot): templates are defined in
|
|
||||||
# https://opendev.org/openstack/openstack-zuul-jobs
|
|
||||||
templates:
|
templates:
|
||||||
- openstack-python3-ussuri-jobs
|
- openstack-python3-charm-jobs
|
||||||
- openstack-cover-jobs
|
- openstack-cover-jobs
|
||||||
|
|
|
@ -38,7 +38,3 @@ options:
|
||||||
type: string
|
type: string
|
||||||
description: |
|
description: |
|
||||||
Name of the OpenStack region.
|
Name of the OpenStack region.
|
||||||
service-plugins:
|
|
||||||
default: router,firewall,metering,neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2
|
|
||||||
type: string
|
|
||||||
description: Override of Neutron-API service plugins setting.
|
|
||||||
|
|
|
@ -1,26 +1,16 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
from collections import OrderedDict
|
|
||||||
from charmhelpers.core.hookenv import (
|
from charmhelpers.core.hookenv import (
|
||||||
config,
|
config,
|
||||||
log
|
log
|
||||||
)
|
)
|
||||||
import charms_openstack.charm
|
import charms_openstack.charm
|
||||||
|
|
||||||
from charmhelpers.contrib.openstack import (
|
|
||||||
context,
|
|
||||||
templating,
|
|
||||||
)
|
|
||||||
from charmhelpers.fetch import (
|
from charmhelpers.fetch import (
|
||||||
apt_install,
|
apt_install,
|
||||||
apt_update,
|
apt_update,
|
||||||
filter_installed_packages,
|
filter_installed_packages,
|
||||||
add_source,
|
add_source,
|
||||||
)
|
)
|
||||||
from charmhelpers.contrib.openstack.utils import os_release
|
|
||||||
|
|
||||||
|
|
||||||
ML2_CONFIG = '/etc/neutron/plugins/ml2/ml2_conf_arista.ini'
|
|
||||||
TEMPLATES = 'templates/'
|
|
||||||
|
|
||||||
|
|
||||||
class NeutronAristaCharm(charms_openstack.charm.OpenStackCharm):
|
class NeutronAristaCharm(charms_openstack.charm.OpenStackCharm):
|
||||||
|
@ -41,33 +31,3 @@ class NeutronAristaCharm(charms_openstack.charm.OpenStackCharm):
|
||||||
add_source(config('source'))
|
add_source(config('source'))
|
||||||
apt_update(fatal=True)
|
apt_update(fatal=True)
|
||||||
apt_install(self.packages[0], fatal=True)
|
apt_install(self.packages[0], fatal=True)
|
||||||
|
|
||||||
def write_config(self):
|
|
||||||
configs = self.register_configs()
|
|
||||||
configs.write_all()
|
|
||||||
|
|
||||||
def register_configs(release=None):
|
|
||||||
resources = OrderedDict([
|
|
||||||
(ML2_CONFIG, {
|
|
||||||
'services': ['neutron-server'],
|
|
||||||
'contexts': [AristaMl2Context(), ]
|
|
||||||
}),
|
|
||||||
])
|
|
||||||
release = os_release('neutron-common')
|
|
||||||
configs = templating.OSConfigRenderer(templates_dir=TEMPLATES,
|
|
||||||
openstack_release=release)
|
|
||||||
for cfg, rscs in resources.items():
|
|
||||||
configs.register(cfg, rscs['contexts'])
|
|
||||||
return configs
|
|
||||||
|
|
||||||
|
|
||||||
class AristaMl2Context(context.OSContextGenerator):
|
|
||||||
|
|
||||||
def __call__(self):
|
|
||||||
ctxt = {'eapi_host': config('eapi-host'),
|
|
||||||
'eapi_username': config('eapi-username'),
|
|
||||||
'eapi_password': config('eapi-password'),
|
|
||||||
'region_name': config('region-name'),
|
|
||||||
'api_type': config('api-type'),
|
|
||||||
'arista_version': config('arista-version')}
|
|
||||||
return ctxt
|
|
||||||
|
|
|
@ -16,17 +16,13 @@ import charms.reactive as reactive
|
||||||
|
|
||||||
from charmhelpers.core.hookenv import (
|
from charmhelpers.core.hookenv import (
|
||||||
config,
|
config,
|
||||||
)
|
log,
|
||||||
|
|
||||||
from charmhelpers.core.host import (
|
|
||||||
service_restart,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from charms_openstack.charm import (
|
from charms_openstack.charm import (
|
||||||
provide_charm_instance,
|
provide_charm_instance,
|
||||||
use_defaults,
|
use_defaults,
|
||||||
)
|
)
|
||||||
import charm.openstack.neutron_arista as arista # noqa
|
|
||||||
|
|
||||||
|
|
||||||
use_defaults('update-status')
|
use_defaults('update-status')
|
||||||
|
@ -40,33 +36,45 @@ def install_arista():
|
||||||
reactive.set_state('arista-package.installed')
|
reactive.set_state('arista-package.installed')
|
||||||
|
|
||||||
|
|
||||||
@reactive.when('neutron-plugin-api-subordinate.connected')
|
|
||||||
def configure_principle(api_principle):
|
|
||||||
inject_config = {
|
|
||||||
'neutron-api': {
|
|
||||||
'/etc/neutron/neutron.conf': {
|
|
||||||
'sections': {
|
|
||||||
'DEFAULT': [
|
|
||||||
],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
with provide_charm_instance() as charm_class:
|
|
||||||
charm_class.write_config()
|
|
||||||
api_principle.configure_plugin(
|
|
||||||
neutron_plugin='arista',
|
|
||||||
core_plugin='neutron.plugins.ml2.plugin.Ml2Plugin',
|
|
||||||
neutron_plugin_config='/etc/neutron/plugins/ml2/ml2_conf.ini \
|
|
||||||
--config-file=/etc/neutron/plugins/ml2/ml2_conf_arista.ini',
|
|
||||||
service_plugins=config('service-plugins'),
|
|
||||||
subordinate_configuration=inject_config)
|
|
||||||
|
|
||||||
|
|
||||||
@reactive.when_any('config.changed.eapi-host',
|
@reactive.when_any('config.changed.eapi-host',
|
||||||
'config.changed.eapi-username',
|
'config.changed.eapi-username',
|
||||||
'config.changed.eapi-password',
|
'config.changed.eapi-password',
|
||||||
|
'config.changed.region-name',
|
||||||
'config.changed.api-type',
|
'config.changed.api-type',
|
||||||
'config.changed.region-name')
|
'neutron-plugin-api-subordinate.connected')
|
||||||
def restart_service():
|
def configure_principle():
|
||||||
service_restart('neutron-server')
|
try:
|
||||||
|
api_principle = reactive.endpoint_from_flag(
|
||||||
|
'neutron-plugin-api-subordinate.connected')
|
||||||
|
|
||||||
|
mechanism_drivers = ','.join((
|
||||||
|
api_principle.neutron_config_data.get('mechanism_drivers', ''),
|
||||||
|
'arista'))
|
||||||
|
except AttributeError:
|
||||||
|
log("The principle charm isn't ready yet. "
|
||||||
|
"Postponing its configuration...")
|
||||||
|
return
|
||||||
|
|
||||||
|
log('Configuring the principle charm...')
|
||||||
|
|
||||||
|
sections = {
|
||||||
|
'ml2_arista': [
|
||||||
|
('eapi_host', config('eapi-host')),
|
||||||
|
('eapi_username', config('eapi-username')),
|
||||||
|
('eapi_password', config('eapi-password')),
|
||||||
|
('region_name', config('region-name')),
|
||||||
|
('api_type', config('api-type')),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
api_principle.configure_plugin(
|
||||||
|
neutron_plugin='arista',
|
||||||
|
mechanism_drivers=mechanism_drivers,
|
||||||
|
subordinate_configuration={
|
||||||
|
'neutron-api': {
|
||||||
|
'/etc/neutron/plugins/ml2/ml2_conf.ini': {
|
||||||
|
'sections': sections,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
###############################################################################
|
|
||||||
# [ WARNING ]
|
|
||||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
[ml2_arista]
|
|
||||||
eapi_host = {{ eapi_host }}
|
|
||||||
eapi_username = {{ eapi_username }}
|
|
||||||
eapi_password = {{ eapi_password }}
|
|
||||||
region_name = {{ region_name }}
|
|
||||||
api_type = {{ api_type }}
|
|
|
@ -15,11 +15,9 @@ applications:
|
||||||
num_units: 1
|
num_units: 1
|
||||||
|
|
||||||
neutron-api:
|
neutron-api:
|
||||||
# Temporary fork until we refactor neutron-api-plugin-arista:
|
charm: cs:~openstack-charmers-next/neutron-api
|
||||||
charm: cs:~aurelien-lourot/neutron-api-arista-test-fixture
|
|
||||||
num_units: 1
|
num_units: 1
|
||||||
options:
|
options:
|
||||||
enable-arista: True
|
|
||||||
enable-ml2-dns: False
|
enable-ml2-dns: False
|
||||||
flat-network-providers: default
|
flat-network-providers: default
|
||||||
vlan-ranges: default:1000:3000
|
vlan-ranges: default:1000:3000
|
||||||
|
@ -35,7 +33,7 @@ applications:
|
||||||
ipv4-ptr-zone-prefix-size:
|
ipv4-ptr-zone-prefix-size:
|
||||||
reverse-dns-lookup: False
|
reverse-dns-lookup: False
|
||||||
dns-domain:
|
dns-domain:
|
||||||
manage-neutron-plugin-legacy-mode: True
|
manage-neutron-plugin-legacy-mode: False
|
||||||
|
|
||||||
neutron-openvswitch:
|
neutron-openvswitch:
|
||||||
charm: cs:~openstack-charmers-next/neutron-openvswitch
|
charm: cs:~openstack-charmers-next/neutron-openvswitch
|
||||||
|
@ -63,7 +61,6 @@ applications:
|
||||||
eapi-username: admin
|
eapi-username: admin
|
||||||
eapi-password: password123
|
eapi-password: password123
|
||||||
api-type: EAPI
|
api-type: EAPI
|
||||||
service-plugins: router
|
|
||||||
|
|
||||||
nova-compute:
|
nova-compute:
|
||||||
charm: cs:~openstack-charmers-next/nova-compute
|
charm: cs:~openstack-charmers-next/nova-compute
|
||||||
|
|
|
@ -19,12 +19,10 @@ applications:
|
||||||
num_units: 1
|
num_units: 1
|
||||||
|
|
||||||
neutron-api:
|
neutron-api:
|
||||||
# Temporary fork until we refactor neutron-api-plugin-arista:
|
charm: cs:~openstack-charmers-next/neutron-api
|
||||||
charm: cs:~aurelien-lourot/neutron-api-arista-test-fixture
|
|
||||||
num_units: 1
|
num_units: 1
|
||||||
options:
|
options:
|
||||||
openstack-origin: cloud:bionic-rocky
|
openstack-origin: cloud:bionic-rocky
|
||||||
enable-arista: True
|
|
||||||
enable-ml2-dns: False
|
enable-ml2-dns: False
|
||||||
flat-network-providers: default
|
flat-network-providers: default
|
||||||
vlan-ranges: default:1000:3000
|
vlan-ranges: default:1000:3000
|
||||||
|
@ -40,7 +38,7 @@ applications:
|
||||||
ipv4-ptr-zone-prefix-size:
|
ipv4-ptr-zone-prefix-size:
|
||||||
reverse-dns-lookup: False
|
reverse-dns-lookup: False
|
||||||
dns-domain:
|
dns-domain:
|
||||||
manage-neutron-plugin-legacy-mode: True
|
manage-neutron-plugin-legacy-mode: False
|
||||||
|
|
||||||
neutron-openvswitch:
|
neutron-openvswitch:
|
||||||
charm: cs:~openstack-charmers-next/neutron-openvswitch
|
charm: cs:~openstack-charmers-next/neutron-openvswitch
|
||||||
|
@ -69,7 +67,6 @@ applications:
|
||||||
eapi-username: admin
|
eapi-username: admin
|
||||||
eapi-password: password123
|
eapi-password: password123
|
||||||
api-type: EAPI
|
api-type: EAPI
|
||||||
service-plugins: router
|
|
||||||
|
|
||||||
nova-compute:
|
nova-compute:
|
||||||
charm: cs:~openstack-charmers-next/nova-compute
|
charm: cs:~openstack-charmers-next/nova-compute
|
||||||
|
|
|
@ -19,12 +19,10 @@ applications:
|
||||||
num_units: 1
|
num_units: 1
|
||||||
|
|
||||||
neutron-api:
|
neutron-api:
|
||||||
# Temporary fork until we refactor neutron-api-plugin-arista:
|
charm: cs:~openstack-charmers-next/neutron-api
|
||||||
charm: cs:~aurelien-lourot/neutron-api-arista-test-fixture
|
|
||||||
num_units: 1
|
num_units: 1
|
||||||
options:
|
options:
|
||||||
openstack-origin: cloud:xenial-queens
|
openstack-origin: cloud:xenial-queens
|
||||||
enable-arista: True
|
|
||||||
enable-ml2-dns: False
|
enable-ml2-dns: False
|
||||||
flat-network-providers: default
|
flat-network-providers: default
|
||||||
vlan-ranges: default:1000:3000
|
vlan-ranges: default:1000:3000
|
||||||
|
@ -40,7 +38,7 @@ applications:
|
||||||
ipv4-ptr-zone-prefix-size:
|
ipv4-ptr-zone-prefix-size:
|
||||||
reverse-dns-lookup: False
|
reverse-dns-lookup: False
|
||||||
dns-domain:
|
dns-domain:
|
||||||
manage-neutron-plugin-legacy-mode: True
|
manage-neutron-plugin-legacy-mode: False
|
||||||
|
|
||||||
neutron-openvswitch:
|
neutron-openvswitch:
|
||||||
charm: cs:~openstack-charmers-next/neutron-openvswitch
|
charm: cs:~openstack-charmers-next/neutron-openvswitch
|
||||||
|
@ -69,7 +67,6 @@ applications:
|
||||||
eapi-username: admin
|
eapi-username: admin
|
||||||
eapi-password: password123
|
eapi-password: password123
|
||||||
api-type: EAPI
|
api-type: EAPI
|
||||||
service-plugins: router
|
|
||||||
|
|
||||||
nova-compute:
|
nova-compute:
|
||||||
charm: cs:~openstack-charmers-next/nova-compute
|
charm: cs:~openstack-charmers-next/nova-compute
|
||||||
|
|
|
@ -5,8 +5,7 @@ gate_bundles:
|
||||||
- xenial-queens
|
- xenial-queens
|
||||||
- bionic-queens
|
- bionic-queens
|
||||||
|
|
||||||
# NOTE(lourot): on bionic-rocky our special neutron-api fork for Arista fails
|
# NOTE(lourot): on bionic-rocky neutron-server fails to start with:
|
||||||
# to start with:
|
|
||||||
# neutron.plugins.ml2.managers The following mechanism drivers were not found: set(['hyperv'])
|
# neutron.plugins.ml2.managers The following mechanism drivers were not found: set(['hyperv'])
|
||||||
# Disabling for now. To be investigated.
|
# Disabling for now. To be investigated.
|
||||||
#- bionic-rocky
|
#- bionic-rocky
|
||||||
|
|
|
@ -26,17 +26,40 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks):
|
||||||
|
|
||||||
class TestHandlers(test_utils.PatchHelper):
|
class TestHandlers(test_utils.PatchHelper):
|
||||||
|
|
||||||
def _patch_provide_charm_instance(self):
|
|
||||||
the_charm = mock.MagicMock()
|
|
||||||
self.patch_object(handlers, 'provide_charm_instance',
|
|
||||||
name='provide_charm_instance',
|
|
||||||
new=mock.MagicMock())
|
|
||||||
self.provide_charm_instance().__enter__.return_value = the_charm
|
|
||||||
self.provide_charm_instance().__exit__.return_value = None
|
|
||||||
return the_charm
|
|
||||||
|
|
||||||
def test_configure_principal(self):
|
def test_configure_principal(self):
|
||||||
the_charm = self._patch_provide_charm_instance()
|
mocked_reactive = mock.MagicMock()
|
||||||
|
self.patch_object(handlers, 'reactive',
|
||||||
|
name='reactive',
|
||||||
|
new=mocked_reactive)
|
||||||
principal_charm = mock.MagicMock()
|
principal_charm = mock.MagicMock()
|
||||||
handlers.configure_principle(principal_charm)
|
mocked_reactive.endpoint_from_flag.return_value = principal_charm
|
||||||
the_charm.write_config.assert_called_once_with()
|
principal_charm.neutron_config_data = {
|
||||||
|
'mechanism_drivers': 'driver1,driver2'
|
||||||
|
}
|
||||||
|
|
||||||
|
mocked_config = mock.MagicMock()
|
||||||
|
self.patch_object(handlers, 'config',
|
||||||
|
name='config',
|
||||||
|
new=mocked_config)
|
||||||
|
mocked_config.return_value = 'my_config_value'
|
||||||
|
|
||||||
|
handlers.configure_principle()
|
||||||
|
principal_charm.configure_plugin.assert_called_once_with(
|
||||||
|
neutron_plugin='arista',
|
||||||
|
mechanism_drivers='driver1,driver2,arista',
|
||||||
|
subordinate_configuration={
|
||||||
|
'neutron-api': {
|
||||||
|
'/etc/neutron/plugins/ml2/ml2_conf.ini': {
|
||||||
|
'sections': {
|
||||||
|
'ml2_arista': [
|
||||||
|
('eapi_host', 'my_config_value'),
|
||||||
|
('eapi_username', 'my_config_value'),
|
||||||
|
('eapi_password', 'my_config_value'),
|
||||||
|
('region_name', 'my_config_value'),
|
||||||
|
('api_type', 'my_config_value'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue