diff options
3 files changed, 69 insertions, 0 deletions
diff --git a/ansible/module_utils/kolla_docker_worker.py b/ansible/module_utils/kolla_docker_worker.py index 232ec5ba1..70b6af39b 100644 --- a/ansible/module_utils/kolla_docker_worker.py +++ b/ansible/module_utils/kolla_docker_worker.py @@ -184,6 +184,14 @@ class DockerWorker(ContainerWorker): 'ExitCode: %s Message: %s' % (exec_inspect['ExitCode'], output)) + def dimensions_differ(self, a, b, key): + if key in ('cpuset_cpus', 'cpuset_mems'): + a = str(a or '') + b = str(b or '') + return a != b + + return super().dimensions_differ(a, b, key) + def get_image_id(self): full_image = self.params.get('image') diff --git a/releasenotes/notes/fix-cpuset-dimensions-comparison-f2c0e9aaab0f0342.yaml b/releasenotes/notes/fix-cpuset-dimensions-comparison-f2c0e9aaab0f0342.yaml new file mode 100644 index 000000000..343e7fb5e --- /dev/null +++ b/releasenotes/notes/fix-cpuset-dimensions-comparison-f2c0e9aaab0f0342.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixes an issue in the Docker container worker where reconfiguring + containers with ``cpuset_cpus`` or ``cpuset_mems`` dimensions could fail + with an ``IndexError`` when the existing container had no explicit cpuset + constraint configured. diff --git a/tests/kolla_container_tests/test_docker_worker.py b/tests/kolla_container_tests/test_docker_worker.py index 26fe020f2..cd351e4ef 100644 --- a/tests/kolla_container_tests/test_docker_worker.py +++ b/tests/kolla_container_tests/test_docker_worker.py @@ -1500,6 +1500,60 @@ class TestAttrComp(base.BaseTestCase): failed=True, msg=repr("Unsupported dimensions"), unsupported_dimensions=set(['kernel_memory'])) + def test_compare_dimensions_cpuset_cpus_empty_current(self): + self.fake_data['params']['dimensions'] = { + 'cpuset_cpus': '0-1,32-33'} + container_info = dict() + container_info['HostConfig'] = { + 'CpusetCpus': ''} + self.dw = get_DockerWorker(self.fake_data['params']) + self.assertTrue(self.dw.compare_dimensions(container_info)) + + def test_compare_dimensions_cpuset_cpus_same(self): + self.fake_data['params']['dimensions'] = { + 'cpuset_cpus': '0-1,32-33'} + container_info = dict() + container_info['HostConfig'] = { + 'CpusetCpus': '0-1,32-33'} + self.dw = get_DockerWorker(self.fake_data['params']) + self.assertFalse(self.dw.compare_dimensions(container_info)) + + def test_compare_dimensions_cpuset_cpus_different(self): + self.fake_data['params']['dimensions'] = { + 'cpuset_cpus': '0-1,32-33'} + container_info = dict() + container_info['HostConfig'] = { + 'CpusetCpus': '0-3'} + self.dw = get_DockerWorker(self.fake_data['params']) + self.assertTrue(self.dw.compare_dimensions(container_info)) + + def test_compare_dimensions_cpuset_mems_empty_current(self): + self.fake_data['params']['dimensions'] = { + 'cpuset_mems': '0'} + container_info = dict() + container_info['HostConfig'] = { + 'CpusetMems': ''} + self.dw = get_DockerWorker(self.fake_data['params']) + self.assertTrue(self.dw.compare_dimensions(container_info)) + + def test_compare_dimensions_cpuset_mems_same(self): + self.fake_data['params']['dimensions'] = { + 'cpuset_mems': '0'} + container_info = dict() + container_info['HostConfig'] = { + 'CpusetMems': '0'} + self.dw = get_DockerWorker(self.fake_data['params']) + self.assertFalse(self.dw.compare_dimensions(container_info)) + + def test_compare_dimensions_cpuset_mems_different(self): + self.fake_data['params']['dimensions'] = { + 'cpuset_mems': '0'} + container_info = dict() + container_info['HostConfig'] = { + 'CpusetMems': '1'} + self.dw = get_DockerWorker(self.fake_data['params']) + self.assertTrue(self.dw.compare_dimensions(container_info)) + def test_compare_container_state_pos(self): container_info = {'State': dict(Status='running')} self.dw = get_DockerWorker({'state': 'exited'}) |
