From 47937b6113dfe34202926536a2c43d3f85676026 Mon Sep 17 00:00:00 2001 From: int32bit Date: Fri, 21 Dec 2018 15:35:36 +0800 Subject: [PATCH] Convert port to str when validate console port The port type must be str type in nova-serialproxy side as we convert to str forcefully before rpc validate_console to compute service[1]. But on the compute side, the driver may be return int type like ironic serial console[2]. So the validate_console_port may always return False as type inconsistence[3]. [1] https://github.com/openstack/nova/blob/18.0.0/nova/console/websocketproxy.py#L144 [2] https://github.com/openstack/nova/blob/18.0.0/nova/virt/ironic/driver.py#L1830 [3] https://github.com/openstack/nova/blob/18.0.0/nova/compute/manager.py#L5417 Closes-Bug: 1809418 Change-Id: If5f3dc725c5836e67d09deeefb3bce2249f71a69 --- nova/compute/manager.py | 5 ++++- nova/tests/unit/compute/test_compute.py | 22 ++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index a24743c2044c..09ad4f4fb0b0 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -5366,7 +5366,10 @@ class ComputeManager(manager.Manager): else: console_info = self.driver.get_vnc_console(ctxt, instance) - return console_info.port == port + # Some drivers may return an int on console_info.port but the port + # variable in this method is a string, so cast to be sure we are + # comparing the correct types. + return str(console_info.port) == port @wrap_exception() @reverts_task_state diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py index 370033468d94..561d26bf6278 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -3831,7 +3831,7 @@ class ComputeTestCase(BaseTestCase, fake_driver_get_console) self.assertTrue(self.compute.validate_console_port( - context=self.context, instance=instance, port=5900, + context=self.context, instance=instance, port="5900", console_type="novnc")) def test_validate_console_port_spice(self): @@ -3846,7 +3846,7 @@ class ComputeTestCase(BaseTestCase, fake_driver_get_console) self.assertTrue(self.compute.validate_console_port( - context=self.context, instance=instance, port=5900, + context=self.context, instance=instance, port="5900", console_type="spice-html5")) def test_validate_console_port_rdp(self): @@ -3860,9 +3860,23 @@ class ComputeTestCase(BaseTestCase, fake_driver_get_console) self.assertTrue(self.compute.validate_console_port( - context=self.context, instance=instance, port=5900, + context=self.context, instance=instance, port="5900", console_type="rdp-html5")) + def test_validate_console_port_serial(self): + self.flags(enabled=True, group='serial_console') + instance = self._create_fake_instance_obj() + + def fake_driver_get_console(*args, **kwargs): + return ctype.ConsoleSerial(host="fake_host", port=5900) + + self.stub_out("nova.virt.fake.FakeDriver.get_serial_console", + fake_driver_get_console) + + self.assertTrue(self.compute.validate_console_port( + context=self.context, instance=instance, port="5900", + console_type="serial")) + def test_validate_console_port_mks(self): self.flags(enabled=True, group='mks') instance = self._create_fake_instance_obj() @@ -3871,7 +3885,7 @@ class ComputeTestCase(BaseTestCase, mock_getmks.return_value = ctype.ConsoleMKS(host="fake_host", port=5900) result = self.compute.validate_console_port(context=self.context, - instance=instance, port=5900, console_type="webmks") + instance=instance, port="5900", console_type="webmks") self.assertTrue(result) def test_validate_console_port_wrong_port(self):