Compare commits
13 Commits
v0.9.104
...
60967b5606
Author | SHA1 | Date | |
---|---|---|---|
60967b5606 | |||
89bfbe1fd8 | |||
be092756a9 | |||
387fcfdf6b | |||
d695e855f9 | |||
309b203f5d | |||
de4241161e | |||
1950d22876 | |||
7a32d8da9d | |||
e3b8673789 | |||
9db46d48e4 | |||
d74c3a2d45 | |||
f4e946c262 |
12
CHANGELOG.md
12
CHANGELOG.md
@ -1,5 +1,17 @@
|
|||||||
## PVC Changelog
|
## PVC Changelog
|
||||||
|
|
||||||
|
###### [v0.9.107](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.107)
|
||||||
|
|
||||||
|
* [Worker Daemon] Fixes a bug where snapshot removal fails during autobackups
|
||||||
|
|
||||||
|
###### [v0.9.106](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.106)
|
||||||
|
|
||||||
|
* [API Daemon] Fixes a calculation bug when checking storage free space
|
||||||
|
|
||||||
|
###### [v0.9.105](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.105)
|
||||||
|
|
||||||
|
* [API Daemon/Provisioner] Corrects some small bugs with OVA handling
|
||||||
|
|
||||||
###### [v0.9.104](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.104)
|
###### [v0.9.104](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.104)
|
||||||
|
|
||||||
* [API Daemon] Fixes a bug that failed uploading of RAW block devices in "storage volume upload"
|
* [API Daemon] Fixes a bug that failed uploading of RAW block devices in "storage volume upload"
|
||||||
|
@ -81,6 +81,7 @@ def create_app():
|
|||||||
print("|--------------------------------------------------------------|")
|
print("|--------------------------------------------------------------|")
|
||||||
print("| Parallel Virtual Cluster API daemon v{0: <23} |".format(version))
|
print("| Parallel Virtual Cluster API daemon v{0: <23} |".format(version))
|
||||||
print("| Debug: {0: <53} |".format(str(config["debug"])))
|
print("| Debug: {0: <53} |".format(str(config["debug"])))
|
||||||
|
print("| Cluster: {0: <51} |".format(config["cluster_name"]))
|
||||||
print("| API version: v{0: <46} |".format(API_VERSION))
|
print("| API version: v{0: <46} |".format(API_VERSION))
|
||||||
print(
|
print(
|
||||||
"| Listen: {0: <52} |".format(
|
"| Listen: {0: <52} |".format(
|
||||||
|
@ -179,6 +179,10 @@ def upload_ova(zkhandler, pool, name, ova_size):
|
|||||||
}
|
}
|
||||||
retcode = 400
|
retcode = 400
|
||||||
return output, retcode
|
return output, retcode
|
||||||
|
else:
|
||||||
|
ova_script = "default_ova"
|
||||||
|
else:
|
||||||
|
ova_script = "ova"
|
||||||
|
|
||||||
ova_archive = None
|
ova_archive = None
|
||||||
|
|
||||||
@ -397,7 +401,14 @@ def upload_ova(zkhandler, pool, name, ova_size):
|
|||||||
vnc = False
|
vnc = False
|
||||||
serial = True
|
serial = True
|
||||||
retdata, retcode = provisioner.create_template_system(
|
retdata, retcode = provisioner.create_template_system(
|
||||||
name, vcpu_count, vram_mb, serial, vnc, vnc_bind=None, ova=ova_id
|
name,
|
||||||
|
vcpu_count,
|
||||||
|
vram_mb,
|
||||||
|
serial,
|
||||||
|
vnc,
|
||||||
|
vnc_bind=None,
|
||||||
|
ova=ova_id,
|
||||||
|
migration_max_downtime=300,
|
||||||
)
|
)
|
||||||
if retcode != 200:
|
if retcode != 200:
|
||||||
return retdata, retcode
|
return retdata, retcode
|
||||||
@ -414,7 +425,7 @@ def upload_ova(zkhandler, pool, name, ova_size):
|
|||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
userdata=None,
|
userdata=None,
|
||||||
script="default_ova",
|
script=ova_script,
|
||||||
ova=name,
|
ova=name,
|
||||||
arguments=None,
|
arguments=None,
|
||||||
)
|
)
|
||||||
|
@ -221,7 +221,7 @@ def create_template_system(
|
|||||||
node_selector=None,
|
node_selector=None,
|
||||||
node_autostart=False,
|
node_autostart=False,
|
||||||
migration_method=None,
|
migration_method=None,
|
||||||
migration_max_downtime=None,
|
migration_max_downtime=300,
|
||||||
ova=None,
|
ova=None,
|
||||||
):
|
):
|
||||||
if list_template_system(name, is_fuzzy=False)[-1] != 404:
|
if list_template_system(name, is_fuzzy=False)[-1] != 404:
|
||||||
|
@ -221,7 +221,7 @@ def cli_cluster_status_format_pretty(CLI_CONFIG, data):
|
|||||||
continue
|
continue
|
||||||
if state in ["start"]:
|
if state in ["start"]:
|
||||||
state_colour = ansii["green"]
|
state_colour = ansii["green"]
|
||||||
elif state in ["migrate", "disable", "provision", "mirror"]:
|
elif state in ["migrate", "disable", "provision"]:
|
||||||
state_colour = ansii["blue"]
|
state_colour = ansii["blue"]
|
||||||
elif state in ["mirror"]:
|
elif state in ["mirror"]:
|
||||||
state_colour = ansii["purple"]
|
state_colour = ansii["purple"]
|
||||||
@ -331,7 +331,7 @@ def cli_cluster_status_format_short(CLI_CONFIG, data):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
messages = "\n ".join(message_list)
|
messages = "\n ".join(message_list)
|
||||||
else:
|
else:
|
||||||
messages = "None"
|
messages = "None"
|
||||||
output.append(f"{ansii['purple']}Active faults:{ansii['end']} {messages}")
|
output.append(f"{ansii['purple']}Active faults:{ansii['end']} {messages}")
|
||||||
|
@ -2,7 +2,7 @@ from setuptools import setup
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="pvc",
|
name="pvc",
|
||||||
version="0.9.104",
|
version="0.9.107",
|
||||||
packages=["pvc.cli", "pvc.lib"],
|
packages=["pvc.cli", "pvc.lib"],
|
||||||
install_requires=[
|
install_requires=[
|
||||||
"Click",
|
"Click",
|
||||||
|
@ -469,15 +469,16 @@ def run_vm_backup(zkhandler, celery, config, vm_detail, force_full=False):
|
|||||||
|
|
||||||
if len(marked_for_deletion) > 0:
|
if len(marked_for_deletion) > 0:
|
||||||
for backup_to_delete in marked_for_deletion:
|
for backup_to_delete in marked_for_deletion:
|
||||||
ret = vm.vm_worker_remove_snapshot(
|
try:
|
||||||
zkhandler, None, vm_name, backup_to_delete["snapshot_name"]
|
ret = vm.vm_worker_remove_snapshot(
|
||||||
)
|
zkhandler, None, vm_name, backup_to_delete["snapshot_name"]
|
||||||
if ret is False:
|
)
|
||||||
error_message = f"Failed to remove obsolete backup snapshot '{backup_to_delete['snapshot_name']}', leaving in tracked backups"
|
except Exception:
|
||||||
|
error_message = f"Failed to remove obsolete backup snapshot '{backup_to_delete['snapshot_name']}', removing from tracked backups anyways"
|
||||||
log_err(celery, error_message)
|
log_err(celery, error_message)
|
||||||
else:
|
|
||||||
rmtree(f"{vm_backup_path}/{backup_to_delete['snapshot_name']}")
|
rmtree(f"{vm_backup_path}/{backup_to_delete['snapshot_name']}")
|
||||||
tracked_backups.remove(backup_to_delete)
|
tracked_backups.remove(backup_to_delete)
|
||||||
|
|
||||||
tracked_backups = update_tracked_backups()
|
tracked_backups = update_tracked_backups()
|
||||||
return tracked_backups
|
return tracked_backups
|
||||||
|
@ -121,6 +121,9 @@ def format_bytes_tohuman(databytes):
|
|||||||
|
|
||||||
|
|
||||||
def format_bytes_fromhuman(datahuman):
|
def format_bytes_fromhuman(datahuman):
|
||||||
|
if not isinstance(datahuman, str):
|
||||||
|
datahuman = str(datahuman)
|
||||||
|
|
||||||
if not re.search(r"[A-Za-z]+", datahuman):
|
if not re.search(r"[A-Za-z]+", datahuman):
|
||||||
dataunit = "B"
|
dataunit = "B"
|
||||||
datasize = float(datahuman)
|
datasize = float(datahuman)
|
||||||
@ -593,11 +596,11 @@ def add_volume(zkhandler, pool, name, size, force_flag=False, zk_only=False):
|
|||||||
|
|
||||||
# Check if we're greater than 80% utilization after the create; error if so unless we have the force flag
|
# Check if we're greater than 80% utilization after the create; error if so unless we have the force flag
|
||||||
pool_total_bytes = (
|
pool_total_bytes = (
|
||||||
int(pool_information["stats"]["used_bytes"]) + pool_total_free_bytes
|
int(pool_information["stats"]["stored_bytes"]) + pool_total_free_bytes
|
||||||
)
|
)
|
||||||
pool_safe_total_bytes = int(pool_total_bytes * 0.80)
|
pool_safe_total_bytes = int(pool_total_bytes * 0.80)
|
||||||
pool_safe_free_bytes = pool_safe_total_bytes - int(
|
pool_safe_free_bytes = pool_safe_total_bytes - int(
|
||||||
pool_information["stats"]["used_bytes"]
|
pool_information["stats"]["stored_bytes"]
|
||||||
)
|
)
|
||||||
if size_bytes >= pool_safe_free_bytes and not force_flag:
|
if size_bytes >= pool_safe_free_bytes and not force_flag:
|
||||||
return (
|
return (
|
||||||
@ -653,11 +656,11 @@ def clone_volume(zkhandler, pool, name_src, name_new, force_flag=False):
|
|||||||
|
|
||||||
# Check if we're greater than 80% utilization after the create; error if so unless we have the force flag
|
# Check if we're greater than 80% utilization after the create; error if so unless we have the force flag
|
||||||
pool_total_bytes = (
|
pool_total_bytes = (
|
||||||
int(pool_information["stats"]["used_bytes"]) + pool_total_free_bytes
|
int(pool_information["stats"]["stored_bytes"]) + pool_total_free_bytes
|
||||||
)
|
)
|
||||||
pool_safe_total_bytes = int(pool_total_bytes * 0.80)
|
pool_safe_total_bytes = int(pool_total_bytes * 0.80)
|
||||||
pool_safe_free_bytes = pool_safe_total_bytes - int(
|
pool_safe_free_bytes = pool_safe_total_bytes - int(
|
||||||
pool_information["stats"]["used_bytes"]
|
pool_information["stats"]["stored_bytes"]
|
||||||
)
|
)
|
||||||
if size_bytes >= pool_safe_free_bytes and not force_flag:
|
if size_bytes >= pool_safe_free_bytes and not force_flag:
|
||||||
return (
|
return (
|
||||||
@ -718,11 +721,11 @@ def resize_volume(zkhandler, pool, name, size, force_flag=False):
|
|||||||
|
|
||||||
# Check if we're greater than 80% utilization after the create; error if so unless we have the force flag
|
# Check if we're greater than 80% utilization after the create; error if so unless we have the force flag
|
||||||
pool_total_bytes = (
|
pool_total_bytes = (
|
||||||
int(pool_information["stats"]["used_bytes"]) + pool_total_free_bytes
|
int(pool_information["stats"]["stored_bytes"]) + pool_total_free_bytes
|
||||||
)
|
)
|
||||||
pool_safe_total_bytes = int(pool_total_bytes * 0.80)
|
pool_safe_total_bytes = int(pool_total_bytes * 0.80)
|
||||||
pool_safe_free_bytes = pool_safe_total_bytes - int(
|
pool_safe_free_bytes = pool_safe_total_bytes - int(
|
||||||
pool_information["stats"]["used_bytes"]
|
pool_information["stats"]["stored_bytes"]
|
||||||
)
|
)
|
||||||
if size_bytes >= pool_safe_free_bytes and not force_flag:
|
if size_bytes >= pool_safe_free_bytes and not force_flag:
|
||||||
return (
|
return (
|
||||||
|
@ -496,6 +496,7 @@ def getClusterInformation(zkhandler):
|
|||||||
|
|
||||||
# Format the status data
|
# Format the status data
|
||||||
cluster_information = {
|
cluster_information = {
|
||||||
|
"cluster_name": zkhandler.read("base.config"),
|
||||||
"cluster_health": getClusterHealthFromFaults(zkhandler, faults_data),
|
"cluster_health": getClusterHealthFromFaults(zkhandler, faults_data),
|
||||||
"node_health": getNodeHealth(zkhandler, node_list),
|
"node_health": getNodeHealth(zkhandler, node_list),
|
||||||
"maintenance": maintenance_state,
|
"maintenance": maintenance_state,
|
||||||
|
@ -1212,3 +1212,7 @@ def get_detect_device(detect_string):
|
|||||||
return device
|
return device
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def translate_domains_to_names(zkhandler, domain_list):
|
||||||
|
return list(zkhandler.read_many([("domain.name", d) for d in domain_list]))
|
||||||
|
@ -142,7 +142,9 @@ def getNodeInformation(zkhandler, node_name):
|
|||||||
node_mem_free = int(_node_mem_free)
|
node_mem_free = int(_node_mem_free)
|
||||||
node_load = float(_node_load)
|
node_load = float(_node_load)
|
||||||
node_domains_count = int(_node_domains_count)
|
node_domains_count = int(_node_domains_count)
|
||||||
node_running_domains = _node_running_domains.split()
|
node_running_domains = common.translate_domains_to_names(
|
||||||
|
zkhandler, _node_running_domains.split()
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
node_health = int(_node_health)
|
node_health = int(_node_health)
|
||||||
|
18
debian/changelog
vendored
18
debian/changelog
vendored
@ -1,3 +1,21 @@
|
|||||||
|
pvc (0.9.107-0) unstable; urgency=high
|
||||||
|
|
||||||
|
* [Worker Daemon] Fixes a bug where snapshot removal fails during autobackups
|
||||||
|
|
||||||
|
-- Joshua M. Boniface <joshua@boniface.me> Mon, 10 Feb 2025 23:15:21 -0500
|
||||||
|
|
||||||
|
pvc (0.9.106-0) unstable; urgency=high
|
||||||
|
|
||||||
|
* [API Daemon] Fixes a calculation bug when checking storage free space
|
||||||
|
|
||||||
|
-- Joshua M. Boniface <joshua@boniface.me> Mon, 09 Dec 2024 16:45:10 -0500
|
||||||
|
|
||||||
|
pvc (0.9.105-0) unstable; urgency=high
|
||||||
|
|
||||||
|
* [API Daemon/Provisioner] Corrects some small bugs with OVA handling
|
||||||
|
|
||||||
|
-- Joshua M. Boniface <joshua@boniface.me> Tue, 19 Nov 2024 14:43:43 -0500
|
||||||
|
|
||||||
pvc (0.9.104-0) unstable; urgency=high
|
pvc (0.9.104-0) unstable; urgency=high
|
||||||
|
|
||||||
* [API Daemon] Fixes a bug that failed uploading of RAW block devices in "storage volume upload"
|
* [API Daemon] Fixes a bug that failed uploading of RAW block devices in "storage volume upload"
|
||||||
|
@ -33,7 +33,7 @@ import os
|
|||||||
import signal
|
import signal
|
||||||
|
|
||||||
# Daemon version
|
# Daemon version
|
||||||
version = "0.9.104"
|
version = "0.9.107"
|
||||||
|
|
||||||
|
|
||||||
##########################################################
|
##########################################################
|
||||||
@ -64,6 +64,7 @@ def entrypoint():
|
|||||||
logger.out("|--------------------------------------------------------------|")
|
logger.out("|--------------------------------------------------------------|")
|
||||||
logger.out("| Parallel Virtual Cluster health daemon v{0: <20} |".format(version))
|
logger.out("| Parallel Virtual Cluster health daemon v{0: <20} |".format(version))
|
||||||
logger.out("| Debug: {0: <53} |".format(str(config["debug"])))
|
logger.out("| Debug: {0: <53} |".format(str(config["debug"])))
|
||||||
|
logger.out("| Cluster: {0: <51} |".format(config["cluster_name"]))
|
||||||
logger.out("| FQDN: {0: <54} |".format(config["node_fqdn"]))
|
logger.out("| FQDN: {0: <54} |".format(config["node_fqdn"]))
|
||||||
logger.out("| Host: {0: <54} |".format(config["node_hostname"]))
|
logger.out("| Host: {0: <54} |".format(config["node_hostname"]))
|
||||||
logger.out("| ID: {0: <56} |".format(config["node_id"]))
|
logger.out("| ID: {0: <56} |".format(config["node_id"]))
|
||||||
|
@ -49,7 +49,7 @@ import re
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
# Daemon version
|
# Daemon version
|
||||||
version = "0.9.104"
|
version = "0.9.107"
|
||||||
|
|
||||||
|
|
||||||
##########################################################
|
##########################################################
|
||||||
@ -83,6 +83,7 @@ def entrypoint():
|
|||||||
logger.out("|--------------------------------------------------------------|")
|
logger.out("|--------------------------------------------------------------|")
|
||||||
logger.out("| Parallel Virtual Cluster node daemon v{0: <22} |".format(version))
|
logger.out("| Parallel Virtual Cluster node daemon v{0: <22} |".format(version))
|
||||||
logger.out("| Debug: {0: <53} |".format(str(config["debug"])))
|
logger.out("| Debug: {0: <53} |".format(str(config["debug"])))
|
||||||
|
logger.out("| Cluster: {0: <51} |".format(config["cluster_name"]))
|
||||||
logger.out("| FQDN: {0: <54} |".format(config["node_fqdn"]))
|
logger.out("| FQDN: {0: <54} |".format(config["node_fqdn"]))
|
||||||
logger.out("| Host: {0: <54} |".format(config["node_hostname"]))
|
logger.out("| Host: {0: <54} |".format(config["node_hostname"]))
|
||||||
logger.out("| ID: {0: <56} |".format(config["node_id"]))
|
logger.out("| ID: {0: <56} |".format(config["node_id"]))
|
||||||
@ -301,6 +302,9 @@ def entrypoint():
|
|||||||
# Set up this node in Zookeeper
|
# Set up this node in Zookeeper
|
||||||
pvcnoded.util.zookeeper.setup_node(logger, config, zkhandler)
|
pvcnoded.util.zookeeper.setup_node(logger, config, zkhandler)
|
||||||
|
|
||||||
|
# Set the cluster name in Zookeeper
|
||||||
|
zkhandler.write([("base.config", config["cluster_name"])])
|
||||||
|
|
||||||
# Check that the primary node key exists and create it with us as primary if not
|
# Check that the primary node key exists and create it with us as primary if not
|
||||||
try:
|
try:
|
||||||
current_primary = zkhandler.read("base.config.primary_node")
|
current_primary = zkhandler.read("base.config.primary_node")
|
||||||
|
@ -58,7 +58,7 @@ from daemon_lib.automirror import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Daemon version
|
# Daemon version
|
||||||
version = "0.9.104"
|
version = "0.9.107"
|
||||||
|
|
||||||
|
|
||||||
config = cfg.get_configuration()
|
config = cfg.get_configuration()
|
||||||
|
Reference in New Issue
Block a user