Ensure cell0 updated on db/amqp change
Prior to this change, cell1 was updated when there was a database or rabbitmq-server relation change, but cell0 wasn't. Ensure that cell0 is also updated. Change-Id: I670d0295ea339b21166ef7b18509b04a5beaa959 Closes-Bug: #1892904
This commit is contained in:
parent
dde75693c7
commit
7983d1aaa9
|
@ -868,27 +868,47 @@ def get_cell_details():
|
||||||
|
|
||||||
|
|
||||||
def update_cell_database():
|
def update_cell_database():
|
||||||
'''Update the cell1 database properties
|
'''Update the cell0 and cell1 database_connection/transport_url properties
|
||||||
|
|
||||||
This should be called whenever a database or rabbitmq-server relation is
|
This should be called whenever a database or rabbitmq-server relation is
|
||||||
changed to update the transport_url in the nova_api cell_mappings table.
|
changed to update the transport_url in the nova_api cell_mappings table.
|
||||||
|
The cell0 transport_url is always none:///.
|
||||||
|
The cell1 transport_url and database_connection are generated from the
|
||||||
|
config file's [DEFAULT]/transport_url and [database]/connection.
|
||||||
'''
|
'''
|
||||||
hookenv.log('Updating cell1 properties', level=hookenv.INFO)
|
cells = ['cell0', 'cell1']
|
||||||
cell1_uuid = get_cell_uuid('cell1')
|
for cell in cells:
|
||||||
cmd = ['nova-manage', 'cell_v2', 'update_cell', '--cell_uuid', cell1_uuid]
|
hookenv.log('Updating {} properties'.format(cell), level=hookenv.INFO)
|
||||||
|
existing_cells = get_cell_details()
|
||||||
|
if not existing_cells.get(cell):
|
||||||
|
hookenv.log(
|
||||||
|
'Cell {} does not exist.'.format(cell), level=hookenv.DEBUG)
|
||||||
|
break
|
||||||
|
cell_uuid = existing_cells[cell]['uuid']
|
||||||
|
cmd = ['nova-manage', 'cell_v2', 'update_cell', '--cell_uuid',
|
||||||
|
cell_uuid]
|
||||||
|
if cell == 'cell0':
|
||||||
|
db_ctxt = ch_context.SharedDBContext(database='nova_cell0',
|
||||||
|
relation_prefix='novacell0',
|
||||||
|
ssl_dir=NOVA_CONF_DIR)()
|
||||||
|
if not db_ctxt:
|
||||||
|
hookenv.log(
|
||||||
|
'Defering updating cell {}, cell db relation not ready.'
|
||||||
|
.format(cell), level=hookenv.DEBUG)
|
||||||
|
break
|
||||||
|
sql_connection = get_sql_uri(db_ctxt)
|
||||||
|
cmd.extend([
|
||||||
|
'--transport-url', existing_cells[cell]['amqp'],
|
||||||
|
'--database_connection', sql_connection])
|
||||||
try:
|
try:
|
||||||
subprocess.check_output(cmd)
|
subprocess.check_output(cmd)
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
if e.returncode == 1:
|
hookenv.log('{} update_cell failed\n{}'.format(cell, e.output),
|
||||||
hookenv.log('Cell1 update_cell failed\n{}'.format(e.output),
|
|
||||||
level=hookenv.ERROR)
|
level=hookenv.ERROR)
|
||||||
raise
|
raise
|
||||||
elif e.returncode == 2:
|
|
||||||
hookenv.log(
|
|
||||||
'Cell1 update_cell failure ignored - the properties cannot '
|
|
||||||
'be set.', level=hookenv.INFO)
|
|
||||||
else:
|
else:
|
||||||
hookenv.log('cell1 was successfully updated', level=hookenv.INFO)
|
hookenv.log('{} was successfully updated'.format(cell),
|
||||||
|
level=hookenv.INFO)
|
||||||
|
|
||||||
|
|
||||||
def map_instances():
|
def map_instances():
|
||||||
|
@ -1968,7 +1988,7 @@ def get_sql_uri(db_ctxt):
|
||||||
|
|
||||||
|
|
||||||
def update_child_cell(name, db_service, amqp_service, skip_acl_check=True):
|
def update_child_cell(name, db_service, amqp_service, skip_acl_check=True):
|
||||||
"""Register cell.
|
"""Register or update cell.
|
||||||
|
|
||||||
Registering a cell requires:
|
Registering a cell requires:
|
||||||
1) Complete relation with api db service.
|
1) Complete relation with api db service.
|
||||||
|
|
|
@ -1759,3 +1759,31 @@ class NovaCCUtilsTests(CharmTestCase):
|
||||||
exists.return_value = True
|
exists.return_value = True
|
||||||
utils.disable_deprecated_nova_placement_apache_site()
|
utils.disable_deprecated_nova_placement_apache_site()
|
||||||
self.assertTrue(remove.called)
|
self.assertTrue(remove.called)
|
||||||
|
|
||||||
|
@patch.object(utils.ch_context, 'SharedDBContext')
|
||||||
|
@patch.object(utils, 'get_cell_details')
|
||||||
|
@patch.object(utils, 'get_sql_uri')
|
||||||
|
@patch.object(utils.subprocess, 'check_output')
|
||||||
|
def test_update_cell_database(self,
|
||||||
|
mock_check_output,
|
||||||
|
mock_get_sql_uri,
|
||||||
|
mock_get_cell_details,
|
||||||
|
mock_SharedDBContext):
|
||||||
|
mock_get_cell_details.return_value = {
|
||||||
|
'cell0': {'uuid': 'cell0uuid',
|
||||||
|
'amqp': 'none:///'},
|
||||||
|
'cell1': {'uuid': 'cell1uuid'},
|
||||||
|
}
|
||||||
|
mock_get_sql_uri.return_value = 'db-uri'
|
||||||
|
utils.update_cell_database()
|
||||||
|
mock_SharedDBContext.assert_called_once_with(
|
||||||
|
database='nova_cell0',
|
||||||
|
relation_prefix='novacell0',
|
||||||
|
ssl_dir='/etc/nova')
|
||||||
|
mock_check_output.assert_has_calls([
|
||||||
|
call(['nova-manage', 'cell_v2', 'update_cell',
|
||||||
|
'--cell_uuid', 'cell0uuid', '--transport-url', 'none:///',
|
||||||
|
'--database_connection', 'db-uri']),
|
||||||
|
call(['nova-manage', 'cell_v2', 'update_cell',
|
||||||
|
'--cell_uuid', 'cell1uuid']),
|
||||||
|
])
|
||||||
|
|
Loading…
Reference in New Issue