Merge "Modify part of the code for the rebuilding process"

This commit is contained in:
Zuul 2018-03-20 09:42:28 +00:00 committed by Gerrit Code Review
commit 48716b428c
5 changed files with 56 additions and 59 deletions

View File

@ -681,50 +681,10 @@ class ContainersController(base.Controller):
LOG.debug('Calling compute.container_rebuild with %s',
container.uuid)
context = pecan.request.context
network_info = self._get_network_info(context, container)
vol_info = self._get_vol_info(context, container)
compute_api = pecan.request.compute_api
compute_api.container_rebuild(context, container,
network_info, vol_info)
compute_api.container_rebuild(context, container)
pecan.response.status = 202
def _get_vol_info(self, context, container):
volumes = objects.VolumeMapping.list_by_container(context,
container.uuid)
return volumes
def _get_network_info(self, context, container):
neutron_api = neutron.NeutronAPI(context)
network_info = []
for i in range(len(container.addresses)):
try:
network_id = container.addresses.keys()[i]
addr_info = container.addresses.values()[i][0]
port_id = addr_info.get('port')
neutron_api.get_neutron_port(port_id)
network = neutron_api.get_neutron_network(network_id)
except exception.PortNotFound:
LOG.exception("The port: %s used by the source container "
"does not exist, can not rebuild", port_id)
raise
except exception.NetworkNotFound:
LOG.exception("The network: %s used by the source container "
"does not exist, can not rebuild", network_id)
raise
except Exception as e:
LOG.exception("Unexpected exception: %s", e)
raise
preserve_info = addr_info.get('preserve_on_delete')
network_info.append({'network': network_id,
'port': port_id,
'router:external':
network.get('router:external'),
'shared': network.get('shared'),
'v4-fixed-ip': '',
'v6-fixed-ip': '',
'preserve_on_delete': preserve_info})
return network_info
@pecan.expose('json')
@exception.wrap_pecan_controller_exception
def start(self, container_ident, **kwargs):

View File

@ -86,11 +86,10 @@ class API(object):
def container_show(self, context, container):
return self.rpcapi.container_show(context, container)
def container_rebuild(self, context, container, network_info, vol_info):
def container_rebuild(self, context, container):
self._record_action_start(context, container,
container_actions.REBUILD)
return self.rpcapi.container_rebuild(context, container,
network_info, vol_info)
return self.rpcapi.container_rebuild(context, container)
def container_reboot(self, context, container, *args):
self._record_action_start(context, container, container_actions.REBOOT)

View File

@ -35,6 +35,7 @@ import zun.conf
from zun.container import driver
from zun.image import driver as image_driver
from zun.image.glance import driver as glance
from zun.network import neutron
from zun import objects
CONF = zun.conf.CONF
@ -569,18 +570,18 @@ class Manager(periodic_task.PeriodicTasks):
container.status = container_status
container.save(context)
def container_rebuild(self, context, container, network_info, vol_info):
def container_rebuild(self, context, container):
@utils.synchronized(container.uuid)
def do_container_rebuild():
self._do_container_rebuild(context, container,
network_info, vol_info)
self._do_container_rebuild(context, container)
utils.spawn_n(do_container_rebuild)
def _do_container_rebuild(self, context, container,
network_info, vol_info):
def _do_container_rebuild(self, context, container):
LOG.info("start to rebuild container: %s", container.uuid)
ori_status = container.status
network_info = self._get_network_info(context, container)
vol_info = self._get_vol_info(context, container)
self._update_container_state(context, container, consts.REBUILDING)
if self.driver.check_container_exist(container):
for addr in container.addresses.values():
@ -614,6 +615,43 @@ class Manager(periodic_task.PeriodicTasks):
self._do_container_start(context, created_container)
return
def _get_vol_info(self, context, container):
volumes = objects.VolumeMapping.list_by_container(context,
container.uuid)
return volumes
def _get_network_info(self, context, container):
neutron_api = neutron.NeutronAPI(context)
network_info = []
for i in range(len(container.addresses)):
try:
network_id = container.addresses.keys()[i]
addr_info = container.addresses.values()[i][0]
port_id = addr_info.get('port')
neutron_api.get_neutron_port(port_id)
network = neutron_api.get_neutron_network(network_id)
except exception.PortNotFound:
LOG.exception("The port: %s used by the source container "
"does not exist, can not rebuild", port_id)
raise
except exception.NetworkNotFound:
LOG.exception("The network: %s used by the source container "
"does not exist, can not rebuild", network_id)
raise
except Exception as e:
LOG.exception("Unexpected exception: %s", e)
raise
preserve_info = addr_info.get('preserve_on_delete')
network_info.append({'network': network_id,
'port': port_id,
'router:external':
network.get('router:external'),
'shared': network.get('shared'),
'v4-fixed-ip': '',
'v6-fixed-ip': '',
'preserve_on_delete': preserve_info})
return network_info
def container_start(self, context, container):
@utils.synchronized(container.uuid)
def do_container_start():

View File

@ -75,9 +75,8 @@ class API(rpc_service.API):
return self._call(container.host, 'container_show',
container=container)
def container_rebuild(self, context, container, network_info, vol_info):
self._cast(container.host, 'container_rebuild', container=container,
network_info=network_info, vol_info=vol_info)
def container_rebuild(self, context, container):
self._cast(container.host, 'container_rebuild', container=container)
def container_reboot(self, context, container, timeout):
self._cast(container.host, 'container_reboot', container=container,

View File

@ -699,26 +699,27 @@ class TestManager(base.TestCase):
self.compute_manager.container_show,
self.context, container)
@mock.patch('zun.compute.manager.Manager._get_vol_info')
@mock.patch('zun.compute.manager.Manager._get_network_info')
@mock.patch('zun.image.driver.pull_image')
@mock.patch.object(fake_driver, 'check_container_exist')
@mock.patch.object(Container, 'save')
@mock.patch.object(fake_driver, 'create')
@mock.patch.object(fake_driver, 'delete')
def test_container_rebuild(self, mock_delete, mock_create,
mock_save, mock_check, mock_pull):
mock_save, mock_check, mock_pull,
mock_get_network_info, mock_get_vol_info):
container = Container(self.context, **utils.get_test_container())
image = {'image': 'repo', 'path': 'out_path', 'driver': 'glance'}
mock_pull.return_value = image, False
networks = []
volumes = []
container.status = 'Created'
mock_get_network_info.return_value = []
mock_get_vol_info.return_value = []
mock_check.return_value = True
self.compute_manager._do_container_rebuild(self.context, container,
networks, volumes)
self.compute_manager._do_container_rebuild(self.context, container)
mock_save.assert_called_with(self.context)
self.assertTrue(mock_create.called)
mock_delete.assert_called_once_with(self.context, container, True)
mock_create.assert_called_once_with(self.context, container, image,
networks, volumes)
@mock.patch.object(ContainerActionEvent, 'event_start')
@mock.patch.object(ContainerActionEvent, 'event_finish')