diff --git a/.zuul.yaml b/.zuul.yaml index 48b08c7..fd20909 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -1,6 +1,4 @@ - project: - # NOTE(lourot): templates are defined in - # https://opendev.org/openstack/openstack-zuul-jobs templates: - - openstack-python3-ussuri-jobs + - openstack-python3-charm-jobs - openstack-cover-jobs diff --git a/src/config.yaml b/src/config.yaml index 62abd51..9d73c81 100644 --- a/src/config.yaml +++ b/src/config.yaml @@ -38,7 +38,3 @@ options: type: string description: | 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. diff --git a/src/lib/charm/openstack/neutron_arista.py b/src/lib/charm/openstack/neutron_arista.py index 8edb84a..520242b 100644 --- a/src/lib/charm/openstack/neutron_arista.py +++ b/src/lib/charm/openstack/neutron_arista.py @@ -1,26 +1,16 @@ #!/usr/bin/env python -from collections import OrderedDict from charmhelpers.core.hookenv import ( config, log ) import charms_openstack.charm -from charmhelpers.contrib.openstack import ( - context, - templating, -) from charmhelpers.fetch import ( apt_install, apt_update, filter_installed_packages, 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): @@ -41,33 +31,3 @@ class NeutronAristaCharm(charms_openstack.charm.OpenStackCharm): add_source(config('source')) apt_update(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 diff --git a/src/reactive/neutron_arista_handlers.py b/src/reactive/neutron_arista_handlers.py index e838db5..c4f1faa 100644 --- a/src/reactive/neutron_arista_handlers.py +++ b/src/reactive/neutron_arista_handlers.py @@ -16,17 +16,13 @@ import charms.reactive as reactive from charmhelpers.core.hookenv import ( config, -) - -from charmhelpers.core.host import ( - service_restart, + log, ) from charms_openstack.charm import ( provide_charm_instance, use_defaults, ) -import charm.openstack.neutron_arista as arista # noqa use_defaults('update-status') @@ -40,33 +36,45 @@ def install_arista(): 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', 'config.changed.eapi-username', 'config.changed.eapi-password', + 'config.changed.region-name', 'config.changed.api-type', - 'config.changed.region-name') -def restart_service(): - service_restart('neutron-server') + 'neutron-plugin-api-subordinate.connected') +def configure_principle(): + 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, + }, + }, + } + ) diff --git a/src/templates/ml2_conf_arista.ini b/src/templates/ml2_conf_arista.ini deleted file mode 100644 index 0f3b856..0000000 --- a/src/templates/ml2_conf_arista.ini +++ /dev/null @@ -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 }} diff --git a/src/tests/bundles/bionic-queens.yaml b/src/tests/bundles/bionic-queens.yaml index 515b47a..cfd46d8 100644 --- a/src/tests/bundles/bionic-queens.yaml +++ b/src/tests/bundles/bionic-queens.yaml @@ -15,11 +15,9 @@ applications: num_units: 1 neutron-api: - # Temporary fork until we refactor neutron-api-plugin-arista: - charm: cs:~aurelien-lourot/neutron-api-arista-test-fixture + charm: cs:~openstack-charmers-next/neutron-api num_units: 1 options: - enable-arista: True enable-ml2-dns: False flat-network-providers: default vlan-ranges: default:1000:3000 @@ -35,7 +33,7 @@ applications: ipv4-ptr-zone-prefix-size: reverse-dns-lookup: False dns-domain: - manage-neutron-plugin-legacy-mode: True + manage-neutron-plugin-legacy-mode: False neutron-openvswitch: charm: cs:~openstack-charmers-next/neutron-openvswitch @@ -63,7 +61,6 @@ applications: eapi-username: admin eapi-password: password123 api-type: EAPI - service-plugins: router nova-compute: charm: cs:~openstack-charmers-next/nova-compute diff --git a/src/tests/bundles/bionic-rocky.yaml b/src/tests/bundles/bionic-rocky.yaml index fdb9534..d82441a 100644 --- a/src/tests/bundles/bionic-rocky.yaml +++ b/src/tests/bundles/bionic-rocky.yaml @@ -19,12 +19,10 @@ applications: num_units: 1 neutron-api: - # Temporary fork until we refactor neutron-api-plugin-arista: - charm: cs:~aurelien-lourot/neutron-api-arista-test-fixture + charm: cs:~openstack-charmers-next/neutron-api num_units: 1 options: openstack-origin: cloud:bionic-rocky - enable-arista: True enable-ml2-dns: False flat-network-providers: default vlan-ranges: default:1000:3000 @@ -40,7 +38,7 @@ applications: ipv4-ptr-zone-prefix-size: reverse-dns-lookup: False dns-domain: - manage-neutron-plugin-legacy-mode: True + manage-neutron-plugin-legacy-mode: False neutron-openvswitch: charm: cs:~openstack-charmers-next/neutron-openvswitch @@ -69,7 +67,6 @@ applications: eapi-username: admin eapi-password: password123 api-type: EAPI - service-plugins: router nova-compute: charm: cs:~openstack-charmers-next/nova-compute diff --git a/src/tests/bundles/xenial-queens.yaml b/src/tests/bundles/xenial-queens.yaml index d69194f..d4bab82 100644 --- a/src/tests/bundles/xenial-queens.yaml +++ b/src/tests/bundles/xenial-queens.yaml @@ -19,12 +19,10 @@ applications: num_units: 1 neutron-api: - # Temporary fork until we refactor neutron-api-plugin-arista: - charm: cs:~aurelien-lourot/neutron-api-arista-test-fixture + charm: cs:~openstack-charmers-next/neutron-api num_units: 1 options: openstack-origin: cloud:xenial-queens - enable-arista: True enable-ml2-dns: False flat-network-providers: default vlan-ranges: default:1000:3000 @@ -40,7 +38,7 @@ applications: ipv4-ptr-zone-prefix-size: reverse-dns-lookup: False dns-domain: - manage-neutron-plugin-legacy-mode: True + manage-neutron-plugin-legacy-mode: False neutron-openvswitch: charm: cs:~openstack-charmers-next/neutron-openvswitch @@ -69,7 +67,6 @@ applications: eapi-username: admin eapi-password: password123 api-type: EAPI - service-plugins: router nova-compute: charm: cs:~openstack-charmers-next/nova-compute diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml index 2761205..97d8924 100644 --- a/src/tests/tests.yaml +++ b/src/tests/tests.yaml @@ -5,8 +5,7 @@ gate_bundles: - xenial-queens - bionic-queens -# NOTE(lourot): on bionic-rocky our special neutron-api fork for Arista fails -# to start with: +# NOTE(lourot): on bionic-rocky neutron-server fails to start with: # neutron.plugins.ml2.managers The following mechanism drivers were not found: set(['hyperv']) # Disabling for now. To be investigated. #- bionic-rocky diff --git a/unit_tests/test_neutron_arista_handlers.py b/unit_tests/test_neutron_arista_handlers.py index 6e0f3bc..232beb1 100644 --- a/unit_tests/test_neutron_arista_handlers.py +++ b/unit_tests/test_neutron_arista_handlers.py @@ -26,17 +26,40 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks): 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): - 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() - handlers.configure_principle(principal_charm) - the_charm.write_config.assert_called_once_with() + mocked_reactive.endpoint_from_flag.return_value = principal_charm + 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'), + ], + }, + }, + }, + } + )