Merge "Add attaching state for Volumes"
This commit is contained in:
commit
dd851ff62b
1
Authors
1
Authors
|
@ -106,6 +106,7 @@ Kevin L. Mitchell <kevin.mitchell@rackspace.com>
|
|||
Kiall Mac Innes <kiall@managedit.ie>
|
||||
Kirill Shileev <kshileev@gmail.com>
|
||||
Koji Iida <iida.koji@lab.ntt.co.jp>
|
||||
Liam Kelleher <liam.kelleher@hp.com>
|
||||
Likitha Shetty <likitha.shetty@citrix.com>
|
||||
Loganathan Parthipan <parthipan@hp.com>
|
||||
Lorin Hochstein <lorin@isi.edu>
|
||||
|
|
|
@ -1515,6 +1515,7 @@ class API(base.Base):
|
|||
raise exception.InvalidDevicePath(path=device)
|
||||
volume = self.volume_api.get(context, volume_id)
|
||||
self.volume_api.check_attach(context, volume)
|
||||
self.volume_api.reserve_volume(context, volume)
|
||||
params = {"volume_id": volume_id,
|
||||
"mountpoint": device}
|
||||
_cast_compute_message(self.db, 'attach_volume', context, instance,
|
||||
|
|
|
@ -1659,12 +1659,21 @@ class ComputeManager(manager.SchedulerDependentManager):
|
|||
context = context.elevated()
|
||||
instance_ref = self.db.instance_get_by_uuid(context, instance_uuid)
|
||||
instance_id = instance_ref['id']
|
||||
msg = _("instance %(instance_uuid)s: attaching volume %(volume_id)s"
|
||||
" to %(mountpoint)s")
|
||||
LOG.audit(_('Attaching volume %(volume_id)s to %(mountpoint)s'),
|
||||
locals(), context=context, instance=instance_ref)
|
||||
connector = self.driver.get_volume_connector(instance_ref)
|
||||
connection_info = self.volume_api.initialize_connection(context,
|
||||
volume,
|
||||
connector)
|
||||
try:
|
||||
connector = self.driver.get_volume_connector(instance_ref)
|
||||
connection_info = self.volume_api.initialize_connection(context,
|
||||
volume,
|
||||
connector)
|
||||
except Exception: # pylint: disable=W0702
|
||||
with utils.save_and_reraise_exception():
|
||||
msg = _("instance %(instance_uuid)s: attach failed"
|
||||
" %(mountpoint)s, removing")
|
||||
LOG.exception(msg % locals(), context=context)
|
||||
self.volume_api.unreserve_volume(context, volume)
|
||||
try:
|
||||
self.driver.attach_volume(connection_info,
|
||||
instance_ref['name'],
|
||||
|
|
|
@ -127,6 +127,8 @@
|
|||
|
||||
"volume:attach": [],
|
||||
"volume:detach": [],
|
||||
"volume:reserve_volume": [],
|
||||
"volume:unreserve_volume": [],
|
||||
"volume:check_attach": [],
|
||||
"volume:check_detach": [],
|
||||
"volume:initialize_connection": [],
|
||||
|
|
|
@ -3149,12 +3149,16 @@ class ComputeAPITestCase(BaseTestCase):
|
|||
def fake_check_attach(*args, **kwargs):
|
||||
pass
|
||||
|
||||
def fake_reserve_volume(*args, **kwargs):
|
||||
pass
|
||||
|
||||
def fake_volume_get(self, context, volume_id):
|
||||
return {'id': volume_id}
|
||||
|
||||
self.stubs.Set(nova.volume.api.API, 'get', fake_volume_get)
|
||||
self.stubs.Set(nova.volume.api.API, 'check_attach', fake_check_attach)
|
||||
|
||||
self.stubs.Set(nova.volume.api.API, 'reserve_volume',
|
||||
fake_reserve_volume)
|
||||
instance = self._create_fake_instance()
|
||||
self.compute_api.attach_volume(self.context, instance, 1, '/dev/vdb')
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ import datetime
|
|||
import functools
|
||||
import hashlib
|
||||
import inspect
|
||||
import itertools
|
||||
import json
|
||||
import lockfile
|
||||
import os
|
||||
|
@ -709,6 +710,11 @@ def to_primitive(value, convert_instances=False, level=0):
|
|||
if test(value):
|
||||
return unicode(value)
|
||||
|
||||
# value of itertools.count doesn't get caught by inspects
|
||||
# above and results in infinite loop when list(value) is called.
|
||||
if type(value) == itertools.count:
|
||||
return unicode(value)
|
||||
|
||||
# FIXME(vish): Workaround for LP bug 852095. Without this workaround,
|
||||
# tests that raise an exception in a mocked method that
|
||||
# has a @wrap_exception with a notifier will fail. If
|
||||
|
|
|
@ -228,6 +228,15 @@ class API(base.Base):
|
|||
"args": {'instance_id': instance_id,
|
||||
'volume_id': volume['id']}})
|
||||
|
||||
@wrap_check_policy
|
||||
def reserve_volume(self, context, volume):
|
||||
self.update(context, volume, {"status": "attaching"})
|
||||
|
||||
@wrap_check_policy
|
||||
def unreserve_volume(self, context, volume):
|
||||
if volume['status'] == "attaching":
|
||||
self.update(context, volume, {"status": "available"})
|
||||
|
||||
@wrap_check_policy
|
||||
def attach(self, context, volume, instance_id, mountpoint):
|
||||
host = volume['host']
|
||||
|
@ -257,6 +266,7 @@ class API(base.Base):
|
|||
|
||||
@wrap_check_policy
|
||||
def terminate_connection(self, context, volume, connector):
|
||||
self.unreserve_volume(context, volume)
|
||||
host = volume['host']
|
||||
queue = self.db.queue_get_for(context, FLAGS.volume_topic, host)
|
||||
return rpc.call(context, queue,
|
||||
|
|
Loading…
Reference in New Issue