Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
fedc4af
reworked cleanup implementation
EbiRider Jul 30, 2026
13c51f0
making sure that cleanup target doesn't suspend for target offline re…
EbiRider Jul 30, 2026
ddd1028
TEMP:adding timeout to cleanup for a special test case
EbiRider Jul 30, 2026
a84a2f7
TEMP: adding more delays for specific test
EbiRider Jul 30, 2026
e4ed120
changing the sleep duration
EbiRider Jul 30, 2026
6edb423
setting delay again
EbiRider Jul 30, 2026
3d5f1ab
removing temp code
EbiRider Jul 31, 2026
befa2e5
cleanup source doesn't suspend the migration if the source node is down
EbiRider Jul 31, 2026
18e4683
fixing unit test for batch migration
EbiRider Jul 31, 2026
f033ba3
Merge pull request #1201 from simplyblock/cleanup-logic-fix
EbiRider Jul 31, 2026
5e57b45
fix: source node going offline suspends the migration instead of tran…
EbiRider Jul 31, 2026
07cf60f
fix: retries jumping up by 2 per try on lvol migration
EbiRider Jul 31, 2026
924a87b
fix: reaching 10 retries kills the process and making it suspend forever
EbiRider Jul 31, 2026
bcf5928
TEMP: trying a workaround to avoid process from being killed by backu…
EbiRider Aug 1, 2026
450d934
Fixing reserved cpu set in openshift baremetal k8s and changing defau…
RaunakJalan Aug 1, 2026
d8c113f
Explicitly ignore existing linter violations
mxsrc Aug 1, 2026
5504903
setting max retires -1 for add_lvol_mig_task so the monitor don't kil…
EbiRider Aug 2, 2026
109ba5d
fix(security-scan): exclude dev caches from image, ignore pip-vendore…
boddumanohar Jul 30, 2026
22c0d6a
applying the timeout fix to batch migration as well
EbiRider Aug 3, 2026
1abea48
resolving unit test after removing task retry ceiling for lvol migration
EbiRider Aug 3, 2026
fb34624
Merge pull request #1205 from simplyblock/migration-test
EbiRider Aug 3, 2026
003b314
fix(sfam-2794): rename variable for Docker image label in service cle…
Hamdy-khader Aug 3, 2026
6d9fce9
fix(cpu-alloc): colocate lvol_poller with jc-singleton, not app_threa…
wmousa Aug 3, 2026
f805cb9
Enable execution checks in linter
mxsrc Aug 1, 2026
a61b00a
fix(restart): stop double execution of a node-restart task (2026-07-2…
michixs Aug 3, 2026
d4a1df1
refactor(rpc_client): simplify parameter handling in nvmf_port_block …
Hamdy-khader Aug 4, 2026
b2b28df
fix(leadership): never grant leadership from recovery paths
michixs Aug 4, 2026
a0f07ea
fix(lvol): claim namespace slot and persist record in one FDB transac…
michixs Aug 4, 2026
3f331c5
fix(tests): teach migration mock RPC server bdev_lvol_get_lvstores
michixs Aug 4, 2026
d333fca
feat(leadership): reload-then-grant for leaderless-LVS recovery
michixs Aug 4, 2026
1df94c6
fix(ci): unbreak Tests workflow — argcomplete pin, stale migration te…
michixs Aug 4, 2026
f97d682
Enforce failure-domain topology policy: +/-1 balance, cross-FD role i…
michixs Aug 4, 2026
44d66a9
fix(tests): de-flake random-node-offline migration test
michixs Aug 4, 2026
b5940c6
Update tests.yml
schmidt-scaled Aug 4, 2026
0b68ec6
Merge pull request #1212 from simplyblock/schmidt-scaled-patch-2
schmidt-scaled Aug 4, 2026
15aecbb
Fix type checker
mxsrc Aug 5, 2026
7c26e61
Convert CLI generation to tox-based execution
mxsrc Aug 5, 2026
4cb16a2
Bump workflow action versions
mxsrc Aug 5, 2026
00454d5
Remove outdated systemd service instrumentation
mxsrc Aug 5, 2026
33027d1
Fix regression in type check fix
mxsrc Aug 5, 2026
a0c9a53
Avoid shadowing built-in set in cluster ops
mxsrc Aug 5, 2026
48fc06d
Fix cluster update missing RPC jc_disable_replication
Hamdy-khader Aug 5, 2026
e803237
fix(rpc_client): unpack params in jc_disable_replication request
Hamdy-khader Aug 5, 2026
90af53d
fix(storage_node_ops): handle RPCException for jc_disable_replication…
Hamdy-khader Aug 5, 2026
c404ff8
feat(limits): hard per-lvstore and subsystem object caps
michixs Aug 4, 2026
e64b33f
monitors: cut per-object delete latency from minutes to seconds
michixs Aug 5, 2026
fb6a6bd
fix(cluster update): update service file paths to use python3 and add…
Hamdy-khader Aug 5, 2026
f292d78
Fix type checker
Hamdy-khader Aug 5, 2026
d9ab52a
Fix type checker 2
Hamdy-khader Aug 5, 2026
24b4119
web api made consistent with structure of cli renamed group migration…
EbiRider Aug 4, 2026
b45c301
using correct annotation for batch query
EbiRider Aug 4, 2026
2f580c4
resolving the unit tests
EbiRider Aug 4, 2026
819cfca
timeout for pre_created lvol migrations, guard against adding namespa…
EbiRider Aug 4, 2026
b72f765
split the endpoints for batch migration
EbiRider Aug 5, 2026
53a65ed
resolved type issue
EbiRider Aug 5, 2026
4667172
preventing multiple instances of the hublvol controller for the migra…
EbiRider Aug 5, 2026
3e520c8
refactor(cpu-alloc): remove JM_COMPRESSION_THREAD_ENABLED and the dea…
wmousa Aug 6, 2026
9ec3b77
using NQN pattern to check instead of the expensive get_lvols call
EbiRider Aug 6, 2026
d1ec720
Merge pull request #1211 from simplyblock/lvol-batch-migration-fix
EbiRider Aug 6, 2026
17ebddb
fix(restart): per-node restart claim — cross-actor mutual exclusion
michixs Aug 6, 2026
f41a193
Bound test execution time
mxsrc Aug 5, 2026
f1c0874
Integration test fixes
mxsrc Aug 5, 2026
65df1a4
Fix potential leak of lock in storage node restart
mxsrc Aug 6, 2026
e55148e
Recategorize tests as unit
mxsrc Aug 6, 2026
40be46b
Introduce cluster downsizing status
mxsrc Aug 6, 2026
300e31f
Wrap all expectable errors in RPCException
mxsrc Aug 6, 2026
9a3dbc7
fixup! Integration test fixes
mxsrc Aug 6, 2026
152613f
Deduplicate cluster state sets for predicate checks
mxsrc Aug 6, 2026
afd665c
adding retry attempts for the sync delete calls, remove unneeded migr…
EbiRider Aug 6, 2026
13d1b89
fixing the rename logic to follow the failover path on an rpc exception
EbiRider Aug 6, 2026
9fd84a4
using rpc exception code
EbiRider Aug 7, 2026
b5b53ca
Introduce retry handling via tenacity
mxsrc Aug 6, 2026
7422ffe
Fix number of attempts
mxsrc Aug 7, 2026
423f4a7
fix(port_block): add support for FirewallClient based on SPDK version…
Hamdy-khader Aug 7, 2026
c351f45
Drop ruff version pin in CI
mxsrc Aug 7, 2026
c8f2bec
Make test execution reproducible
mxsrc Aug 9, 2026
5273175
fix(add-node): always cleanup stale in_creation record, even if anoth…
wmousa Aug 10, 2026
44559da
feat(limits): enforce the 75-subsystem per-node cap at every max_lvol…
michixs Aug 10, 2026
610bef8
Merge origin/main (add-node stale in_creation cleanup #1222)
michixs Aug 10, 2026
d0247d7
fix(node-removal): use subsystem_get instead of misused subsystem_lis…
wmousa Aug 10, 2026
6d24347
Merge origin/main (node-removal subsystem_get fix #1230)
michixs Aug 10, 2026
ae46797
fix(delete): complete the sync legs inline, drop the leader's second …
michixs Aug 10, 2026
f108e84
fix(replication): use the namespace bdev as cutover gateway; pool id-…
michixs Aug 10, 2026
5176e17
fix: don't auto-restart k8s-adopted nodes before CR-linkage, and don'…
boddumanohar Aug 10, 2026
19695df
Fix update spdk_version to empty string
Hamdy-khader Aug 10, 2026
1a8afa6
Split distinct cases into individual migration tests
mxsrc Aug 9, 2026
eabab59
Remove migration node outage test
mxsrc Aug 10, 2026
b9f6073
Mock bdev_lvol_rename in migration tests
mxsrc Aug 10, 2026
ecf8b01
Introduce specific exceptions for RPC failure modes
mxsrc Aug 10, 2026
bc7c6e9
Fix storage node lvstore_stack_* annotations
mxsrc Aug 10, 2026
f728a0a
Annotate storage node parameters to flag type violations
mxsrc Aug 10, 2026
15adea6
Avoid blanket except in storage node RPC interaction
mxsrc Aug 10, 2026
98ed45b
Avoid non-fatal traceback when executing as 3.9
mxsrc Aug 10, 2026
2121913
fixup! Introduce specific exceptions for RPC failure modes
mxsrc Aug 10, 2026
46e94d8
Avoid node-info computation at module load
mxsrc Aug 10, 2026
5a1c077
migration controllers merged under subssytem controller
EbiRider Aug 10, 2026
14a78dc
rewriting unit tests to adapt to new change
EbiRider Aug 10, 2026
9ae9234
Aligned phase 'pre_created'
noctarius Aug 10, 2026
97ef965
fix(ha): stop three ways an HA volume silently loses a path
michixs Aug 10, 2026
f09a8b2
Merge pull request #1229 from simplyblock/subsys-migration-controller
EbiRider Aug 11, 2026
efb9358
Add stuck pod describe, fix docker and k8s upgrade tests, pipeline, b…
RaunakJalan Aug 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ sbcli*
.env
.env.*

# Ignore test/tooling caches and virtualenvs (not needed at runtime;
# these can carry outdated, vulnerable copies of pip/setuptools/wheel
# that trip up the Trivy image scan)
.tox
.mypy_cache
.ruff_cache
.pytest_cache

# Ignore Docker-related files
Dockerfile
docker-compose.yml
Expand Down
191 changes: 34 additions & 157 deletions .github/workflows/api-parity-audit.yml
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -3,178 +3,55 @@
on:
workflow_dispatch:
inputs:
cluster:
default: c141
description: "Cluster to deploy on"
required: true
STORAGE_PRIVATE_IPS:
type: string
default: "192.168.10.201 192.168.10.202 192.168.10.203 192.168.10.204"
description: "Space-separated storage node IPs"
API_INVOKE_URL:
type: string
default: "http://192.168.10.210/"
description: "Management API URL"
BASTION_IP:
type: string
default: "192.168.10.210"
description: "Bastion / management node IP"
MNODES:
type: string
default: "192.168.10.210"
description: "Management node IPs"
sbcli_branch:
description: "sbcli branch to test"
required: false
default: main
type: string
CUSTOM_IMAGES:
type: string
default: 'spdk="simplyblock/spdk:main-latest" docker="simplyblock/simplyblock:main"'
description: "Custom SPDK/Docker images (space-separated key=value)"
send_slack_notification:
description: 'Send Slack notification?'
required: false
default: false
type: boolean
schedule:
- cron: '0 6 * * 1' # Weekly on Monday 6am UTC
# schedule:
# - cron: '0 6 * * 1' # Weekly on Monday 6am UTC — disabled to avoid interfering with other runs

concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false

jobs:
cleanup:
runs-on: self-hosted
steps:
- name: Fix workspace permissions
run: sudo chown -R "$(id -u):$(id -g)" "$GITHUB_WORKSPACE" 2>/dev/null || true

- name: Checkout deployment tooling
uses: actions/checkout@v4
with:
repository: simplyblock-io/simplyBlockDeploy
path: deploy

- name: cleanup cluster
timeout-minutes: 15
run: |
cd deploy/bare-metal
cluster="${{ inputs.cluster || 'c141' }}"
cluster="${cluster:1}"
echo "cleaning up cluster $cluster"
KEY="~/.ssh/simplyblock-us-east-2.pem"
eval $(python3 inventory.py inventory/c${cluster}.yml)
ssh -i $KEY -o StrictHostKeyChecking=no root@192.168.10.1 "bash proxmox_script.sh cluster_${cluster}"

deploy:
needs: cleanup
uses: ./.github/workflows/bare-metal-deploy.yml
with:
runs_on: self-hosted
cluster: ${{ inputs.cluster || 'c141' }}
docker_image: simplyblock/simplyblock:${{ github.head_ref || github.ref_name }}
sbcli_source: ${{ github.head_ref || github.ref_name }}
k8s_snode: false

audit:
runs-on: self-hosted
needs: deploy
steps:
- name: Fix workspace permissions
run: sudo chown -R "$(id -u):$(id -g)" "$GITHUB_WORKSPACE" 2>/dev/null || true

- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ inputs.sbcli_branch || github.ref_name }}

- name: Record Audit Start Time
run: echo "AUDIT_START_TIME=$(date +%s)" >> $GITHUB_ENV

- name: Setup & Run Parity Audit
timeout-minutes: 60
env:
CLUSTER_ID: ${{ needs.deploy.outputs.cluster_id }}
CLUSTER_SECRET: ${{ needs.deploy.outputs.cluster_secret }}
CLUSTER_IP: ${{ needs.deploy.outputs.cluster_ip }}
API_BASE_URL: ${{ needs.deploy.outputs.cluster_ip }}
KEY_NAME: "simplyblock-us-east-2.pem"
SSH_USER: root
SBCLI_CMD: "sbctl"
MNODES: "${{ needs.deploy.outputs.mnodes }}"
run: |
cd $GITHUB_WORKSPACE/e2e
pip install virtualenv
python3 -m venv myenv
source myenv/bin/activate
python3 -m pip install -r requirements.txt
echo "Running API Parity Audit"
python3 e2e.py --testname TestAPIParityAudit

- name: Record Audit End Time
if: always()
run: echo "AUDIT_END_TIME=$(date +%s)" >> $GITHUB_ENV

- name: Calculate Total Time Taken
if: always()
run: |
AUDIT_TIME=$(($AUDIT_END_TIME - $AUDIT_START_TIME))
AUDIT_TIME_MINS=$((AUDIT_TIME / 60))
AUDIT_TIME_SECS=$((AUDIT_TIME % 60))
echo "Audit runtime: ${AUDIT_TIME_MINS}m ${AUDIT_TIME_SECS}s"
echo "AUDIT_TIME_MINS=$AUDIT_TIME_MINS" >> $GITHUB_ENV
echo "AUDIT_TIME_SECS=$AUDIT_TIME_SECS" >> $GITHUB_ENV

- name: Upload HTML report
if: always()
uses: actions/upload-artifact@v4
with:
name: api-parity-report
path: |
e2e/logs/**/api_parity_report.html
e2e/logs/**/api_parity_findings.json
retention-days: 30
if-no-files-found: warn

- name: Post Job Summary
if: always()
run: |
{
echo "## API Parity Audit Results"
echo ""
echo "**Branch:** \`${{ github.ref_name }}\`"
echo "**Duration:** ${AUDIT_TIME_MINS:-0}m ${AUDIT_TIME_SECS:-0}s"
echo ""
} >> "$GITHUB_STEP_SUMMARY"

# Try to extract summary counts from JSON sidecar
JSON_FILE=$(find $GITHUB_WORKSPACE/e2e/logs -name "api_parity_findings.json" 2>/dev/null | head -1)
if [ -n "$JSON_FILE" ] && [ -f "$JSON_FILE" ]; then
python3 -c "
import json
with open('${JSON_FILE}') as f:
findings = json.load(f)
total = len(findings)
errors = sum(1 for f in findings if f.get('severity') == 'error')
warnings = sum(1 for f in findings if f.get('severity') == 'warning')
info = sum(1 for f in findings if f.get('severity') == 'info')
print(f'| Severity | Count |')
print(f'|----------|-------|')
print(f'| **Total** | {total} |')
print(f'| Errors | {errors} |')
print(f'| Warnings | {warnings} |')
print(f'| Info | {info} |')
print()
if errors > 0:
print('> :warning: **Errors found** — download the HTML report artifact for details.')
else:
print('> :white_check_mark: No errors detected.')
" >> "$GITHUB_STEP_SUMMARY"
else
echo "> :warning: No findings JSON found — audit may have failed before producing output." >> "$GITHUB_STEP_SUMMARY"
fi

echo "" >> "$GITHUB_STEP_SUMMARY"
echo "**Report artifact:** \`api-parity-report\`" >> "$GITHUB_STEP_SUMMARY"

- name: Upload logs to MinIO
if: always()
env:
GITHUB_RUN_ID: ${{ github.run_id }}
MINIO_ACCESS_KEY: ${{ secrets.MINIO_ACCESS_KEY }}
MINIO_SECRET_KEY: ${{ secrets.MINIO_SECRET_KEY }}
MNODES: "${{ needs.deploy.outputs.mnodes }}"
STORAGE_PRIVATE_IPS: "${{ needs.deploy.outputs.storage_private_ips }}"
USER: "root"
run: |
cd $GITHUB_WORKSPACE/e2e/
python3 logs/upload_logs_to_miniio.py

- name: Cleanup build folder
if: always()
run: |
rm -rf ./* || true
rm -rf ./.??* || true
uses: ./.github/workflows/e2e-bootstrap.yml
with:
TEST_CLASS: TestAPIParityAudit
RUN_LABEL: api-parity
STORAGE_PRIVATE_IPS: ${{ inputs.STORAGE_PRIVATE_IPS || '192.168.10.201 192.168.10.202 192.168.10.203 192.168.10.204' }}
API_INVOKE_URL: ${{ inputs.API_INVOKE_URL || 'http://192.168.10.210/' }}
BASTION_IP: ${{ inputs.BASTION_IP || '192.168.10.210' }}
MNODES: ${{ inputs.MNODES || '192.168.10.210' }}
SBCLI_BRANCH: ${{ inputs.sbcli_branch || 'main' }}
CUSTOM_IMAGES: ${{ inputs.CUSTOM_IMAGES || 'spdk="simplyblock/spdk:main-latest" docker="simplyblock/simplyblock:main"' }}
send_slack_notification: ${{ inputs.send_slack_notification || github.event_name == 'schedule' }}
BOOTSTRAP_MAX_SUBSYS: "40"
secrets: inherit
Comment on lines +45 to +57
Loading
Loading