summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/db/sqlalchemy/api.py46
-rw-r--r--nova/db/sqlalchemy/models.py1
-rw-r--r--nova/tests/compute_unittest.py2
-rw-r--r--nova/tests/volume_unittest.py15
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):