Errors — skyline-console — branch stable/2026.2
Branch
stable/2026.2@806d200392ee— repository https://opendev.org/openstack/skyline-console — analysed on 2026-10-29
A client defines no error codes. What matters is how it reacts to the errors of skyline-apiserver and of the OpenStack APIs, and which error bodies it parses (those become requirements on the services, see 07 § 4). The console throws only one exception of its own (Invalid prefixlen, src/stores/neutron/network.js:345, a CIDR helper).
1. Central handling (every request)
| Situation | What the console does | Where |
|---|---|---|
| HTTP 401 from any URL (Skyline or an OpenStack proxy) | redirect to /auth/login?referer=<current path>, unless already on the login page; the promise is still rejected | src/client/client/request.js:38, src/client/client/request.js:42, src/stores/root.js:254 |
| non-2xx status that axios resolved anyway | rejected with the body instead of the error object | src/client/client/request.js:139 |
HEAD, application/octet-stream, Content-Disposition: attachment | the raw axios response is returned (downloads, Swift objects) | src/client/client/request.js:133 |
| network error, timeout | no special handling: the axios error propagates (no retry, no timeout set) | src/client/client/request.js:148 |
time_expired cookie missing or in the past | X-Auth-Token is not sent; the next OpenStack call gets a 401 and the user is logged out | src/client/client/request.js:56 |
There is no retry and no client timeout anywhere in the request layer (src/client/client/request.js:157): a hung upstream keeps the spinner until the browser gives up.
2. How errors are shown
| Where it happens | Rule | Shown as | Where |
|---|---|---|---|
| list or detail fetch | 401 → "The session has expired, please log in again."; 500 → "Get {name} error. System is error, please try again later."; other → "Get {name} error." with the body in a JSON viewer; auto refresh is stopped | sticky error notification (no timeout) | src/containers/List/index.jsx:723, src/components/Notify/index.jsx:62 |
| page policy denied by the policy list | synthetic 403 "You don't have access to get {name}." — no request is sent | notification | src/containers/List/index.jsx:664 |
| page whose required endpoint is missing from the profile | "not found" page with endpointError | page | src/containers/List/index.jsx:254 |
| action submit (confirm, modal, form, step) | the response body (error.response.data, else the error) is shown under the action's error title (submitErrorMsg or "Unable to {action}") | notification + "Click to show detail" JSON viewer | src/components/Tables/Base/ActionButton/index.jsx:235, src/components/Form/index.jsx:372 |
| batch action | one notification per failed item; the batch counts as failed only when every item failed | notifications | src/components/Tables/Base/ActionButton/index.jsx:355 |
status ≥ 500 in errorWithDetail | title + statusMap text ("Internal Server Error (code: 500)", 501, 502, 503, 504, 505); body not shown unless the status is outside the map | notification | src/components/Notify/index.jsx:128, src/utils/code.js:1 |
| action not allowed for the item's state | performErrorMsg of the action (e.g. 'Instance "{ name }" status is not in active or suspended, can not stop it.'), no request | confirm dialog | src/pages/compute/containers/Instance/actions/Stop.jsx:59 |
The error body is not parsed in general: it is displayed as JSON (HTML entities decoded). OpenStack services can change error texts without breaking the console, except for the cases below.
3. Error bodies the console parses (hard expectations)
| Service response | Parsed field / text | Effect | Where |
|---|---|---|---|
skyline POST login 401 | detail object with totp_required: true and receipt | TOTP step | src/pages/auth/containers/Login/index.jsx:296 |
skyline POST login 401 | detail string containing The password is expired and needs to be changed for user; the user ID is taken from it | change-password page | src/pages/auth/containers/Login/index.jsx:306 |
skyline POST login/totp 401 | detail equal to receipt_expired or invalid_totp | message choice | src/pages/auth/containers/Login/index.jsx:346 |
Keystone POST /v3/users/{id}/password error | error.message | shown under the form | src/pages/auth/containers/ChangePassword/index.jsx:89 |
Nova POST /servers 403 | forbidden.message containing Quota exceeded | "Quota exceeded" instead of the raw body | src/pages/compute/containers/Instance/actions/StepCreate/index.jsx:794 |
Nova POST /servers (bare metal flavor) 403 | same rule | same | src/pages/compute/containers/Instance/actions/CreateIronic/index.jsx:361 |
Neutron GET routers/{id}/l3-agents 404 | treated as "no L3 agent information" (OVN has no L3 agents) | empty column, no error | src/stores/neutron/router.js:117 |
Swift DELETE container 409 | replaced by 'Cannot delete container "{name}". The container is not empty.' | notification | src/stores/swift/container.js:96 |
4. Asynchronous errors
The console has no background worker. Asynchronous failures of OpenStack (a server in ERROR, a volume in error_extending…) appear only as statuses in the next list refresh; the console shows them as returned (with fault.message for servers in the detail page). Refresh behaviour after an error: 05.
5. Key console messages (browser console)
| Message | Situation | Where |
|---|---|---|
error.response … | every failed request | src/client/client/request.js:148 |
fetch list error | list fetch failed | src/containers/List/index.jsx:723 |
policy rule not exit <rule> <action> | a rule used by the UI is missing from skyline-apiserver's policy list (then treated as allowed) | src/resources/skyline/policy.js:129 |
parse marker error! | marker paging could not read the last item's marker | src/stores/base.js:287 |
Source: reverse-spec-skyline-console/02-errors_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.