|
|
|
@ -19,6 +19,8 @@
|
|
|
|
|
#
|
|
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
|
|
from colorama import Fore
|
|
|
|
|
from difflib import unified_diff
|
|
|
|
|
from functools import wraps
|
|
|
|
|
from json import dump as jdump
|
|
|
|
|
from json import dumps as jdumps
|
|
|
|
@ -26,7 +28,7 @@ from json import loads as jloads
|
|
|
|
|
from os import environ, makedirs, path
|
|
|
|
|
from pkg_resources import get_distribution
|
|
|
|
|
from lxml.etree import fromstring, tostring
|
|
|
|
|
from re import sub
|
|
|
|
|
from re import sub, match
|
|
|
|
|
from yaml import load as yload
|
|
|
|
|
from yaml import SafeLoader as SafeYAMLLoader
|
|
|
|
|
|
|
|
|
@ -1196,7 +1198,7 @@ def cli_vm_modify(
|
|
|
|
|
text=current_vm_cfgfile, require_save=True, extension=".xml"
|
|
|
|
|
)
|
|
|
|
|
if new_vm_cfgfile is None:
|
|
|
|
|
echo("Aborting with no modifications.")
|
|
|
|
|
echo(CLI_CONFIG, "Aborting with no modifications.")
|
|
|
|
|
exit(0)
|
|
|
|
|
else:
|
|
|
|
|
new_vm_cfgfile = new_vm_cfgfile.strip()
|
|
|
|
@ -1208,16 +1210,14 @@ def cli_vm_modify(
|
|
|
|
|
cfgfile.close()
|
|
|
|
|
|
|
|
|
|
echo(
|
|
|
|
|
CLI_CONFIG,
|
|
|
|
|
'Replacing configuration of VM "{}" with file "{}".'.format(
|
|
|
|
|
dom_name, cfgfile.name
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Show a diff and confirm
|
|
|
|
|
echo("Pending modifications:")
|
|
|
|
|
echo("")
|
|
|
|
|
diff = list(
|
|
|
|
|
difflib.unified_diff(
|
|
|
|
|
unified_diff(
|
|
|
|
|
current_vm_cfgfile.split("\n"),
|
|
|
|
|
new_vm_cfgfile.split("\n"),
|
|
|
|
|
fromfile="current",
|
|
|
|
@ -1228,16 +1228,23 @@ def cli_vm_modify(
|
|
|
|
|
lineterm="",
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
if len(diff) < 1:
|
|
|
|
|
echo(CLI_CONFIG, "Aborting with no modifications.")
|
|
|
|
|
exit(0)
|
|
|
|
|
|
|
|
|
|
# Show a diff and confirm
|
|
|
|
|
echo(CLI_CONFIG, "Pending modifications:")
|
|
|
|
|
echo(CLI_CONFIG, "")
|
|
|
|
|
for line in diff:
|
|
|
|
|
if re.match(r"^\+", line) is not None:
|
|
|
|
|
echo(colorama.Fore.GREEN + line + colorama.Fore.RESET)
|
|
|
|
|
elif re.match(r"^\-", line) is not None:
|
|
|
|
|
echo(colorama.Fore.RED + line + colorama.Fore.RESET)
|
|
|
|
|
elif re.match(r"^\^", line) is not None:
|
|
|
|
|
echo(colorama.Fore.BLUE + line + colorama.Fore.RESET)
|
|
|
|
|
if match(r"^\+", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.GREEN + line + Fore.RESET)
|
|
|
|
|
elif match(r"^\-", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.RED + line + Fore.RESET)
|
|
|
|
|
elif match(r"^\^", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.BLUE + line + Fore.RESET)
|
|
|
|
|
else:
|
|
|
|
|
echo(line)
|
|
|
|
|
echo("")
|
|
|
|
|
echo(CLI_CONFIG, line)
|
|
|
|
|
echo(CLI_CONFIG, "")
|
|
|
|
|
|
|
|
|
|
# Verify our XML is sensible
|
|
|
|
|
try:
|
|
|
|
@ -3594,7 +3601,7 @@ def cli_storage_volume_upload(pool, name, image_format, image_file):
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(image_file):
|
|
|
|
|
echo("ERROR: File '{}' does not exist!".format(image_file))
|
|
|
|
|
echo(CLI_CONFIG, "ERROR: File '{}' does not exist!".format(image_file))
|
|
|
|
|
exit(1)
|
|
|
|
|
|
|
|
|
|
retcode, retmsg = pvc.lib.storage.ceph_volume_upload(
|
|
|
|
@ -4432,7 +4439,8 @@ def cli_provisioner_template_storage_disk_add(
|
|
|
|
|
|
|
|
|
|
if source_volume and (size or filesystem or mountpoint):
|
|
|
|
|
echo(
|
|
|
|
|
'The "--source-volume" option is not compatible with the "--size", "--filesystem", or "--mountpoint" options.'
|
|
|
|
|
CLI_CONFIG,
|
|
|
|
|
'The "--source-volume" option is not compatible with the "--size", "--filesystem", or "--mountpoint" options.',
|
|
|
|
|
)
|
|
|
|
|
exit(1)
|
|
|
|
|
|
|
|
|
@ -4514,7 +4522,7 @@ def cli_provisioner_userdata_add(name, filename):
|
|
|
|
|
try:
|
|
|
|
|
yload(userdata, Loader=SafeYAMLLoader)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
echo("Error: Userdata document is malformed")
|
|
|
|
|
echo(CLI_CONFIG, "Error: Userdata document is malformed")
|
|
|
|
|
cleanup(False, e)
|
|
|
|
|
|
|
|
|
|
params = dict()
|
|
|
|
@ -4551,7 +4559,7 @@ def cli_provisioner_userdata_modify(name, filename, editor):
|
|
|
|
|
# Grab the current config
|
|
|
|
|
retcode, retdata = pvc.lib.provisioner.userdata_info(CLI_CONFIG, name)
|
|
|
|
|
if not retcode:
|
|
|
|
|
echo(retdata)
|
|
|
|
|
echo(CLI_CONFIG, retdata)
|
|
|
|
|
exit(1)
|
|
|
|
|
current_userdata = retdata["userdata"].strip()
|
|
|
|
|
|
|
|
|
@ -4559,16 +4567,14 @@ def cli_provisioner_userdata_modify(name, filename, editor):
|
|
|
|
|
text=current_userdata, require_save=True, extension=".yaml"
|
|
|
|
|
)
|
|
|
|
|
if new_userdata is None:
|
|
|
|
|
echo("Aborting with no modifications.")
|
|
|
|
|
echo(CLI_CONFIG, "Aborting with no modifications.")
|
|
|
|
|
exit(0)
|
|
|
|
|
else:
|
|
|
|
|
new_userdata = new_userdata.strip()
|
|
|
|
|
|
|
|
|
|
# Show a diff and confirm
|
|
|
|
|
echo("Pending modifications:")
|
|
|
|
|
echo("")
|
|
|
|
|
diff = list(
|
|
|
|
|
difflib.unified_diff(
|
|
|
|
|
unified_diff(
|
|
|
|
|
current_userdata.split("\n"),
|
|
|
|
|
new_userdata.split("\n"),
|
|
|
|
|
fromfile="current",
|
|
|
|
@ -4579,16 +4585,22 @@ def cli_provisioner_userdata_modify(name, filename, editor):
|
|
|
|
|
lineterm="",
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
if len(diff) < 1:
|
|
|
|
|
echo(CLI_CONFIG, "Aborting with no modifications.")
|
|
|
|
|
exit(0)
|
|
|
|
|
|
|
|
|
|
echo(CLI_CONFIG, "Pending modifications:")
|
|
|
|
|
echo(CLI_CONFIG, "")
|
|
|
|
|
for line in diff:
|
|
|
|
|
if re.match(r"^\+", line) is not None:
|
|
|
|
|
echo(colorama.Fore.GREEN + line + colorama.Fore.RESET)
|
|
|
|
|
elif re.match(r"^\-", line) is not None:
|
|
|
|
|
echo(colorama.Fore.RED + line + colorama.Fore.RESET)
|
|
|
|
|
elif re.match(r"^\^", line) is not None:
|
|
|
|
|
echo(colorama.Fore.BLUE + line + colorama.Fore.RESET)
|
|
|
|
|
if match(r"^\+", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.GREEN + line + Fore.RESET)
|
|
|
|
|
elif match(r"^\-", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.RED + line + Fore.RESET)
|
|
|
|
|
elif match(r"^\^", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.BLUE + line + Fore.RESET)
|
|
|
|
|
else:
|
|
|
|
|
echo(line)
|
|
|
|
|
echo("")
|
|
|
|
|
echo(CLI_CONFIG, line)
|
|
|
|
|
echo(CLI_CONFIG, "")
|
|
|
|
|
|
|
|
|
|
click.confirm("Write modifications to cluster?", abort=True)
|
|
|
|
|
|
|
|
|
@ -4603,7 +4615,7 @@ def cli_provisioner_userdata_modify(name, filename, editor):
|
|
|
|
|
try:
|
|
|
|
|
yload(userdata, Loader=SafeYAMLLoader)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
echo("Error: Userdata document is malformed")
|
|
|
|
|
echo(CLI_CONFIG, "Error: Userdata document is malformed")
|
|
|
|
|
cleanup(False, e)
|
|
|
|
|
|
|
|
|
|
params = dict()
|
|
|
|
@ -4741,22 +4753,20 @@ def cli_provisioner_script_modify(name, filename, editor):
|
|
|
|
|
# Grab the current config
|
|
|
|
|
retcode, retdata = pvc.lib.provisioner.script_info(CLI_CONFIG, name)
|
|
|
|
|
if not retcode:
|
|
|
|
|
echo(retdata)
|
|
|
|
|
echo(CLI_CONFIG, retdata)
|
|
|
|
|
exit(1)
|
|
|
|
|
current_script = retdata["script"].strip()
|
|
|
|
|
|
|
|
|
|
new_script = click.edit(text=current_script, require_save=True, extension=".py")
|
|
|
|
|
if new_script is None:
|
|
|
|
|
echo("Aborting with no modifications.")
|
|
|
|
|
echo(CLI_CONFIG, "Aborting with no modifications.")
|
|
|
|
|
exit(0)
|
|
|
|
|
else:
|
|
|
|
|
new_script = new_script.strip()
|
|
|
|
|
|
|
|
|
|
# Show a diff and confirm
|
|
|
|
|
echo("Pending modifications:")
|
|
|
|
|
echo("")
|
|
|
|
|
diff = list(
|
|
|
|
|
difflib.unified_diff(
|
|
|
|
|
unified_diff(
|
|
|
|
|
current_script.split("\n"),
|
|
|
|
|
new_script.split("\n"),
|
|
|
|
|
fromfile="current",
|
|
|
|
@ -4767,16 +4777,22 @@ def cli_provisioner_script_modify(name, filename, editor):
|
|
|
|
|
lineterm="",
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
if len(diff) < 1:
|
|
|
|
|
echo(CLI_CONFIG, "Aborting with no modifications.")
|
|
|
|
|
exit(0)
|
|
|
|
|
|
|
|
|
|
echo(CLI_CONFIG, "Pending modifications:")
|
|
|
|
|
echo(CLI_CONFIG, "")
|
|
|
|
|
for line in diff:
|
|
|
|
|
if re.match(r"^\+", line) is not None:
|
|
|
|
|
echo(colorama.Fore.GREEN + line + colorama.Fore.RESET)
|
|
|
|
|
elif re.match(r"^\-", line) is not None:
|
|
|
|
|
echo(colorama.Fore.RED + line + colorama.Fore.RESET)
|
|
|
|
|
elif re.match(r"^\^", line) is not None:
|
|
|
|
|
echo(colorama.Fore.BLUE + line + colorama.Fore.RESET)
|
|
|
|
|
if match(r"^\+", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.GREEN + line + Fore.RESET)
|
|
|
|
|
elif match(r"^\-", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.RED + line + Fore.RESET)
|
|
|
|
|
elif match(r"^\^", line) is not None:
|
|
|
|
|
echo(CLI_CONFIG, Fore.BLUE + line + Fore.RESET)
|
|
|
|
|
else:
|
|
|
|
|
echo(line)
|
|
|
|
|
echo("")
|
|
|
|
|
echo(CLI_CONFIG, line)
|
|
|
|
|
echo(CLI_CONFIG, "")
|
|
|
|
|
|
|
|
|
|
click.confirm("Write modifications to cluster?", abort=True)
|
|
|
|
|
|
|
|
|
@ -4897,7 +4913,7 @@ def cli_provisioner_ova_upload(name, filename, pool):
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(filename):
|
|
|
|
|
echo("ERROR: File '{}' does not exist!".format(filename))
|
|
|
|
|
echo(CLI_CONFIG, "ERROR: File '{}' does not exist!".format(filename))
|
|
|
|
|
exit(1)
|
|
|
|
|
|
|
|
|
|
params = dict()
|
|
|
|
|