Skip to content

A floating provider constraint resolves differently on terraform and opentofu, and the Exoscale safety floor has no margin left #778

Description

@stephrobert

The three stacks that use a floating provider constraint do not resolve to
the same thing on the two engines this repository drives, because
registry.terraform.io and registry.opentofu.org do not index in step.

Measured 2026-09-14, reading both registries and applying each stack's own
constraint:

provider constraint here terraform init -upgrade takes tofu init -upgrade takes
exoscale/exoscale >= 0.71.0 0.72.0 (85 stable versions listed) 0.71.0 (84 listed)
outscale/outscale ~> 1.7 1.8.0 1.8.0
scaleway/scaleway 2.82.0, exact 2.82.0 2.82.0

The Exoscale row is two different pieces of software driving the same pack,
and nothing says so.
The terraform leg and the opentofu leg both report
"the Exoscale provider passes" while running v0.72.0 and v0.71.0 respectively.
docs/clients.md already says a constraint's resolved version "is not knowable
here"; this is a step further — it is not the same on both legs.

The Outscale row agrees today by luck, not by construction. The same divergence
window applies to it whenever outscale/outscale publishes.

Why this is more than untidiness, for Exoscale specifically

terraformProviderFloor is v0.71.0 (internal/providers/exoscale/pack.go),
and the reason is recorded: below it, the provider honours
EXOSCALE_API_ENDPOINT for only half of its calls and the rest reach a paying
account
— 57 requests, measured in #525.

So the opentofu leg currently resolves to exactly the floor, with no margin
at all
. It is not below it, and guardSplitClients would refuse a client that
were. But the distance between "safe" and "the case the floor exists for" is
currently zero, and it is held there by a registry's indexing schedule rather
than by anything in this repository.

What is not being claimed

What would settle it

Some way for a run to state which version answered, rather than leaving it
to be reconstructed from a registry days later. The conformance score already
records which client drove each operation; the provider version is the piece it
does not carry. At minimum, the Exoscale stack could pin at or above the floor
rather than floating from it, so the safety margin stops depending on indexing
latency.

Measurement scripts used are throwaway; the numbers above are reproducible by
reading /v1/providers/<ns>/<name>/versions on both registries and applying the
constraint written in each stack.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions