docs(spec): project-config: apiserver is the only project authorization point
Production submits always go through the apiserver; harness and direct client-library submits are test tools. The apiserver resolves the project and checks project:submit; the controller records the project and the authorization basis it is given. Direct submits are recorded as given with basis `direct`. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
88ca983f43
commit
33edbeeaf0
2 changed files with 12 additions and 9 deletions
|
|
@ -36,7 +36,7 @@ limits cannot be configured end to end, and nothing shows usage per project.
|
||||||
environment variables).
|
environment variables).
|
||||||
- **Access check** at submit (user decisions 2026-10-12): an RBAC
|
- **Access check** at submit (user decisions 2026-10-12): an RBAC
|
||||||
permission `project:submit`, implied by membership of the project and
|
permission `project:submit`, implied by membership of the project and
|
||||||
grantable by roles (apiserver early check, controller authoritative), with
|
grantable by roles (checked in the apiserver only: production submits always go through it, 2026-10-12), with
|
||||||
a clear error; `cluster_admin` keeps its existing bypass.
|
a clear error; `cluster_admin` keeps its existing bypass.
|
||||||
- **Project admins**: a project's `admins` get every job permission and
|
- **Project admins**: a project's `admins` get every job permission and
|
||||||
`project:view` over its subtree, implied by config like membership. Only
|
`project:view` over its subtree, implied by config like membership. Only
|
||||||
|
|
@ -116,12 +116,12 @@ projects:
|
||||||
`resource-distribution-mapping`, `rbac-persistence`.
|
`resource-distribution-mapping`, `rbac-persistence`.
|
||||||
|
|
||||||
## Design questions (RBAC, 2026-10-12)
|
## Design questions (RBAC, 2026-10-12)
|
||||||
- RBAC lives in the apiserver; the controller sees only config. Direct
|
- Resolved 2026-10-12 (user): production submits always go through the
|
||||||
client-library and harness submits bypass the apiserver, so there the
|
apiserver; harness and direct client-library submits are test tools. The
|
||||||
controller can honour membership and `cluster_admin` but not explicit role
|
apiserver resolves the project and checks `project:submit` (membership
|
||||||
grants. Options: the controller trusts an authorization basis passed by
|
and role grants); the controller records the project and authorization
|
||||||
the authenticated apiserver; or explicit `project:submit` grants apply on
|
basis it is given and never re-checks RBAC. A direct submit is recorded
|
||||||
the REST path only (documented).
|
as given with basis `direct` (Req 3.13).
|
||||||
- The job's authorization basis (Req 3.11) is a new job field: WAL fact and
|
- The job's authorization basis (Req 3.11) is a new job field: WAL fact and
|
||||||
scheduler snapshot must carry it (field completeness, `persistence.md`).
|
scheduler snapshot must carry it (field completeness, `persistence.md`).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ Discovery brief: `.kiro/specs/project-config/brief.md`. Governing rules: `.kiro/
|
||||||
- Submitting under a project is an RBAC permission, `project:submit` (scope type `project`), checked like `queue:submit`.
|
- Submitting under a project is an RBAC permission, `project:submit` (scope type `project`), checked like `queue:submit`.
|
||||||
- Membership implies the grant: being a member of P gives an implicit `project:submit` on P only (membership is not inherited). Roles may also grant `project:submit` explicitly (e.g. to service accounts); a `project` scope covers the named projects and their subtrees, as for every `project` scope.
|
- Membership implies the grant: being a member of P gives an implicit `project:submit` on P only (membership is not inherited). Roles may also grant `project:submit` explicitly (e.g. to service accounts); a `project` scope covers the named projects and their subtrees, as for every `project` scope.
|
||||||
- Project admins: a project's `admins` (users and user groups) get an implicit grant of every job permission and `project:view` over the project's whole subtree. Being an admin does not imply `project:submit`.
|
- Project admins: a project's `admins` (users and user groups) get an implicit grant of every job permission and `project:view` over the project's whole subtree. Being an admin does not imply `project:submit`.
|
||||||
|
- In production every job submission goes through the apiserver (REST: `xcecli`, UIs); the harness and direct client-library submits are test tools. The apiserver is therefore the one place that resolves the project and checks `project:submit`; the controller records what the apiserver decided and does not re-check RBAC.
|
||||||
- In this stage project definitions, members and admins change only through cluster config, so only the cluster administrator edits them; project admins manage jobs, not the project.
|
- In this stage project definitions, members and admins change only through cluster config, so only the cluster administrator edits them; project admins manage jobs, not the project.
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
@ -106,7 +107,7 @@ This feature makes projects first-class cluster configuration entities that cont
|
||||||
2. When a job is submitted without a project name and at least one defined project lists a user group the submitter belongs to as default-for, the Cluster shall use the first such project in configuration order.
|
2. When a job is submitted without a project name and at least one defined project lists a user group the submitter belongs to as default-for, the Cluster shall use the first such project in configuration order.
|
||||||
3. When a job is submitted without a project name and no default-for rule matches the submitter, the Cluster shall use the cluster default project if one is configured, and otherwise the project `default`.
|
3. When a job is submitted without a project name and no default-for rule matches the submitter, the Cluster shall use the cluster default project if one is configured, and otherwise the project `default`.
|
||||||
4. The Cluster shall record the resolved project name on the job at submit, show it in the job's details, and keep it unchanged across later configuration changes, failover and restart.
|
4. The Cluster shall record the resolved project name on the job at submit, show it in the job's details, and keep it unchanged across later configuration changes, failover and restart.
|
||||||
5. The Cluster shall apply the same project resolution to every submit path (REST API, `xcecli`, harness and client library) and to every element of a job array.
|
5. The Cluster shall apply the same project resolution to every submission through the REST API (`xcecli` and any other client of the API) and to every element of a job array.
|
||||||
6. The Cluster shall identify a project at submit only by its full path name; a name that is only the last segment of a defined project's path (e.g. `cfd` for `eng/hpc/cfd`) is treated as the top-level project of that name.
|
6. The Cluster shall identify a project at submit only by its full path name; a name that is only the last segment of a defined project's path (e.g. `cfd` for `eng/hpc/cfd`) is treated as the top-level project of that name.
|
||||||
|
|
||||||
### Requirement 3: Submit authorization
|
### Requirement 3: Submit authorization
|
||||||
|
|
@ -121,9 +122,11 @@ This feature makes projects first-class cluster configuration entities that cont
|
||||||
6. The Cluster shall not infer membership of a project from membership of its parent, its children or any other project; the implicit `project:submit` of a member covers that project only.
|
6. The Cluster shall not infer membership of a project from membership of its parent, its children or any other project; the implicit `project:submit` of a member covers that project only.
|
||||||
7. The Cluster shall treat a role grant of `project:submit` with scope type `all` as covering every project, and with scope type `project` as covering the named projects and their descendants.
|
7. The Cluster shall treat a role grant of `project:submit` with scope type `all` as covering every project, and with scope type `project` as covering the named projects and their descendants.
|
||||||
8. Where a user may submit under several projects, the Cluster shall accept the user's jobs under any of those projects.
|
8. Where a user may submit under several projects, the Cluster shall accept the user's jobs under any of those projects.
|
||||||
9. The Cluster shall reject an unauthorized or unknown-project submission before the job is assigned a job ID or recorded, on every submit path.
|
9. The Cluster shall reject an unauthorized or unknown-project submission before the job is assigned a job ID or recorded.
|
||||||
10. The Cluster shall check `project:submit` in addition to, not instead of, the existing queue permission.
|
10. The Cluster shall check `project:submit` in addition to, not instead of, the existing queue permission.
|
||||||
11. The Cluster shall record on the job whether its project was authorized by membership, by a role grant or by the cluster administrator role.
|
11. The Cluster shall record on the job whether its project was authorized by membership, by a role grant or by the cluster administrator role.
|
||||||
|
12. The apiserver shall be the only component that resolves the project and checks `project:submit`; the controller shall record the project and authorization basis it receives with the submission without checking them again.
|
||||||
|
13. When a job is submitted directly to the controller, bypassing the apiserver (harness and client-library test paths, not supported for production), the Cluster shall record the project name as given (an empty name as `default`) with the authorization basis `direct`, without project resolution or authorization; Requirement 5 still applies to the pending job, except the membership hold of 5.2.
|
||||||
|
|
||||||
### Requirement 4: Open mode when no projects are defined
|
### Requirement 4: Open mode when no projects are defined
|
||||||
**Objective:** As an operator of an existing cluster, I want clusters without project definitions to keep working as today, so that upgrading does not break existing submissions.
|
**Objective:** As an operator of an existing cluster, I want clusters without project definitions to keep working as today, so that upgrading does not break existing submissions.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue