summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-09-30 10:07:50 +0000
committerGerrit Code Review <review@openstack.org>2014-09-30 10:07:50 +0000
commit25c7735677e16d7d7d36f9661bf906c3711d7ff2 (patch)
tree38bf03946ab1b04d7ed444e4c8ff7c2c31c528a5
parent87b5c70bcc91a439afa87763bfc546f4dd81a669 (diff)
parent948ff4f3d0a159f1aed9fab65d205ede845b3eb9 (diff)
downloadnova-25c7735677e16d7d7d36f9661bf906c3711d7ff2.tar.gz
Merge "VMware: prevent race condition with VNC port allocation"
-rw-r--r--nova/tests/virt/vmwareapi/test_vmops.py12
-rw-r--r--nova/virt/vmwareapi/vm_util.py2
-rw-r--r--nova/virt/vmwareapi/vmops.py7
3 files changed, 8 insertions, 13 deletions
diff --git a/nova/tests/virt/vmwareapi/test_vmops.py b/nova/tests/virt/vmwareapi/test_vmops.py
index 45e21c19e4..b49adc8ab7 100644
--- a/nova/tests/virt/vmwareapi/test_vmops.py
+++ b/nova/tests/virt/vmwareapi/test_vmops.py
@@ -757,8 +757,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
@mock.patch('nova.virt.vmwareapi.vmops.VMwareVMOps._set_machine_id')
@mock.patch(
'nova.virt.vmwareapi.imagecache.ImageCacheManager.enlist_image')
- @mock.patch('nova.virt.vmwareapi.vm_util.get_vnc_port', return_value=5900)
- @mock.patch('nova.virt.vmwareapi.vmops.VMwareVMOps._set_vnc_config')
+ @mock.patch.object(vmops.VMwareVMOps, '_get_and_set_vnc_config')
@mock.patch('nova.virt.vmwareapi.vm_util.power_on_instance')
@mock.patch('nova.virt.vmwareapi.vm_util.copy_virtual_disk')
# TODO(dims): Need to add tests for create_virtual_disk after the
@@ -766,8 +765,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
def _test_spawn(self,
mock_copy_virtual_disk,
mock_power_on_instance,
- mock_set_vnc_config,
- mock_get_vnc_port,
+ mock_get_and_set_vnc_config,
mock_enlist_image,
mock_set_machine_id,
mock_mkdir,
@@ -821,7 +819,6 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
self.assertEqual(expected_mkdir_calls, len(mock_mkdir.mock_calls))
- mock_get_vnc_port.assert_called_once_with(self._session)
mock_get_mo_id_for_instance.assert_called_once_with(self._instance)
mock_get_res_pool_ref.assert_called_once_with(
self._session, None, 'fake_node_mo_id')
@@ -844,10 +841,9 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
'fake_vm_folder',
'fake_create_spec',
'fake_rp_ref')
- mock_set_vnc_config.assert_called_once_with(
+ mock_get_and_set_vnc_config.assert_called_once_with(
self._session._get_vim().client.factory,
- self._instance,
- 5900)
+ self._instance)
mock_set_machine_id.assert_called_once_with(
self._session._get_vim().client.factory,
self._instance,
diff --git a/nova/virt/vmwareapi/vm_util.py b/nova/virt/vmwareapi/vm_util.py
index 7aaa9f1cfd..1f44e17098 100644
--- a/nova/virt/vmwareapi/vm_util.py
+++ b/nova/virt/vmwareapi/vm_util.py
@@ -29,7 +29,6 @@ from nova.i18n import _
from nova.network import model as network_model
from nova.openstack.common import log as logging
from nova.openstack.common import units
-from nova import utils
from nova.virt.vmwareapi import constants
from nova.virt.vmwareapi import vim_util
@@ -717,7 +716,6 @@ def get_vnc_config_spec(client_factory, port):
return virtual_machine_config_spec
-@utils.synchronized('vmware.get_vnc_port')
def get_vnc_port(session):
"""Return VNC port for an VM or None if there is no available port."""
min_port = CONF.vmware.vnc_port
diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py
index 67ed6c32ad..2c5ecd467e 100644
--- a/nova/virt/vmwareapi/vmops.py
+++ b/nova/virt/vmwareapi/vmops.py
@@ -456,8 +456,7 @@ class VMwareVMOps(object):
# Set the vnc configuration of the instance, vnc port starts from 5900
if CONF.vnc_enabled:
- vnc_port = vm_util.get_vnc_port(self._session)
- self._set_vnc_config(client_factory, instance, vnc_port)
+ self._get_and_set_vnc_config(client_factory, instance)
block_device_mapping = []
if block_device_info is not None:
@@ -1247,8 +1246,10 @@ class VMwareVMOps(object):
LOG.debug("Reconfigured VM instance to set the machine id",
instance=instance)
- def _set_vnc_config(self, client_factory, instance, port):
+ @utils.synchronized('vmware.get_and_set_vnc_port')
+ def _get_and_set_vnc_config(self, client_factory, instance):
"""Set the vnc configuration of the VM."""
+ port = vm_util.get_vnc_port(self._session)
vm_ref = vm_util.get_vm_ref(self._session, instance)
vnc_config_spec = vm_util.get_vnc_config_spec(