aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ansible/module_utils/kolla_docker_worker.py8
-rw-r--r--releasenotes/notes/fix-cpuset-dimensions-comparison-f2c0e9aaab0f0342.yaml7
-rw-r--r--tests/kolla_container_tests/test_docker_worker.py54
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'})