Compare commits

..

1 Commits

Author SHA1 Message Date
37e0b6be71 Bump version to 0.9.94 2024-02-05 09:58:07 -05:00
12 changed files with 30 additions and 84 deletions

View File

@@ -1 +1 @@
0.9.95 0.9.94

View File

@@ -1,16 +1,10 @@
## PVC Changelog ## PVC Changelog
###### [v0.9.95](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.95)
* [API Daemon/CLI Client] Adds a flag to allow duplicate VNIs in network templates
* [API Daemon] Ensures that storage template disks are returned in disk ID order
###### [v0.9.94](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.94) ###### [v0.9.94](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.94)
* [CLI Client] Fixes an incorrect ordering issue with autobackup summary emails * [CLI Client] Fixes an incorrect ordering issue with autobackup summary emails
* [API Daemon/CLI Client] Adds an additional safety check for 80% cluster fullness when doing volume adds or resizes * [API Daemon/CLI Client] Adds an additional safety check for 80% cluster fullness when doing volume adds or resizes
* [API Daemon/CLI Client] Adds safety checks to volume clones as well * [API Daemon/CLI Client] Adds safety checks to volume clones as well
* [API Daemon] Fixes a few remaining memory bugs for stopped/disabled VMs
###### [v0.9.93](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.93) ###### [v0.9.93](https://github.com/parallelvirtualcluster/pvc/releases/tag/v0.9.93)

View File

@@ -27,7 +27,7 @@ from distutils.util import strtobool as dustrtobool
import daemon_lib.config as cfg import daemon_lib.config as cfg
# Daemon version # Daemon version
version = "0.9.95" version = "0.9.94"
# API version # API version
API_VERSION = 1.0 API_VERSION = 1.0

View File

@@ -7139,11 +7139,7 @@ class API_Provisioner_Template_Network_Net_Root(Resource):
"name": "vni", "name": "vni",
"required": True, "required": True,
"helptext": "A valid VNI must be specified.", "helptext": "A valid VNI must be specified.",
}, }
{
"name": "permit_duplicate",
"required": False,
},
] ]
) )
@Authenticator @Authenticator
@@ -7159,11 +7155,6 @@ class API_Provisioner_Template_Network_Net_Root(Resource):
type: integer type: integer
required: false required: false
description: PVC network VNI description: PVC network VNI
- in: query
name: permit_duplicate
type: boolean
required: false
description: Bypass checks to permit duplicate VNIs for niche usecases
responses: responses:
200: 200:
description: OK description: OK
@@ -7177,7 +7168,7 @@ class API_Provisioner_Template_Network_Net_Root(Resource):
id: Message id: Message
""" """
return api_provisioner.create_template_network_element( return api_provisioner.create_template_network_element(
template, reqargs.get("vni", None), reqargs.get("permit_duplicate", False) template, reqargs.get("vni", None)
) )
@@ -7215,27 +7206,13 @@ class API_Provisioner_Template_Network_Net_Element(Resource):
return _vni, 200 return _vni, 200
abort(404) abort(404)
@RequestParser(
[
{
"name": "permit_duplicate",
"required": False,
}
]
)
@Authenticator @Authenticator
def post(self, template, vni, reqargs): def post(self, template, vni):
""" """
Create a new network {vni} in network template {template} Create a new network {vni} in network template {template}
--- ---
tags: tags:
- provisioner / template - provisioner / template
parameters:
- in: query
name: permit_duplicate
type: boolean
required: false
description: Bypass checks to permit duplicate VNIs for niche usecases
responses: responses:
200: 200:
description: OK description: OK
@@ -7248,9 +7225,7 @@ class API_Provisioner_Template_Network_Net_Element(Resource):
type: object type: object
id: Message id: Message
""" """
return api_provisioner.create_template_network_element( return api_provisioner.create_template_network_element(template, vni)
template, vni, reqargs.get("permit_duplicate", False)
)
@Authenticator @Authenticator
def delete(self, template, vni): def delete(self, template, vni):

View File

@@ -125,7 +125,7 @@ def list_template(limit, table, is_fuzzy=True):
args = (template_data["id"],) args = (template_data["id"],)
cur.execute(query, args) cur.execute(query, args)
disks = cur.fetchall() disks = cur.fetchall()
data[template_id]["disks"] = sorted(disks, key=lambda x: x["disk_id"]) data[template_id]["disks"] = disks
close_database(conn, cur) close_database(conn, cur)
@@ -284,28 +284,27 @@ def create_template_network(name, mac_template=None):
return retmsg, retcode return retmsg, retcode
def create_template_network_element(name, vni, permit_duplicate=False): def create_template_network_element(name, vni):
if list_template_network(name, is_fuzzy=False)[-1] != 200: if list_template_network(name, is_fuzzy=False)[-1] != 200:
retmsg = {"message": 'The network template "{}" does not exist.'.format(name)} retmsg = {"message": 'The network template "{}" does not exist.'.format(name)}
retcode = 400 retcode = 400
return retmsg, retcode return retmsg, retcode
if not permit_duplicate: networks, code = list_template_network_vnis(name)
networks, code = list_template_network_vnis(name) if code != 200:
if code != 200: networks = []
networks = [] found_vni = False
found_vni = False for network in networks:
for network in networks: if network["vni"] == vni:
if network["vni"] == vni: found_vni = True
found_vni = True if found_vni:
if found_vni: retmsg = {
retmsg = { "message": 'The VNI "{}" in network template "{}" already exists.'.format(
"message": 'The VNI "{}" in network template "{}" already exists.'.format( vni, name
vni, name )
) }
} retcode = 400
retcode = 400 return retmsg, retcode
return retmsg, retcode
conn, cur = open_database(config) conn, cur = open_database(config)
try: try:

View File

@@ -4849,27 +4849,13 @@ def cli_provisioner_template_network_vni():
@connection_req @connection_req
@click.argument("name") @click.argument("name")
@click.argument("vni") @click.argument("vni")
@click.option( def cli_provisioner_template_network_vni_add(name, vni):
"-d",
"--permit-duplicate",
"permit_duplicate_flag",
is_flag=True,
default=False,
help="Permit a duplicate VNI if one already exists",
)
def cli_provisioner_template_network_vni_add(name, vni, permit_duplicate_flag):
""" """
Add a new network VNI to network template NAME. Add a new network VNI to network template NAME.
Networks will be added to VMs in the order they are added and displayed within the template. Networks will be added to VMs in the order they are added and displayed within the template.
NOTE: Normally, the API prevents duplicate VNIs from being added to the same network template
by returning an error, as this requirement is very niche. If you do not desire this behaviour,
use the "-d"/"--permit-duplicate" option to bypass the check.
""" """
params = dict() params = dict()
if permit_duplicate_flag:
params["permit_duplicate"] = True
retcode, retdata = pvc.lib.provisioner.template_element_add( retcode, retdata = pvc.lib.provisioner.template_element_add(
CLI_CONFIG, name, vni, params, element_type="net", template_type="network" CLI_CONFIG, name, vni, params, element_type="net", template_type="network"

View File

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

View File

@@ -1230,7 +1230,7 @@ def get_resource_metrics(zkhandler):
) )
output_lines.append("# TYPE pvc_vm_memory_stats_actual gauge") output_lines.append("# TYPE pvc_vm_memory_stats_actual gauge")
for vm in vm_data: for vm in vm_data:
actual_memory = vm["memory_stats"].get("actual", 0) actual_memory = vm["memory_stats"]["actual"]
output_lines.append( output_lines.append(
f"pvc_vm_memory_stats_actual{{vm=\"{vm['name']}\"}} {actual_memory}" f"pvc_vm_memory_stats_actual{{vm=\"{vm['name']}\"}} {actual_memory}"
) )
@@ -1238,7 +1238,7 @@ def get_resource_metrics(zkhandler):
output_lines.append("# HELP pvc_vm_memory_stats_rss PVC VM RSS memory KB") output_lines.append("# HELP pvc_vm_memory_stats_rss PVC VM RSS memory KB")
output_lines.append("# TYPE pvc_vm_memory_stats_rss gauge") output_lines.append("# TYPE pvc_vm_memory_stats_rss gauge")
for vm in vm_data: for vm in vm_data:
rss_memory = vm["memory_stats"].get("rss", 0) rss_memory = vm["memory_stats"]["rss"]
output_lines.append( output_lines.append(
f"pvc_vm_memory_stats_rss{{vm=\"{vm['name']}\"}} {rss_memory}" f"pvc_vm_memory_stats_rss{{vm=\"{vm['name']}\"}} {rss_memory}"
) )

8
debian/changelog vendored
View File

@@ -1,16 +1,8 @@
pvc (0.9.95-0) unstable; urgency=high
* [API Daemon/CLI Client] Adds a flag to allow duplicate VNIs in network templates
* [API Daemon] Ensures that storage template disks are returned in disk ID order
-- Joshua M. Boniface <joshua@boniface.me> Fri, 09 Feb 2024 12:42:00 -0500
pvc (0.9.94-0) unstable; urgency=high pvc (0.9.94-0) unstable; urgency=high
* [CLI Client] Fixes an incorrect ordering issue with autobackup summary emails * [CLI Client] Fixes an incorrect ordering issue with autobackup summary emails
* [API Daemon/CLI Client] Adds an additional safety check for 80% cluster fullness when doing volume adds or resizes * [API Daemon/CLI Client] Adds an additional safety check for 80% cluster fullness when doing volume adds or resizes
* [API Daemon/CLI Client] Adds safety checks to volume clones as well * [API Daemon/CLI Client] Adds safety checks to volume clones as well
* [API Daemon] Fixes a few remaining memory bugs for stopped/disabled VMs
-- Joshua M. Boniface <joshua@boniface.me> Mon, 05 Feb 2024 09:58:07 -0500 -- Joshua M. Boniface <joshua@boniface.me> Mon, 05 Feb 2024 09:58:07 -0500

View File

@@ -33,7 +33,7 @@ import os
import signal import signal
# Daemon version # Daemon version
version = "0.9.95" version = "0.9.94"
########################################################## ##########################################################

View File

@@ -49,7 +49,7 @@ import re
import json import json
# Daemon version # Daemon version
version = "0.9.95" version = "0.9.94"
########################################################## ##########################################################

View File

@@ -44,7 +44,7 @@ from daemon_lib.vmbuilder import (
) )
# Daemon version # Daemon version
version = "0.9.95" version = "0.9.94"
config = cfg.get_configuration() config = cfg.get_configuration()