def test_is_db_initisalised_true(self, mock_related_units, mock_relation_ids, mock_relation_get, mock_local_unit): shared_db_rel_id = 'shared-db:1' init_db_val = 'unit/1-{}-1234'.format(shared_db_rel_id) mock_relation_ids.return_value = [shared_db_rel_id] settings = {'0': {nutils.NEUTRON_DB_INIT_RKEY: init_db_val}, '1': {nutils.NEUTRON_DB_INIT_ECHO_RKEY: init_db_val}} def mock_rel_ids(name): if name == 'cluster': return 'cluster:1' elif name == 'shared-db': return 'shared-db:1' raise Exception("Uknown relation '{}'".format(name)) def mock_rel_get(unit=None, rid=None, attribute=None): if not unit: unit = '0' if attribute: return settings[unit].get(attribute) return settings[unit] mock_relation_ids.side_effect = mock_rel_ids mock_local_unit.return_value = '0' mock_relation_get.side_effect = mock_rel_get mock_related_units.return_value = ['1'] self.assertTrue(nutils.is_db_initialised())
def infoblox_changed(): # The neutron DB upgrade will add new tables to # neutron db related to infoblox service. # Please take a look to charm-infoblox docs. if 'infoblox-neutron' not in CONFIGS.complete_contexts(): log('infoblox-neutron relation incomplete. Peer not ready?') return CONFIGS.write(NEUTRON_CONF) if is_leader(): ready = False if is_db_initialised() and neutron_ready(): migrate_neutron_database(upgrade=True) ready = True for rid in relation_ids('infoblox-neutron'): relation_set(relation_id=rid, neutron_api_ready=ready)
def test_is_db_initisalised_false(self, mock_related_units, mock_relation_ids, mock_relation_get, mock_local_unit): shared_db_rel_id = 'shared-db:1' mock_relation_ids.return_value = [shared_db_rel_id] settings = {'0': {}, '1': {}} def mock_rel_get(unit=None, rid=None, attribute=None): if not unit: unit = '0' if attribute: return settings[unit].get(attribute) return settings[unit] mock_local_unit.return_value = '0' mock_relation_get.side_effect = mock_rel_get mock_related_units.return_value = ['1'] mock_relation_ids.return_value = ['cluster:1'] self.assertFalse(nutils.is_db_initialised())
def neutron_plugin_api_subordinate_relation_joined(relid=None): relation_data = {} if is_db_initialised(): db_migration_key = 'migrate-database-nonce' if not relid: relid = relation_id() leader_key = '{}-{}'.format(db_migration_key, relid) for unit in related_units(relid): nonce = relation_get(db_migration_key, rid=relid, unit=unit) if nonce: if is_leader() and leader_get(leader_key) != nonce: migrate_neutron_database(upgrade=True) # track nonce in leader storage to avoid superfluous # migrations leader_set({leader_key: nonce}) # set nonce back on relation to signal completion to other end # we do this regardless of leadership status so that # subordinates connected to non-leader units can proceed. relation_data[db_migration_key] = nonce 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_all()