Skip to content

Commit 3f31b67

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Fix 1vcpu error with multiqueue and vif_type=tap" into stable/wallaby
2 parents 088addf + aa5b8d1 commit 3f31b67

File tree

3 files changed

+43
-13
lines changed

3 files changed

+43
-13
lines changed

nova/tests/unit/virt/libvirt/test_vif.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,10 @@ class LibvirtVifTestCase(test.NoDBTestCase):
378378
uuid='f0000000-0000-0000-0000-000000000001',
379379
project_id=723)
380380

381+
flavor_1vcpu = objects.Flavor(vcpus=1, memory=512, root_gb=1)
382+
383+
flavor_2vcpu = objects.Flavor(vcpus=2, memory=512, root_gb=1)
384+
381385
bandwidth = {
382386
'quota:vif_inbound_peak': '200',
383387
'quota:vif_outbound_peak': '20',
@@ -1068,30 +1072,50 @@ def test_tap_ethernet_vif_driver(self):
10681072
@mock.patch('nova.privsep.linux_net.device_exists', return_value=True)
10691073
@mock.patch('nova.privsep.linux_net.set_device_mtu')
10701074
@mock.patch('nova.privsep.linux_net.create_tap_dev')
1071-
def test_plug_tap_kvm_virtio(self, mock_create_tap_dev, mock_set_mtu,
1072-
mock_device_exists):
1075+
def test_plug_tap_kvm_virtio(
1076+
self, mock_create_tap_dev, mock_set_mtu, mock_device_exists):
10731077

10741078
d1 = vif.LibvirtGenericVIFDriver()
10751079
ins = objects.Instance(
10761080
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1081+
flavor=self.flavor_2vcpu,
10771082
project_id=723, system_metadata={}
10781083
)
10791084
d1.plug(ins, self.vif_tap)
1080-
mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz', None,
1081-
multiqueue=False)
1085+
mock_create_tap_dev.assert_called_once_with(
1086+
'tap-xxx-yyy-zzz', None, multiqueue=False)
10821087

10831088
mock_create_tap_dev.reset_mock()
10841089

10851090
d2 = vif.LibvirtGenericVIFDriver()
10861091
mq_ins = objects.Instance(
10871092
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1093+
flavor=self.flavor_2vcpu,
10881094
project_id=723, system_metadata={
10891095
'image_hw_vif_multiqueue_enabled': 'True'
10901096
}
10911097
)
10921098
d2.plug(mq_ins, self.vif_tap)
1093-
mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz', None,
1094-
multiqueue=True)
1099+
mock_create_tap_dev.assert_called_once_with(
1100+
'tap-xxx-yyy-zzz', None, multiqueue=True)
1101+
1102+
@mock.patch('nova.privsep.linux_net.device_exists', return_value=True)
1103+
@mock.patch('nova.privsep.linux_net.set_device_mtu')
1104+
@mock.patch('nova.privsep.linux_net.create_tap_dev')
1105+
def test_plug_tap_mq_ignored_1vcpu(
1106+
self, mock_create_tap_dev, mock_set_mtu, mock_device_exists):
1107+
1108+
d1 = vif.LibvirtGenericVIFDriver()
1109+
mq_ins = objects.Instance(
1110+
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1111+
image_ref=uuids.image_ref, flavor=self.flavor_1vcpu,
1112+
project_id=723, system_metadata={
1113+
'image_hw_vif_multiqueue_enabled': 'True',
1114+
}
1115+
)
1116+
d1.plug(mq_ins, self.vif_tap)
1117+
mock_create_tap_dev.assert_called_once_with(
1118+
'tap-xxx-yyy-zzz', None, multiqueue=False)
10951119

10961120
@mock.patch('nova.privsep.linux_net.device_exists', return_value=True)
10971121
@mock.patch('nova.privsep.linux_net.set_device_mtu')
@@ -1106,14 +1130,14 @@ def test_plug_tap_mq_ignored_virt_type(
11061130
d1 = vif.LibvirtGenericVIFDriver()
11071131
ins = objects.Instance(
11081132
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1133+
flavor=self.flavor_2vcpu,
11091134
project_id=723, system_metadata={
11101135
'image_hw_vif_multiqueue_enabled': 'True'
11111136
}
11121137
)
11131138
d1.plug(ins, self.vif_tap)
1114-
mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz',
1115-
None,
1116-
multiqueue=False)
1139+
mock_create_tap_dev.assert_called_once_with(
1140+
'tap-xxx-yyy-zzz', None, multiqueue=False)
11171141

11181142
@mock.patch('nova.privsep.linux_net.device_exists', return_value=True)
11191143
@mock.patch('nova.privsep.linux_net.set_device_mtu')
@@ -1124,15 +1148,15 @@ def test_plug_tap_mq_ignored_vif_model(
11241148
d1 = vif.LibvirtGenericVIFDriver()
11251149
ins = objects.Instance(
11261150
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1151+
flavor=self.flavor_2vcpu,
11271152
project_id=723, system_metadata={
11281153
'image_hw_vif_multiqueue_enabled': 'True',
11291154
'image_hw_vif_model': 'e1000',
11301155
}
11311156
)
11321157
d1.plug(ins, self.vif_tap)
1133-
mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz',
1134-
None,
1135-
multiqueue=False)
1158+
mock_create_tap_dev.assert_called_once_with(
1159+
'tap-xxx-yyy-zzz', None, multiqueue=False)
11361160

11371161
def test_unplug_tap(self):
11381162
d = vif.LibvirtGenericVIFDriver()

nova/virt/libvirt/vif.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,8 @@ def plug_tap(self, instance, vif):
681681
vif_model = self.get_vif_model(image_meta=image_meta)
682682
# TODO(ganso): explore whether multiqueue works for other vif models
683683
# that go through this code path.
684-
multiqueue = (self._requests_multiqueue(image_meta) and
684+
multiqueue = (instance.get_flavor().vcpus > 1 and
685+
self._requests_multiqueue(image_meta) and
685686
vif_model == network_model.VIF_MODEL_VIRTIO)
686687
nova.privsep.linux_net.create_tap_dev(dev, mac, multiqueue=multiqueue)
687688
network = vif.get('network')
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
fixes:
3+
- |
4+
Addressed an issue that prevented instances with 1 vcpu using multiqueue
5+
feature from being created successfully when their vif_type is TAP.

0 commit comments

Comments
 (0)