corepair
What does this cluster actually need, and what should we therefore buy?
corepair measures real demand on an OpenShift or Kubernetes cluster, converts
it into a subscription count using the rules that actually apply, and produces a
cost case that shows its working — including which parts of a multi-year saving
are contractual and which are just forecasts.
It is the missing step between kubectl top and a purchase order.
$ corepair audit
Subscribed nodes : 9 / 12
Core-pairs : 22
Rounding waste : 6 vCPU paid for but not present
FINDING infra nodes without an infra taint (application pods can still land here,
so the exemption does not apply):
- infra-02: 2 core-pairs would be released by tainting it
FINDING node sizes that are not a multiple of 4 vCPU. Rounding is per node, so the
remainder is paid for and unusable:
- worker-05: 6 vCPU -> 2 core-pairs (2 vCPU wasted)
$ corepair cost --pricing pricing.yaml --units 32 --base-units 8
| Scenario | Peak units | Total (EUR) | NPV @ 5% |
|-----------------------------------------|-----------|-------------|----------|
| All 32 units, 1y | 32 | 86,534 | 82,240 |
| All 32 units, 3y | 32 | 71,424 | 68,077 |
| Blended: 8 on 3y, 24 on 1y from year 2 | 32 | 63,317 | 59,259 |
### Where the multi-year saving actually comes from
| Component | EUR | Share |
|------------------------------------------------|--------|-------|
| Term / discount differential | 6,336 | 42% |
| Avoided list-price growth (assumption) | 3,953 | 26% |
| Avoided discount decay at renewal (assumption) | 4,822 | 32% |
| **Headline saving** | 15,110 | 100% |
**58% of the headline rests on forecasts**, not on the contract itself.
Why this exists
Subscription quantities get decided from a node inventory and a growth guess, then defended with a single savings number. Two things go wrong:
The count is wrong. Core-pair rounding happens per node, so ten 6-vCPU nodes cost twenty core-pairs rather than fifteen. Infra nodes are only exempt if they are tainted, not merely labelled. Meanwhile most estates request several times the CPU they use, and requests — not usage — are what force nodes to exist. Right-size first and the count often falls by half.
The savings case is mostly assumptions. A three-year lock is justified by a
number that quietly combines the discount differential (a term you can hold the
vendor to) with assumed annual list-price growth and an assumed worse discount
at renewal (forecasts, which are negotiable). corepair separates them. If most
of the case is forecast, the right move is to ask for those forecasts in writing
— and to notice if the answer is no.
Install
pipx install corepair # or: pip install corepair
Use
# 1. What do we actually run, versus what did we reserve?
corepair measure --prometheus https://thanos-querier... --window 30d \
--snapshot-out baseline.json
# 2. What are we subscribing that we needn't be?
corepair audit
# 3. What will the migration waves need, and when?
corepair plan --plan plan.yaml
# 4. What should we buy, and what does the saving really consist of?
corepair cost --pricing pricing.yaml --units 16 --base-units 8 \
--sensitivity 8 24 --xlsx case.xlsx
On OpenShift, --prometheus points at the thanos-querier route with
export PROM_TOKEN=$(oc whoami -t).
Every command reads and writes nothing but its own files. corepair has no
cluster-side component and needs only read access.
Snapshots
--snapshot-out freezes a measurement so it can be replayed, reviewed, and
committed alongside the proposal. A licence recommendation built on numbers
nobody else can reproduce is an assertion, not a recommendation.
What it knows
| Rule | Why it matters |
|---|---|
| Core-pair = 2 cores = 4 vCPU, rounded up per node | Node shape drives cost independently of workload |
| Control-plane nodes are exempt | Unless the cluster is compact and they are schedulable |
| Infra nodes are exempt only when labelled and tainted | An untainted infra node can run application pods |
| Bare-metal is per node, with an optional core cap | Break-even against core-pairs depends entirely on density |
| Node count is set by whichever resource saturates first | Memory-bound estates get no benefit from CPU-rich nodes, and pay for them |
| HA spare capacity and headroom are licensed too | The N+1 node is not free |
Each of these is a unit test in tests/test_licensing.py, which doubles as the
readable specification.
corepair ships no prices
Vendor pricing is confidential and contract-specific. A figure copied from
someone else's repo is worse than none, because it looks authoritative.
examples/pricing.example.yaml documents the schema with placeholders that the
tool refuses to run against — replace them with figures from your own quote.
The same goes for your plan file and any snapshot: they describe your estate. Publish the schema, not the data.
Caveats worth reading
- The counting rules encode Red Hat's OpenShift subscription model as of 2026. Verify against your own contract — entitlement terms change and vary by agreement. This tool tells you what your cluster needs, not what you owe.
- Not affiliated with, or endorsed by, Red Hat or IBM.
corepairis an input to a decision, not the decision. It has no opinion on whether your discount is good.
License
Apache-2.0
═══════════════════ ✠ ════════════════════
#### #### #### #### ####
# # # # # # # # # #
# # # # # # # # # #
##### ##### ##### ##### #####
# # # # #
# # # # #
#### #### #### #### ####
═══════════════════ ✠ ════════════════════
Five Nines be upon you, and also with you.
Kubernetes · OpenShift · High Availability
HA-llelujah.
✠ The Church of the Eternal Cluster
A Highly Available Faith. Keep no Pets. Declare thy state. Back up etcd.
The Scriptorium
- ha-llelujah.dev · the book, the music, and the reliquary
- The Music · the sacred discography
- Be Reconciled · take the vow and join the Reconciled
The Parish
- fivenines.church · confession, prayer, and the living parish
- The Liturgical Calendar · the holy days of uptime
- The Tithe · support the Church
The Canon (source)
- church-of-the-eternal-cluster · doctrine, liturgy, and scripture
- eternal-cluster-mcp · the Oracle, an MCP server that diagnoses thy incidents through doctrine
More from the Rootless One
- vK
- Linux Fleet Audit
- Linux Fleet Harden
- Size OpenShift subscriptions from evidence
- Diagnose stuck PersistentVolumes, safely
Let's connect
An independent parody, built with love for everyone who has been paged at 03:00. Kubernetes is a trademark of the Linux Foundation. OpenShift is a trademark of Red Hat, Inc. Not affiliated with, nor endorsed by, either. They have real SLAs; we only have belief. HA-llelujah.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file corepair-0.1.0.tar.gz.
File metadata
- Download URL: corepair-0.1.0.tar.gz
- Upload date:
- Size: 28.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f5f98f9afdcbeb4f839e961117c84b6120195b742180395dec1e231ba6bc614
|
|
| MD5 |
ace72dea1ca0845cb00cf8eb4f8887ed
|
|
| BLAKE2b-256 |
48fbf68631a525a13fd4457b8ec54256875f7ed0f8af9be186e3111716e6a623
|
Provenance
The following attestation bundles were made for corepair-0.1.0.tar.gz:
Publisher:
release.yml on vikozs/corepair
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
corepair-0.1.0.tar.gz -
Subject digest:
4f5f98f9afdcbeb4f839e961117c84b6120195b742180395dec1e231ba6bc614 - Sigstore transparency entry: 2268136365
- Sigstore integration time:
-
Permalink:
vikozs/corepair@94e258d235ea7262d0ee863bd07e7942eba5a1de -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/vikozs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@94e258d235ea7262d0ee863bd07e7942eba5a1de -
Trigger Event:
push
-
Statement type:
File details
Details for the file corepair-0.1.0-py3-none-any.whl.
File metadata
- Download URL: corepair-0.1.0-py3-none-any.whl
- Upload date:
- Size: 25.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
278674bbc7f70b123f544d1cb6edaad85cfd5fe5c0ce9d30cb2384ccafe52cec
|
|
| MD5 |
4f97ae744c87bd0a193cb6631aa18f85
|
|
| BLAKE2b-256 |
0b882fffde13f75d4862125d27d2c845757a3b7342c6e98a3745bf8514340b69
|
Provenance
The following attestation bundles were made for corepair-0.1.0-py3-none-any.whl:
Publisher:
release.yml on vikozs/corepair
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
corepair-0.1.0-py3-none-any.whl -
Subject digest:
278674bbc7f70b123f544d1cb6edaad85cfd5fe5c0ce9d30cb2384ccafe52cec - Sigstore transparency entry: 2268136766
- Sigstore integration time:
-
Permalink:
vikozs/corepair@94e258d235ea7262d0ee863bd07e7942eba5a1de -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/vikozs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@94e258d235ea7262d0ee863bd07e7942eba5a1de -
Trigger Event:
push
-
Statement type: