Skip to main content

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.
  • corepair is 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

The Parish

The Canon (source)

More from the Rootless One

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.


Metadata

Release files for corepair 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for corepair 0.1.0
File Size Uploaded Provenance Actions
corepair-0.1.0.tar.gz 28.6 kB With provenance Details for corepair-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for corepair 0.1.0
File Interpreter ABI Platform Actions
corepair-0.1.0-py3-none-any.whl Python 3 none any Details for corepair-0.1.0-py3-none-any.whl

Total release size: 54.6 kB

Release files / corepair-0.1.0.tar.gz

Download URL corepair-0.1.0.tar.gz
Size 28.6 kB
Tags Source
SHA-256 checksum
How to use checksums
4f5f98f9afdcbeb4f839e961117c84b6120195b742180395dec1e231ba6bc614
BLAKE2b-256 checksum
How to use checksums
48fbf68631a525a13fd4457b8ec54256875f7ed0f8af9be186e3111716e6a623
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / corepair-0.1.0-py3-none-any.whl

Download URL corepair-0.1.0-py3-none-any.whl
Size 25.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
278674bbc7f70b123f544d1cb6edaad85cfd5fe5c0ce9d30cb2384ccafe52cec
BLAKE2b-256 checksum
How to use checksums
0b882fffde13f75d4862125d27d2c845757a3b7342c6e98a3745bf8514340b69
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Security for corepair 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for corepair-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page