Skip to content

Add LBHealthMonitor controller - #1036

Draft
zunken1337 wants to merge 15 commits into
k-orc:mainfrom
zunken1337:healthmonitor
Draft

zunken1337 wants to merge 15 commits into
k-orc:mainfrom
zunken1337:healthmonitor

Conversation

@zunken1337

Copy link
Copy Markdown
Contributor

Fixes #1023

Depends on #1018, #1034 and #1035. Until they merge this PR also shows their commits; the new ones are the last three.

LBHealthMonitor as proposed in #1023: poolRef and type are immutable, timeout < delay is validated with CEL. Optional fields are only updated when set, since gophercloud can't reset them.

🤖 Generated with Claude Code

eshulman2 and others added 15 commits October 27, 2026 17:35
Adds an ORC controller for Octavia load balancers, and enables Octavia
in the e2e devstack.

Rebased from k-orc#638 onto main: module path v3, RequireDependency, the
default resync period, the reconcileResourceActuator assertion, listResources,
+orc:kustomize:ref markers, no dead spec.resource nil checks, and the
e2e matrix (hibiscus/gazpacho/flamingo, Noble amphora image).

Co-Authored-By: Joakim Johansson <joakimjohansson@zunken.nu>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- adoption matches everything set at creation, not only the name
- filter: adminStateUp, flavorRef, and vipAddress as IPvAny
- link the provisioning and operating status codes
- wait on deletion, not readiness, when deleting
- API validation tests, an adopt test, README

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- omit empty description, flavorID and availabilityZone from the status
- assert operatingStatus, and more present and absent fields
- create-full: test projectRef, which needs admin, on a separate LB

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Octavia's flavor_id refers to an Octavia flavor, which the operator
creates (/v2/lbaas/flavors), not a compute flavor, so a Flavor
reference can't work. ORC has no kind for Octavia flavors yet.

Also clarify that availabilityZone is an Octavia availability zone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
As k-orc#1015 did for network and subnet: CreateResource adds the deletion
guards, but an adopted load balancer never goes through it. The adopt
test now removes the subnet guard and checks that it comes back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each load balancer is an amphora VM with 1 GB of RAM. With more load
balancer tests, nova ran out of memory to schedule them ("No valid host
was found") although most of it was unused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
loadbalancer-import creates a load balancer with the fixed VIP address
10.0.0.100 on the subnet where the trap load balancer and its amphora
already got random addresses, so the address was sometimes taken
("The VIP IP address is already in use"). Give the subnet an allocation
pool that excludes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds an ORC controller for Octavia listeners.

Rebased from k-orc#639 onto the LoadBalancer controller: module path v3,
RequireDependency, the default resync period, the
reconcileResourceActuator assertion, +orc:kustomize:ref markers, and
no dead spec.resource nil checks.

Co-Authored-By: Joakim Johansson <joakimjohansson@zunken.nu>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Create and update now handle every field in the spec: connection limit,
timeouts, insert headers, allowed CIDRs, TLS (Barbican container URLs,
ciphers, versions, ALPN, client authentication), HSTS and tags. Status
reports the TLS and HSTS settings.

The Barbican fields are named ...URL rather than ...Ref, since they are
not references to ORC objects. defaultPoolRef is removed until the Pool
controller exists. Adoption filters by load balancer, import applies
every filter field, and a 409 on update waits instead of failing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds an ORC controller for Octavia pools, with their members.

Rebased from k-orc#640 onto the Listener controller: module path v3,
RequireDependency, the default resync period, the
reconcileResourceActuator assertion, +orc:kustomize:ref markers, and
no dead spec.resource nil checks.

Co-Authored-By: Joakim Johansson <joakimjohansson@zunken.nu>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adoption filters by load balancer or listener, import applies every
filter field, and the members' subnets get their deletion guards. The
pool's lbAlgorithm, TLS and CA/CRL settings can be updated; the TLS
settings Octavia fills in by default are only updated when set. Members
are listed in one call. The Barbican fields are named ...URL.

Listener gets defaultPoolRef, for a pool created on the load balancer.

lbpool-update replaced its dependencies along with the pool, which
removed their finalizers; they are now prerequisites.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A health monitor checks the members of one pool. type and poolRef are
immutable; delay, timeout, retries and the HTTP options can be updated.
The optional fields have Octavia defaults and gophercloud can't reset
them or clear the tags, so they are only updated when set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the semver:major Breaking change label Oct 29, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

semver:major Breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HealthMonitor controller for Octavia

2 participants