Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions CHANGELOG.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,36 @@ change ni l'un ni l'autre a sa place dans `git log`.

### Ajouté

- **Un serveur rend une interface privée : `instance/v2alpha1/API.DetachServerPrivateNetworkInterface`.**
`POST /instance/v2alpha1/zones/{zone}/servers/{id}/detach-private-network-interface`
dissocie une interface de son serveur et répond le serveur. Le provider
Terraform **2.83.0** l'envoie avant chaque suppression d'interface
(`fix(instance): detach private network interface before deleting it`,
upstream #4354), et un 501 à cet endroit faisait échouer tous les
`terraform destroy`.

Le refus qu'elle quitte disait « aucun client piloté par ce projet n'atteint
ces opérations » : une phrase qui portait déjà une date de péremption, venue
de 2.81.0, et qui vient d'en collecter une seconde. Seul le détachement est
retiré : l'enregistrement d'un apply et d'un destroy complets le montre deux
fois et ne montre jamais `AttachServerPrivateNetworkInterface`, qui garde donc
la raison.

**Elle dissocie sans supprimer, et c'est mesuré.** Les deux appels suivants du
client sont une relecture qui doit répondre 200, puis un `DELETE` qu'il envoie
lui-même ; supprimer dès le détachement répond 404 à cette relecture, le
client saute son `DELETE`, et la suite passe pour une raison qui n'est pas
celle annoncée. Les deux comportements sont verts, un seul correspond à ce que
le client fait.

La servir demandait de rendre le serveur dans la forme propre à v2alpha1, que
ce pack n'avait pas. Trois vocabulaires diffèrent de `instance/v1` et le
contrôle de contrat a attrapé chacun : un serveur est `started` là où v1 dit
`running`, une interface est `available` là où un serveur est `started`, et un
volume que v1 écrit `sbs_volume` s'écrit `sbs`. `b_ssd` et `unified` n'ont pas
d'orthographe en v2alpha1 et répondent `unknown_volume_type` plutôt qu'une
équivalence devinée.

- **Un équilibreur de charge peut être migré : `lb/v1/ZonedAPI.MigrateLB`**
(#762). `POST /lb/v1/zones/{zone}/lbs/{id}/migrate` accepte une nouvelle offre
et la relecture qui suit la montre. C'est la seule action de jour 2 que porte
Expand Down
26 changes: 26 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,32 @@ what this project is judged on: **a response shape a client can observe**, and

### Added

- **A server gives up a private interface: `instance/v2alpha1/API.DetachServerPrivateNetworkInterface`.**
`POST /instance/v2alpha1/zones/{zone}/servers/{id}/detach-private-network-interface`
dissociates an interface from its server and answers the server. Terraform
provider **2.83.0** sends it before every delete of an interface
(`fix(instance): detach private network interface before deleting it`,
upstream #4354), and a 501 there failed every `terraform destroy`.

The refusal it leaves said *"no client this project drives reaches for these
operations"* — a sentence that already carried one expiry date, from 2.81.0,
and has now collected a second. Only the detach is withdrawn: a recording of a
full apply plus destroy shows it twice and the symmetric
`AttachServerPrivateNetworkInterface` never, so that one keeps the reason.

**It dissociates rather than deletes, and that is measured.** The client's next
two calls are a read that must answer 200 and a `DELETE` it sends itself;
deleting at the detach answers the read with a 404, the client skips its
delete, and the suite passes for a reason that is not the stated one. Both
behaviours are green — only one matches what the client does.

Serving it needed the server rendered in v2alpha1's own shape, which this pack
did not have. Three vocabularies differ from `instance/v1` and the contract
check caught each: a server is `started` where v1 says `running`, an interface
is `available` where a server is `started`, and a volume v1 spells
`sbs_volume` is `sbs`. `b_ssd` and `unified` have no v2alpha1 spelling and
answer `unknown_volume_type` rather than a guessed equivalence.

- **A load balancer can be migrated: `lb/v1/ZonedAPI.MigrateLB`** (#762).
`POST /lb/v1/zones/{zone}/lbs/{id}/migrate` accepts a new offer and the read
that follows shows it. It is the one Day-2 action this API has, and no client
Expand Down
4 changes: 2 additions & 2 deletions README.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
> [!IMPORTANT]
> **Ce qu'on peut pointer vers cet émulateur, et ce qu'on ne peut pas.**
>
> **Prouvé** : 376 des 397 opérations montées sont pilotées par un vrai client, à chaque pull request. `scw`, `octl`, `exo`, Terraform et OpenTofu tournent contre l'émulateur en CI, et les machines démarrent réellement : connexion ssh sur le compte par défaut de chaque provider, subnets isolés, pare-feu qui filtre. La chaîne complète est décrite dans [docs/conformance.md](docs/conformance.md).
> **Prouvé** : 377 des 398 opérations montées sont pilotées par un vrai client, à chaque pull request. `scw`, `octl`, `exo`, Terraform et OpenTofu tournent contre l'émulateur en CI, et les machines démarrent réellement : connexion ssh sur le compte par défaut de chaque provider, subnets isolés, pare-feu qui filtre. La chaîne complète est décrite dans [docs/conformance.md](docs/conformance.md).
>
> **Pas prouvé** : quotas, prix, capacité réelle, validation des identifiants, authentification, cohérence à terme. Les 57 sections de [docs/limits.md](docs/limits.md) disent chacune ce qu'elle coûte. Un émulateur avec un seul compte implicite et aucune grille tarifaire devrait inventer ces chiffres, et quelqu'un agirait dessus.
>
Expand Down Expand Up @@ -140,7 +140,7 @@ valider](docs/confidence.md) dit où cette affirmation s'arrête.
```bash
feint serve
# feint dev listening on 127.0.0.1:4599
# scaleway 193 routes
# scaleway 194 routes
# outscale 100 routes
# exoscale 104 routes
# machines none
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
> [!IMPORTANT]
> **What is safe to point at this emulator, and what is not.**
>
> **Proven**: 376 of the 397 mounted operations are driven by a real client, on every pull request: each pack's own official CLI, and an infrastructure engine wherever a pack admits one, all of them running against the emulator in CI, and machines really boot: an ssh login on each provider's own default account, isolated subnets, a firewall that filters. The whole chain is described in [docs/conformance.md](docs/conformance.md).
> **Proven**: 377 of the 398 mounted operations are driven by a real client, on every pull request: each pack's own official CLI, and an infrastructure engine wherever a pack admits one, all of them running against the emulator in CI, and machines really boot: an ssh login on each provider's own default account, isolated subnets, a firewall that filters. The whole chain is described in [docs/conformance.md](docs/conformance.md).
>
> **Not proven**: quotas, prices, real capacity, identifier validation, authentication, eventual consistency. The 57 sections of [docs/limits.md](docs/limits.md) each say what one costs. An emulator with a single implicit account and no price list would have to invent those figures, and somebody would act on them.
>
Expand Down Expand Up @@ -129,7 +129,7 @@ that claim stops.
```bash
feint serve
# feint dev listening on 127.0.0.1:4599
# scaleway 193 routes
# scaleway 194 routes
# outscale 100 routes
# exoscale 104 routes
# machines none
Expand Down Expand Up @@ -831,8 +831,8 @@ argument is that the upstream moves:
| Client | Version proven in CI | Emulated provider |
|---|---|---|
| `scw` | 2.56.3 | Scaleway |
| Terraform | 1.13.3 with providers `outscale/outscale ~> 1.7`, `scaleway/scaleway 2.82.0` | Exoscale, Outscale, Scaleway |
| OpenTofu | 1.12.5 with providers `outscale/outscale ~> 1.7`, `scaleway/scaleway 2.82.0` | Exoscale, Outscale, Scaleway |
| Terraform | 1.13.3 with providers `outscale/outscale ~> 1.7`, `scaleway/scaleway 2.83.0` | Exoscale, Outscale, Scaleway |
| OpenTofu | 1.12.5 with providers `outscale/outscale ~> 1.7`, `scaleway/scaleway 2.83.0` | Exoscale, Outscale, Scaleway |
| `octl` | 0.0.32 | Outscale |
| `exo` | 1.95.6 | Exoscale |

Expand All @@ -856,18 +856,18 @@ same block is published in the body of every release.
<!-- coverage:start -->
<!-- Generated by `mise run docs:coverage`. Do not edit by hand. -->

397 routes are mounted across the three packs. The tables count *upstream operations*
398 routes are mounted across the three packs. The tables count *upstream operations*
rather than routes: what the provider's own SDK or API description declares, against
what this emulator serves, declines on purpose, or has not triaged yet.

#### Scaleway

193 routes mounted. Of the 536 operations upstream declares: 36% served,
194 routes mounted. Of the 536 operations upstream declares: 36% served,
63% declined on purpose, 0% untriaged.

| Group | Served | Declined | Untriaged | Upstream |
|---|--:|--:|--:|--:|
| `instance` | 72 | 79 | 0 | 151 |
| `instance` | 73 | 78 | 0 | 151 |
| `lb` | 43 | 64 | 0 | 107 |
| `iam` | 5 | 78 | 0 | 83 |
| `vpcgw` | 15 | 49 | 0 | 64 |
Expand All @@ -876,7 +876,7 @@ what this emulator serves, declines on purpose, or has not triaged yet.
| `block` | 22 | 5 | 0 | 27 |
| `account` | 5 | 7 | 0 | 12 |
| *… 2 smaller groups* | 10 | 8 | 0 | 18 |
| **Total** | **193** | **343** | **0** | **536** |
| **Total** | **194** | **342** | **0** | **536** |

#### Exoscale

Expand Down
11 changes: 10 additions & 1 deletion coverage/evidence.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"generated_from": {
"contracts": "e969cbd8c5841bb9",
"shapes": "cac046c206cc9fc8",
"suites": "2ff2d523b829feed"
"suites": "88882d1375a101e2"
},
"operations": {
"account/v3/ProjectAPI.CreateProject": {
Expand Down Expand Up @@ -1847,6 +1847,15 @@
"behaviour": true,
"negative": false
},
"instance/v2alpha1/API.DetachServerPrivateNetworkInterface": {
"driven": true,
"probed": "response",
"contract": "clean",
"dataplane": true,
"shape": "unobserved",
"behaviour": true,
"negative": false
},
"instance/v2alpha1/API.GetPlacementGroup": {
"driven": true,
"probed": "response",
Expand Down
Loading
Loading