Assign labels to kolla volumes

Kolla volumes do not have assigned any labels, that makes
identification and filtering for kolla specific volumes hard.
This change allows for easier volume management.

Closes-bug: #1630545
Change-Id: I6b536f73433cfc64881ac66e53aa0a5eed709ce6
Signed-off-by: Marek Buch <marek.buch@tietoevry.com>
This commit is contained in:
Marek Buch 2025-03-05 13:49:41 +00:00
parent 005978608d
commit bff6ee9d7e
5 changed files with 90 additions and 10 deletions

View File

@ -333,6 +333,9 @@ class DockerWorker(ContainerWorker):
def create_container(self):
self.changed = True
# ensure volumes are pre-created before container creation
self.create_container_volumes()
options = self.build_container_options()
self.dc.create_container(**options)
if self.params.get('restart_policy') != 'oneshot':
@ -458,10 +461,22 @@ class DockerWorker(ContainerWorker):
self.dc.stop(name, timeout=graceful_timeout)
self.dc.start(name)
def create_volume(self):
def create_volume(self, name=None):
volume_name = name if name else self.params.get('name')
if not self.check_volume():
self.changed = True
self.dc.create_volume(name=self.params.get('name'), driver='local')
self.dc.create_volume(name=volume_name, driver='local',
labels={'kolla_managed': 'true'})
def create_container_volumes(self):
volumes = self.params.get("volumes", [])
for volume in volumes:
volume_name = volume.split(":")[0]
if "/" in volume_name:
continue
self.create_volume(name=volume_name)
def remove_volume(self):
if self.check_volume():

View File

@ -274,9 +274,10 @@ class PodmanWorker(ContainerWorker):
)
)
def check_volume(self):
def check_volume(self, name=None):
volume_name = name if name else self.params.get('name')
try:
vol = self.pc.volumes.get(self.params.get('name'))
vol = self.pc.volumes.get(volume_name)
return vol.attrs
except APIError as e:
if e.status_code == 404:
@ -503,6 +504,9 @@ class PodmanWorker(ContainerWorker):
return ulimits_opt
def create_container(self):
# ensure volumes are pre-created before container creation
self.create_container_volumes()
args = self.prepare_container_args()
container = self.pc.containers.create(**args)
if container.attrs == {}:
@ -624,17 +628,29 @@ class PodmanWorker(ContainerWorker):
msg="Container timed out",
**container.attrs)
def create_volume(self):
if not self.check_volume():
def create_volume(self, name=None):
volume_name = name if name else self.params.get('name')
if not self.check_volume(name=volume_name):
self.changed = True
args = dict(
name=self.params.get('name'),
driver='local'
name=volume_name,
driver='local',
labels={'kolla_managed': 'true'}
)
vol = self.pc.volumes.create(**args)
self.result = vol.attrs
def create_container_volumes(self):
volumes = self.params.get("volumes", []) or []
for volume in volumes:
volume_name = volume.split(":")[0]
if "/" in volume_name:
continue
self.create_volume(name=volume_name)
def remove_volume(self):
if self.check_volume():
self.changed = True

View File

@ -0,0 +1,9 @@
---
features:
- |
Implements assigning labels to kolla volumes.
Kolla volumes did not have assigned any labels,
that made identification and filtering for kolla specific volumes hard.
This feature is useful in podman migrations and
allows for easier volume management such as destroying volumes.
`LP#1630545 <https://bugs.launchpad.net/kolla-ansible/+bug/1630545>`

View File

@ -385,6 +385,25 @@ class TestContainer(base.BaseTestCase):
self.assertTrue(self.dw.changed)
self.assertFalse(self.dw.dc.create_host_config.call_args[1]['tmpfs'])
def test_create_container_create_volumes(self):
self.fake_data['params']['volumes'] = [
"kolla_logs:/var/log/kolla/",
"fluentd_data:/var/lib/fluentd/data/",
"/var/log/journal:/var/log/journal:ro",
"/etc/kolla/fluentd/:/var/lib/kolla/config_files/:ro"
]
self.dw = get_DockerWorker(self.fake_data['params'])
self.dw.create_volume = mock.MagicMock()
self.dw.create_container()
expected_calls = [
mock.call(name="kolla_logs"),
mock.call(name="fluentd_data")
]
self.dw.create_volume.assert_has_calls(expected_calls, any_order=True)
self.assertEqual(self.dw.create_volume.call_count, 2)
def test_start_container_without_pull(self):
self.fake_data['params'].update({'auth_username': 'fake_user',
'auth_password': 'fake_psw',
@ -1081,7 +1100,8 @@ class TestVolume(base.BaseTestCase):
self.assertTrue(self.dw.changed)
self.dw.dc.create_volume.assert_called_once_with(
name='rabbitmq',
driver='local')
driver='local',
labels={'kolla_managed': 'true'})
def test_create_volume_exists(self):
self.dw = get_DockerWorker({'name': 'nova_compute',

View File

@ -279,6 +279,25 @@ class TestContainer(base.BaseTestCase):
self.assertTrue(self.pw.changed)
self.assertFalse(self.pw.pc.containers.create.call_args[1]['tmpfs'])
def test_create_container_create_volumes(self):
self.fake_data['params']['volumes'] = [
"kolla_logs:/var/log/kolla/",
"fluentd_data:/var/lib/fluentd/data/",
"/var/log/journal:/var/log/journal:ro",
"/etc/kolla/fluentd/:/var/lib/kolla/config_files/:ro"
]
self.pw = get_PodmanWorker(self.fake_data['params'])
self.pw.create_volume = mock.MagicMock()
self.pw.create_container()
expected_calls = [
mock.call(name="kolla_logs"),
mock.call(name="fluentd_data")
]
self.pw.create_volume.assert_has_calls(expected_calls, any_order=True)
self.assertEqual(self.pw.create_volume.call_count, 2)
def test_start_container_without_pull(self):
self.fake_data['params'].update({'auth_username': 'fake_user',
'auth_password': 'fake_psw',
@ -1004,7 +1023,8 @@ class TestVolume(base.BaseTestCase):
self.assertTrue(self.pw.changed)
self.pw.pc.volumes.create.assert_called_once_with(
name='rabbitmq',
driver='local')
driver='local',
labels={'kolla_managed': 'true'})
def test_create_volume_exists(self):
self.pw = get_PodmanWorker({'name': 'nova_compute',