Skip to content
This repository has been archived by the owner on Sep 26, 2019. It is now read-only.

Commit

Permalink
compute: convert manager to use nova.objects.ImageMeta
Browse files Browse the repository at this point in the history
All nova drivers had to be fixed to support this change:
I75465a2029b53aa4d338b80619ed7380e0d19e6a

Change-Id: I9690a3549313368fa65669b922d7df60f0ccb414
  • Loading branch information
dims committed Jan 24, 2016
1 parent 7a9e713 commit 28c4f1e
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 55 deletions.
82 changes: 41 additions & 41 deletions novadocker/tests/virt/docker/test_driver.py
Expand Up @@ -85,9 +85,9 @@ def _get_running_instance(self, obj=True):
network_info = utils.get_test_network_info()
network_info[0]['network']['subnets'][0]['meta']['dhcp_server'] = \
'1.1.1.1'
image_info = utils.get_test_image_info(None, instance_ref)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_ref)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
self.connection.spawn(self.ctxt, instance_ref, image_info,
[], 'herp', network_info=network_info)
return instance_ref, network_info
Expand Down Expand Up @@ -165,9 +165,9 @@ def test_create_container(self, image_info=None, instance_href=None,
if instance_href is None:
instance_href = utils.get_test_instance()
if image_info is None:
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
self.connection.spawn(self.context, instance_href, image_info,
'fake_files', 'fake_password',
network_info=network_info)
Expand All @@ -181,9 +181,9 @@ def test_create_container_empty_cmd(self, image_info=None,
if instance_href is None:
instance_href = utils.get_test_instance()
if image_info is None:
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
with mock.patch.object(self.mock_client, 'create_container') as mc:
self.connection.spawn(self.context, instance_href, image_info,
'fake_files', 'fake_password',
Expand All @@ -196,9 +196,9 @@ def test_create_container_inject_key(self, mock_inject_key):
self.fixture.config(inject_key=True, group='docker')
instance_href = utils.get_test_instance()
instance_href.key_data = 'my_key'
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
with mock.patch.object(self.mock_client, 'create_container'):
with mock.patch.object(self.mock_client, 'start') as ms:
self.connection.spawn(self.context, instance_href, image_info,
Expand All @@ -217,10 +217,10 @@ def test_create_container_glance_cmd(self, image_info=None,
if instance_href is None:
instance_href = utils.get_test_instance()
if image_info is None:
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info['properties'] = {'os_command_line': 'uname'}
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
image_info.properties.os_command_line = 'uname'
with mock.patch.object(self.mock_client, 'create_container') as mc:
self.connection.spawn(self.context, instance_href, image_info,
'fake_files', 'fake_password',
Expand All @@ -236,9 +236,9 @@ def test_create_container_vcpus_2(self, image_info=None):
})
instance_href = utils.get_test_instance(flavor=flavor)
if image_info is None:
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
self.connection.spawn(self.context, instance_href, image_info,
'fake_files', 'fake_password')
self._assert_cpu_shares(instance_href, vcpus=2)
Expand All @@ -261,9 +261,9 @@ def test_create_container_net_setup_fails(self, mock_plug_vifs):

def test_create_container_wrong_image(self):
instance_href = utils.get_test_instance()
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'invalid_format'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'invalid_format'
self.assertRaises(exception.InstanceDeployFailure,
self.test_create_container,
image_info, instance_href)
Expand Down Expand Up @@ -304,9 +304,9 @@ def test_cleanup_container_notfound(self, byuuid_mock, unplug_mock):

def test_soft_delete_restore_container(self):
instance_href = utils.get_test_instance()
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'

self.connection.spawn(self.context, instance_href, image_info,
'fake_files', 'fake_password')
Expand All @@ -333,9 +333,9 @@ def test_get_memory_limit_from_sys_meta_in_db_instance(self):

def test_list_instances(self):
instance_href = utils.get_test_instance()
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
self.connection.spawn(self.context, instance_href, image_info,
'fake_files', 'fake_password')

Expand All @@ -350,9 +350,9 @@ def test_list_instances_none(self):
def test_list_instances_no_inspect_race(self):
"""Assures containers that cannot be inspected are not listed."""
instance_href = utils.get_test_instance()
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
self.connection.spawn(self.context, instance_href, image_info,
'fake_files', 'fake_password')

Expand Down Expand Up @@ -423,14 +423,14 @@ def test_snapshot(self, byuuid_mock):

def test_get_image_name(self):
instance_ref = utils.get_test_instance()
image_info = utils.get_test_image_info(None, instance_ref)
image_info['container_format'] = 'docker'
image_info['name'] = 'MiXeDcAsE-image'
image_info = utils.get_test_image_object(None, instance_ref)
image_info.container_format = 'docker'
image_info.name = 'MiXeDcAsE-image'
repo = self.connection._get_image_name(self.context,
instance_ref, image_info)

# image_name = repo.split("/")[1]
self.assertEqual(image_info['name'], repo)
self.assertEqual(image_info.name, repo)

def test_get_host_uptime_returns_exec_result(self):
result = '4294967296'
Expand All @@ -449,9 +449,9 @@ def test_get_dns_entries(self):
def test_pull_missing_image_with_shared_dir(self, mock_os):
self.fixture.config(shared_directory='/fake_dir', group='docker')
instance_ref = utils.get_test_instance()
image_info = utils.get_test_image_info(None, instance_ref)
image_info['name'] = 'fake_name'
image_info['id'] = 'fake_id'
image_info = utils.get_test_image_object(None, instance_ref)
image_info.name = 'fake_name'
image_info.id = 'fake_id'
with mock.patch.object(self.mock_client, 'load_repository_file') as f:
with mock.patch.object(self.mock_client, 'inspect_image') as i:
i.return_value = 'fake_image'
Expand All @@ -464,9 +464,9 @@ def test_pull_missing_image_with_shared_dir(self, mock_os):

def test_find_container_by_uuid(self):
instance_href = utils.get_test_instance()
image_info = utils.get_test_image_info(None, instance_href)
image_info['disk_format'] = 'raw'
image_info['container_format'] = 'docker'
image_info = utils.get_test_image_object(None, instance_href)
image_info.disk_format = 'raw'
image_info.container_format = 'docker'
self.connection.spawn(self.context, instance_href, image_info,
'fake_files', 'fake_password')
info = self.connection._find_container_by_uuid(instance_href['uuid'])
Expand Down
28 changes: 14 additions & 14 deletions novadocker/virt/docker/driver.py
Expand Up @@ -368,27 +368,27 @@ def _get_memory_limit_bytes(self, instance):
'instance_type_memory_mb', 0)) * units.Mi

def _get_image_name(self, context, instance, image):
fmt = image['container_format']
fmt = image.container_format
if fmt != 'docker':
msg = _('Image container format not supported ({0})')
raise exception.InstanceDeployFailure(msg.format(fmt),
instance_id=instance['name'])
return image['name']
return image.name

def _pull_missing_image(self, context, image_meta, instance):
msg = 'Image name "%s" does not exist, fetching it...'
LOG.debug(msg, image_meta['name'])
LOG.debug(msg, image_meta.name)

shared_directory = CONF.docker.shared_directory
if (shared_directory and
os.path.exists(os.path.join(shared_directory,
image_meta['id']))):
image_meta.id))):
try:
self.docker.load_repository_file(
self._encode_utf8(image_meta['name']),
os.path.join(shared_directory, image_meta['id']))
self._encode_utf8(image_meta.name),
os.path.join(shared_directory, image_meta.id))
return self.docker.inspect_image(
self._encode_utf8(image_meta['name']))
self._encode_utf8(image_meta.name))
except Exception as e:
# If failed to load image from shared_directory, continue
# to download the image from glance then load.
Expand All @@ -404,20 +404,20 @@ def _pull_missing_image(self, context, image_meta, instance):
try:
out_path = os.path.join(tmpdir, uuid.uuid4().hex)

images.fetch(context, image_meta['id'], out_path,
images.fetch(context, image_meta.id, out_path,
instance['user_id'], instance['project_id'])
self.docker.load_repository_file(
self._encode_utf8(image_meta['name']),
self._encode_utf8(image_meta.name),
out_path
)
except Exception as e:
LOG.warning(_('Cannot load repository file: %s'),
e, instance=instance, exc_info=True)
msg = _('Cannot load repository file: {0}')
raise exception.NovaException(msg.format(e),
instance_id=image_meta['name'])
instance_id=image_meta.name)

return self.docker.inspect_image(self._encode_utf8(image_meta['name']))
return self.docker.inspect_image(self._encode_utf8(image_meta.name))

def _extract_dns_entries(self, network_info):
dns = []
Expand Down Expand Up @@ -479,9 +479,9 @@ def spawn(self, context, instance, image_meta, injected_files,
if not image:
image = self._pull_missing_image(context, image_meta, instance)
# Glance command-line overrides any set in the Docker image
if (image_meta and
image_meta.get('properties', {}).get('os_command_line')):
args['command'] = image_meta['properties'].get('os_command_line')
if (image_meta is not None and
image_meta.properties.get("os_command_line") is not None):
args['command'] = image_meta.properties.get("os_command_line")

if 'metadata' in instance:
args['environment'] = nova_utils.instance_meta(instance)
Expand Down

3 comments on commit 28c4f1e

@vastinnocentaims
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change breaks my setup when I spawn a docker image using Liberty, I am deploying another OpenStack cluster and pulled novadocker yesterday, any hints on a fix before I embark on debugging futher? My current traceback shows

2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [req-6add2291-39b2-4637-a6a5-825486a1003a 502254a16d404ffd9b3d9f3d9dd41a6a ef0beabfb28d4b1984096796945a2cc9 - - -] [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c] Instance failed to spawn
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c] Traceback (most recent call last):
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]   File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 2155, in _build_resources
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]     yield resources
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]   File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 2009, in _build_and_run_instance
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]     block_device_info=block_device_info)
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]   File "/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py", line 527, in spawn
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]     image = self._pull_missing_image(context, image_meta, instance)
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]   File "/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py", line 383, in _pull_missing_image
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]     LOG.debug(msg, image_meta.name)
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c] AttributeError: 'dict' object has no attribute 'name'
2016-02-23 18:10:11.975 4382 ERROR nova.compute.manager [instance: 95d544ae-93d6-4892-b6f8-7ec0d5a9a14c]

Running on CentOS 7, and did not have this issue a month ago.

Thanks

@ct16k
Copy link

@ct16k ct16k commented on 28c4f1e Mar 7, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This commit seems to break nova-docker for me as well. Whenever I try to spawn new containers I receive the following error:

Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [req-f86dda28-82b2-43aa-b7c0-16c30ad120b2 390b26c47f9245bea217d89b95d2d166 157cb009d1b3411b9282c55935f89799 - - -] [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] Instance failed to spawn
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] Traceback (most recent call last):
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 2461, in _build_resources
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] yield resources
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 2333, in _build_and_run_instance
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] block_device_info=block_device_info)
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] File "/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py", line 508, in spawn
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] image_name = self._get_image_name(context, instance, image_meta)
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] File "/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py", line 371, in _get_image_name
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] fmt = image.container_format
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf] AttributeError: 'dict' object has no attribute 'container_format'
Mar 7 16:46:16 compute2 nova-compute: 2016-03-07 16:46:16.444 8701 ERROR nova.compute.manager [instance: d99c4d2f-c5ae-4de3-9bfe-585f245d66bf]

System is CentOS 7.2 with OpenStack Kilo (2015.1.1, latest version available from RDO repository). Can you please tell me the min. version required for this commit to work or any other mitigation way, short of rolling back and staying on the previous commit? Thank you!

@vastinnocentaims
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And FWIW, after editing the dereferenced attributes back to dictionary getters (i.e. back to ['id'], ['name'], etc...) I got nova-docker to work again, so it seems that this diff is missing some pieces to make it complete.

Please sign in to comment.