Merge "Modify part of the code for the rebuilding process"
This commit is contained in:
commit
48716b428c
@ -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):
|
||||
|
@ -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)
|
||||
|
@ -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():
|
||||
|
@ -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,
|
||||
|
@ -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')
|
||||
|
Loading…
x
Reference in New Issue
Block a user