Merge "Set nova config for rbd instance folder cleanup after evacuations"

This commit is contained in:
Zuul 2023-08-01 14:01:15 +00:00 committed by Gerrit Code Review
commit c1115f4c5a
4 changed files with 58 additions and 0 deletions

View File

@ -17,6 +17,7 @@ import os
import platform
import shutil
import socket
import subprocess
import uuid
from typing import (
@ -97,6 +98,16 @@ def _network_manager():
return manager()
def is_local_fs(path):
result = False
try:
subprocess.check_call(["df", "-l", path])
result = True
except subprocess.CalledProcessError as e:
log("Error invoking df -l {}: {}".format(path, e), level=DEBUG)
return result
def get_availability_zone():
use_juju_az = config('customize-failure-domain')
juju_az = os.environ.get('JUJU_AVAILABILITY_ZONE')
@ -324,6 +335,17 @@ class NovaComputeLibvirtContext(context.OSContextGenerator):
if config('libvirt-image-backend'):
ctxt['libvirt_images_type'] = config('libvirt-image-backend')
if config('libvirt-image-backend') == 'rbd':
instances_path = config('instances-path')
if instances_path in ('', None):
instances_path = '/var/lib/nova/instances'
if is_local_fs(instances_path):
ctxt['ensure_libvirt_rbd_instance_dir_cleanup'] = True
else:
log("Skipped enabling "
"'ensure_libvirt_rbd_instance_dir_cleanup' because"
" instances-path is not a local mount.",
level=INFO)
ctxt['force_raw_images'] = config('force-raw-images')
ctxt['inject_password'] = config('inject-password')

View File

@ -370,6 +370,9 @@ lock_path=/var/lock/nova
[workarounds]
disable_libvirt_livesnapshot = False
{% if ensure_libvirt_rbd_instance_dir_cleanup -%}
ensure_libvirt_rbd_instance_dir_cleanup = {{ ensure_libvirt_rbd_instance_dir_cleanup }}
{% endif -%}
{% include "parts/section-ephemeral" %}

View File

@ -353,6 +353,9 @@ lock_path=/var/lock/nova
[workarounds]
disable_libvirt_livesnapshot = False
{% if ensure_libvirt_rbd_instance_dir_cleanup -%}
ensure_libvirt_rbd_instance_dir_cleanup = {{ ensure_libvirt_rbd_instance_dir_cleanup }}
{% endif -%}
{% include "parts/section-ephemeral" %}

View File

@ -386,6 +386,36 @@ class NovaComputeContextTests(CharmTestCase):
'reserved_host_disk': 0,
'reserved_host_memory': 512}, libvirt())
@patch.object(context.subprocess, 'check_call')
def test_ensure_rbd_cleanup_rbd(self, call_mock):
self.lsb_release.return_value = {'DISTRIB_CODENAME': 'focal'}
self.os_release.return_value = 'ussuri'
self.test_config.set('libvirt-image-backend', 'rbd')
libvirt = context.NovaComputeLibvirtContext()
result = libvirt()
self.assertIn('ensure_libvirt_rbd_instance_dir_cleanup', result)
self.assertTrue(result['ensure_libvirt_rbd_instance_dir_cleanup'])
call_mock.assert_called_once_with(
['df', '-l', '/var/lib/nova/instances'])
@patch.object(context.subprocess, 'check_call')
def test_ensure_rbd_cleanup_rbd_non_local_mount(self, call_mock):
self.lsb_release.return_value = {'DISTRIB_CODENAME': 'focal'}
self.os_release.return_value = 'ussuri'
call_mock.side_effect = [context.subprocess.CalledProcessError(
1, 'df -l /var/foo/bar')]
self.test_config.set('libvirt-image-backend', 'rbd')
self.test_config.set('instances-path', '/var/foo/bar')
libvirt = context.NovaComputeLibvirtContext()
self.assertNotIn('ensure_libvirt_rbd_instance_dir_cleanup', libvirt())
call_mock.assert_called_once_with(['df', '-l', '/var/foo/bar'])
def test_ensure_rbd_cleanup_non_rbd(self):
self.lsb_release.return_value = {'DISTRIB_CODENAME': 'focal'}
self.os_release.return_value = 'ussuri'
libvirt = context.NovaComputeLibvirtContext()
self.assertNotIn('ensure_libvirt_rbd_instance_dir_cleanup', libvirt())
def test_libvirt_context_inject_password(self):
self.lsb_release.return_value = {'DISTRIB_CODENAME': 'zesty'}
self.os_release.return_value = 'ocata'