cinder: accommodate v1 cinder client in detach call
Call Cinder client's detach() with attachment_uuid only if the client is v2. Cinder client v2 supports passing volume_id and optionally attachment_id to its volume manager's detach() method, but v1 does not, only accepting volume_id. Change I3cdc4992 indiscriminately passes both volume_id and attachment_id to the Cinder client regardless of its version, prompting with v1: TypeError: detach() takes exactly 2 arguments (3 given) Change-Id: I2e8b5947521d659e930141b0b8e6a6353e9163bd Closes-Bug: 1561056
This commit is contained in:
parent
1feab84233
commit
a45f5dd702
@ -42,7 +42,8 @@ class FakeCinderClient(object):
|
|||||||
def __getattr__(self, item):
|
def __getattr__(self, item):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, version='2'):
|
||||||
|
self.version = version
|
||||||
self.volumes = self.Volumes()
|
self.volumes = self.Volumes()
|
||||||
self.volume_snapshots = self.volumes
|
self.volume_snapshots = self.volumes
|
||||||
|
|
||||||
@ -290,6 +291,18 @@ class CinderApiTestCase(test.NoDBTestCase):
|
|||||||
|
|
||||||
self.api.detach(self.ctx, 'id1', instance_uuid='fake_uuid')
|
self.api.detach(self.ctx, 'id1', instance_uuid='fake_uuid')
|
||||||
|
|
||||||
|
def test_detach_v1(self):
|
||||||
|
self.cinderclient = FakeCinderClient('1')
|
||||||
|
|
||||||
|
cinder.cinderclient(self.ctx).AndReturn(self.cinderclient)
|
||||||
|
self.mox.StubOutWithMock(self.cinderclient.volumes,
|
||||||
|
'detach',
|
||||||
|
use_mock_anything=True)
|
||||||
|
self.cinderclient.volumes.detach('id1')
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
self.api.detach(self.ctx, 'id1', instance_uuid='fake_uuid')
|
||||||
|
|
||||||
@mock.patch('nova.volume.cinder.cinderclient')
|
@mock.patch('nova.volume.cinder.cinderclient')
|
||||||
def test_initialize_connection(self, mock_cinderclient):
|
def test_initialize_connection(self, mock_cinderclient):
|
||||||
connection_info = {'foo': 'bar'}
|
connection_info = {'foo': 'bar'}
|
||||||
|
@ -378,6 +378,11 @@ class API(object):
|
|||||||
@translate_volume_exception
|
@translate_volume_exception
|
||||||
def detach(self, context, volume_id, instance_uuid=None,
|
def detach(self, context, volume_id, instance_uuid=None,
|
||||||
attachment_id=None):
|
attachment_id=None):
|
||||||
|
client = cinderclient(context)
|
||||||
|
if client.version == '1':
|
||||||
|
client.volumes.detach(volume_id)
|
||||||
|
return
|
||||||
|
|
||||||
if attachment_id is None:
|
if attachment_id is None:
|
||||||
volume = self.get(context, volume_id)
|
volume = self.get(context, volume_id)
|
||||||
if volume['multiattach']:
|
if volume['multiattach']:
|
||||||
@ -403,7 +408,7 @@ class API(object):
|
|||||||
"cannot perform the detach."),
|
"cannot perform the detach."),
|
||||||
{'volume_id': volume_id})
|
{'volume_id': volume_id})
|
||||||
|
|
||||||
cinderclient(context).volumes.detach(volume_id, attachment_id)
|
client.volumes.detach(volume_id, attachment_id)
|
||||||
|
|
||||||
@translate_volume_exception
|
@translate_volume_exception
|
||||||
def initialize_connection(self, context, volume_id, connector):
|
def initialize_connection(self, context, volume_id, connector):
|
||||||
|
Loading…
Reference in New Issue
Block a user