98 lines
3.4 KiB
Diff
98 lines
3.4 KiB
Diff
Subject: cloner: clone serial files
|
|
From: Oleg Vasilev oleg.vasilev@virtuozzo.com Wed Nov 30 22:01:08 2022 +0600
|
|
Date: Wed Mar 22 17:44:06 2023 -0400:
|
|
Git: b2f6e953831aba9ab7cc4b8673c237c3bb434100
|
|
|
|
Before this, on clone the serial file would remain the same for the cloned
|
|
domain. This doesn't make much sense as the output would be an intermix of two
|
|
unrelated output sequences.
|
|
|
|
Here we apply the the same filename changing algorithm, as with disk files.
|
|
|
|
Signed-off-by: Oleg Vasilev <oleg.vasilev@virtuozzo.com>
|
|
|
|
diff --git a/virtinst/cloner.py b/virtinst/cloner.py
|
|
index 9334513c..556bfdbb 100644
|
|
--- a/virtinst/cloner.py
|
|
+++ b/virtinst/cloner.py
|
|
@@ -9,6 +9,7 @@
|
|
|
|
import re
|
|
import os
|
|
+from itertools import chain
|
|
|
|
import libvirt
|
|
|
|
@@ -20,6 +21,7 @@ from .devices import DeviceInterface
|
|
from .devices import DeviceDisk
|
|
from .logger import log
|
|
from .devices import DeviceChannel
|
|
+from .devices import DeviceSerial
|
|
|
|
|
|
def _replace_vm(conn, name):
|
|
@@ -70,9 +72,9 @@ def _generate_clone_name(conn, basename):
|
|
sep="", start_num=start_num, force_num=force_num)
|
|
|
|
|
|
-def _generate_clone_disk_path(conn, origname, newname, origpath):
|
|
+def _generate_clone_path(origname, newname, origpath, cb_exists):
|
|
"""
|
|
- Generate desired cloned disk path name, derived from the
|
|
+ Generate desired cloned path for auxiliary files, derived from the
|
|
original path, original VM name, and proposed new VM name
|
|
"""
|
|
if origpath is None:
|
|
@@ -99,9 +101,7 @@ def _generate_clone_disk_path(conn, origname, newname, origpath):
|
|
clonebase = newname
|
|
|
|
clonebase = os.path.join(dirname, clonebase)
|
|
- def cb(p):
|
|
- return DeviceDisk.path_definitely_exists(conn, p)
|
|
- return generatename.generate_name(clonebase, cb, suffix=suffix)
|
|
+ return generatename.generate_name(clonebase, cb_exists, suffix=suffix)
|
|
|
|
|
|
def _lookup_vm(conn, name):
|
|
@@ -287,7 +287,9 @@ class Cloner(object):
|
|
|
|
@staticmethod
|
|
def generate_clone_disk_path(conn, origname, newname, origpath):
|
|
- return _generate_clone_disk_path(conn, origname, newname, origpath)
|
|
+ def cb_exists(p):
|
|
+ return DeviceDisk.path_definitely_exists(conn, p)
|
|
+ return _generate_clone_path(origname, newname, origpath, cb_exists)
|
|
|
|
@staticmethod
|
|
def build_clone_disk(orig_disk, clonepath, allow_create, sparse):
|
|
@@ -455,6 +457,21 @@ class Cloner(object):
|
|
# Functional methods #
|
|
######################
|
|
|
|
+ def _prepare_serial_files(self):
|
|
+ for serial in chain(self._new_guest.devices.console,
|
|
+ self._new_guest.devices.serial):
|
|
+ if serial.type != DeviceSerial.TYPE_FILE:
|
|
+ continue
|
|
+
|
|
+ def cb_exists(path):
|
|
+ # Ignore the check for now
|
|
+ return False
|
|
+
|
|
+ serial.source.path = _generate_clone_path(self.src_name,
|
|
+ self.new_guest.name,
|
|
+ serial.source.path,
|
|
+ cb_exists=cb_exists)
|
|
+
|
|
def _prepare_nvram(self):
|
|
if not self._nvram_diskinfo:
|
|
return
|
|
@@ -534,6 +551,7 @@ class Cloner(object):
|
|
xmldisk.set_source_path(new_disk.get_source_path())
|
|
|
|
self._prepare_nvram()
|
|
+ self._prepare_serial_files()
|
|
|
|
# Save altered clone xml
|
|
diff = xmlutil.diff(self._src_guest.get_xml(),
|