mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-30 08:50:48 +01:00
* s3vectors: reuse shared authenticated identity context * s3vectors: encode empty results as arrays * test: cover S3 Vectors with Go and Rust volume servers * ci: require both volume implementations in vector integration tests * s3vectors: keep identityOf as a shim over the shared identity context Concurrent branches add identityOf call sites; deleting the helper would break the build when they merge in either order. Route it through GetIdentityNameFromContext so every caller resolves the same identity. * test: wait for the vector engine to register before running The gateway resolves weed-vector lazily through the master cluster list, so a listening port does not mean the engine is reachable yet; the first vector write or query could race KeepConnected and fail. Restore the cluster.ps registration wait the previous harness had, and ignore the pytest cache directory the suite creates. * test: wait for master registration across OSS and enterprise Use the exact engine registration event after AddClusterNode completes. The current enterprise cluster.ps does not list vector nodes, so waiting on its output prevents the shared fixture from starting there. * s3vectors: keep contextWithIdentity as a shim alongside identityOf In-flight callers still write the caller name through it; route the write through SetIdentityNameInContext so both helpers agree on the shared key whichever lands first.
167 lines
6.6 KiB
YAML
167 lines
6.6 KiB
YAML
name: "Rust Vector Tests"
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [ master ]
|
|
paths:
|
|
- 'seaweed-vector/**'
|
|
- 'seaweed-volume/**'
|
|
- 'seaweed-worker/**'
|
|
- 'seaweed-common/**'
|
|
- 'weed/pb/plugin.proto'
|
|
- 'weed/pb/vector.proto'
|
|
- 'weed/pb/vector_pb/**'
|
|
- 'weed/s3api/**'
|
|
- 'weed/command/**'
|
|
- 'test/vectors/**'
|
|
- '.github/workflows/rust-vector-tests.yml'
|
|
push:
|
|
branches: [ master, main ]
|
|
paths:
|
|
- 'seaweed-vector/**'
|
|
- 'seaweed-volume/**'
|
|
- 'seaweed-worker/**'
|
|
- 'seaweed-common/**'
|
|
- 'weed/pb/plugin.proto'
|
|
- 'weed/pb/vector.proto'
|
|
- 'weed/pb/vector_pb/**'
|
|
- 'weed/s3api/**'
|
|
- 'weed/command/**'
|
|
- 'test/vectors/**'
|
|
- '.github/workflows/rust-vector-tests.yml'
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || (github.event_name == 'push' && github.ref) || github.run_id }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' || (github.event_name == 'push' && !startsWith(github.ref, 'refs/tags/')) }}
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
rust-vector-build:
|
|
name: Rust Vector Build and Unit Tests
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 45
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v7
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Install Rust toolchain
|
|
uses: dtolnay/rust-toolchain@stable
|
|
|
|
- name: Fingerprint build toolchain
|
|
id: toolchain
|
|
run: echo "fingerprint=$(getconf GNU_LIBC_VERSION | tr ' ' '-')-rustc-$(rustc -V | awk '{print $2}')" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Cache cargo registry and target
|
|
if: runner.environment == 'github-hosted'
|
|
uses: actions/cache@v6
|
|
with:
|
|
path: |
|
|
~/.cargo/registry
|
|
~/.cargo/git
|
|
seaweed-vector/target/release
|
|
key: rust-vector-${{ steps.toolchain.outputs.fingerprint }}-${{ hashFiles('seaweed-vector/Cargo.lock') }}
|
|
restore-keys: |
|
|
rust-vector-${{ steps.toolchain.outputs.fingerprint }}-
|
|
|
|
# lance's build scripts compile their own protos and look for a protoc.
|
|
# Point them at the one protoc-bin-vendored ships, so no job depends on a
|
|
# system package and every build sees the same version.
|
|
- name: Use the vendored protoc
|
|
run: |
|
|
cd seaweed-vector
|
|
cargo fetch
|
|
version=$(awk '/^name = "protoc-bin-vendored-linux-x86_64"$/{found=1; next} found && /^version = /{gsub(/"/,"",$3); print $3; exit}' Cargo.lock)
|
|
test -n "$version" || { echo "protoc-bin-vendored-linux-x86_64 is not in Cargo.lock" >&2; exit 1; }
|
|
protoc=$(find ~/.cargo/registry/src -path "*protoc-bin-vendored-linux-x86_64-$version/bin/protoc" | head -1)
|
|
test -x "$protoc" || { echo "no vendored protoc $version in the registry" >&2; exit 1; }
|
|
echo "PROTOC=$protoc" >> "$GITHUB_ENV"
|
|
|
|
- name: Build the vector crates
|
|
run: cd seaweed-vector && cargo build --release
|
|
|
|
- name: Run unit tests
|
|
run: cd seaweed-vector && cargo test --release --workspace
|
|
|
|
|
|
vectors-e2e:
|
|
name: S3 Vectors Go/Rust Volume Parity
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 45
|
|
env:
|
|
CARGO_PROFILE_DEV_DEBUG: "0"
|
|
CARGO_BUILD_JOBS: "2"
|
|
CARGO_TARGET_DIR: ${{ github.workspace }}/seaweed-vector/target
|
|
VOLUME_SERVER_IMPL: go,rust
|
|
VECTOR_QUERY_MODE: single
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
with:
|
|
persist-credentials: false
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
cache: ${{ runner.environment == 'github-hosted' }}
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- name: Fingerprint build toolchain
|
|
id: toolchain
|
|
run: echo "fingerprint=$(getconf GNU_LIBC_VERSION | tr ' ' '-')-rustc-$(rustc -V | awk '{print $2}')" >> "$GITHUB_OUTPUT"
|
|
- name: Cache cargo registry and target
|
|
if: runner.environment == 'github-hosted'
|
|
uses: actions/cache@v6
|
|
with:
|
|
path: |
|
|
~/.cargo/registry
|
|
~/.cargo/git
|
|
seaweed-vector/target/debug
|
|
key: vectors-e2e-${{ runner.os }}-${{ runner.arch }}-${{ steps.toolchain.outputs.fingerprint }}-${{ hashFiles('seaweed-vector/Cargo.lock', 'seaweed-volume/Cargo.lock') }}
|
|
restore-keys: |
|
|
vectors-e2e-${{ runner.os }}-${{ runner.arch }}-${{ steps.toolchain.outputs.fingerprint }}-
|
|
- name: Use the vendored protoc
|
|
run: |
|
|
cd seaweed-vector
|
|
cargo fetch
|
|
version=$(awk '/^name = "protoc-bin-vendored-linux-x86_64"$/{found=1; next} found && /^version = /{gsub(/"/,"",$3); print $3; exit}' Cargo.lock)
|
|
test -n "$version" || { echo "protoc-bin-vendored-linux-x86_64 is not in Cargo.lock" >&2; exit 1; }
|
|
protoc=$(find ~/.cargo/registry/src -path "*protoc-bin-vendored-linux-x86_64-$version/bin/protoc" | head -1)
|
|
test -x "$protoc" || { echo "no vendored protoc $version in the registry" >&2; exit 1; }
|
|
echo "PROTOC=$protoc" >> "$GITHUB_ENV"
|
|
- name: Test Go vector gateway
|
|
run: go test ./weed/s3api/s3vectors ./weed/command -run 'Vector|Vectors' -count=1
|
|
- name: Build integration binaries
|
|
working-directory: test/vectors
|
|
run: make build CARGO_PROFILE=dev
|
|
- uses: actions/setup-python@v5
|
|
with:
|
|
python-version: "3.12"
|
|
- name: Install test dependencies
|
|
run: python -m pip install -r test/vectors/requirements.txt
|
|
- name: Run the S3 Vectors integration matrix
|
|
working-directory: test/vectors
|
|
run: |
|
|
./run_test.sh --basetemp="$RUNNER_TEMP/vector-tests" --junitxml="$RUNNER_TEMP/vector-results.xml"
|
|
python - <<'PYTHON'
|
|
import os
|
|
from pathlib import Path
|
|
import xml.etree.ElementTree as ET
|
|
cases = ET.parse(Path(os.environ["RUNNER_TEMP"]) / "vector-results.xml").findall(".//testcase")
|
|
assert len(cases) >= 24, f"expected at least 24 cases, got {len(cases)}"
|
|
assert not any(case.find("skipped") is not None for case in cases), "integration cases were skipped"
|
|
for volume in ("go", "rust"):
|
|
assert sum(case.get("name", "").endswith(f"[{volume}-single]") for case in cases) >= 12, volume
|
|
PYTHON
|
|
- name: Upload integration diagnostics
|
|
if: always()
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: vectors-e2e-diagnostics
|
|
path: |
|
|
${{ runner.temp }}/vector-tests
|
|
${{ runner.temp }}/vector-results.xml
|
|
if-no-files-found: ignore
|
|
retention-days: 7
|