Fixing signature mismatch for spawn method

Nova was unable to spawn instances on compute nodes because of an
argument not being passed.

More specific, the 'spawn' method of the 'HyperVClusterDriver'
class was called with 9 arguments, when the signature only had 8.
This would raise an error as one of the arguments was receiving
two values instead of one.

The cluster driver public method signatures are now validated against
the base Nova driver.

This change fixes this issue.

Change-Id: I086a5c6a859bc4fa2424e840cb390462d8cdff85
This commit is contained in:
AlexMuresan 2017-11-14 12:40:35 +02:00 committed by Alexandru Muresan
parent 3ceacfdbbe
commit 38505fb1e8
2 changed files with 25 additions and 4 deletions

View File

@ -30,10 +30,11 @@ class HyperVClusterDriver(driver.HyperVDriver):
self._clops.reclaim_failovered_instances()
def spawn(self, context, instance, image_meta, injected_files,
admin_password, network_info=None, block_device_info=None):
admin_password, allocations, network_info=None,
block_device_info=None):
super(HyperVClusterDriver, self).spawn(
context, instance, image_meta, injected_files, admin_password,
network_info, block_device_info)
allocations, network_info, block_device_info)
self._clops.add_to_cluster(instance)
def destroy(self, context, instance, network_info, block_device_info=None,

View File

@ -17,6 +17,9 @@
import mock
from nova import safe_utils
from nova.virt import driver as nova_base_driver
from compute_hyperv.nova.cluster import clusterops
from compute_hyperv.nova.cluster import driver
from compute_hyperv.nova import driver as base_driver
@ -36,20 +39,37 @@ class HyperVClusterTestCase(test_base.HyperVBaseTestCase):
self.driver = driver.HyperVClusterDriver(mock.sentinel.virtapi)
self.driver._livemigrationops = mock.Mock()
def test_public_api_signatures(self):
driver_methods = dict(driver.HyperVClusterDriver.__dict__,
**base_driver.HyperVDriver.__dict__)
for attr in driver_methods:
class_member = getattr(driver.HyperVClusterDriver, attr)
if callable(class_member):
mocked_method = mock.patch.object(
driver.HyperVClusterDriver, attr,
safe_utils.get_wrapped_function(class_member))
mocked_method.start()
self.addCleanup(mocked_method.stop)
self.assertPublicAPISignatures(nova_base_driver.ComputeDriver,
driver.HyperVClusterDriver)
@mock.patch.object(base_driver.HyperVDriver, 'spawn')
def test_spawn(self, mock_superclass_spawn):
self.driver.spawn(self.context, mock.sentinel.fake_instance,
mock.sentinel.image_meta,
mock.sentinel.injected_files,
mock.sentinel.admin_pass,
mock.sentinel.allocations,
mock.sentinel.network_info,
mock.sentinel.block_dev_info)
mock_superclass_spawn.assert_called_once_with(
self.context, mock.sentinel.fake_instance,
mock.sentinel.image_meta, mock.sentinel.injected_files,
mock.sentinel.admin_pass, mock.sentinel.network_info,
mock.sentinel.block_dev_info)
mock.sentinel.admin_pass, mock.sentinel.allocations,
mock.sentinel.network_info, mock.sentinel.block_dev_info)
self.driver._clops.add_to_cluster.assert_called_once_with(
mock.sentinel.fake_instance)