NetApp: Add use-exact-size parameter when creating a LUN on ONTAP iSCSI

When a cinder volume is created the ontap backend fits the LUN to the
best geometry. It makes the image uploaded from a volume larger than
expected and a volume of larger size must be created from that image.
Using the use-exact-size parameter the backend does not fit to best
geometry, the image uploaded from that volume has the same size and a
volume of the same size may be created from that image.

Nevertheless this parameter is available only in Data ONTAP 9.1 (ontapi
version 1.110) and later.

Closes-Bug: #1731474
Change-Id: I0e21cbcb6effa1e72999580564099976511ca4a9
This commit is contained in:
Luiz Gavioli 2018-01-23 15:50:06 -02:00
parent aa58746ec2
commit 67391f1f0f
3 changed files with 36 additions and 4 deletions

View File

@ -46,6 +46,7 @@ class NetAppBaseClientTestCase(test.TestCase):
self.mock_object(client_base.Client, '_init_ssh_client')
self.client = client_base.Client(**CONNECTION_INFO)
self.client.connection = mock.MagicMock()
self.client.connection.get_api_version.return_value = (1, 100)
self.client.ssh_client = mock.MagicMock()
self.connection = self.client.connection
self.fake_volume = six.text_type(uuid.uuid4())
@ -86,7 +87,6 @@ class NetAppBaseClientTestCase(test.TestCase):
def test_create_lun(self):
expected_path = '/vol/%s/%s' % (self.fake_volume, self.fake_lun)
with mock.patch.object(netapp_api.NaElement,
'create_node_with_children',
) as mock_create_node:
@ -105,6 +105,28 @@ class NetAppBaseClientTestCase(test.TestCase):
self.connection.invoke_successfully.assert_called_once_with(
mock.ANY, True)
def test_create_lun_exact_size(self):
expected_path = '/vol/%s/%s' % (self.fake_volume, self.fake_lun)
self.connection.get_api_version.return_value = (1, 110)
with mock.patch.object(netapp_api.NaElement,
'create_node_with_children',
) as mock_create_node:
self.client.create_lun(self.fake_volume,
self.fake_lun,
self.fake_size,
self.fake_metadata)
mock_create_node.assert_called_once_with(
'lun-create-by-size',
**{'path': expected_path,
'size': self.fake_size,
'ostype': self.fake_metadata['OsType'],
'use-exact-size': 'true',
'space-reservation-enabled':
self.fake_metadata['SpaceReserved']})
self.connection.invoke_successfully.assert_called_once_with(
mock.ANY, True)
def test_create_lun_with_qos_policy_group_name(self):
expected_path = '/vol/%s/%s' % (self.fake_volume, self.fake_lun)
expected_qos_group_name = 'qos_1'

View File

@ -94,11 +94,15 @@ class Client(object):
"""Issues API request for creating LUN on volume."""
path = '/vol/%s/%s' % (volume_name, lun_name)
params = {'path': path, 'size': six.text_type(size),
'ostype': metadata['OsType'],
'space-reservation-enabled': metadata['SpaceReserved']}
version = self.get_ontapi_version()
if version >= (1, 110):
params['use-exact-size'] = 'true'
lun_create = netapp_api.NaElement.create_node_with_children(
'lun-create-by-size',
**{'path': path, 'size': six.text_type(size),
'ostype': metadata['OsType'],
'space-reservation-enabled': metadata['SpaceReserved']})
**params)
if qos_policy_group_name:
lun_create.add_new_child('qos-policy-group', qos_policy_group_name)

View File

@ -0,0 +1,6 @@
---
fixes:
- |
Fixed bug #1731474 on NetApp Data ONTAP driver that was causing LUNs to be created
with larger size than requested. This fix requires version 9.1 of ONTAP
or later.