Merge "NexentaStor drivers: resize volume if cloned image is larger"
This commit is contained in:
commit
48dac64a8e
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'])
|
||||
|
|
Loading…
Reference in New Issue