summaryrefslogtreecommitdiff
path: root/ironic_python_agent/utils.py
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-12-21 14:09:04 +0000
committerGerrit Code Review <review@openstack.org>2020-12-21 14:09:04 +0000
commit8d5862d8b2ea9123807042e44e4263a5196b68e7 (patch)
treec9562eebe157be6a1523f23eb29e4620b860337c /ironic_python_agent/utils.py
parent4fb8163717e94468da08090ebfa8b137076d744a (diff)
parentd69f12e0fd379d57443c73c169149593a6a87240 (diff)
downloadironic-python-agent-8d5862d8b2ea9123807042e44e4263a5196b68e7.tar.gz
Merge "Handle situation when a configdrive is already mounted"6.5.0
Diffstat (limited to 'ironic_python_agent/utils.py')
-rw-r--r--ironic_python_agent/utils.py62
1 files changed, 39 insertions, 23 deletions
diff --git a/ironic_python_agent/utils.py b/ironic_python_agent/utils.py
index b2310d00..a897210e 100644
--- a/ironic_python_agent/utils.py
+++ b/ironic_python_agent/utils.py
@@ -212,6 +212,39 @@ def _early_log(msg, *args):
print('ironic-python-agent:', msg % args, file=sys.stderr)
+def _copy_config_from(path):
+ for ext in ('', '.d'):
+ src = os.path.join(path, 'etc', 'ironic-python-agent%s' % ext)
+ if not os.path.isdir(src):
+ _early_log('%s not found', src)
+ continue
+
+ dest = '/etc/ironic-python-agent%s' % ext
+ _early_log('Copying configuration from %s to %s', src, dest)
+ try:
+ os.makedirs(dest, exist_ok=True)
+
+ # TODO(dtantsur): use shutil.copytree(.., dirs_exist_ok=True)
+ # when the minimum supported Python is 3.8.
+ for name in os.listdir(src):
+ src_file = os.path.join(src, name)
+ dst_file = os.path.join(dest, name)
+ shutil.copy(src_file, dst_file)
+ except Exception as exc:
+ msg = ("Unable to copy vmedia configuration %s to %s: %s"
+ % (src, dest, exc))
+ raise errors.VirtualMediaBootError(msg)
+
+
+def _find_mount_point(device):
+ try:
+ path, _e = execute('findmnt', '-n', '-oTARGET', device)
+ except processutils.ProcessExecutionError:
+ return
+ else:
+ return path.strip()
+
+
def copy_config_from_vmedia():
"""Copies any configuration from a virtual media device.
@@ -223,29 +256,12 @@ def copy_config_from_vmedia():
_early_log('No virtual media device detected')
return
- with _mounted(vmedia_device_file) as vmedia_mount_point:
- for ext in ('', '.d'):
- src = os.path.join(vmedia_mount_point, 'etc',
- 'ironic-python-agent%s' % ext)
- if not os.path.isdir(src):
- _early_log('%s not found', src)
- continue
-
- dest = '/etc/ironic-python-agent%s' % ext
- _early_log('Copying configuration from %s to %s', src, dest)
- try:
- os.makedirs(dest, exist_ok=True)
-
- # TODO(dtantsur): use shutil.copytree(.., dirs_exist_ok=True)
- # when the minimum supported Python is 3.8.
- for name in os.listdir(src):
- src_file = os.path.join(src, name)
- dst_file = os.path.join(dest, name)
- shutil.copy(src_file, dst_file)
- except Exception as exc:
- msg = ("Unable to copy vmedia configuration %s to %s: %s"
- % (src, dest, exc))
- raise errors.VirtualMediaBootError(msg)
+ mounted = _find_mount_point(vmedia_device_file)
+ if mounted:
+ _copy_config_from(mounted)
+ else:
+ with _mounted(vmedia_device_file) as vmedia_mount_point:
+ _copy_config_from(vmedia_mount_point)
def _get_cached_params():