Skip to content

Run against a real OpenVox Server, and fix two bugs it found#7

Merged
miharp merged 1 commit into
mainfrom
feat/integration
Jul 23, 2026
Merged

Run against a real OpenVox Server, and fix two bugs it found#7
miharp merged 1 commit into
mainfrom
feat/integration

Conversation

@miharp

@miharp miharp commented Jul 23, 2026

Copy link
Copy Markdown
Owner

Adds the integration topology and the fixes that came out of actually running it. Everything before this was tested against synthetic CAs and temp directories.

It works end to end

Against real OpenVox Server processes and real Puppet certificates:

  • both compilers converged on the same code_id over mutual TLS
  • a compiler kept offline across a deploy caught up on a single poll, no event replayed
  • an agent received a static catalog stamped with the codavox code_id and inlined sha256 metadata
  • changing code produced a new code_id and the agent applied the new content
compiler01: 4f5c1abd2b0bdc64dcb4175335cfdb8150039f5d9c182ef8030fbe7fd36fdbb3
compiler02: 4f5c1abd2b0bdc64dcb4175335cfdb8150039f5d9c182ef8030fbe7fd36fdbb3
CONVERGED

Notice: Catalog compiled by compiler01
Notice: /Stage[main]/Demo/File[/tmp/codavox-demo.txt]/content: content changed
code_id":"4f5c1abd2b0bdc64dcb4175335cfdb8150039f5d9c182ef8030fbe7fd36fdbb3"

The real compiler certificate carries the pp_role extension exactly as assumed — 1.3.6.1.4.1.34380.1.1.13: ..openvox_compiler, where .. is the ASN.1 UTF8String header, confirming the decoding path.

Bug 1: deployed directories were mode 0700

os.MkdirTemp creates 0700, and the agent renames that into place. OpenVox Server runs as the puppet user while the agent runs as root, so every catalog compile failed with:

(EACCES) Permission denied - /opt/puppetlabs/codavox/environments/production/environment.conf

No same-user test can observe this — the unit suite was structurally blind to it. Fixed by widening before the rename, with a regression test asserting the deployed tree is traversable by other users.

Bug 2: managing the stock codedir is not viable

A fresh OpenVox Server ships a populated skeleton at code/environments/productiondata, environment.conf, hiera.yaml, manifests, modules — and rename(2) cannot replace a real directory with a symlink:

swapping environment link: rename .../.production.tmp .../production: file exists

My first instinct was an --adopt flag to move it aside. That was wrong: it makes every install need an explicit override, and that directory may hold code somebody deployed by other means.

codavox now owns /opt/puppetlabs/codavox/environments and OpenVox Server is pointed at it. This is what PE does with versioned deploys and /etc/puppetlabs/puppetserver/code — the stock path is left untouched for anyone still using it.

Environment note

The Rocky 9 base image now ships Java 25, which OpenVox refuses (java 25.0.3 found but OpenVox requires 17 or 21). This affects ovadm's own Docker testing, not just codavox. Documented as a prerequisite step.

Topology

compose.codavox.yml layers a second compiler over ovadm's compose rather than changing that repo. Version directories are on named volumes, not the container overlay filesystem, since atomic rename(2) semantics are a correctness claim and testing them on overlayfs risks false confidence.

🤖 Generated with Claude Code

Adds the integration topology and the fixes that came out of running it.

Deployed version directories were mode 0700. os.MkdirTemp creates 0700 and
the agent renames that into place, so OpenVox Server — running as the puppet
user while the agent runs as root — failed every catalog compile with EACCES
on environment.conf. No same-user test can observe this, so the unit suite
was blind to it. The directory is now widened before the rename, with a test
asserting the deployed tree is traversable by other users.

codavox no longer manages the stock /etc/puppetlabs/code/environments. A fresh
OpenVox Server ships a populated skeleton at code/environments/production, and
rename(2) cannot replace a real directory with a symlink, so managing that path
would mean either refusing to start or moving an operator's directory aside on
first run — and that directory may hold code deployed by other means. codavox
owns /opt/puppetlabs/codavox/environments instead and OpenVox Server is pointed
at it, which is the same approach PE takes with versioned deploys and
/etc/puppetlabs/puppetserver/code.

Verified end to end: both compilers converged on the same code_id over mutual
TLS using real Puppet certificates; a compiler kept offline across a deploy
caught up on one poll with no event replayed; an agent received a static
catalog carrying the codavox code_id and inlined sha256 metadata; and changing
code produced a new code_id that the agent applied.

Also records that the Rocky 9 base image now ships Java 25, which OpenVox
refuses, so the topology needs Java 21 installed first.

Signed-off-by: Michael Harp <mike@mikeharp.com>
@miharp
miharp merged commit c73306b into main Jul 23, 2026
7 checks passed
@miharp
miharp deleted the feat/integration branch July 23, 2026 17:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant