Permalink
Browse files

Don't create block device mappings in the API cell

Otherwise 2 block_device_mapping entries will be created
in the API cell:
- the first one (created by the API cell) will have close to
  no information about the volume (device_name and volume_id are NULL)
- the second one (bubbled up from the compute cell) will contain
  all the volume information

The first entry confuses Nova when creating an image since
it won't be able to find the associated volume (NULL) in Cinder.

The compute cell should create it first and propagate it up
to the API cell.

Change-Id: I38edb953e73de6bc70a2e5950c68f457f83303e1
Closes-bug: #1417239
(cherry picked from commit 58633c4)
  • Loading branch information...
mgagne committed Feb 2, 2015
1 parent a229710 commit a7eb97f5e16b0108fb4a5555af82203b166859dd
Showing with 21 additions and 0 deletions.
  1. +7 −0 nova/compute/cells_api.py
  2. +14 −0 nova/tests/compute/test_compute_cells.py
@@ -210,6 +210,13 @@ def create(self, *args, **kwargs):
"""
return super(ComputeCellsAPI, self).create(*args, **kwargs)

def _update_block_device_mapping(self, *args, **kwargs):
"""Don't create block device mappings in the API cell.
The child cell will create it and propagate it up to the parent cell.
"""
pass

def update(self, context, instance, **kwargs):
"""Update an instance."""
cell_name = instance['cell_name']
@@ -20,6 +20,7 @@
import mock
from oslo.config import cfg

from nova import block_device
from nova.cells import manager
from nova.compute import api as compute_api
from nova.compute import cells_api as compute_cells_api
@@ -185,6 +186,19 @@ def test_get_migrations(self):

self.assertEqual(migrations, response)

def test_update_block_device_mapping(self):
instance_type = {'swap': 1, 'ephemeral_gb': 1}
instance = self._create_fake_instance_obj()
bdms = [block_device.BlockDeviceDict({'source_type': 'image',
'destination_type': 'local',
'image_id': 'fake-image',
'boot_index': 0})]
self.compute_api._update_block_device_mapping(
instance_type, instance.uuid, bdms)
bdms = db.block_device_mapping_get_all_by_instance(
self.context, instance['uuid'])
self.assertEqual(0, len(bdms))

@mock.patch('nova.cells.messaging._TargetedMessage')
def test_rebuild_sig(self, mock_msg):
# TODO(belliott) Cells could benefit from better testing to ensure API

0 comments on commit a7eb97f

Please sign in to comment.