Compare commits
7 Commits
v0.9.94
...
a461791ce8
Author | SHA1 | Date | |
---|---|---|---|
a461791ce8 | |||
9fdb6d8708 | |||
2fb7c40497 | |||
dee8d186cf | |||
1e9871241e | |||
9cd88ebccb | |||
3bc500bc55 |
@ -1,5 +1,11 @@
|
|||||||
## 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
|
||||||
|
* [Client CLI] Fixes a display bug showing all OSDs as split
|
||||||
|
|
||||||
###### [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
|
||||||
|
@ -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.94"
|
version = "0.9.95"
|
||||||
|
|
||||||
# API version
|
# API version
|
||||||
API_VERSION = 1.0
|
API_VERSION = 1.0
|
||||||
|
@ -7139,7 +7139,11 @@ 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
|
||||||
@ -7155,6 +7159,11 @@ 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
|
||||||
@ -7168,7 +7177,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)
|
template, reqargs.get("vni", None), reqargs.get("permit_duplicate", False)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -7206,13 +7215,27 @@ 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):
|
def post(self, template, vni, reqargs):
|
||||||
"""
|
"""
|
||||||
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
|
||||||
@ -7225,7 +7248,9 @@ class API_Provisioner_Template_Network_Net_Element(Resource):
|
|||||||
type: object
|
type: object
|
||||||
id: Message
|
id: Message
|
||||||
"""
|
"""
|
||||||
return api_provisioner.create_template_network_element(template, vni)
|
return api_provisioner.create_template_network_element(
|
||||||
|
template, vni, reqargs.get("permit_duplicate", False)
|
||||||
|
)
|
||||||
|
|
||||||
@Authenticator
|
@Authenticator
|
||||||
def delete(self, template, vni):
|
def delete(self, template, vni):
|
||||||
|
@ -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"] = disks
|
data[template_id]["disks"] = sorted(disks, key=lambda x: x["disk_id"])
|
||||||
|
|
||||||
close_database(conn, cur)
|
close_database(conn, cur)
|
||||||
|
|
||||||
@ -284,12 +284,13 @@ def create_template_network(name, mac_template=None):
|
|||||||
return retmsg, retcode
|
return retmsg, retcode
|
||||||
|
|
||||||
|
|
||||||
def create_template_network_element(name, vni):
|
def create_template_network_element(name, vni, permit_duplicate=False):
|
||||||
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 = []
|
||||||
|
@ -4849,13 +4849,27 @@ def cli_provisioner_template_network_vni():
|
|||||||
@connection_req
|
@connection_req
|
||||||
@click.argument("name")
|
@click.argument("name")
|
||||||
@click.argument("vni")
|
@click.argument("vni")
|
||||||
def cli_provisioner_template_network_vni_add(name, vni):
|
@click.option(
|
||||||
|
"-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"
|
||||||
|
@ -430,7 +430,9 @@ def format_list_osd(config, osd_list):
|
|||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if osd_information.get("is_split") is not None:
|
if osd_information.get("is_split") is not None and osd_information.get(
|
||||||
|
"is_split"
|
||||||
|
):
|
||||||
osd_information["device"] = f"{osd_information['device']} [s]"
|
osd_information["device"] = f"{osd_information['device']} [s]"
|
||||||
|
|
||||||
# Deal with the size to human readable
|
# Deal with the size to human readable
|
||||||
|
@ -2,7 +2,7 @@ from setuptools import setup
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="pvc",
|
name="pvc",
|
||||||
version="0.9.94",
|
version="0.9.95",
|
||||||
packages=["pvc.cli", "pvc.lib"],
|
packages=["pvc.cli", "pvc.lib"],
|
||||||
install_requires=[
|
install_requires=[
|
||||||
"Click",
|
"Click",
|
||||||
|
@ -115,9 +115,10 @@ class BenchmarkError(Exception):
|
|||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
def cleanup(job_name, db_conn=None, db_cur=None, zkhandler=None):
|
def cleanup(job_name, db_conn=None, db_cur=None, zkhandler=None, final=False):
|
||||||
if db_conn is not None and db_cur is not None:
|
if db_conn is not None and db_cur is not None:
|
||||||
# Clean up our dangling result
|
if not final:
|
||||||
|
# Clean up our dangling result (non-final runs only)
|
||||||
query = "DELETE FROM storage_benchmarks WHERE job = %s;"
|
query = "DELETE FROM storage_benchmarks WHERE job = %s;"
|
||||||
args = (job_name,)
|
args = (job_name,)
|
||||||
db_cur.execute(query, args)
|
db_cur.execute(query, args)
|
||||||
@ -410,6 +411,7 @@ def worker_run_benchmark(zkhandler, celery, config, pool):
|
|||||||
db_conn=db_conn,
|
db_conn=db_conn,
|
||||||
db_cur=db_cur,
|
db_cur=db_cur,
|
||||||
zkhandler=zkhandler,
|
zkhandler=zkhandler,
|
||||||
|
final=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
current_stage += 1
|
current_stage += 1
|
||||||
|
@ -69,6 +69,8 @@ def getNodeHealthDetails(zkhandler, node_name, node_health_plugins):
|
|||||||
plugin_message,
|
plugin_message,
|
||||||
plugin_data,
|
plugin_data,
|
||||||
) = tuple(all_plugin_data[pos_start:pos_end])
|
) = tuple(all_plugin_data[pos_start:pos_end])
|
||||||
|
if plugin_data is None:
|
||||||
|
continue
|
||||||
plugin_output = {
|
plugin_output = {
|
||||||
"name": plugin,
|
"name": plugin,
|
||||||
"last_run": int(plugin_last_run) if plugin_last_run is not None else None,
|
"last_run": int(plugin_last_run) if plugin_last_run is not None else None,
|
||||||
@ -156,9 +158,9 @@ def getNodeInformation(zkhandler, node_name):
|
|||||||
zkhandler, node_name, node_health_plugins
|
zkhandler, node_name, node_health_plugins
|
||||||
)
|
)
|
||||||
|
|
||||||
if _node_network_stats is not None:
|
try:
|
||||||
node_network_stats = json.loads(_node_network_stats)
|
node_network_stats = json.loads(_node_network_stats)
|
||||||
else:
|
except Exception:
|
||||||
node_network_stats = dict()
|
node_network_stats = dict()
|
||||||
|
|
||||||
# Construct a data structure to represent the data
|
# Construct a data structure to represent the data
|
||||||
|
8
debian/changelog
vendored
8
debian/changelog
vendored
@ -1,3 +1,11 @@
|
|||||||
|
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
|
||||||
|
* [Client CLI] Fixes a display bug showing all OSDs as split
|
||||||
|
|
||||||
|
-- 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
|
||||||
|
@ -33,7 +33,7 @@ import os
|
|||||||
import signal
|
import signal
|
||||||
|
|
||||||
# Daemon version
|
# Daemon version
|
||||||
version = "0.9.94"
|
version = "0.9.95"
|
||||||
|
|
||||||
|
|
||||||
##########################################################
|
##########################################################
|
||||||
|
@ -49,7 +49,7 @@ import re
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
# Daemon version
|
# Daemon version
|
||||||
version = "0.9.94"
|
version = "0.9.95"
|
||||||
|
|
||||||
|
|
||||||
##########################################################
|
##########################################################
|
||||||
|
@ -44,7 +44,7 @@ from daemon_lib.vmbuilder import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Daemon version
|
# Daemon version
|
||||||
version = "0.9.94"
|
version = "0.9.95"
|
||||||
|
|
||||||
|
|
||||||
config = cfg.get_configuration()
|
config = cfg.get_configuration()
|
||||||
|
Reference in New Issue
Block a user