diff --git a/zun/compute/manager.py b/zun/compute/manager.py index 1d7b7a8e0..a2f5615d0 100644 --- a/zun/compute/manager.py +++ b/zun/compute/manager.py @@ -90,25 +90,9 @@ class Manager(object): self._fail_container(self, context, container, msg) return - self._update_task_state(context, container, consts.SANDBOX_CREATING) - sandbox_image = CONF.sandbox_image - sandbox_image_driver = CONF.sandbox_image_driver - sandbox_image_pull_policy = CONF.sandbox_image_pull_policy - repo, tag = utils.parse_image_name(sandbox_image) - try: - image, image_loaded = image_driver.pull_image( - context, repo, tag, sandbox_image_pull_policy, - sandbox_image_driver) - if not image_loaded: - self.driver.load_image(image['path']) - sandbox_id = self.driver.create_sandbox( - context, container, image=sandbox_image, - requested_networks=requested_networks) - except Exception as e: - with excutils.save_and_reraise_exception(reraise=reraise): - LOG.exception("Unexpected exception: %s", - six.text_type(e)) - self._fail_container(context, container, six.text_type(e)) + sandbox_id = self._create_sandbox(context, container, + requested_networks, reraise) + if sandbox_id is None: return self._update_task_state(context, container, consts.IMAGE_PULLING) @@ -171,6 +155,29 @@ class Manager(object): unset_host=True) return + def _create_sandbox(self, context, container, requested_networks, + reraise=False): + self._update_task_state(context, container, consts.SANDBOX_CREATING) + sandbox_image = CONF.sandbox_image + sandbox_image_driver = CONF.sandbox_image_driver + sandbox_image_pull_policy = CONF.sandbox_image_pull_policy + repo, tag = utils.parse_image_name(sandbox_image) + try: + image, image_loaded = image_driver.pull_image( + context, repo, tag, sandbox_image_pull_policy, + sandbox_image_driver) + if not image_loaded: + self.driver.load_image(image['path']) + sandbox_id = self.driver.create_sandbox( + context, container, image=sandbox_image, + requested_networks=requested_networks) + return sandbox_id + except Exception as e: + with excutils.save_and_reraise_exception(reraise=reraise): + LOG.exception("Unexpected exception: %s", + six.text_type(e)) + self._fail_container(context, container, six.text_type(e)) + def _do_container_start(self, context, container, reraise=False): LOG.debug('Starting container: %s', container.uuid) self._update_task_state(context, container, consts.CONTAINER_STARTING) @@ -206,17 +213,7 @@ class Manager(object): LOG.exception("Unexpected exception: %s", six.text_type(e)) self._fail_container(context, container, six.text_type(e)) - sandbox_id = self.driver.get_sandbox_id(container) - if sandbox_id: - self._update_task_state(context, container, - consts.SANDBOX_DELETING) - try: - self.driver.delete_sandbox(context, container, sandbox_id) - except Exception as e: - with excutils.save_and_reraise_exception(reraise=reraise): - LOG.exception("Unexpected exception: %s", - six.text_type(e)) - self._fail_container(context, container, six.text_type(e)) + self._delete_sandbox(context, container, reraise) self._update_task_state(context, container, None) container.destroy(context) self._get_resource_tracker() @@ -226,6 +223,18 @@ class Manager(object): rt.remove_usage_from_container(context, container, True) return container + def _delete_sandbox(self, context, container, reraise=False): + sandbox_id = self.driver.get_sandbox_id(container) + if sandbox_id: + self._update_task_state(context, container, + consts.SANDBOX_DELETING) + try: + self.driver.delete_sandbox(context, container, sandbox_id) + except Exception as e: + with excutils.save_and_reraise_exception(reraise=reraise): + LOG.exception("Unexpected exception: %s", six.text_type(e)) + self._fail_container(context, container, six.text_type(e)) + def add_security_group(self, context, container, security_group): utils.spawn_n(self._add_security_group, context, container, security_group) diff --git a/zun/tests/unit/compute/test_compute_manager.py b/zun/tests/unit/compute/test_compute_manager.py index ab552dcc8..d78bb0185 100644 --- a/zun/tests/unit/compute/test_compute_manager.py +++ b/zun/tests/unit/compute/test_compute_manager.py @@ -158,7 +158,7 @@ class TestManager(base.TestCase): mock_pull.assert_any_call(self.context, container.image, 'latest', 'always', 'glance') mock_create.assert_called_once_with(self.context, container, - None, image) + 'fake_sandbox', image) mock_start.assert_called_once_with(self.context, container) @mock.patch.object(Container, 'save') @@ -236,8 +236,9 @@ class TestManager(base.TestCase): self.context, container, 'Docker Error occurred', unset_host=True) mock_pull.assert_any_call(self.context, container.image, 'latest', 'always', 'glance') - mock_create.assert_called_once_with(self.context, container, None, - {'name': 'nginx', 'path': None}) + mock_create.assert_called_once_with( + self.context, container, 'fake_sandbox', + {'name': 'nginx', 'path': None}) @mock.patch.object(compute_node_tracker.ComputeNodeTracker, 'remove_usage_from_container') diff --git a/zun/tests/unit/container/fake_driver.py b/zun/tests/unit/container/fake_driver.py index a88ef79a2..b225f652f 100644 --- a/zun/tests/unit/container/fake_driver.py +++ b/zun/tests/unit/container/fake_driver.py @@ -87,7 +87,7 @@ class FakeDriver(driver.ContainerDriver): pass def create_sandbox(self, context, name, **kwargs): - pass + return "fake_sandbox" def delete_sandbox(self, context, id): pass