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
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -862,12 +862,12 @@ what this emulator serves, declines on purpose, or has not triaged yet.

#### Scaleway

195 routes mounted. Of the 537 operations upstream declares: 36% served,
63% declined on purpose, 0% untriaged.
195 routes mounted. Of the 542 operations upstream declares: 35% served,
64% declined on purpose, 0% untriaged.

| Group | Served | Declined | Untriaged | Upstream |
|---|--:|--:|--:|--:|
| `instance` | 73 | 78 | 0 | 151 |
| `instance` | 73 | 83 | 0 | 156 |
| `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 |
| *… 3 smaller groups* | 11 | 8 | 0 | 19 |
| **Total** | **195** | **342** | **0** | **537** |
| **Total** | **195** | **347** | **0** | **542** |

#### Exoscale

Expand Down
51 changes: 43 additions & 8 deletions coverage/scaleway-coverage.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"provider": "scaleway",
"total": 537,
"total": 542,
"implemented": 195,
"declined": 342,
"declined": 347,
"unknown": 0,
"orphans": null,
"products": [
Expand Down Expand Up @@ -86,9 +86,9 @@
},
{
"product": "instance",
"total": 151,
"total": 156,
"implemented": 73,
"declined": 78,
"declined": 83,
"unknown": 0,
"versions": [
{
Expand All @@ -100,9 +100,9 @@
},
{
"version": "v2alpha1",
"total": 73,
"total": 78,
"implemented": 11,
"declined": 62,
"declined": 67,
"unknown": 0
}
]
Expand Down Expand Up @@ -240,9 +240,9 @@
},
{
"group": "instance",
"total": 151,
"total": 156,
"implemented": 73,
"declined": 78,
"declined": 83,
"unknown": 0
},
{
Expand Down Expand Up @@ -2022,6 +2022,13 @@
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.GetDedicatedPool",
"product": "instance",
"reason": "a Dedicated Pool is physical capacity reserved for an organisation, and this emulator has no fleet: answering would invent hardware a client could plan a migration onto, which is the same refusal GetServerTypesAvailability carries. It holds whether or not this API stays alpha",
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.GetPlacementGroup",
"product": "instance",
Expand Down Expand Up @@ -2090,6 +2097,20 @@
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.ListDedicatedPoolServerTypes",
"product": "instance",
"reason": "a Dedicated Pool is physical capacity reserved for an organisation, and this emulator has no fleet: answering would invent hardware a client could plan a migration onto, which is the same refusal GetServerTypesAvailability carries. It holds whether or not this API stays alpha",
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.ListDedicatedPools",
"product": "instance",
"reason": "a Dedicated Pool is physical capacity reserved for an organisation, and this emulator has no fleet: answering would invent hardware a client could plan a migration onto, which is the same refusal GetServerTypesAvailability carries. It holds whether or not this API stays alpha",
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.ListPlacementGroups",
"product": "instance",
Expand All @@ -2109,6 +2130,13 @@
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.ListServerCompatibleTypes",
"product": "instance",
"reason": "which types a server can be converted to is a compatibility matrix this emulator has no measurement for: corpus/ holds no recording of it, and the catalogue served here is a small fixed table rather than Scaleway's. An invented answer would have a client plan a resize the real API refuses",
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.ListServerTypes",
"product": "instance",
Expand Down Expand Up @@ -2221,6 +2249,13 @@
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.UpdateDedicatedPool",
"product": "instance",
"reason": "a Dedicated Pool is physical capacity reserved for an organisation, and this emulator has no fleet: answering would invent hardware a client could plan a migration onto, which is the same refusal GetServerTypesAvailability carries. It holds whether or not this API stays alpha",
"version": "v2alpha1",
"status": "declined"
},
{
"operation": "instance/v2alpha1/API.UpdatePlacementGroup",
"product": "instance",
Expand Down
4 changes: 3 additions & 1 deletion docs/routes.md
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ reason that outlived its cause.
- `ipam` — 1 operation — no official client calls it: the CLI has no detach subcommand, and the provider detaches by deleting the NIC that carries the address
- `vpc` — 1 operation — no official client asks for the flat list: `scw vpc` has no subnet subcommand, and the Terraform provider reads the subnets a private network publishes inline through GetPrivateNetwork

### Declined on purpose (342)
### Declined on purpose (347)

Operations this pack knowingly does not serve, and why. Declining is a
decision the drift gate records, which is what separates it from having
Expand All @@ -441,6 +441,7 @@ are in `coverage/`, one artefact per provider.
- `iam` — 78 operations — the emulator accepts every credential on purpose, so serving users, policies and keys would describe an access control that nothing here enforces
- `instance` — 61 operations — instance/v2alpha1 is an alpha rewrite Scaleway is still free to change, and no client this project drives reaches for these operations — a claim that held for the whole API until provider 2.81.0 moved private network interfaces and placement groups onto it, and for the server family until 2.83.0 reached the private-interface detach, which is why those are served and these are not
- `instance` — 5 operations — the metadata service answers on the link-local address 169.254.42.42, from inside the machine, to a caller that carries no credentials
- `instance` — 4 operations — a Dedicated Pool is physical capacity reserved for an organisation, and this emulator has no fleet: answering would invent hardware a client could plan a migration onto, which is the same refusal GetServerTypesAvailability carries. It holds whether or not this API stays alpha
- `instance` — 2 operations — capacity and quotas are the provider's fleet, and a local emulator that answered would be inventing headroom a client could plan against
- `instance` — 2 operations — it mounts Scaleway's File Storage product, and there is no filesystem service behind this emulator for a machine to mount
- `instance` — 2 operations — the SDK's hand-written helpers, deprecated upstream in favour of AttachServerVolume and DetachServerVolume, which this pack serves and which the CLI calls
Expand All @@ -449,6 +450,7 @@ are in `coverage/`, one artefact per provider.
- `instance` — 1 operation — it hands an instance flexible IP over to IPAM's pool, and the public addresses of this emulator live and die with the instance product: IPAM here holds private-network addresses only
- `instance` — 1 operation — it writes into Object Storage, which is not emulated because the Terraform provider builds the S3 endpoint in code: supporting it needs DNS interception and a certificate, measured in docs/limits.md
- `instance` — 1 operation — the server already publishes allowed_actions, derived from its state, so a second listing would be a second place to keep in step with the first
- `instance` — 1 operation — which types a server can be converted to is a compatibility matrix this emulator has no measurement for: corpus/ holds no recording of it, and the catalogue served here is a small fixed table rather than Scaleway's. An invented answer would have a client plan a resize the real API refuses
- `ipam` — 1 operation — ipam/v1alpha1 is the superseded draft of ipam/v1, which is served
- `lb` — 53 operations — the regional lb/v1 API is deprecated upstream in favour of the zoned one, which is served: the portal publishes only the zoned document, and every measured client calls ZonedAPI
- `lb` — 6 operations — subscribers are an alerting channel, and an emulator whose balancer never degrades has no event to deliver: a subscription recorded here would be a promise nothing can keep; the list is served since #666, and it is empty, for the same reason
Expand Down
29 changes: 29 additions & 0 deletions internal/providers/scaleway/pack.go
Original file line number Diff line number Diff line change
Expand Up @@ -1236,6 +1236,35 @@ func (p *Pack) Declined() []emulator.Decline {
emulator.Because("instance/v2alpha1.DetachAndDeletePrivateNetworkInterface folds a detach and a delete into one call, and no client this project drives sends it: the recorded transcript of a full Terraform apply on provider 2.81.0 shows only ListPrivateNetworkInterfaces on this API. The two halves it folds are reachable through the routes already mounted, and the alpha version is named so a promotion to a stable instance/v2 has this decided again",
"instance/v2alpha1/API.DetachAndDeletePrivateNetworkInterface"),

// Appeared upstream in the nightly scan of 2026-09-21, and they get two
// reasons rather than one because they fail for different reasons. Both
// would survive a promotion of v2alpha1 to a stable instance/v2, which the
// blanket reason below would not: that one rests on the API being alpha.
//
// A Dedicated Pool is physical capacity reserved for an organisation —
// "List Dedicated Pools for an organization", "Instance types available in
// a Dedicated Pool and their technical details", says the SDK. This is the
// provider's own fleet, which docs/limits.md refuses to invent for the
// reason GetServerTypesAvailability is already declined: an emulator that
// answered would be publishing headroom a client could plan against, and
// there is no honest number to put there.
emulator.Because("a Dedicated Pool is physical capacity reserved for an organisation, and this emulator has no fleet: answering would invent hardware a client could plan a migration onto, which is the same refusal GetServerTypesAvailability carries. It holds whether or not this API stays alpha",
"instance/v2alpha1/API.GetDedicatedPool",
"instance/v2alpha1/API.ListDedicatedPoolServerTypes",
"instance/v2alpha1/API.ListDedicatedPools",
"instance/v2alpha1/API.UpdateDedicatedPool"),

// "List the Instance types that a given instance could be converted to."
// A different refusal from the pools above: the obstacle is not a missing
// fleet but a missing measurement. This pack serves a small fixed
// catalogue (catalog.go), and which of its types a given server could
// become is a compatibility matrix — local volumes, architecture,
// generation — that no recording in corpus/ arbitrates. Answering would
// mean inventing the matrix, and a client that trusted it would plan a
// resize the real API refuses.
emulator.Because("which types a server can be converted to is a compatibility matrix this emulator has no measurement for: corpus/ holds no recording of it, and the catalogue served here is a small fixed table rather than Scaleway's. An invented answer would have a client plan a resize the real API refuses",
"instance/v2alpha1/API.ListServerCompatibleTypes"),

// The claim below is now dated twice, and the dates are the point: it held
// for the whole alpha API until provider 2.81.0 moved private network
// interfaces and placement groups onto it, and it held for the server
Expand Down
Loading