Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
6a0a419
[pipeline-manager] Add OIDC workload-identity trust relationships
gz May 27, 2026
f8d0a82
[pipeline-manager] Add role-based access control
gz Jun 8, 2026
80bf1d1
[web-console] RBAC/OIDC admin UX fixes
gz Jul 23, 2026
97dd62f
[pipeline-manager] OIDC trust: header-based tenant selection
gz Jul 23, 2026
8d66157
[web-console] Admin page: clearer tenant scope and owner-vs-tenant trust
gz Jul 23, 2026
136f14d
[pipeline-manager] OIDC trust: platform-wide owner trusts + issuer lo…
gz Jul 23, 2026
271b8b1
[web-console] Admin OIDC/tenant UX: owner-vs-tenant trust, read-only …
gz Jul 23, 2026
b6f3ae6
[pipeline-manager] RBAC API reference: per-route min role, tighter ro…
gz Jul 24, 2026
4971592
[docs] Authentication: RBAC roles page and upgrade guidance
gz Jul 24, 2026
3142b69
[pipeline-manager] Make the tenant-creator's role configurable
gz Jul 24, 2026
536c24b
[docs] Document the configurable first-user role
gz Jul 24, 2026
dcd313c
[pipeline-manager] Drop unused role imports
gz Jul 24, 2026
4403e49
[scripts] dummy_oidc: add --demo-tenants for multi-tenant demo users
gz Jul 24, 2026
b50cfba
[pipeline-manager] Merge the RBAC and OIDC trust migrations
gz Jul 26, 2026
dc43e53
[pipeline-manager] Address review feedback on the RBAC surface
gz Jul 26, 2026
900a618
[fda] Default a new API key to read, and show real token commands
gz Jul 26, 2026
2cbcc5f
[web-console] Derive owner status from the session role
gz Jul 26, 2026
7879f6e
[docs] Record the API-key default change and owner-trust precedence
gz Jul 26, 2026
c1a29b0
[scripts] dummy_oidc: plain section comments
gz Jul 26, 2026
455e781
[pipeline-manager] Order tenant members deterministically
gz Jul 26, 2026
48e23bc
[pipeline-manager] Model-test OIDC trust and tenant membership
gz Jul 26, 2026
ce1a1ce
[ci] apply automatic fixes
feldera-bot Jul 26, 2026
1e792d7
[pipeline-manager] Fix the rustdoc failures in pre-commit
gz Jul 26, 2026
0d9590d
[pipeline-manager] Identify a tenant by its name alone
gz Jul 27, 2026
7552bee
[docs] Explain what changing the identity provider does to tenants
gz Jul 27, 2026
5dbd71c
[pipeline-manager] Name the tenant's provider column for what it holds
gz Jul 27, 2026
827fa1e
[pipeline-manager] Let an owner rename or delete a tenant
gz Jul 27, 2026
bfd84ac
[pipeline-manager] Resolve a route's access rule without actix's pattern
gz Jul 27, 2026
71b807d
[docs] Authentication: apply review wording
gz Jul 27, 2026
7e8e8d4
[fda] Apply review feedback on the tenant and auth-token commands
gz Jul 28, 2026
53eca85
[pipeline-manager] Apply review feedback on the RBAC surface
gz Jul 28, 2026
64994a8
[pipeline-manager] Make the owner role deploy-time configuration only
gz Jul 28, 2026
32565a3
[pipeline-manager] Honour an owner trust from the login provider
gz Jul 28, 2026
c71a056
[scripts] Cover config-only owner in the RBAC demo
gz Jul 28, 2026
e2f620e
[web-console] Add proper role-based feature gating
Karakatiza666 Jul 28, 2026
7dc8c06
[web-console] Update UI of Admin dashboard and OIDC trust popup
Karakatiza666 Jul 29, 2026
2961f8d
[web-console] Tenant management review fixes
Karakatiza666 Jul 30, 2026
406976a
[web-console] Say what revoking at the provider actually does
gz Jul 30, 2026
9f11ea2
[scripts] Fix rbac_up.sh on macOS bash 3.2
gz Jul 30, 2026
5ebbec5
[pipeline-manager] Never ignore an explicit Feldera-Tenant header
gz Jul 31, 2026
abb172a
[tests] Cover RBAC and OIDC trust across manager restarts
gz Jul 31, 2026
0d10fd9
[ci] apply automatic fixes
feldera-bot Jul 31, 2026
7968812
[pipeline-manager] Restrict where a registered OIDC trust may point
gz Jul 31, 2026
922ffe2
[pipeline-manager] Keep the default tenant bootstrap keyed by its id
gz Jul 31, 2026
ddc1066
[tests] Pin what the route matrix reads into a status code
gz Jul 31, 2026
a15706d
[ci] apply automatic fixes
feldera-bot Jul 31, 2026
330b110
[pipeline-manager] Confine federated OIDC fetches to public addresses
gz Jul 29, 2026
590dc5b
[pipeline-manager] Coalesce OIDC key refreshes behind a per-issuer co…
gz Jul 29, 2026
6f2c3fe
[pipeline-manager] Require write to compile a program
gz Jul 29, 2026
83701cb
[scripts] Let the RBAC demo register an internal trust issuer
gz Jul 31, 2026
fac36be
[web-console] Don't create a Monaco editor after its consumer unmounts
gz Jul 31, 2026
5225e97
[tests] Say why the RBAC suite's manager refused a request
gz Jul 31, 2026
db8fa85
[tests] Show what the RBAC container sees of its CA bundle
gz Jul 31, 2026
a1222ba
[pipeline-manager] Trust the configured CA when fetching OIDC keys
gz Jul 31, 2026
22f9d9f
[ci] Cancel the run when a platform integration job fails
gz Jul 31, 2026
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
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ jobs:
# watches a single upstream job and immediately cancels the entire run on
# failure.
#
# A sentinel here watches an `invoke-*` job, which stands for a whole called
# workflow and reports failure only once every job in it has finished. A
# called workflow that runs several jobs therefore needs its own sentinel per
# job, next to those jobs, or one failing job leaves its siblings running.
# See build-rust.yml and test-integration-platform.yml.
#
# IMPORTANT: The sentinel cancel is asynchronous. Any job that must not run
# when a prior job fails MUST also list that job in its `needs:` field and
# check its result in its `if:` condition — do not rely on the cancel alone.
Expand Down
123 changes: 107 additions & 16 deletions .github/workflows/test-integration-platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,22 @@ name: Platform Integration Tests

on:
workflow_call:
inputs:
image_tag:
description: "Image tag to test. Empty means this ref's own sha- tag."
required: false
type: string
workflow_dispatch:
inputs:
run_id:
description: "ID of the workflow run that uploaded the artifact"
required: true
image_tag:
description: >-
Tag of an already-built image to test, e.g. sha-<40-char-sha> from an
earlier run. Leave empty to use this ref's own sha- tag, which only
exists if the image was built for exactly this commit. Pointing at a
previous run's image is what makes this workflow dispatchable on its
own, without waiting for a full rebuild.
required: false
type: string

env:
FELDERA_SENTRY_ENABLED: 1
Expand All @@ -34,7 +45,7 @@ jobs:
--health-interval=10s \
--health-timeout=5s \
--health-retries=5 \
${{ vars.FELDERA_IMAGE_NAME }}:sha-${{ github.sha }}
${{ vars.FELDERA_IMAGE_NAME }}:${{ inputs.image_tag || format('sha-{0}', github.sha) }}
- name: Wait for container to become healthy (max 50s)
run: |
for i in {1..50}; do
Expand All @@ -59,12 +70,11 @@ jobs:
docker rm -f pipeline-manager-no-internet || true
docker network rm no-internet-net || true

manager-https:
if: ${{ !contains(vars.CI_SKIP_JOBS, 'manager-https') }}
name: Make sure manager runs with HTTPS
manager-https-rbac:
if: ${{ !contains(vars.CI_SKIP_JOBS, 'manager-https-rbac') }}
name: HTTPS, RBAC and OIDC trust
runs-on: ubuntu-latest-amd64

# Environment variables for OIDC authentication (if available)
env:
OIDC_TEST_ISSUER: ${{ vars.OIDC_TEST_ISSUER }}
OIDC_TEST_CLIENT_ID: ${{ vars.OIDC_TEST_CLIENT_ID }}
Expand All @@ -81,7 +91,10 @@ jobs:
- name: Login to GHCR with GITHUB_TOKEN
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

- name: Start pipeline-manager in background
# Phase 1: the HTTPS listener, against the external provider when one is
# configured. This manager is torn down before phase 2, which binds the
# same port.
- name: Start pipeline-manager with HTTPS
run: |
mkdir test-tls
echo -e "[x509_v3]\nsubjectAltName = @alt_names\n\n[alt_names]\nDNS.1 = localhost\nIP.1 = 127.0.0.1\n" > test-tls/x509_v3_test.ext
Expand All @@ -103,7 +116,7 @@ jobs:
-e RUST_LOG=info \
-e RUST_BACKTRACE=1 \
-e CARGO_BUILD_JOBS=${{ vars.CI_RUNNER_CORES || 20 }} \
${{ vars.FELDERA_IMAGE_NAME }}:sha-${{ github.sha }} \
${{ vars.FELDERA_IMAGE_NAME }}:${{ inputs.image_tag || format('sha-{0}', github.sha) }} \
--enable-https \
--https-tls-cert-path /home/ubuntu/test-tls/tls_test.crt \
--https-tls-key-path /home/ubuntu/test-tls/tls_test.key
Expand All @@ -123,27 +136,53 @@ jobs:
done
echo "Timed out waiting for pipeline-manager to become healthy"
exit 1
- name: Run platform tests
- name: Pipeline CRUD over HTTPS
if: ${{ vars.CI_DRY_RUN != 'true' }}
run: uv run --locked pytest -n ${{ vars.PYTEST_WORKERS }} tests/platform/test_pipeline_crud.py --timeout=3600 -vv
working-directory: python
env:
FELDERA_HTTPS_TLS_CERT: ../test-tls/tls_test.crt
FELDERA_HOST: https://localhost:8080
PYTHONPATH: ${{ github.workspace }}/python
# OIDC environment variables for authentication
OIDC_TEST_ISSUER: ${{ vars.OIDC_TEST_ISSUER }}
OIDC_TEST_CLIENT_ID: ${{ vars.OIDC_TEST_CLIENT_ID }}
OIDC_TEST_CLIENT_SECRET: ${{ secrets.OIDC_TEST_CLIENT_SECRET }}
OIDC_TEST_USERNAME: ${{ secrets.OIDC_TEST_USERNAME }}
OIDC_TEST_PASSWORD: ${{ secrets.OIDC_TEST_PASSWORD }}

- name: Stop the HTTPS manager
run: docker rm -f pipeline-manager-https || true

# Phase 2: RBAC and OIDC trust. The suite owns the manager, restarting it
# through no-auth, single-tenant and multi-tenant configurations, and runs
# its own issuers: a login provider, a workload issuer that trusts are
# registered against, and a rogue issuer signing with an unknown key. It
# is stateful and ordered, so it runs serially rather than under -n.
- name: RBAC, OIDC trust and the route/role matrix
if: ${{ vars.CI_DRY_RUN != 'true' }}
run: uv run --locked pytest tests/platform_rbac --timeout=2400 --maxfail=1 -vv
working-directory: python
env:
FELDERA_TEST_IMAGE: ${{ vars.FELDERA_IMAGE_NAME }}:${{ inputs.image_tag || format('sha-{0}', github.sha) }}
PYTHONPATH: ${{ github.workspace }}/python

- name: Logs & Cleanup
if: always()
run: |
rm -rf test-tls
docker logs pipeline-manager-https || true
docker inspect pipeline-manager-https || true
docker rm -f pipeline-manager-https || true
# Only if it outlived the phase that normally removes it, which is
# what happens when that phase failed and its log is worth having.
if docker inspect pipeline-manager-https >/dev/null 2>&1; then
docker logs pipeline-manager-https || true
docker rm -f pipeline-manager-https || true
fi
for c in $(docker ps -aq --filter "name=feldera-rbac-"); do
echo "=== $c ==="; docker logs "$c" 2>&1 | tail -100 || true
docker rm -f "$c" || true
done
for v in $(docker volume ls -q --filter "name=feldera-rbac-state-"); do
docker volume rm -f "$v" || true
done

oss-platform-tests:
if: ${{ !contains(vars.CI_SKIP_JOBS, 'oss-platform-tests') }}
Expand Down Expand Up @@ -179,7 +218,7 @@ jobs:
image: ghcr.io/feldera/feldera-dev:sha-a5ab793b8d261068867b9fdfad3f04157b2536fc
services:
pipeline-manager:
image: ${{ vars.FELDERA_IMAGE_NAME }}:sha-${{ github.sha }}
image: ${{ vars.FELDERA_IMAGE_NAME }}:${{ inputs.image_tag || format('sha-{0}', github.sha) }}
env:
# Configure OIDC authentication if available, otherwise use no auth
AUTH_PROVIDER: ${{ vars.OIDC_TEST_ISSUER && 'generic-oidc' || 'none' }}
Expand Down Expand Up @@ -291,3 +330,55 @@ jobs:
working-directory: crates/fda
env:
FDA_BINARY: ${{ github.workspace }}/build/fda

# One cancel sentinel per job above, following the scheme ci.yml documents.
# ci.yml's cancel-if-tests-integration-platform-failed is not enough on its
# own: it watches the caller-side job, which reports failure only once every
# job here has finished, so a job that fails early leaves its siblings, and
# the rest of the run, going for hours. These watch a single job each and
# cancel the run as soon as it fails. `github.run_id` is the caller's run,
# so the whole run goes down, not just this workflow.
cancel-if-manager-no-network-failed:
name: Cancel if No-Network Manager Test Failed
needs: [manager-no-network]
if: failure()
runs-on: ubuntu-latest-amd64
permissions:
actions: write
steps:
- name: Cancel workflow
run: |
curl -fsSL -X POST \
-H "Authorization: Bearer ${{ github.token }}" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/cancel"

cancel-if-manager-https-rbac-failed:
name: Cancel if HTTPS, RBAC and OIDC Trust Tests Failed
needs: [manager-https-rbac]
if: failure()
runs-on: ubuntu-latest-amd64
permissions:
actions: write
steps:
- name: Cancel workflow
run: |
curl -fsSL -X POST \
-H "Authorization: Bearer ${{ github.token }}" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/cancel"

cancel-if-oss-platform-tests-failed:
name: Cancel if OSS Platform Tests Failed
needs: [oss-platform-tests]
if: failure()
runs-on: ubuntu-latest-amd64
permissions:
actions: write
steps:
- name: Cancel workflow
run: |
curl -fsSL -X POST \
-H "Authorization: Bearer ${{ github.token }}" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/cancel"
6 changes: 4 additions & 2 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading