From 79c4b36315b7cc31fdf92c982ebea681279b579a Mon Sep 17 00:00:00 2001 From: Claudiu Belu Date: Mon, 30 Jan 2017 13:09:52 +0200 Subject: [PATCH] Pass-in empty array uuid filter to server list If there are no VMs running on the compute node, the given instance_uuids will be an empty array. This should be added as a filter, otherwise, the entire list of instances will be returned. Change-Id: I9a77eeb410f59feda5ee84429eae8895ae3f3c26 Closes-Bug: #1660293 --- hyperv/nova/cluster/clusterops.py | 2 +- hyperv/tests/unit/cluster/test_clusterops.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/hyperv/nova/cluster/clusterops.py b/hyperv/nova/cluster/clusterops.py index 442e14d7..3f533848 100644 --- a/hyperv/nova/cluster/clusterops.py +++ b/hyperv/nova/cluster/clusterops.py @@ -220,7 +220,7 @@ class ClusterOps(object): expected_attrs = ['id', 'uuid', 'name'] filters = {'deleted': False} - if instance_uuids: + if instance_uuids is not None: filters['uuid'] = instance_uuids return objects.InstanceList.get_by_filters( diff --git a/hyperv/tests/unit/cluster/test_clusterops.py b/hyperv/tests/unit/cluster/test_clusterops.py index 2b334c3f..d747db38 100644 --- a/hyperv/tests/unit/cluster/test_clusterops.py +++ b/hyperv/tests/unit/cluster/test_clusterops.py @@ -15,6 +15,7 @@ import time +import ddt import mock from nova.compute import power_state from nova.compute import task_states @@ -27,6 +28,7 @@ from hyperv.tests import fake_instance from hyperv.tests.unit import test_base +@ddt.ddt class ClusterOpsTestCase(test_base.HyperVBaseTestCase): """Unit tests for the Hyper-V ClusterOps class.""" @@ -292,14 +294,20 @@ class ClusterOpsTestCase(test_base.HyperVBaseTestCase): self.assertEqual(mock.sentinel.uuid, self.clusterops._instance_map[mock.sentinel.name]) + @ddt.data({'instance_uuids': None}, + {'instance_uuids': []}, + {'instance_uuids': mock.sentinel.uuid}) + @ddt.unpack @mock.patch.object(clusterops.objects.InstanceList, 'get_by_filters') - def test_get_nova_instances(self, mock_get_by_filters): + def test_get_nova_instances(self, mock_get_by_filters, instance_uuids): instances = self.clusterops._get_nova_instances( - instance_uuids=mock.sentinel.uuids) + instance_uuids=instance_uuids) self.assertEqual(mock_get_by_filters.return_value, instances) expected_attrs = ['id', 'uuid', 'name'] - expected_filters = {'deleted': False, 'uuid': mock.sentinel.uuids} + expected_filters = {'deleted': False} + if instance_uuids is not None: + expected_filters['uuid'] = instance_uuids mock_get_by_filters.assert_called_once_with( self.clusterops._context, expected_filters, expected_attrs=expected_attrs)