Merge "Reproducers for bug 1869804"
This commit is contained in:
commit
336b815a30
@ -422,6 +422,12 @@ class TestCase(base.BaseTestCase):
|
|||||||
for k, v in kw.items():
|
for k, v in kw.items():
|
||||||
CONF.set_override(k, v, group)
|
CONF.set_override(k, v, group)
|
||||||
|
|
||||||
|
def reset_flags(self, *k, **kw):
|
||||||
|
"""Reset flag variables for a test."""
|
||||||
|
group = kw.pop('group')
|
||||||
|
for flag in k:
|
||||||
|
CONF.clear_override(flag, group)
|
||||||
|
|
||||||
def enforce_fk_constraints(self, engine=None):
|
def enforce_fk_constraints(self, engine=None):
|
||||||
if engine is None:
|
if engine is None:
|
||||||
engine = db_api.get_engine()
|
engine = db_api.get_engine()
|
||||||
|
20
nova/tests/fixtures/libvirt.py
vendored
20
nova/tests/fixtures/libvirt.py
vendored
@ -905,6 +905,13 @@ def _parse_disk_info(element):
|
|||||||
return disk_info
|
return disk_info
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_vcpu_info(element):
|
||||||
|
vcpu_info = {}
|
||||||
|
vcpu_info['number'] = int(element.text)
|
||||||
|
vcpu_info['cpuset'] = element.get('cpuset')
|
||||||
|
return vcpu_info
|
||||||
|
|
||||||
|
|
||||||
def _parse_nic_info(element):
|
def _parse_nic_info(element):
|
||||||
nic_info = {}
|
nic_info = {}
|
||||||
nic_info['type'] = element.get('type', 'bridge')
|
nic_info['type'] = element.get('type', 'bridge')
|
||||||
@ -1097,7 +1104,7 @@ class Domain(object):
|
|||||||
|
|
||||||
vcpu = tree.find('./vcpu')
|
vcpu = tree.find('./vcpu')
|
||||||
if vcpu is not None:
|
if vcpu is not None:
|
||||||
definition['vcpu'] = int(vcpu.text)
|
definition['vcpu'] = _parse_vcpu_info(vcpu)
|
||||||
|
|
||||||
memory = tree.find('./memory')
|
memory = tree.find('./memory')
|
||||||
if memory is not None:
|
if memory is not None:
|
||||||
@ -1543,12 +1550,16 @@ class Domain(object):
|
|||||||
<source host="-1" service="-1" mode="bind"/>
|
<source host="-1" service="-1" mode="bind"/>
|
||||||
</serial>"""
|
</serial>"""
|
||||||
|
|
||||||
|
vcpuset = ''
|
||||||
|
if self._def['vcpu'].get('cpuset'):
|
||||||
|
vcpuset = ' cpuset="' + self._def['vcpu']['cpuset'] + '"'
|
||||||
|
|
||||||
return '''<domain type='kvm'>
|
return '''<domain type='kvm'>
|
||||||
<name>%(name)s</name>
|
<name>%(name)s</name>
|
||||||
<uuid>%(uuid)s</uuid>
|
<uuid>%(uuid)s</uuid>
|
||||||
<memory>%(memory)s</memory>
|
<memory>%(memory)s</memory>
|
||||||
<currentMemory>%(memory)s</currentMemory>
|
<currentMemory>%(memory)s</currentMemory>
|
||||||
<vcpu>%(vcpu)s</vcpu>
|
<vcpu%(vcpuset)s>%(vcpu)s</vcpu>
|
||||||
<os>
|
<os>
|
||||||
<type arch='%(arch)s' machine='pc-0.12'>hvm</type>
|
<type arch='%(arch)s' machine='pc-0.12'>hvm</type>
|
||||||
<boot dev='hd'/>
|
<boot dev='hd'/>
|
||||||
@ -1596,7 +1607,8 @@ class Domain(object):
|
|||||||
</domain>''' % {'name': self._def['name'],
|
</domain>''' % {'name': self._def['name'],
|
||||||
'uuid': self._def['uuid'],
|
'uuid': self._def['uuid'],
|
||||||
'memory': self._def['memory'],
|
'memory': self._def['memory'],
|
||||||
'vcpu': self._def['vcpu'],
|
'vcpuset': vcpuset,
|
||||||
|
'vcpu': self._def['vcpu']['number'],
|
||||||
'arch': self._def['os']['arch'],
|
'arch': self._def['os']['arch'],
|
||||||
'disks': disks,
|
'disks': disks,
|
||||||
'nics': nics,
|
'nics': nics,
|
||||||
@ -1628,7 +1640,7 @@ class Domain(object):
|
|||||||
|
|
||||||
def vcpus(self):
|
def vcpus(self):
|
||||||
vcpus = ([], [])
|
vcpus = ([], [])
|
||||||
for i in range(0, self._def['vcpu']):
|
for i in range(0, self._def['vcpu']['number']):
|
||||||
vcpus[0].append((i, 1, 120405, i))
|
vcpus[0].append((i, 1, 120405, i))
|
||||||
vcpus[1].append((True, True, True, True))
|
vcpus[1].append((True, True, True, True))
|
||||||
return vcpus
|
return vcpus
|
||||||
|
@ -210,3 +210,124 @@ class LiveMigrationQueuedAbortTestLeftoversRemoved(LiveMigrationWithLockBase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(1, len(port_binding_server_b))
|
self.assertEqual(1, len(port_binding_server_b))
|
||||||
self.assertNotIn('dest', port_binding_server_b)
|
self.assertNotIn('dest', port_binding_server_b)
|
||||||
|
|
||||||
|
|
||||||
|
class LiveMigrationWithCpuSharedSet(
|
||||||
|
libvirt_base.LibvirtMigrationMixin,
|
||||||
|
libvirt_base.ServersTestBase,
|
||||||
|
integrated_helpers.InstanceHelperMixin
|
||||||
|
):
|
||||||
|
|
||||||
|
api_major_version = 'v2.1'
|
||||||
|
# Microversion 2.74 is required to boot a server on a specific host,
|
||||||
|
# which is used in the below tests.
|
||||||
|
microversion = '2.74'
|
||||||
|
ADMIN_API = True
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
|
||||||
|
self.src_hostname = self.start_compute(hostname='src')
|
||||||
|
self.dest_hostname = self.start_compute(hostname='dest')
|
||||||
|
|
||||||
|
self.src = self.computes[self.src_hostname]
|
||||||
|
self.dest = self.computes[self.dest_hostname]
|
||||||
|
|
||||||
|
def get_host(self, server_id):
|
||||||
|
server = self.api.get_server(server_id)
|
||||||
|
return server['OS-EXT-SRV-ATTR:host']
|
||||||
|
|
||||||
|
def test_live_migration_to_different_cpu_shared_set(self):
|
||||||
|
"""Reproducer for bug 1869804 #1.
|
||||||
|
An instance live migrated from a host with a cpu_shared_set to a
|
||||||
|
destination host with a different cpu_shared_set should be updated
|
||||||
|
to use the destination cpu_shared_set.
|
||||||
|
"""
|
||||||
|
self.flags(cpu_shared_set='0,1', group='compute')
|
||||||
|
self.restart_compute_service('src')
|
||||||
|
self.restart_compute_service('dest')
|
||||||
|
self.server = self._create_server(host='src', networks='none')
|
||||||
|
|
||||||
|
conn = self.src.driver._host.get_connection()
|
||||||
|
dom = conn.lookupByUUIDString(self.server['id'])
|
||||||
|
xml = dom.XMLDesc(0)
|
||||||
|
self.assertIn('<vcpu cpuset="0-1">1</vcpu>', xml)
|
||||||
|
|
||||||
|
self.flags(cpu_shared_set='3,4', group='compute')
|
||||||
|
self.restart_compute_service('dest')
|
||||||
|
self._live_migrate(self.server, 'completed')
|
||||||
|
self.assertEqual('dest', self.get_host(self.server['id']))
|
||||||
|
|
||||||
|
conn = self.dest.driver._host.get_connection()
|
||||||
|
dom = conn.lookupByUUIDString(self.server['id'])
|
||||||
|
xml = dom.XMLDesc(0)
|
||||||
|
# The destination should be updated to "3-4" but it is not the case.
|
||||||
|
self.assertIn('<vcpu cpuset="0-1">1</vcpu>', xml)
|
||||||
|
self.assertNotIn('<vcpu cpuset="3-4">1</vcpu>', xml)
|
||||||
|
|
||||||
|
def test_live_migration_to_no_cpu_shared_set(self):
|
||||||
|
"""Reproducer for bug 1869804 #2.
|
||||||
|
An instance live migrated from a host with a cpu_shared_set to a
|
||||||
|
destination host without cpu_shared_set should not keep cpuset
|
||||||
|
settings.
|
||||||
|
"""
|
||||||
|
self.flags(cpu_shared_set='0,1', group='compute')
|
||||||
|
self.restart_compute_service('src')
|
||||||
|
self.restart_compute_service('dest')
|
||||||
|
self.server = self._create_server(host='src', networks='none')
|
||||||
|
|
||||||
|
self.reset_flags('cpu_shared_set', group='compute')
|
||||||
|
self.restart_compute_service('src')
|
||||||
|
self.restart_compute_service('dest')
|
||||||
|
|
||||||
|
# Here we just create a server2 to ensure cpu_shared_set is not
|
||||||
|
# configured on destination host.
|
||||||
|
self.server2 = self._create_server(host='dest', networks='none')
|
||||||
|
|
||||||
|
conn = self.src.driver._host.get_connection()
|
||||||
|
dom = conn.lookupByUUIDString(self.server['id'])
|
||||||
|
xml = dom.XMLDesc(0)
|
||||||
|
self.assertIn('<vcpu cpuset="0-1">1</vcpu>', xml)
|
||||||
|
|
||||||
|
conn = self.dest.driver._host.get_connection()
|
||||||
|
dom = conn.lookupByUUIDString(self.server2['id'])
|
||||||
|
xml = dom.XMLDesc(0)
|
||||||
|
# This prove that cpu_shared_set is not configured on destination host
|
||||||
|
self.assertIn('<vcpu>1</vcpu>', xml)
|
||||||
|
|
||||||
|
self._live_migrate(self.server, 'completed')
|
||||||
|
self.assertEqual('dest', self.get_host(self.server['id']))
|
||||||
|
|
||||||
|
conn = self.dest.driver._host.get_connection()
|
||||||
|
dom = conn.lookupByUUIDString(self.server['id'])
|
||||||
|
xml = dom.XMLDesc(0)
|
||||||
|
# The destination cpuset should be removed because the
|
||||||
|
# host has no cpu_shared_set configured. Which is not the case due to
|
||||||
|
# the bug.
|
||||||
|
self.assertIn('<vcpu cpuset="0-1">1</vcpu>', xml)
|
||||||
|
self.assertNotIn('<vcpu>1</vcpu>', xml)
|
||||||
|
|
||||||
|
def test_live_migration_from_no_cpu_shared_set_to_cpu_shared_set(self):
|
||||||
|
"""Reproducer for bug 1869804 #3.
|
||||||
|
An instance live migrated from a host without a cpu_shared_set to a
|
||||||
|
destination host with cpu_shared_set should be updated to use
|
||||||
|
the destination cpu_shared_set.
|
||||||
|
"""
|
||||||
|
self.server = self._create_server(host='src', networks='none')
|
||||||
|
|
||||||
|
conn = self.src.driver._host.get_connection()
|
||||||
|
dom = conn.lookupByUUIDString(self.server['id'])
|
||||||
|
xml = dom.XMLDesc(0)
|
||||||
|
self.assertIn('<vcpu>1</vcpu>', xml)
|
||||||
|
|
||||||
|
self.flags(cpu_shared_set='0,1', group='compute')
|
||||||
|
self.restart_compute_service('dest')
|
||||||
|
self._live_migrate(self.server, 'completed')
|
||||||
|
self.assertEqual('dest', self.get_host(self.server['id']))
|
||||||
|
|
||||||
|
conn = self.dest.driver._host.get_connection()
|
||||||
|
dom = conn.lookupByUUIDString(self.server['id'])
|
||||||
|
xml = dom.XMLDesc(0)
|
||||||
|
# The destination should be updated to "0-1".
|
||||||
|
self.assertIn('<vcpu>1</vcpu>', xml)
|
||||||
|
self.assertNotIn('<vcpu cpuset="0-1">1</vcpu>', xml)
|
||||||
|
@ -172,7 +172,7 @@ class FakeLibvirtTests(test.NoDBTestCase):
|
|||||||
self.assertEqual(info[0], libvirt.VIR_DOMAIN_RUNNING)
|
self.assertEqual(info[0], libvirt.VIR_DOMAIN_RUNNING)
|
||||||
self.assertEqual(info[1], 128000)
|
self.assertEqual(info[1], 128000)
|
||||||
self.assertLessEqual(info[2], 128000)
|
self.assertLessEqual(info[2], 128000)
|
||||||
self.assertEqual(info[3], 1)
|
self.assertEqual(info[3]['number'], 1)
|
||||||
self.assertIs(type(info[4]), int)
|
self.assertIs(type(info[4]), int)
|
||||||
|
|
||||||
def test_createXML_runs_domain(self):
|
def test_createXML_runs_domain(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user