Merge "NexentaStor drivers: resize volume if cloned image is larger"

This commit is contained in:
Jenkins 2016-04-05 20:05:20 +00:00 committed by Gerrit Code Review
commit 48dac64a8e
5 changed files with 93 additions and 8 deletions

View File

@ -1,5 +1,4 @@
#
# Copyright 2015 Nexenta Systems, Inc.
# Copyright 2016 Nexenta Systems, Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@ -18,6 +17,7 @@ Unit tests for OpenStack Cinder volume driver
"""
import mock
from mock import patch
from oslo_utils import units
from cinder import context
@ -34,6 +34,7 @@ from cinder.volume.drivers.nexenta import utils
class TestNexentaISCSIDriver(test.TestCase):
TEST_VOLUME_NAME = 'volume1'
TEST_VOLUME_NAME2 = 'volume2'
TEST_VOLUME_NAME3 = 'volume3'
TEST_SNAPSHOT_NAME = 'snapshot1'
TEST_VOLUME_REF = {
'name': TEST_VOLUME_NAME,
@ -47,9 +48,16 @@ class TestNexentaISCSIDriver(test.TestCase):
'id': '2',
'status': 'in-use'
}
TEST_VOLUME_REF3 = {
'name': TEST_VOLUME_NAME3,
'size': 3,
'id': '3',
'status': 'in-use'
}
TEST_SNAPSHOT_REF = {
'name': TEST_SNAPSHOT_NAME,
'volume_name': TEST_VOLUME_NAME,
'volume_size': 1,
}
def __init__(self, method):
@ -198,10 +206,13 @@ class TestNexentaISCSIDriver(test.TestCase):
'cinder/volume1', 'snapshot1', '')
def test_create_volume_from_snapshot(self):
self.drv.create_volume_from_snapshot(self.TEST_VOLUME_REF2,
self._create_volume_db_entry()
self.drv.create_volume_from_snapshot(self.TEST_VOLUME_REF3,
self.TEST_SNAPSHOT_REF)
self.nms_mock.zvol.clone.assert_called_with(
'cinder/volume1@snapshot1', 'cinder/volume2')
'cinder/volume1@snapshot1', 'cinder/volume3')
self.nms_mock.zvol.set_child_prop.assert_called_with(
'cinder/volume3', 'volsize', '3G')
def test_delete_snapshot(self):
self._create_volume_db_entry()
@ -298,6 +309,34 @@ class TestNexentaISCSIDriver(test.TestCase):
class TestNexentaNfsDriver(test.TestCase):
TEST_VOLUME_NAME = 'volume1'
TEST_VOLUME_NAME2 = 'volume2'
TEST_VOLUME_NAME3 = 'volume3'
TEST_SNAPSHOT_NAME = 'snapshot1'
TEST_VOLUME_REF = {
'name': TEST_VOLUME_NAME,
'size': 1,
'id': '1',
'status': 'available'
}
TEST_VOLUME_REF2 = {
'name': TEST_VOLUME_NAME2,
'size': 2,
'id': '2',
'status': 'in-use'
}
TEST_VOLUME_REF3 = {
'name': TEST_VOLUME_NAME2,
'id': '2',
'status': 'in-use'
}
TEST_SNAPSHOT_REF = {
'name': TEST_SNAPSHOT_NAME,
'volume_name': TEST_VOLUME_NAME,
'volume_size': 1,
'volume_id': 1
}
TEST_EXPORT1 = 'host1:/volumes/stack/share'
TEST_NMS1 = 'http://admin:nexenta@host1:2000'
@ -327,6 +366,7 @@ class TestNexentaNfsDriver(test.TestCase):
'status': 'available',
'provider_location': self.TEST_EXPORT1
}
self.drv.share2nms = {self.TEST_EXPORT1: self.nms_mock}
return db.volume_create(self.ctxt, vol)['id']
def setUp(self):
@ -445,6 +485,39 @@ class TestNexentaNfsDriver(test.TestCase):
self.nms_mock.appliance.execute.assert_called_with(
'dd if=/dev/zero of=/tmp/path bs=1M count=1024')
@patch('cinder.volume.drivers.remotefs.'
'RemoteFSDriver._ensure_shares_mounted')
@patch('cinder.volume.drivers.nexenta.nfs.'
'NexentaNfsDriver._get_volroot')
@patch('cinder.volume.drivers.nexenta.nfs.'
'NexentaNfsDriver._get_nfs_server_version')
def test_create_larger_volume_from_snap(self, version, volroot, ensure):
version.return_value = 4
volroot.return_value = 'volroot'
self._create_volume_db_entry()
self.drv.create_volume_from_snapshot(self.TEST_VOLUME_REF2,
self.TEST_SNAPSHOT_REF)
self.nms_mock.appliance.execute.assert_called_with(
'truncate --size 2G /volumes/stack/share/volume2/volume')
@patch('cinder.volume.drivers.remotefs.'
'RemoteFSDriver._ensure_shares_mounted')
@patch('cinder.volume.drivers.nexenta.nfs.'
'NexentaNfsDriver._get_volroot')
@patch('cinder.volume.drivers.nexenta.nfs.'
'NexentaNfsDriver._get_nfs_server_version')
def test_create_volume_from_snapshot(self, version, volroot, ensure):
version.return_value = 4
volroot.return_value = 'volroot'
self._create_volume_db_entry()
self.drv.create_volume_from_snapshot(self.TEST_VOLUME_REF,
self.TEST_SNAPSHOT_REF)
self.nms_mock.appliance.execute.assert_not_called()
self.drv.create_volume_from_snapshot(self.TEST_VOLUME_REF3,
self.TEST_SNAPSHOT_REF)
self.nms_mock.appliance.execute.assert_not_called()
def test_set_rw_permissions_for_all(self):
path = '/tmp/path'
self.drv._set_rw_permissions_for_all(self.nms_mock, path)

View File

@ -58,7 +58,7 @@ class TestNexentaISCSIDriver(test.TestCase):
'name': TEST_SNAPSHOT_NAME,
'volume_name': TEST_VOLUME_NAME,
'volume_id': '1',
'size': 1
'volume_size': 1
}
def __init__(self, method):

View File

@ -17,6 +17,7 @@
.. automodule:: nexenta.iscsi
"""
import six
from oslo_log import log as logging
from oslo_utils import excutils
@ -214,7 +215,7 @@ class NexentaISCSIDriver(driver.ISCSIDriver):
self.nms.zvol.create(
self._get_zvol_name(volume['name']),
'%sG' % (volume['size'],),
self.configuration.nexenta_blocksize,
six.text_type(self.configuration.nexenta_blocksize),
self.configuration.nexenta_sparse)
def extend_volume(self, volume, new_size):
@ -263,7 +264,8 @@ class NexentaISCSIDriver(driver.ISCSIDriver):
:param src_vref: source volume reference
"""
snapshot = {'volume_name': src_vref['name'],
'name': self._get_clone_snapshot_name(volume)}
'name': self._get_clone_snapshot_name(volume),
'volume_size': src_vref['size']}
LOG.debug('Creating temp snapshot of the original volume: '
'%(volume_name)s@%(name)s', snapshot)
# We don't delete this snapshot, because this snapshot will be origin
@ -479,6 +481,9 @@ class NexentaISCSIDriver(driver.ISCSIDriver):
'%s@%s' % (self._get_zvol_name(snapshot['volume_name']),
snapshot['name']),
self._get_zvol_name(volume['name']))
if (('size' in volume) and (
volume['size'] > snapshot['volume_size'])):
self.extend_volume(volume, volume['size'])
def delete_snapshot(self, snapshot):
"""Delete volume's snapshot on appliance.

View File

@ -398,6 +398,10 @@ class NexentaNfsDriver(nfs.NfsDriver): # pylint: disable=R0921
volume)
self._ensure_share_mounted(sub_share, mnt_path)
if (('size' in volume) and (
volume['size'] > snapshot['volume_size'])):
self.extend_volume(volume, volume['size'])
return {'provider_location': volume['provider_location']}
def create_cloned_volume(self, volume, src_vref):
@ -409,6 +413,7 @@ class NexentaNfsDriver(nfs.NfsDriver): # pylint: disable=R0921
LOG.info(_LI('Creating clone of volume: %s'), src_vref['id'])
snapshot = {'volume_name': src_vref['name'],
'volume_id': src_vref['id'],
'volume_size': src_vref['size'],
'name': self._get_clone_snapshot_name(volume)}
# We don't delete this snapshot, because this snapshot will be origin
# of new volume. This snapshot will be automatically promoted by NMS

View File

@ -323,7 +323,8 @@ class NexentaISCSIDriver(driver.ISCSIDriver): # pylint: disable=R0921
}
self.nef.post(url)
if (('size' in volume) and (volume['size'] > snapshot['size'])):
if (('size' in volume) and (
volume['size'] > snapshot['volume_size'])):
self.extend_volume(volume, volume['size'])
def create_cloned_volume(self, volume, src_vref):
@ -334,6 +335,7 @@ class NexentaISCSIDriver(driver.ISCSIDriver): # pylint: disable=R0921
"""
snapshot = {'volume_name': src_vref['name'],
'volume_id': src_vref['id'],
'volume_size': src_vref['size'],
'name': self._get_clone_snapshot_name(volume)}
LOG.debug('Creating temp snapshot of the original volume: '
'%s@%s', snapshot['volume_name'], snapshot['name'])