Share values of interest from charm state with plugin

Remove separate relation-changed hook.

Change-Id: I9eb5f8a6039b74288a395a584f844507448cdc23
Closes-Bug: #1845212
This commit is contained in:
Frode Nordahl 2019-09-25 12:33:50 +02:00
parent 40b3977d16
commit 831729dc98
No known key found for this signature in database
GPG Key ID: 6A5D59A3BA48373F
4 changed files with 74 additions and 20 deletions

View File

@ -750,6 +750,19 @@ class NeutronApiSDNContext(context.SubordinateConfigContext):
return None
return ctxt.get(templ_key) == self.defaults[interface_key]['value']
def is_allowed(self, templ_key):
"""Check whether specified key is allowed on the relation.
:param templ_key: Key to lookup
:type templ_key: str
:returns: True or False
:rtype: bool
"""
for interface_key in self.defaults:
if self.defaults[interface_key]['templ_key'] == templ_key:
return True
return False
def __call__(self):
ctxt = super(NeutronApiSDNContext, self).__call__()
for rid in relation_ids('neutron-plugin-api-subordinate'):

View File

@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import os
import sys
import uuid
@ -65,44 +66,46 @@ from charmhelpers.contrib.openstack.utils import (
)
from neutron_api_utils import (
additional_install_locations,
ADMIN_POLICY,
API_PASTE_INI,
CLUSTER_RES,
NEUTRON_CONF,
additional_install_locations,
api_port,
assess_status,
CLUSTER_RES,
check_local_db_actions_complete,
determine_packages,
determine_ports,
do_openstack_upgrade,
dvr_router_present,
force_etcd_restart,
is_api_ready,
is_db_initialised,
l3ha_router_present,
manage_plugin,
migrate_neutron_database,
NEUTRON_CONF,
neutron_ready,
pause_unit_helper,
register_configs,
remove_old_packages,
restart_map,
resume_unit_helper,
services,
setup_ipv6,
check_local_db_actions_complete,
pause_unit_helper,
resume_unit_helper,
remove_old_packages,
is_db_initialised,
)
from neutron_api_context import (
EtcdContext,
IdentityServiceContext,
NeutronApiSDNContext,
NeutronCCContext,
get_dns_domain,
get_dvr,
get_l3ha,
get_l2population,
get_l3ha,
get_overlay_network_type,
IdentityServiceContext,
is_qos_requested_and_valid,
is_vlan_trunking_requested_and_valid,
is_nfg_logging_enabled,
is_nsg_logging_enabled,
EtcdContext,
is_qos_requested_and_valid,
is_vlan_trunking_requested_and_valid,
)
from charmhelpers.contrib.hahelpers.cluster import (
@ -320,6 +323,8 @@ def config_changed():
identity_joined(rid=r_id)
for r_id in relation_ids('ha'):
ha_joined(relation_id=r_id)
for r_id in relation_ids('neutron-plugin-api-subordinate'):
neutron_plugin_api_subordinate_relation_joined(relid=r_id)
[cluster_joined(rid) for rid in relation_ids('cluster')]
@ -608,17 +613,20 @@ def neutron_plugin_api_subordinate_relation_joined(relid=None):
relation_data = {'neutron-api-ready': 'no'}
if is_api_ready(CONFIGS):
relation_data['neutron-api-ready'] = "yes"
if not manage_plugin():
neutron_cc_ctxt = NeutronCCContext()()
plugin_instance = NeutronApiSDNContext()
neutron_config_data = {
k: v for k, v in neutron_cc_ctxt.items()
if plugin_instance.is_allowed(k)}
if neutron_config_data:
relation_data['neutron_config_data'] = json.dumps(
neutron_config_data)
relation_set(relation_id=relid, **relation_data)
# there is no race condition with the neutron service restart
# as juju propagates the changes done in relation_set only after
# the hook exists
CONFIGS.write(API_PASTE_INI)
@hooks.hook('neutron-plugin-api-subordinate-relation-changed')
@restart_on_change(restart_map(), stopstart=True)
def neutron_plugin_api_relation_changed():
CONFIGS.write_all()

View File

@ -1196,6 +1196,11 @@ class NeutronApiSDNContextTest(CharmTestCase):
{'sections': {}},
)
def test_is_allowed(self):
napisdn_instance = context.NeutronApiSDNContext()
self.assertTrue(napisdn_instance.is_allowed('core_plugin'))
self.assertFalse(napisdn_instance.is_allowed('non_existent_key'))
class NeutronApiSDNConfigFileContextTest(CharmTestCase):

View File

@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import sys
from mock import MagicMock, patch, call
@ -198,6 +199,8 @@ class NeutronAPIHooksTests(CharmTestCase):
_id_rel_joined = self.patch('identity_joined')
_id_cluster_joined = self.patch('cluster_joined')
_id_ha_joined = self.patch('ha_joined')
_n_plugin_api_sub_rel_joined = self.patch(
'neutron_plugin_api_subordinate_relation_joined')
self._call_hook('config-changed')
self.assertTrue(_n_api_rel_joined.called)
self.assertTrue(_n_plugin_api_rel_joined.called)
@ -208,6 +211,7 @@ class NeutronAPIHooksTests(CharmTestCase):
self.assertTrue(self.CONFIGS.write_all.called)
self.assertTrue(self.do_openstack_upgrade.called)
self.assertTrue(self.apt_install.called)
_n_plugin_api_sub_rel_joined.assert_called()
def test_config_changed_nodvr_disprouters(self):
self.neutron_ready.return_value = True
@ -934,3 +938,27 @@ class NeutronAPIHooksTests(CharmTestCase):
def test_infoblox_peer_departed(self):
self._call_hook('infoblox-neutron-relation-departed')
self.assertTrue(self.CONFIGS.write.called_with(NEUTRON_CONF))
@patch.object(hooks, 'NeutronApiSDNContext')
@patch.object(hooks, 'NeutronCCContext')
@patch.object(hooks, 'manage_plugin')
def test_neutron_plugin_api_subordinate_relation(
self, _manage_plugin, _NeutronCCContext, _NeutronApiSDNContext):
_manage_plugin.return_value = True
self._call_hook('neutron-plugin-api-subordinate-relation-joined')
self.relation_set.assert_called_once_with(
**{'neutron-api-ready': 'no'}, relation_id=None)
self.CONFIGS.write_all.assert_called_once_with()
self.relation_set.reset_mock()
_manage_plugin.return_value = False
ncc_instance = _NeutronCCContext.return_value
ncc_instance.return_value = {'core_plugin': 'aPlugin'}
napisdn_instance = _NeutronApiSDNContext.return_value
napisdn_instance.is_allowed.return_value = True
self._call_hook('neutron-plugin-api-subordinate-relation-changed')
hooks.neutron_plugin_api_subordinate_relation_joined()
self.relation_set.assert_called_with(
**{'neutron-api-ready': 'no',
'neutron_config_data': json.dumps({'core_plugin': 'aPlugin'})},
relation_id=None)
self.CONFIGS.write_all.assert_called_with()