Compare commits

..

11 Commits

10 changed files with 106 additions and 55 deletions

View File

@ -1 +1 @@
0.9.66 0.9.69

View File

@ -1,5 +1,18 @@
## PVC Changelog ## PVC Changelog
###### [v0.9.69](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.69)
* [Node Daemon] Ensures that system load is always 2 decimal places on Bookworm
* [Node Daemon] Fixes bug blocking primary takeover at DNS Aggregator start if Patroni is down
###### [v0.9.68](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.68)
* [CLI] Fixes another bug with network info view
###### [v0.9.67](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.67)
* [CLI] Fixes several more bugs in the refactored CLI
###### [v0.9.66](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.66) ###### [v0.9.66](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.66)
* [CLI] Fixes a missing YAML import in CLI * [CLI] Fixes a missing YAML import in CLI

View File

@ -27,7 +27,7 @@ from ssl import SSLContext, TLSVersion
from distutils.util import strtobool as dustrtobool from distutils.util import strtobool as dustrtobool
# Daemon version # Daemon version
version = "0.9.66" version = "0.9.69"
# API version # API version
API_VERSION = 1.0 API_VERSION = 1.0

View File

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

View File

@ -700,7 +700,7 @@ def format_info(config, network_information, long_output):
ainformation.append("") ainformation.append("")
if retcode: if retcode:
dhcp4_reservations_string = format_list_dhcp( dhcp4_reservations_string = format_list_dhcp(
dhcp4_reservations_list config, dhcp4_reservations_list
) )
for line in dhcp4_reservations_string.split("\n"): for line in dhcp4_reservations_string.split("\n"):
ainformation.append(line) ainformation.append(line)

View File

@ -2,7 +2,7 @@ from setuptools import setup
setup( setup(
name="pvc", name="pvc",
version="0.9.66", version="0.9.69",
packages=["pvc.cli", "pvc.lib"], packages=["pvc.cli", "pvc.lib"],
install_requires=[ install_requires=[
"Click", "Click",

19
debian/changelog vendored
View File

@ -1,3 +1,22 @@
pvc (0.9.69-0) unstable; urgency=high
* [Node Daemon] Ensures that system load is always 2 decimal places on Bookworm
* [Node Daemon] Fixes bug blocking primary takeover at DNS Aggregator start if Patroni is down
-- Joshua M. Boniface <joshua@boniface.me> Tue, 29 Aug 2023 22:01:22 -0400
pvc (0.9.68-0) unstable; urgency=high
* [CLI] Fixes another bug with network info view
-- Joshua M. Boniface <joshua@boniface.me> Sun, 27 Aug 2023 20:59:23 -0400
pvc (0.9.67-0) unstable; urgency=high
* [CLI] Fixes several more bugs in the refactored CLI
-- Joshua M. Boniface <joshua@boniface.me> Sun, 27 Aug 2023 14:47:20 -0400
pvc (0.9.66-0) unstable; urgency=high pvc (0.9.66-0) unstable; urgency=high
* [CLI] Fixes a missing YAML import in CLI * [CLI] Fixes a missing YAML import in CLI

View File

@ -49,7 +49,7 @@ import re
import json import json
# Daemon version # Daemon version
version = "0.9.66" version = "0.9.69"
########################################################## ##########################################################

View File

@ -620,9 +620,12 @@ class NodeInstance(object):
for network in self.d_network: for network in self.d_network:
self.d_network[network].startDHCPServer() self.d_network[network].startDHCPServer()
# 9. Start DNS aggregator; just continue if we fail # 9. Start DNS aggregator; just continue if we fail
try:
if not patroni_failed: if not patroni_failed:
self.dns_aggregator.start_aggregator() self.dns_aggregator.start_aggregator()
else: else:
raise
except Exception:
self.logger.out( self.logger.out(
"Not starting DNS aggregator due to Patroni failures", state="e" "Not starting DNS aggregator due to Patroni failures", state="e"
) )

View File

@ -753,7 +753,7 @@ def node_keepalive(logger, config, zkhandler, this_node, monitoring_instance):
this_node.memtotal = int(psutil.virtual_memory().total / 1024 / 1024) this_node.memtotal = int(psutil.virtual_memory().total / 1024 / 1024)
this_node.memused = int(psutil.virtual_memory().used / 1024 / 1024) this_node.memused = int(psutil.virtual_memory().used / 1024 / 1024)
this_node.memfree = int(psutil.virtual_memory().free / 1024 / 1024) this_node.memfree = int(psutil.virtual_memory().free / 1024 / 1024)
this_node.cpuload = os.getloadavg()[0] this_node.cpuload = round(os.getloadavg()[0], 2)
# Join against running threads # Join against running threads
if config["enable_hypervisor"]: if config["enable_hypervisor"]: