Compare commits

...

8 Commits
v1.0 ... v1.0.3

Author SHA1 Message Date
a28f8372b3 Bump version to 1.0.3 2026-03-01 22:48:49 -05:00
c7729db898 Improve 3-debootstrap example for Debian 13+
Debian 13+ no longer include isc-dhcp-server (or any DHCP client it
seems) in their default minimal stack. This can cause cloud-init to fail
early and render newly provsiioned VMs unbootable. We add it to the
example here for posterity. We also explicitly add ifupdown, which
provides the legacy Debian networking subsystem.

Finally we modify the cloud-init to ensure it does not attempt to
overwrite the networking provided by the system, and reduce timeouts to
avoid excessive delays.
2026-03-01 22:47:01 -05:00
dfc8d598cb Fix errors when overwriting DHCP leases
Ensure we remove any existing leases for the MAC first, before adding a
new entry for that MAC. Otherwise what dnsmasq returns will not be valid
and this can cause CloudInit bootstrap errors.
2026-03-01 21:10:35 -05:00
eff972a62e Bump version to 1.0.2 2026-01-30 10:05:04 -05:00
113ecec18f Fix bad function definition 2026-01-30 09:56:59 -05:00
427fd5515d Update CheckMK plugin details 2025-10-02 02:40:10 -04:00
7df1ca8c6e Bump version to 1.0.1 2025-06-21 12:41:36 -04:00
b9106134ee Fix bug in DELETE response 2025-06-21 12:39:40 -04:00
14 changed files with 85 additions and 35 deletions

View File

@@ -1 +1 @@
1.0 1.0.3

View File

@@ -1,5 +1,18 @@
## PVC Changelog ## PVC Changelog
###### [v1.0.3](https://github.com/parallelvirtualcluster/pvc/releases/tag/v1.0.3)
* Fixes silent errors in the dnsmasq DHCP lease handler which can prevent leases from updating
* Improves the 3-debootstrap.py provisioner example script to work with Debian 13+
###### [v1.0.2](https://github.com/parallelvirtualcluster/pvc/releases/tag/v1.0.2)
* [Worker Daemon] [Bugfix] Fixed a bug in the calling of osd create-db-vg command worker
###### [v1.0.1](https://github.com/parallelvirtualcluster/pvc/releases/tag/v1.0.1)
* [CLI Client] [Bugfix] Fix bug with DELETE endpoints returning invalid data
###### [v1.0](https://github.com/parallelvirtualcluster/pvc/releases/tag/v1.0) ###### [v1.0](https://github.com/parallelvirtualcluster/pvc/releases/tag/v1.0)
**Announcement**: We are pleased to announce PVC 1.0! Functionally speaking, there are only a few minor improvements over the previous 0.9.107, but I believe it's finally time to call this a "1.0" release. Recently I have had much less opportunity to work on PVC as I would like, so some features are still not quite there, but those can arrive in future versions over time. **Announcement**: We are pleased to announce PVC 1.0! Functionally speaking, there are only a few minor improvements over the previous 0.9.107, but I believe it's finally time to call this a "1.0" release. Recently I have had much less opportunity to work on PVC as I would like, so some features are still not quite there, but those can arrive in future versions over time.

View File

@@ -485,6 +485,8 @@ class VMBuilderScript(VMBuilder):
"acpid", "acpid",
"acpi-support-base", "acpi-support-base",
"wget", "wget",
"ifupdown", # be explicit for Debian 13+
"isc-dhcp-server", # required for cloud-init on Debian 13+ where this is no longer standard
] ]
# We need to know our root disk for later GRUB-ing # We need to know our root disk for later GRUB-ing
@@ -585,13 +587,15 @@ After=multi-user.target
disable_root: true disable_root: true
preserve_hostname: true preserve_hostname: true
network:
config: disabled
datasource: datasource:
Ec2: Ec2:
metadata_urls: ["http://169.254.169.254:80"] metadata_urls: ["http://169.254.169.254:80"]
max_wait: 30 max_wait: 5
timeout: 30 timeout: 5
apply_full_imds_network_config: true
cloud_init_modules: cloud_init_modules:
- migrator - migrator

View File

@@ -30,7 +30,7 @@ from yaml import load as yload
from yaml import SafeLoader from yaml import SafeLoader
VERSION = "1.0" VERSION = "1.0.3"
DEFAULT_STORE_DATA = {"cfgfile": "/etc/pvc/pvc.conf"} DEFAULT_STORE_DATA = {"cfgfile": "/etc/pvc/pvc.conf"}
DEFAULT_STORE_FILENAME = "pvc.json" DEFAULT_STORE_FILENAME = "pvc.json"

View File

@@ -231,7 +231,7 @@ def call_api(
verify=config["verify_ssl"], verify=config["verify_ssl"],
) )
if operation == "delete": if operation == "delete":
response = patch, delete( response = delete(
uri, uri,
timeout=timeout, timeout=timeout,
headers=headers, headers=headers,

View File

@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "pvc" name = "pvc"
version = "1.0" version = "1.0.3"
dependencies = [ dependencies = [
"Click", "Click",
"PyYAML", "PyYAML",

View File

@@ -2486,7 +2486,7 @@ def osd_worker_remove_osd(
) )
def osd_worker_add_db_vg(zkhandler, celery, device): def osd_worker_add_db_vg(zkhandler, celery, node, device):
# Set up stages # Set up stages
current_stage = 0 current_stage = 0
total_stages = 4 total_stages = 4

19
debian/changelog vendored
View File

@@ -1,3 +1,22 @@
pvc (1.0.3-0) unstable; urgency=high
* Fixes silent errors in the dnsmasq DHCP lease handler which can prevent leases from updating
* Improves the 3-debootstrap.py provisioner example script to work with Debian 13+
-- Joshua M. Boniface <joshua@boniface.me> Sun, 01 Mar 2026 22:48:49 -0500
pvc (1.0.2-0) unstable; urgency=high
* [Worker Daemon] [Bugfix] Fixed a bug in the calling of osd create-db-vg command worker
-- Joshua M. Boniface <joshua@boniface.me> Fri, 30 Jan 2026 09:58:00 -0500
pvc (1.0.1-0) unstable; urgency=high
* [CLI Client] [Bugfix] Fix bug with DELETE endpoints returning invalid data
-- Joshua M. Boniface <joshua@boniface.me> Sat, 21 Jun 2025 12:40:33 -0400
pvc (1.0-0) unstable; urgency=high pvc (1.0-0) unstable; urgency=high
**Announcement**: We are pleased to announce PVC 1.0! Functionally speaking, there are only a few minor improvements over the previous 0.9.107, but I believe it's finally time to call this a "1.0" release. Recently I have had much less opportunity to work on PVC as I would like, so some features are still not quite there, but those can arrive in future versions over time. **Announcement**: We are pleased to announce PVC 1.0! Functionally speaking, there are only a few minor improvements over the previous 0.9.107, but I believe it's finally time to call this a "1.0" release. Recently I have had much less opportunity to work on PVC as I would like, so some features are still not quite there, but those can arrive in future versions over time.

View File

@@ -33,7 +33,7 @@ import os
import signal import signal
# Daemon version # Daemon version
version = "1.0" version = "1.0.3"
########################################################## ##########################################################

View File

@@ -3,4 +3,5 @@
# PVC cluster status check for Check_MK (agent-side) # PVC cluster status check for Check_MK (agent-side)
echo "<<<pvc>>>" echo "<<<pvc>>>"
pvc --quiet status --format json hostname -s
pvc --quiet cluster status --format json

View File

@@ -17,24 +17,29 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from .agent_based_api.v1 import * from cmk.agent_based.v2 import *
from cmk.base.check_api import host_name
from time import time from time import time
from json import loads from json import loads
def parse_pvc(string_table):
hostname = string_table[0][0]
data = loads(" ".join(string_table[1]))
parsed = (hostname, data)
return parsed
def discover_pvc(section): def discover_pvc(section):
my_node = host_name().split(".")[0] my_node, _ = section
yield Service(item=f"PVC Node {my_node}") yield Service(item=f"PVC Node {my_node}")
yield Service(item="PVC Cluster") yield Service(item="PVC Cluster")
def check_pvc(item, params, section): def check_pvc(item, params, section):
my_node, data = section
state = State.OK state = State.OK
summary = "Stuff" summary = ""
details = None details = None
data = loads(" ".join(section[0]))
my_node = host_name().split(".")[0]
maintenance_map = { maintenance_map = {
"true": "on", "true": "on",
@@ -44,7 +49,6 @@ def check_pvc(item, params, section):
# Node check # Node check
if item == f"PVC Node {my_node}": if item == f"PVC Node {my_node}":
my_node = host_name().split(".")[0]
node_health = data["node_health"][my_node]["health"] node_health = data["node_health"][my_node]["health"]
node_messages = data["node_health"][my_node]["messages"] node_messages = data["node_health"][my_node]["messages"]
@@ -85,7 +89,12 @@ def check_pvc(item, params, section):
return return
register.check_plugin( agent_section_pvc = AgentSection(
name="pvc",
parse_function=parse_pvc,
)
check_plugin_pvc = CheckPlugin(
name="pvc", name="pvc",
service_name="%s", service_name="%s",
check_ruleset_name="pvc", check_ruleset_name="pvc",

View File

@@ -49,7 +49,7 @@ import re
import json import json
# Daemon version # Daemon version
version = "1.0" version = "1.0.3"
########################################################## ##########################################################

View File

@@ -130,21 +130,25 @@ def read_lease_database(zk_conn, zk_leases_key):
def add_lease(zk_conn, zk_leases_key, expiry, macaddr, ipaddr, hostname, clientid): def add_lease(zk_conn, zk_leases_key, expiry, macaddr, ipaddr, hostname, clientid):
if not hostname: if not hostname:
hostname = "" hostname = ""
transaction = zk_conn.transaction() try:
transaction.create("{}/{}".format(zk_leases_key, macaddr), "".encode("ascii")) zk_conn.delete("{}/{}".format(zk_leases_key, macaddr), recursive=True)
transaction.create( transaction = zk_conn.transaction()
"{}/{}/expiry".format(zk_leases_key, macaddr), expiry.encode("ascii") transaction.create("{}/{}".format(zk_leases_key, macaddr), "".encode("ascii"))
) transaction.create(
transaction.create( "{}/{}/expiry".format(zk_leases_key, macaddr), expiry.encode("ascii")
"{}/{}/ipaddr".format(zk_leases_key, macaddr), ipaddr.encode("ascii") )
) transaction.create(
transaction.create( "{}/{}/ipaddr".format(zk_leases_key, macaddr), ipaddr.encode("ascii")
"{}/{}/hostname".format(zk_leases_key, macaddr), hostname.encode("ascii") )
) transaction.create(
transaction.create( "{}/{}/hostname".format(zk_leases_key, macaddr), hostname.encode("ascii")
"{}/{}/clientid".format(zk_leases_key, macaddr), clientid.encode("ascii") )
) transaction.create(
transaction.commit() "{}/{}/clientid".format(zk_leases_key, macaddr), clientid.encode("ascii")
)
transaction.commit()
except Exception as e:
print(f"FATAL: {e}")
def del_lease(zk_conn, zk_leases_key, macaddr, expiry): def del_lease(zk_conn, zk_leases_key, macaddr, expiry):

View File

@@ -58,7 +58,7 @@ from daemon_lib.automirror import (
) )
# Daemon version # Daemon version
version = "1.0" version = "1.0.3"
config = cfg.get_configuration() config = cfg.get_configuration()