ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.load_host_keys(expanduser(join("~", ".ssh", "known_hosts"))) ssh.connect(server) # Undefine the masters disks_to_remove = {} defined_clones_names = [] for master_name in machines_to_clone: clone_name = cfg.get(master_name, "clone_name") # Check that we got a replacement before removing if not is_defined_guest(conn, clone_name): continue defined_clones_names.append(clone_name) # Make sure master and clone are inactive clone_guest = conn.lookupByName(clone_name) master_guest = conn.lookupByName(master_name) if clone_guest.isActive(): clone_guest.destroy() if master_guest.isActive(): master_guest.destroy() # Copy clone disk onto master disk disk_to_replace = disk_path_from_guest_name(conn, master_name) disk_to_copy = disk_path_from_guest_name(conn, clone_name) command = "cp %s %s" % (disk_to_replace, disk_to_copy) ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(command)
import sys from xml.etree import ElementTree from common import parse_cfg, is_defined_guest, remove_all_disks, disk_path_from_guest_name if __name__ == "__main__": if not len(sys.argv) == 2: print USAGE sys.exit(1) conn, machines_to_clone, cfg, xmlfilepath = parse_cfg(sys.argv[1]) clone_names = [cfg.get(orig_name, "clone_name") for orig_name in machines_to_clone] # For some reason, some clones may not have been defined defined_clone_names = [clone_name for clone_name in clone_names if is_defined_guest(conn, clone_name)] # Processing data and removing disks_to_remove = [disk_path_from_guest_name(conn, clone_name) for clone_name in defined_clone_names] # The disks will be removed after we destroy the machines. for clone_name in defined_clone_names: clone_guest = conn.lookupByName(clone_name) if clone_guest.isActive(): clone_guest.destroy() clone_guest.undefine() remove_all_disks(conn, disks_to_remove)