Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
f7d0c71
initial L0 work
df49b9cd Nov 24, 2025
2f6ba32
ci: add http3, perf, aot, hyperscale workflows
df49b9cd Nov 24, 2025
bd39c49
--blame
df49b9cd Nov 24, 2025
c3141d3
L1 initial
df49b9cd Nov 24, 2025
9aef895
chore: add hugo alignment work items and pipeline delays
df49b9cd Nov 24, 2025
5bd425a
refactor: move gossip timers to Hugo pipeline delay
df49b9cd Nov 24, 2025
c752a80
refactor: use hugo retry policies for control watch, leadership, gossip
df49b9cd Nov 24, 2025
b9c74e0
refactor: retry shuffle sends with hugo policy
df49b9cd Nov 24, 2025
907f29a
refactor: apply hugo retry policies to watch/gossip/leadership
df49b9cd Nov 24, 2025
2a239b5
chore: scaffold gossip send pump queue
df49b9cd Nov 24, 2025
9d56034
refactor: queue gossip sends via safe pump
df49b9cd Nov 24, 2025
b3c0099
refactor: route control-plane delays through pipeline timers
df49b9cd Nov 24, 2025
7663a82
chore: queue leadership scope evaluations via SafeTaskQueue
df49b9cd Nov 24, 2025
6a0a569
feat: queue control watch applies via SafeTaskQueue
df49b9cd Nov 24, 2025
6deab64
feat: move http duplex request pump onto SafeTaskQueue
df49b9cd Nov 24, 2025
ea18f6e
chore: use result-based delay in grpc health watch
df49b9cd Nov 24, 2025
87c7365
docs: mark WORK-024Q done
df49b9cd Nov 24, 2025
a5d55b1
chore: resolve analyzers and stabilize hyperscale gossip test
df49b9cd Nov 24, 2025
910aa13
feat: bound control watch retry policy
df49b9cd Nov 24, 2025
8a8a328
feat: batch telemetry snapshots with Hugo windowing
df49b9cd Nov 24, 2025
216f134
feat: fan-out shard simulations via Hugo merge
df49b9cd Nov 24, 2025
450ba99
dotnet format
df49b9cd Nov 24, 2025
7bc715f
feat: aggregate stream errors with Hugo collect
df49b9cd Nov 24, 2025
b7191b6
feat: link stream cancellation with Hugo tap helpers
df49b9cd Nov 24, 2025
d3bff8e
feat: batch data-plane streams with Hugo windowing
df49b9cd Nov 24, 2025
58439ec
feat: fan-out dispatcher lifecycle via Hugo pipelines
df49b9cd Nov 24, 2025
5446ca7
feat: aggregate data-plane stream errors via Hugo
df49b9cd Nov 24, 2025
25d9e05
docs: mark WORK-024I done with codec aggregation notes
df49b9cd Nov 24, 2025
a06b428
feat: link grpc server stream pumps to Hugo cancellation
df49b9cd Nov 24, 2025
0bae709
feat: align meshkit/onway/duplex with Hugo patterns
df49b9cd Nov 24, 2025
3bbcabc
dotnet format
df49b9cd Nov 24, 2025
a10ac85
adjust global.json
df49b9cd Nov 24, 2025
c015096
ci fixes
df49b9cd Nov 24, 2025
3ea43bc
fix: stabilize control-plane pumps and gossip timers
df49b9cd Nov 24, 2025
e57354a
regression fix
df49b9cd Nov 24, 2025
ed8a2d9
minor ci correction
df49b9cd Nov 24, 2025
dabedd5
chore: add control-plane host and switch CI AOT publishes
df49b9cd Nov 25, 2025
309d51f
chore: publish control-plane/data-plane hosts in AOT script
df49b9cd Nov 25, 2025
ae324d0
set runtime identifiers
df49b9cd Nov 25, 2025
229b7af
ci: add linux-arm64 to gate matrix
df49b9cd Nov 25, 2025
43bcbc6
.vscode stuff
df49b9cd Nov 25, 2025
23d14fa
change job matrix
df49b9cd Nov 25, 2025
63c3c53
ci: run gate on ubuntu, macos, windows
df49b9cd Nov 25, 2025
c410a80
ci: map OS to appropriate RIDs
df49b9cd Nov 25, 2025
0724bca
ci: drop windows http3 job to avoid hung builds
df49b9cd Nov 25, 2025
24d1e7c
ci: reenable windows http3 with hang detection and http3 flag
df49b9cd Nov 25, 2025
ec14b81
ci: run gate with PowerShell on Windows runners
df49b9cd Nov 25, 2025
1700228
win-x64 default in ps1
df49b9cd Nov 25, 2025
aff5588
test: deflake watch harness applies update
df49b9cd Nov 25, 2025
81dffcf
ci: fix windows gate step shell
df49b9cd Nov 25, 2025
d0c10b9
trying to make watchharnesstests more deterministic
df49b9cd Nov 25, 2025
eb98864
ci: gate http3 jobs on platform-specific ci success
df49b9cd Nov 25, 2025
c9ad1aa
update ci and retire http3.yml
df49b9cd Nov 25, 2025
00b581d
naming of cli to orc
df49b9cd Nov 25, 2025
1ec92f2
adjusted ci timeout and made windows build optional for now
df49b9cd Nov 25, 2025
76d1b5a
omnirelay-cli
df49b9cd Nov 25, 2025
14e322f
adjust cli name
df49b9cd Nov 25, 2025
373a3e1
adjust tests and work-006
df49b9cd Nov 25, 2025
d6973e3
feat: control-plane CA rotation and telemetry surfaces
df49b9cd Nov 25, 2025
cc2ee6c
adjust agents.md
df49b9cd Nov 25, 2025
d64d77e
agents.md adjustment
df49b9cd Nov 25, 2025
4716030
feat: add agent cert renewal and signed LKG cache
df49b9cd Nov 25, 2025
f92a58a
moving code to plugins
df49b9cd Nov 25, 2025
5e4ebe5
added abstractions
df49b9cd Nov 25, 2025
6e455c4
code organization
df49b9cd Nov 25, 2025
c76d4e9
updated namespace and solution structure; switched Task to ValueTask …
df49b9cd Nov 25, 2025
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
66 changes: 66 additions & 0 deletions .github/workflows/aot-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Native AOT Publish

on:
schedule:
- cron: '0 6 * * 1' # Mondays 06:00 UTC
workflow_dispatch:
inputs:
rid:
description: 'Runtime identifier (RID)'
default: 'linux-x64'
required: true
config:
description: 'Build configuration'
default: 'Release'
required: true

permissions:
contents: read

env:
DOTNET_NOLOGO: 1
DOTNET_CLI_TELEMETRY_OPTOUT: 1

jobs:
aot:
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
rid: [ linux-x64 ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.rid }}
cancel-in-progress: true
steps:
- name: Checkout
uses: actions/checkout@v5

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props', 'global.json') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Native AOT publish (DataPlane + ControlPlane + CLI + MeshKit smoke)
env:
RID: ${{ github.event.inputs.rid || matrix.rid }}
CONFIG: ${{ github.event.inputs.config || 'Release' }}
run: |
chmod +x eng/run-aot-publish.sh
./eng/run-aot-publish.sh "$RID" "$CONFIG"

- name: Upload AOT artifacts
if: always()
uses: actions/upload-artifact@v5
with:
name: aot-${{ matrix.rid }}
path: artifacts/aot/${{ github.event.inputs.rid || matrix.rid }}/**
if-no-files-found: error
190 changes: 164 additions & 26 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: CI
name: CI Gate

on:
push:
Expand All @@ -17,18 +17,77 @@ env:
DOTNET_CLI_TELEMETRY_OPTOUT: 1

jobs:
build-and-test:
runs-on: ubuntu-latest
timeout-minutes: 30
gate-linux-macos:
runs-on: ${{ matrix.os }}
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
rid: linux-x64
- os: macos-latest
rid: osx-arm64
- os: macos-latest
rid: osx-x64
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.os }}-${{ matrix.rid }}
steps:
- name: Checkout
uses: actions/checkout@v5

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props', 'global.json') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Run CI gate (Unix)
env:
RID: ${{ matrix.rid }}
CONFIG: Release
shell: bash
run: |
chmod +x eng/run-ci-gate.sh
./eng/run-ci-gate.sh

- name: Upload CI artifacts
if: always()
uses: actions/upload-artifact@v5
with:
name: ci-artifacts-${{ matrix.os }}-${{ matrix.rid }}
path: |
artifacts/ci/**
**/TestResults/**/*.trx
if-no-files-found: ignore

gate-windows:
runs-on: ${{ matrix.os }}
timeout-minutes: 10
continue-on-error: true
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
rid: win-x64
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.os }}-${{ matrix.rid }}
steps:
- name: Checkout
uses: actions/checkout@v5

- name: Prepare NuGet cache directory
run: mkdir -p ~/.nuget/packages
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v4
Expand All @@ -38,51 +97,130 @@ jobs:
restore-keys: |
${{ runner.os }}-nuget-

- name: Build CI image
id: build-image
run: docker build --target ci -f Dockerfile.ci -t omnirelay-ci .
- name: Run CI gate (Windows)
env:
RID: ${{ matrix.rid }}
CONFIG: Release
shell: pwsh
run: pwsh -File eng/run-ci-gate.ps1 -RID $env:RID -CONFIG $env:CONFIG

- name: Upload CI artifacts
if: always()
uses: actions/upload-artifact@v5
with:
name: ci-artifacts-${{ matrix.os }}-${{ matrix.rid }}
path: |
artifacts/ci/**
**/TestResults/**/*.trx
if-no-files-found: ignore

http3-ci-container:
needs: gate-linux-macos
if: needs.gate-linux-macos.result == 'success'
runs-on: ubuntu-latest
timeout-minutes: 10
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-http3-linux
cancel-in-progress: true
steps:
- name: Checkout
uses: actions/checkout@v5

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Extract CI artifacts
if: ${{ steps.build-image.outcome == 'success' }}
id: extract-artifacts
- name: Build CI image with HTTP/3 support (libmsquic on Alpine)
id: build
run: |
container_id=$(docker create omnirelay-ci)
docker build \
--file Dockerfile.ci \
--target ci \
--progress=plain \
-t omnirelay-ci-http3 .

- name: Extract artifacts from CI image
if: ${{ steps.build.outcome == 'success' }}
id: extract
run: |
container_id=$(docker create omnirelay-ci-http3)
echo "container_id=${container_id}" >> $GITHUB_OUTPUT
mkdir -p artifacts/test-results artifacts/coverage
docker cp "${container_id}:/repo/artifacts/test-results/." artifacts/test-results || true
docker cp "${container_id}:/repo/artifacts/coverage/." artifacts/coverage || true
docker rm "${container_id}" || true

- name: Report test results
if: ${{ always() && steps.extract-artifacts.outcome == 'success' }}
if: ${{ always() && steps.extract.outcome == 'success' }}
uses: dorny/test-reporter@v2
with:
name: .NET Tests
name: HTTP3 Tests
path: artifacts/test-results/**/*.trx
reporter: dotnet-trx

- name: Upload coverage to Codecov
if: ${{ steps.extract-artifacts.outcome == 'success' }}
- name: Upload coverage
if: ${{ steps.extract.outcome == 'success' }}
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: artifacts/coverage/**/*.xml
fail_ci_if_error: false
verbose: true

- name: Upload Test Results
if: ${{ steps.extract-artifacts.outcome == 'success' }}
- name: Upload artifacts
if: ${{ always() && steps.extract.outcome == 'success' }}
uses: actions/upload-artifact@v5
with:
name: test-results
name: http3-artifacts
path: |
artifacts/test-results/**/*.trx
artifacts/coverage
if-no-files-found: ignore

- name: Upload Coverage Artifacts
if: ${{ steps.extract-artifacts.outcome == 'success' }}
http3-windows:
needs: gate-windows
if: needs.gate-windows.result == 'success'
runs-on: windows-latest
timeout-minutes: 10
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-http3-win
cancel-in-progress: true
env:
OMNIRELAY_ENABLE_HTTP3_TESTS: true
DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT: 1
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_NOLOGO: 1
steps:
- name: Checkout
uses: actions/checkout@v5

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props', 'global.json') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Restore
run: dotnet restore OmniRelay.slnx

- name: Build (no tests)
run: dotnet build OmniRelay.slnx -c Release --no-restore -p:ContinuousIntegrationBuild=true /m

- name: Run HTTP/3-focused suites (with hang detection)
run: |
dotnet test tests/OmniRelay.IntegrationTests/OmniRelay.IntegrationTests.csproj -c Release --filter "FullyQualifiedName~Http3" --logger "trx;LogFileName=integration-http3.trx" --results-directory artifacts\http3 --blame-hang --blame-hang-timeout 10m
dotnet test tests/OmniRelay.CodeGen.IntegrationTests/OmniRelay.CodeGen.IntegrationTests.csproj -c Release --filter "FullyQualifiedName~Http3" --logger "trx;LogFileName=codegen-http3.trx" --results-directory artifacts\http3 --blame-hang --blame-hang-timeout 10m

- name: Upload Windows HTTP/3 artifacts
if: always()
uses: actions/upload-artifact@v5
with:
name: coverage
path: artifacts/coverage
name: http3-windows-artifacts
path: artifacts/http3/**/*.trx
if-no-files-found: ignore
61 changes: 61 additions & 0 deletions .github/workflows/hyperscale-smoke.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Hyperscale Smoke

on:
schedule:
- cron: '0 7 * * 1,4' # Mondays and Thursdays 07:00 UTC
workflow_dispatch:
inputs:
config:
description: 'Build configuration'
default: 'Release'
required: true

permissions:
contents: read

env:
DOTNET_NOLOGO: 1
DOTNET_CLI_TELEMETRY_OPTOUT: 1

jobs:
hyperscale-smoke:
runs-on: ubuntu-latest
timeout-minutes: 90
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
steps:
- name: Checkout
uses: actions/checkout@v5

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props', 'global.json') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Restore
run: dotnet restore OmniRelay.slnx

- name: Run hyperscale smoke tests
env:
CONFIGURATION: ${{ github.event.inputs.config || 'Release' }}
run: |
chmod +x eng/run-hyperscale-smoke.sh
./eng/run-hyperscale-smoke.sh "$CONFIGURATION"

- name: Upload smoke artifacts
if: always()
uses: actions/upload-artifact@v5
with:
name: hyperscale-smoke-results
path: |
**/TestResults/**/*.trx
if-no-files-found: ignore
Loading
Loading