Python: add AZ Affinity ReadFrom strategy Support (#2676) #6312
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Python tests | |
on: | |
push: | |
branches: | |
- main | |
- release-* | |
- v* | |
paths: | |
- python/** | |
- glide-core/src/** | |
- glide-core/redis-rs/redis/src/**/** | |
- utils/cluster_manager.py | |
- .github/workflows/python.yml | |
- .github/workflows/build-python-wrapper/action.yml | |
- .github/workflows/install-shared-dependencies/action.yml | |
- .github/workflows/test-benchmark/action.yml | |
- .github/workflows/lint-rust/action.yml | |
- .github/workflows/install-engine/action.yml | |
- .github/workflows/start-self-hosted-runner/action.yml | |
- .github/workflows/create-test-matrices/action.yml | |
- .github/json_matrices/** | |
pull_request: | |
paths: | |
- python/** | |
- glide-core/src/** | |
- glide-core/redis-rs/redis/src/** | |
- utils/cluster_manager.py | |
- .github/workflows/python.yml | |
- .github/workflows/build-python-wrapper/action.yml | |
- .github/workflows/install-shared-dependencies/action.yml | |
- .github/workflows/test-benchmark/action.yml | |
- .github/workflows/lint-rust/action.yml | |
- .github/workflows/install-engine/action.yml | |
- .github/workflows/start-self-hosted-runner/action.yml | |
- .github/workflows/create-test-matrices/action.yml | |
- .github/json_matrices/** | |
workflow_dispatch: | |
inputs: | |
full-matrix: | |
description: "Run the full engine, host, and language version matrix" | |
type: boolean | |
default: false | |
name: | |
required: false | |
type: string | |
description: "(Optional) Test run name" | |
workflow_call: | |
concurrency: | |
group: python-${{ github.head_ref || github.ref }}-${{ toJson(inputs) }} | |
cancel-in-progress: true | |
permissions: | |
contents: read | |
# Allows the GITHUB_TOKEN to make an API call to generate an OIDC token. | |
id-token: write | |
run-name: | |
# Set custom name if job is started manually and name is given | |
${{ github.event_name == 'workflow_dispatch' && (inputs.name == '' && format('{0} @ {1} {2}', github.ref_name, github.sha, toJson(inputs)) || inputs.name) || '' }} | |
jobs: | |
get-matrices: | |
runs-on: ubuntu-latest | |
outputs: | |
engine-matrix-output: ${{ steps.get-matrices.outputs.engine-matrix-output }} | |
host-matrix-output: ${{ steps.get-matrices.outputs.host-matrix-output }} | |
version-matrix-output: ${{ steps.get-matrices.outputs.version-matrix-output }} | |
steps: | |
- uses: actions/checkout@v4 | |
- id: get-matrices | |
uses: ./.github/workflows/create-test-matrices | |
with: | |
language-name: python | |
# Run full test matrix if job started by cron or it was explictly specified by a person who triggered the workflow | |
run-full-matrix: ${{ github.event.inputs.full-matrix == 'true' || github.event_name == 'schedule' }} | |
test-python: | |
runs-on: ${{ matrix.host.RUNNER }} | |
needs: get-matrices | |
timeout-minutes: 35 | |
strategy: | |
fail-fast: false | |
matrix: | |
python: ${{ fromJson(needs.get-matrices.outputs.version-matrix-output) }} | |
engine: ${{ fromJson(needs.get-matrices.outputs.engine-matrix-output) }} | |
host: ${{ fromJson(needs.get-matrices.outputs.host-matrix-output) }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python }} | |
- name: Install dependencies | |
working-directory: ./python | |
run: | | |
python -m pip install --upgrade pip | |
pip install mypy-protobuf | |
- name: Build Python wrapper | |
uses: ./.github/workflows/build-python-wrapper | |
with: | |
os: ${{ matrix.host.OS }} | |
target: ${{ matrix.host.TARGET }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
engine-version: ${{ matrix.engine.version }} | |
- name: Test with pytest | |
working-directory: ./python | |
run: | | |
source .env/bin/activate | |
pip install -r dev_requirements.txt | |
cd python/tests/ | |
pytest --asyncio-mode=auto --html=pytest_report.html --self-contained-html | |
- uses: ./.github/workflows/test-benchmark | |
if: ${{ matrix.engine.version == '8.0' && matrix.host.OS == 'ubuntu' && matrix.host.RUNNER == 'ubuntu-latest' && matrix.python == '3.12' }} | |
with: | |
language-flag: -python | |
- name: Type check with mypy | |
if: ${{ matrix.engine.version == '8.0' && matrix.host.OS == 'ubuntu' && matrix.host.RUNNER == 'ubuntu-latest' && matrix.python == '3.12' }} | |
working-directory: ./python | |
run: | | |
# The type check should run inside the virtual env to get | |
# all installed dependencies and build files | |
source .env/bin/activate | |
pip install mypy types-protobuf | |
# Install the benchmark requirements | |
pip install -r ../benchmarks/python/requirements.txt | |
python -m mypy .. | |
- name: Upload test reports | |
if: always() | |
continue-on-error: true | |
uses: actions/upload-artifact@v4 | |
with: | |
name: test-report-python-${{ matrix.python }}-${{ matrix.engine.type }}-${{ matrix.engine.version }}-${{ matrix.host.RUNNER }} | |
path: | | |
python/python/tests/pytest_report.html | |
utils/clusters/** | |
benchmarks/results/** | |
# run pubsub tests in another job - they take too much time | |
test-pubsub-python: | |
runs-on: ${{ matrix.host.RUNNER }} | |
needs: get-matrices | |
timeout-minutes: 35 | |
strategy: | |
fail-fast: false | |
matrix: | |
python: ${{ fromJson(needs.get-matrices.outputs.version-matrix-output) }} | |
engine: ${{ fromJson(needs.get-matrices.outputs.engine-matrix-output) }} | |
host: ${{ fromJson(needs.get-matrices.outputs.host-matrix-output) }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python }} | |
- name: Build Python wrapper | |
uses: ./.github/workflows/build-python-wrapper | |
with: | |
os: ${{ matrix.host.OS }} | |
target: ${{ matrix.host.TARGET }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
engine-version: ${{ matrix.engine.version }} | |
- name: Test pubsub with pytest | |
working-directory: ./python | |
run: | | |
source .env/bin/activate | |
pip install -r dev_requirements.txt | |
cd python/tests/ | |
pytest --asyncio-mode=auto -k test_pubsub --html=pytest_report.html --self-contained-html | |
- name: Upload test reports | |
if: always() | |
continue-on-error: true | |
uses: actions/upload-artifact@v4 | |
with: | |
name: pubsub-test-report-python-${{ matrix.python }}-${{ matrix.engine.type }}-${{ matrix.engine.version }}-${{ matrix.host.RUNNER }} | |
path: | | |
python/python/tests/pytest_report.html | |
lint: | |
runs-on: ubuntu-latest | |
timeout-minutes: 15 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: lint rust | |
uses: ./.github/workflows/lint-rust | |
with: | |
cargo-toml-folder: python | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Install dependencies | |
if: always() | |
uses: threeal/pipx-install-action@latest | |
with: | |
packages: flake8 isort black | |
- name: Lint python with isort | |
if: always() | |
working-directory: ./python | |
run: | | |
isort . --profile black --check --diff | |
- name: Lint python with flake8 | |
if: always() | |
working-directory: ./python | |
run: | | |
# stop the build if there are Python syntax errors or undefined names | |
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --extend-ignore=E230 --exclude=python/glide/protobuf,.env/* | |
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide | |
flake8 . --count --exit-zero --max-complexity=12 --max-line-length=127 --statistics --extend-ignore=E230 --exclude=python/glide/protobuf,.env/* | |
- name: Lint python with black | |
if: always() | |
working-directory: ./python | |
run: | | |
black --check --diff . | |
get-containers: | |
runs-on: ubuntu-latest | |
if: ${{ github.event.inputs.full-matrix == 'true' || github.event_name == 'schedule' }} | |
outputs: | |
engine-matrix-output: ${{ steps.get-matrices.outputs.engine-matrix-output }} | |
host-matrix-output: ${{ steps.get-matrices.outputs.host-matrix-output }} | |
version-matrix-output: ${{ steps.get-matrices.outputs.version-matrix-output }} | |
steps: | |
- uses: actions/checkout@v4 | |
- id: get-matrices | |
uses: ./.github/workflows/create-test-matrices | |
with: | |
language-name: python | |
run-full-matrix: true | |
containers: true | |
test-python-container: | |
runs-on: ${{ matrix.host.RUNNER }} | |
needs: [get-containers] | |
timeout-minutes: 25 | |
strategy: | |
fail-fast: false | |
matrix: | |
# Don't use generated matrix for python until compatibility issues resolved on amazon linux | |
# python: ${{ fromJson(needs.get-containers.outputs.version-matrix-output) }} | |
engine: ${{ fromJson(needs.get-containers.outputs.engine-matrix-output) }} | |
host: ${{ fromJson(needs.get-containers.outputs.host-matrix-output) }} | |
container: | |
image: ${{ matrix.host.IMAGE }} | |
options: ${{ join(' -q ', matrix.host.CONTAINER_OPTIONS) }} # adding `-q` to bypass empty options | |
steps: | |
- name: Install git and python | |
run: | | |
yum update | |
yum install -y git tar python3 | |
python3 -m ensurepip --upgrade | |
python3 -m pip install --upgrade pip | |
python3 -m pip install mypy-protobuf virtualenv | |
echo IMAGE=amazonlinux:latest | sed -r 's/:/-/g' >> $GITHUB_ENV | |
# Replace `:` in the variable otherwise it can't be used in `upload-artifact` | |
- uses: actions/checkout@v4 | |
- name: Build Python wrapper | |
uses: ./.github/workflows/build-python-wrapper | |
with: | |
os: ${{ matrix.host.OS }} | |
target: ${{ matrix.host.TARGET }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
engine-version: ${{ matrix.engine.version }} | |
- name: Test with pytest | |
working-directory: ./python | |
run: | | |
source .env/bin/activate | |
cd python/tests/ | |
pytest --asyncio-mode=auto --html=pytest_report.html --self-contained-html | |
- name: Upload test reports | |
if: always() | |
continue-on-error: true | |
uses: actions/upload-artifact@v4 | |
with: | |
name: test-report-python-${{ matrix.python }}-${{ matrix.engine.type }}-${{ matrix.engine.version }}-${{ env.IMAGE }}-${{ matrix.host.ARCH }} | |
path: | | |
python/python/tests/pytest_report.html | |
utils/clusters/** | |
benchmarks/results/** | |
test-modules: | |
if: (github.repository_owner == 'valkey-io' && github.event_name == 'workflow_dispatch') || github.event.pull_request.head.repo.owner.login == 'valkey-io' | |
environment: AWS_ACTIONS | |
name: Running Module Tests | |
runs-on: [self-hosted, linux, ARM64] | |
timeout-minutes: 15 | |
steps: | |
- name: Setup self-hosted runner access | |
if: ${{ contains(matrix.host.RUNNER, 'self-hosted') }} | |
run: sudo chown -R $USER:$USER /home/ubuntu/actions-runner/_work/valkey-glide | |
- uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Build Python wrapper | |
uses: ./.github/workflows/build-python-wrapper | |
with: | |
os: ubuntu | |
target: aarch64-unknown-linux-gnu | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Test with pytest | |
working-directory: ./python | |
run: | | |
source .env/bin/activate | |
cd python/tests/ | |
pytest --asyncio-mode=auto --tls --cluster-endpoints=${{ secrets.MEMDB_MODULES_ENDPOINT }} -k server_modules --html=pytest_report.html --self-contained-html | |
- name: Upload test reports | |
if: always() | |
continue-on-error: true | |
uses: actions/upload-artifact@v4 | |
with: | |
name: modules-test-report | |
path: | | |
python/python/tests/pytest_report.html |