diff options
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 46 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/models.py | 1 | ||||
| -rw-r--r-- | nova/tests/compute_unittest.py | 2 | ||||
| -rw-r--r-- | nova/tests/volume_unittest.py | 15 |
4 files changed, 42 insertions, 22 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index fd62abb5d..9d8297a8e 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -157,7 +157,8 @@ def fixed_ip_allocate(_context, network_id): if not fixed_ip_ref: raise db.NoMoreAddresses() if not fixed_ip_ref.network: - fixed_ip_ref.network = models.Network.find(network_id) + fixed_ip_ref.network = models.Network.find(network_id, + session=session) fixed_ip_ref['allocated'] = True session.add(fixed_ip_ref) return fixed_ip_ref['address'] @@ -300,8 +301,10 @@ def instance_state(context, instance_id, state, description=None): from nova.compute import power_state if not description: description = power_state.name(state) - db.instance_update(context, {'state': state, - 'state_description': description}) + db.instance_update(context, + instance_id, + {'state': state, + 'state_description': description}) def instance_update(context, instance_id, values): @@ -518,12 +521,15 @@ def volume_allocate_shelf_and_blade(_context, volume_id): def volume_attached(context, volume_id, instance_id, mountpoint): - volume_ref = volume_get(context, volume_id) - volume_ref.instance_id = instance_id - volume_ref['status'] = 'in-use' - volume_ref['mountpoint'] = mountpoint - volume_ref['attach_status'] = 'attached' - volume_ref.save() + session = get_session() + with session.begin(): + volume_ref = models.Volume.find(volume_id, session=session) + volume_ref['status'] = 'in-use' + volume_ref['mountpoint'] = mountpoint + volume_ref['attach_status'] = 'attached' + volume_ref.instance = models.Instance.find(instance_id, + session=session) + volume_ref.save(session=session) def volume_create(_context, values): @@ -546,12 +552,14 @@ def volume_destroy(_context, volume_id): def volume_detached(context, volume_id): - volume_ref = volume_get(context, volume_id) - volume_ref['instance_id'] = None - volume_ref['mountpoint'] = None - volume_ref['status'] = 'available' - volume_ref['attach_status'] = 'detached' - volume_ref.save() + session = get_session() + with session.begin(): + volume_ref = models.Volume.find(volume_id, session=session) + volume_ref['status'] = 'available' + volume_ref['mountpoint'] = None + volume_ref['attach_status'] = 'detached' + volume_ref.instance = None + volume_ref.save(session=session) def volume_get(_context, volume_id): @@ -580,9 +588,9 @@ def volume_get_host(context, volume_id): def volume_get_instance(context, volume_id): - volume_ref = db.volume_get(context, volume_id) - instance_ref = db.instance_get(context, volume_ref['instance_id']) - return instance_ref + session = get_session() + with session.begin(): + return models.Volume.find(volume_id, session=session).instance def volume_get_shelf_and_blade(_context, volume_id): @@ -598,7 +606,7 @@ def volume_get_shelf_and_blade(_context, volume_id): def volume_update(context, volume_id, values): session = get_session() with session.begin(): - volume_ref = models.Volumes.find(volume_id, session=session) + volume_ref = models.Volume.find(volume_id, session=session) for (key, value) in values.iteritems(): volume_ref[key] = value volume_ref.save(session=session) diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 0d796ffa7..fe3a77a52 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -255,6 +255,7 @@ class Volume(BASE, NovaBase): size = Column(Integer) availability_zone = Column(String(255)) # TODO(vish): foreign key? instance_id = Column(Integer, ForeignKey('instances.id'), nullable=True) + instance = relationship(Instance, backref=backref('volumes')) mountpoint = Column(String(255)) attach_time = Column(String(255)) # TODO(vish): datetime status = Column(String(255)) # TODO(vish): enum? diff --git a/nova/tests/compute_unittest.py b/nova/tests/compute_unittest.py index 07a2fceb1..746c035d6 100644 --- a/nova/tests/compute_unittest.py +++ b/nova/tests/compute_unittest.py @@ -60,7 +60,7 @@ class ComputeTestCase(test.TrialTestCase): inst['instance_type'] = 'm1.tiny' inst['mac_address'] = utils.generate_mac() inst['ami_launch_index'] = 0 - return db.instance_create(None, inst) + return db.instance_create(self.context, inst) @defer.inlineCallbacks def test_run_terminate(self): diff --git a/nova/tests/volume_unittest.py b/nova/tests/volume_unittest.py index 99b228701..9e35d2a1c 100644 --- a/nova/tests/volume_unittest.py +++ b/nova/tests/volume_unittest.py @@ -99,7 +99,16 @@ class VolumeTestCase(test.TrialTestCase): @defer.inlineCallbacks def test_run_attach_detach_volume(self): """Make sure volume can be attached and detached from instance""" - instance_id = "storage-test" + inst = {} + inst['image_id'] = 'ami-test' + inst['reservation_id'] = 'r-fakeres' + inst['launch_time'] = '10' + inst['user_id'] = 'fake' + inst['project_id'] = 'fake' + inst['instance_type'] = 'm1.tiny' + inst['mac_address'] = utils.generate_mac() + inst['ami_launch_index'] = 0 + instance_id = db.instance_create(self.context, inst) mountpoint = "/dev/sdf" volume_id = self._create_volume() yield self.volume.create_volume(self.context, volume_id) @@ -112,8 +121,9 @@ class VolumeTestCase(test.TrialTestCase): vol = db.volume_get(None, volume_id) self.assertEqual(vol['status'], "in-use") self.assertEqual(vol['attach_status'], "attached") - self.assertEqual(vol['instance_id'], instance_id) self.assertEqual(vol['mountpoint'], mountpoint) + instance_ref = db.volume_get_instance(self.context, volume_id) + self.assertEqual(instance_ref['id'], instance_id) self.assertFailure(self.volume.delete_volume(self.context, volume_id), exception.Error) @@ -130,6 +140,7 @@ class VolumeTestCase(test.TrialTestCase): db.volume_get, None, volume_id) + db.instance_destroy(self.context, instance_id) @defer.inlineCallbacks def test_concurrent_volumes_get_different_blades(self): |
