diff --git a/compute_hyperv/nova/driver.py b/compute_hyperv/nova/driver.py index f44b8172..a1b1177d 100644 --- a/compute_hyperv/nova/driver.py +++ b/compute_hyperv/nova/driver.py @@ -103,6 +103,7 @@ class HyperVDriver(driver.ComputeDriver): "supports_device_tagging": True, "supports_tagged_attach_interface": True, "supports_tagged_attach_volume": True, + "supports_extend_volume": True, } def __init__(self, virtapi): @@ -198,6 +199,9 @@ class HyperVDriver(driver.ComputeDriver): instance, update_device_metadata=True) + def extend_volume(self, connection_info, instance): + self._volumeops.extend_volume(connection_info) + def get_volume_connector(self, instance): return self._volumeops.get_volume_connector() diff --git a/compute_hyperv/nova/volumeops.py b/compute_hyperv/nova/volumeops.py index 32763de6..af22351d 100644 --- a/compute_hyperv/nova/volumeops.py +++ b/compute_hyperv/nova/volumeops.py @@ -375,6 +375,10 @@ class VolumeOps(object): volume_driver = self._get_volume_driver(connection_info) return volume_driver.get_disk_attachment_info(connection_info) + def extend_volume(self, connection_info): + volume_driver = self._get_volume_driver(connection_info) + return volume_driver.extend_volume(connection_info) + class BaseVolumeDriver(object): _is_block_dev = True @@ -543,6 +547,11 @@ class BaseVolumeDriver(object): is_physical=self._is_block_dev, serial=serial) + def extend_volume(self, connection_info): + # We're not actually extending the volume, we're just + # refreshing cached information about an already extended volume. + self._connector.extend_volume(connection_info['data']) + class ISCSIVolumeDriver(BaseVolumeDriver): _is_block_dev = True diff --git a/compute_hyperv/tests/unit/test_driver.py b/compute_hyperv/tests/unit/test_driver.py index dc40a676..00eee158 100644 --- a/compute_hyperv/tests/unit/test_driver.py +++ b/compute_hyperv/tests/unit/test_driver.py @@ -226,6 +226,14 @@ class HyperVDriverTestCase(test_base.HyperVBaseTestCase): mock_instance, update_device_metadata=True) + def test_extend_volume(self): + mock_instance = fake_instance.fake_instance_obj(self.context) + self.driver.extend_volume( + mock.sentinel.connection_info, mock_instance) + + self.driver._volumeops.extend_volume.assert_called_once_with( + mock.sentinel.connection_info) + def test_get_volume_connector(self): self.driver.get_volume_connector(mock.sentinel.instance) self.driver._volumeops.get_volume_connector.assert_called_once_with() diff --git a/compute_hyperv/tests/unit/test_volumeops.py b/compute_hyperv/tests/unit/test_volumeops.py index c7d28974..e3084337 100644 --- a/compute_hyperv/tests/unit/test_volumeops.py +++ b/compute_hyperv/tests/unit/test_volumeops.py @@ -516,6 +516,15 @@ class VolumeOpsTestCase(test_base.HyperVBaseTestCase): mock_vol_driver.get_disk_attachment_info.return_value, ret_val) + @mock.patch.object(volumeops.VolumeOps, '_get_volume_driver') + def test_extend_volume(self, mock_get_volume_driver): + fake_conn_info = get_fake_connection_info() + self._volumeops.extend_volume(fake_conn_info) + + mock_vol_driver = mock_get_volume_driver.return_value + mock_vol_driver.extend_volume.assert_called_once_with( + fake_conn_info) + @ddt.ddt class BaseVolumeDriverTestCase(test_base.HyperVBaseTestCase): @@ -814,6 +823,14 @@ class BaseVolumeDriverTestCase(test_base.HyperVBaseTestCase): is_physical=is_block_dev, serial=exp_serial) + def test_extend_volume(self): + conn_info = get_fake_connection_info() + + self._base_vol_driver.extend_volume(conn_info) + + self._conn.extend_volume.assert_called_once_with( + conn_info['data']) + class ISCSIVolumeDriverTestCase(test_base.HyperVBaseTestCase): """Unit tests for Hyper-V BaseVolumeDriver class."""