From bf0aa56fbbfa33c3bfbdf3c03a4ab55aceb0cda4 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Fri, 4 Apr 2025 20:00:41 -0500 Subject: [PATCH 1/4] PYTHON-5252 Add dependency on pymongocrypt 1.13 (#2258) --- .evergreen/scripts/setup_tests.py | 2 +- requirements/encryption.txt | 2 +- uv.lock | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.evergreen/scripts/setup_tests.py b/.evergreen/scripts/setup_tests.py index fc2cadf61..0764d2464 100644 --- a/.evergreen/scripts/setup_tests.py +++ b/.evergreen/scripts/setup_tests.py @@ -165,7 +165,7 @@ def handle_test_env() -> None: # Handle pass through env vars. for var in PASS_THROUGH_ENV: if is_set(var) or getattr(opts, var.lower()): - write_env(var, os.environ[var]) + write_env(var, os.environ.get(var, getattr(opts, var.lower()))) if extra := EXTRAS_MAP.get(test_name, ""): UV_ARGS.append(f"--extra {extra}") diff --git a/requirements/encryption.txt b/requirements/encryption.txt index 5962f5028..321aba5ba 100644 --- a/requirements/encryption.txt +++ b/requirements/encryption.txt @@ -1,3 +1,3 @@ pymongo-auth-aws>=1.1.0,<2.0.0 -pymongocrypt>=1.12.0,<2.0.0 +pymongocrypt>=1.13.0,<2.0.0 certifi;os.name=='nt' or sys_platform=='darwin' diff --git a/uv.lock b/uv.lock index 39aae339e..aa23663a8 100644 --- a/uv.lock +++ b/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 1 requires-python = ">=3.9" resolution-markers = [ "python_full_version >= '3.10'", @@ -997,7 +998,6 @@ sdist = { url = "https://files.pythonhosted.org/packages/07/e9/ae44ea7d7605df9e5 [[package]] name = "pymongo" -version = "4.12.0.dev0" source = { editable = "." } dependencies = [ { name = "dnspython" }, @@ -1086,7 +1086,7 @@ requires-dist = [ { name = "pykerberos", marker = "os_name != 'nt' and extra == 'gssapi'" }, { name = "pymongo-auth-aws", marker = "extra == 'aws'", specifier = ">=1.1.0,<2.0.0" }, { name = "pymongo-auth-aws", marker = "extra == 'encryption'", specifier = ">=1.1.0,<2.0.0" }, - { name = "pymongocrypt", marker = "extra == 'encryption'", specifier = ">=1.12.0,<2.0.0" }, + { name = "pymongocrypt", marker = "extra == 'encryption'", specifier = ">=1.13.0,<2.0.0" }, { name = "pyopenssl", marker = "extra == 'ocsp'", specifier = ">=17.2.0" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.2" }, { name = "pytest-asyncio", marker = "extra == 'test'", specifier = ">=0.24.0" }, @@ -1101,6 +1101,7 @@ requires-dist = [ { name = "winkerberos", marker = "os_name == 'nt' and extra == 'gssapi'", specifier = ">=0.5.0" }, { name = "zstandard", marker = "extra == 'zstd'" }, ] +provides-extras = ["aws", "docs", "encryption", "gssapi", "ocsp", "snappy", "test", "zstd"] [package.metadata.requires-dev] coverage = [ @@ -1136,8 +1137,8 @@ wheels = [ [[package]] name = "pymongocrypt" -version = "1.13.0.dev0" -source = { git = "https://github.com/mongodb/libmongocrypt?subdirectory=bindings%2Fpython&rev=master#1cad4ad1c4cd6c11c6a4710da2127dab6a374471" } +version = "1.14.0.dev0" +source = { git = "https://github.com/mongodb/libmongocrypt?subdirectory=bindings%2Fpython&rev=master#af621673c46d3d8fd2a2fe9d5540e24a79d9357a" } dependencies = [ { name = "cffi" }, { name = "cryptography" }, From 79e5d601397f6d3891d9eaf881b43fd40a712ee2 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Mon, 7 Apr 2025 09:48:05 -0500 Subject: [PATCH 2/4] PYTHON-5268 Fix handling of PYTHON_BINARY (#2264) --- .evergreen/scripts/install-dependencies.sh | 4 ++-- .evergreen/scripts/setup-dev-env.sh | 4 +--- .evergreen/scripts/setup_tests.py | 13 ++++++++++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.evergreen/scripts/install-dependencies.sh b/.evergreen/scripts/install-dependencies.sh index 1347374bf..780d250a2 100755 --- a/.evergreen/scripts/install-dependencies.sh +++ b/.evergreen/scripts/install-dependencies.sh @@ -39,7 +39,7 @@ function _pip_install() { # Ensure just is installed. -if ! command -v just 2>/dev/null; then +if ! command -v just >/dev/null 2>&1; then # On most systems we can install directly. _TARGET="" if [ "Windows_NT" = "${OS:-}" ]; then @@ -54,7 +54,7 @@ if ! command -v just 2>/dev/null; then fi # Install uv. -if ! command -v uv 2>/dev/null; then +if ! command -v uv >/dev/null 2>&1; then echo "Installing uv..." # On most systems we can install directly. curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR="$_BIN_DIR" INSTALLER_NO_MODIFY_PATH=1 sh || { diff --git a/.evergreen/scripts/setup-dev-env.sh b/.evergreen/scripts/setup-dev-env.sh index 3051c9aad..6e6b5965b 100755 --- a/.evergreen/scripts/setup-dev-env.sh +++ b/.evergreen/scripts/setup-dev-env.sh @@ -11,7 +11,7 @@ pushd $ROOT > /dev/null if [ -f $HERE/env.sh ]; then . $HERE/env.sh fi -# PYTHON_BINARY may be defined in test-env.sh. +# PYTHON_BINARY or PYTHON_VERSION may be defined in test-env.sh. if [ -f $HERE/test-env.sh ]; then . $HERE/test-env.sh fi @@ -21,7 +21,6 @@ bash $HERE/install-dependencies.sh # Get the appropriate UV_PYTHON. . $ROOT/.evergreen/utils.sh -set -x if [ -z "${PYTHON_BINARY:-}" ]; then if [ -n "${PYTHON_VERSION:-}" ]; then @@ -31,7 +30,6 @@ if [ -z "${PYTHON_BINARY:-}" ]; then fi fi export UV_PYTHON=${PYTHON_BINARY} -echo "export UV_PYTHON=$UV_PYTHON" >> $HERE/env.sh echo "Using python $UV_PYTHON" # Add the default install path to the path if needed. diff --git a/.evergreen/scripts/setup_tests.py b/.evergreen/scripts/setup_tests.py index 0764d2464..2ee8aa12e 100644 --- a/.evergreen/scripts/setup_tests.py +++ b/.evergreen/scripts/setup_tests.py @@ -26,7 +26,14 @@ from utils import ( ) # Passthrough environment variables. -PASS_THROUGH_ENV = ["GREEN_FRAMEWORK", "NO_EXT", "MONGODB_API_VERSION", "DEBUG_LOG"] +PASS_THROUGH_ENV = [ + "GREEN_FRAMEWORK", + "NO_EXT", + "MONGODB_API_VERSION", + "DEBUG_LOG", + "PYTHON_BINARY", + "PYTHON_VERSION", +] # Map the test name to test extra. EXTRAS_MAP = { @@ -164,8 +171,8 @@ def handle_test_env() -> None: # Handle pass through env vars. for var in PASS_THROUGH_ENV: - if is_set(var) or getattr(opts, var.lower()): - write_env(var, os.environ.get(var, getattr(opts, var.lower()))) + if is_set(var) or getattr(opts, var.lower(), ""): + write_env(var, os.environ.get(var, getattr(opts, var.lower(), ""))) if extra := EXTRAS_MAP.get(test_name, ""): UV_ARGS.append(f"--extra {extra}") From 7a4218f0ad653af5091c1cb6a8dfc5d377f3df37 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Mon, 7 Apr 2025 10:36:35 -0500 Subject: [PATCH 3/4] PYTHON-5263 Convert s3-related functions to generated config (#2259) --- .evergreen/config.yml | 142 +-------------------- .evergreen/generated_configs/functions.yml | 117 +++++++++++++++++ .evergreen/scripts/generate_config.py | 135 +++++++++++++++++++- .pre-commit-config.yaml | 2 +- 4 files changed, 253 insertions(+), 143 deletions(-) create mode 100644 .evergreen/generated_configs/functions.yml diff --git a/.evergreen/config.yml b/.evergreen/config.yml index a297c4916..d83a5620d 100644 --- a/.evergreen/config.yml +++ b/.evergreen/config.yml @@ -25,6 +25,7 @@ timeout: binary: ls -la include: + - filename: .evergreen/generated_configs/functions.yml - filename: .evergreen/generated_configs/tasks.yml - filename: .evergreen/generated_configs/variants.yml @@ -52,147 +53,6 @@ functions: params: file: src/expansion.yml - "upload coverage" : - - command: ec2.assume_role - params: - role_arn: ${assume_role_arn} - - command: s3.put - params: - aws_key: ${AWS_ACCESS_KEY_ID} - aws_secret: ${AWS_SECRET_ACCESS_KEY} - aws_session_token: ${AWS_SESSION_TOKEN} - local_file: src/.coverage - optional: true - # Upload the coverage report for all tasks in a single build to the same directory. - remote_file: coverage/${revision}/${version_id}/coverage/coverage.${build_variant}.${task_name} - bucket: ${bucket_name} - permissions: public-read - content_type: text/html - display_name: "Raw Coverage Report" - - "download and merge coverage" : - - command: ec2.assume_role - params: - role_arn: ${assume_role_arn} - - command: subprocess.exec - params: - silent: true - binary: bash - working_dir: "src" - include_expansions_in_env: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN"] - args: - - .evergreen/scripts/download-and-merge-coverage.sh - - ${bucket_name} - - ${revision} - - ${version_id} - - command: subprocess.exec - params: - working_dir: "src" - binary: bash - args: - - .evergreen/combine-coverage.sh - # Upload the resulting html coverage report. - - command: subprocess.exec - params: - silent: true - binary: bash - working_dir: "src" - include_expansions_in_env: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN"] - args: - - .evergreen/scripts/upload-coverage-report.sh - - ${bucket_name} - - ${revision} - - ${version_id} - # Attach the index.html with s3.put so it shows up in the Evergreen UI. - - command: s3.put - params: - aws_key: ${AWS_ACCESS_KEY_ID} - aws_secret: ${AWS_SECRET_ACCESS_KEY} - aws_session_token: ${AWS_SESSION_TOKEN} - local_file: src/htmlcov/index.html - remote_file: coverage/${revision}/${version_id}/htmlcov/index.html - bucket: ${bucket_name} - permissions: public-read - content_type: text/html - display_name: "Coverage Report HTML" - - "upload mo artifacts": - - command: ec2.assume_role - params: - role_arn: ${assume_role_arn} - - command: archive.targz_pack - params: - target: "mongo-coredumps.tgz" - source_dir: "./" - include: - - "./**.core" - - "./**.mdmp" # Windows: minidumps - - command: s3.put - params: - aws_key: ${AWS_ACCESS_KEY_ID} - aws_secret: ${AWS_SECRET_ACCESS_KEY} - aws_session_token: ${AWS_SESSION_TOKEN} - local_file: mongo-coredumps.tgz - remote_file: ${build_variant}/${revision}/${version_id}/${build_id}/coredumps/${task_id}-${execution}-mongodb-coredumps.tar.gz - bucket: ${bucket_name} - permissions: public-read - content_type: ${content_type|application/gzip} - display_name: Core Dumps - Execution - optional: true - - command: s3.put - params: - aws_key: ${AWS_ACCESS_KEY_ID} - aws_secret: ${AWS_SECRET_ACCESS_KEY} - aws_session_token: ${AWS_SESSION_TOKEN} - local_file: ${DRIVERS_TOOLS}/.evergreen/test_logs.tar.gz - remote_file: ${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-drivers-tools-logs.tar.gz - bucket: ${bucket_name} - permissions: public-read - content_type: ${content_type|application/x-gzip} - display_name: "drivers-tools-logs.tar.gz" - - "upload working dir": - - command: ec2.assume_role - params: - role_arn: ${assume_role_arn} - - command: archive.targz_pack - params: - target: "working-dir.tar.gz" - source_dir: ${PROJECT_DIRECTORY}/ - include: - - "./**" - - command: s3.put - params: - aws_key: ${AWS_ACCESS_KEY_ID} - aws_secret: ${AWS_SECRET_ACCESS_KEY} - aws_session_token: ${AWS_SESSION_TOKEN} - local_file: working-dir.tar.gz - remote_file: ${build_variant}/${revision}/${version_id}/${build_id}/artifacts/${task_id}-${execution}-working-dir.tar.gz - bucket: ${bucket_name} - permissions: public-read - content_type: ${content_type|application/x-gzip} - display_name: "working-dir.tar.gz" - - command: archive.targz_pack - params: - target: "drivers-dir.tar.gz" - source_dir: ${DRIVERS_TOOLS} - include: - - "./**" - exclude_files: - # Windows cannot read the mongod *.lock files because they are locked. - - "*.lock" - - command: s3.put - params: - aws_key: ${AWS_ACCESS_KEY_ID} - aws_secret: ${AWS_SECRET_ACCESS_KEY} - aws_session_token: ${AWS_SESSION_TOKEN} - local_file: drivers-dir.tar.gz - remote_file: ${build_variant}/${revision}/${version_id}/${build_id}/artifacts/${task_id}-${execution}-drivers-dir.tar.gz - bucket: ${bucket_name} - permissions: public-read - content_type: ${content_type|application/x-gzip} - display_name: "drivers-dir.tar.gz" - "upload test results": - command: attach.results params: diff --git a/.evergreen/generated_configs/functions.yml b/.evergreen/generated_configs/functions.yml new file mode 100644 index 000000000..afd7f1137 --- /dev/null +++ b/.evergreen/generated_configs/functions.yml @@ -0,0 +1,117 @@ +functions: + # Download and merge coverage + download and merge coverage: + - command: ec2.assume_role + params: + role_arn: ${assume_role_arn} + type: setup + - command: subprocess.exec + params: + binary: bash + args: + - .evergreen/scripts/download-and-merge-coverage.sh + - ${bucket_name} + - ${revision} + - ${version_id} + working_dir: src + silent: true + include_expansions_in_env: + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_SESSION_TOKEN + type: test + - command: subprocess.exec + params: + binary: bash + args: + - .evergreen/combine-coverage.sh + working_dir: src + type: test + - command: subprocess.exec + params: + binary: bash + args: + - .evergreen/scripts/upload-coverage-report.sh + - ${bucket_name} + - ${revision} + - ${version_id} + working_dir: src + silent: true + include_expansions_in_env: + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_SESSION_TOKEN + type: test + - command: s3.put + params: + remote_file: coverage/${revision}/${version_id}/htmlcov/index.html + aws_key: ${AWS_ACCESS_KEY_ID} + aws_secret: ${AWS_SECRET_ACCESS_KEY} + aws_session_token: ${AWS_SESSION_TOKEN} + bucket: ${bucket_name} + local_file: src/htmlcov/index.html + permissions: public-read + content_type: text/html + display_name: Coverage Report HTML + optional: "true" + type: setup + + # Upload coverage + upload coverage: + - command: ec2.assume_role + params: + role_arn: ${assume_role_arn} + type: setup + - command: s3.put + params: + remote_file: coverage/${revision}/${version_id}/coverage/coverage.${build_variant}.${task_name} + aws_key: ${AWS_ACCESS_KEY_ID} + aws_secret: ${AWS_SECRET_ACCESS_KEY} + aws_session_token: ${AWS_SESSION_TOKEN} + bucket: ${bucket_name} + local_file: src/.coverage + permissions: public-read + content_type: text/html + display_name: Raw Coverage Report + optional: "true" + type: setup + + # Upload mo artifacts + upload mo artifacts: + - command: ec2.assume_role + params: + role_arn: ${assume_role_arn} + type: setup + - command: archive.targz_pack + params: + target: mongo-coredumps.tgz + source_dir: ./ + include: + - ./**.core + - ./**.mdmp + - command: s3.put + params: + remote_file: ${build_variant}/${revision}/${version_id}/${build_id}/coredumps/${task_id}-${execution}-mongodb-coredumps.tar.gz + aws_key: ${AWS_ACCESS_KEY_ID} + aws_secret: ${AWS_SECRET_ACCESS_KEY} + aws_session_token: ${AWS_SESSION_TOKEN} + bucket: ${bucket_name} + local_file: mongo-coredumps.tgz + permissions: public-read + content_type: ${content_type|application/x-gzip} + display_name: Core Dumps - Execution + optional: "true" + type: setup + - command: s3.put + params: + remote_file: ${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-drivers-tools-logs.tar.gz + aws_key: ${AWS_ACCESS_KEY_ID} + aws_secret: ${AWS_SECRET_ACCESS_KEY} + aws_session_token: ${AWS_SESSION_TOKEN} + bucket: ${bucket_name} + local_file: ${DRIVERS_TOOLS}/.evergreen/test_logs.tar.gz + permissions: public-read + content_type: ${content_type|application/x-gzip} + display_name: drivers-tools-logs.tar.gz + optional: "true" + type: setup diff --git a/.evergreen/scripts/generate_config.py b/.evergreen/scripts/generate_config.py index 723ef6ba3..5a5f6e93d 100644 --- a/.evergreen/scripts/generate_config.py +++ b/.evergreen/scripts/generate_config.py @@ -9,7 +9,14 @@ from pathlib import Path from typing import Any from shrub.v3.evg_build_variant import BuildVariant -from shrub.v3.evg_command import EvgCommandType, FunctionCall, subprocess_exec +from shrub.v3.evg_command import ( + EvgCommandType, + FunctionCall, + archive_targz_pack, + ec2_assume_role, + s3_put, + subprocess_exec, +) from shrub.v3.evg_project import EvgProject from shrub.v3.evg_task import EvgTask, EvgTaskDependency, EvgTaskRef from shrub.v3.shrub_service import ShrubService @@ -233,6 +240,12 @@ def handle_c_ext(c_ext, expansions) -> None: expansions["NO_EXT"] = "1" +def get_assume_role(**kwargs): + kwargs.setdefault("command_type", EvgCommandType.SETUP) + kwargs.setdefault("role_arn", "${assume_role_arn}") + return ec2_assume_role(**kwargs) + + def get_subprocess_exec(**kwargs): kwargs.setdefault("binary", "bash") kwargs.setdefault("working_dir", "src") @@ -240,6 +253,18 @@ def get_subprocess_exec(**kwargs): return subprocess_exec(**kwargs) +def get_s3_put(**kwargs): + kwargs["aws_key"] = "${AWS_ACCESS_KEY_ID}" + kwargs["aws_secret"] = "${AWS_SECRET_ACCESS_KEY}" # noqa:S105 + kwargs["aws_session_token"] = "${AWS_SESSION_TOKEN}" # noqa:S105 + kwargs["bucket"] = "${bucket_name}" + kwargs.setdefault("optional", "true") + kwargs.setdefault("permissions", "public-read") + kwargs.setdefault("content_type", "${content_type|application/x-gzip}") + kwargs.setdefault("command_type", EvgCommandType.SETUP) + return s3_put(**kwargs) + + def generate_yaml(tasks=None, variants=None): """Generate the yaml for a given set of tasks and variants.""" project = EvgProject(tasks=tasks, buildvariants=variants) @@ -1193,6 +1218,79 @@ def create_serverless_tasks(): return [EvgTask(name=task_name, tags=tags, commands=[test_func])] +############## +# Functions +############## + + +def create_upload_coverage_func(): + # Upload the coverage report for all tasks in a single build to the same directory. + remote_file = ( + "coverage/${revision}/${version_id}/coverage/coverage.${build_variant}.${task_name}" + ) + display_name = "Raw Coverage Report" + cmd = get_s3_put( + local_file="src/.coverage", + remote_file=remote_file, + display_name=display_name, + content_type="text/html", + ) + return "upload coverage", [get_assume_role(), cmd] + + +def create_download_and_merge_coverage_func(): + include_expansions = ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN"] + args = [ + ".evergreen/scripts/download-and-merge-coverage.sh", + "${bucket_name}", + "${revision}", + "${version_id}", + ] + merge_cmd = get_subprocess_exec( + silent=True, include_expansions_in_env=include_expansions, args=args + ) + combine_cmd = get_subprocess_exec(args=[".evergreen/combine-coverage.sh"]) + # Upload the resulting html coverage report. + args = [ + ".evergreen/scripts/upload-coverage-report.sh", + "${bucket_name}", + "${revision}", + "${version_id}", + ] + upload_cmd = get_subprocess_exec( + silent=True, include_expansions_in_env=include_expansions, args=args + ) + display_name = "Coverage Report HTML" + remote_file = "coverage/${revision}/${version_id}/htmlcov/index.html" + put_cmd = get_s3_put( + local_file="src/htmlcov/index.html", + remote_file=remote_file, + display_name=display_name, + content_type="text/html", + ) + cmds = [get_assume_role(), merge_cmd, combine_cmd, upload_cmd, put_cmd] + return "download and merge coverage", cmds + + +def create_upload_mo_artifacts_func(): + include = ["./**.core", "./**.mdmp"] # Windows: minidumps + archive_cmd = archive_targz_pack(target="mongo-coredumps.tgz", source_dir="./", include=include) + display_name = "Core Dumps - Execution" + remote_file = "${build_variant}/${revision}/${version_id}/${build_id}/coredumps/${task_id}-${execution}-mongodb-coredumps.tar.gz" + s3_dumps = get_s3_put( + local_file="mongo-coredumps.tgz", remote_file=remote_file, display_name=display_name + ) + display_name = "drivers-tools-logs.tar.gz" + remote_file = "${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-drivers-tools-logs.tar.gz" + s3_logs = get_s3_put( + local_file="${DRIVERS_TOOLS}/.evergreen/test_logs.tar.gz", + remote_file=remote_file, + display_name=display_name, + ) + cmds = [get_assume_role(), archive_cmd, s3_dumps, s3_logs] + return "upload mo artifacts", cmds + + ################## # Generate Config ################## @@ -1258,5 +1356,40 @@ def write_tasks_to_file(): fid.write(f"{line}\n") +def write_functions_to_file(): + mod = sys.modules[__name__] + here = Path(__file__).absolute().parent + target = here.parent / "generated_configs" / "functions.yml" + if target.exists(): + target.unlink() + with target.open("w") as fid: + fid.write("functions:\n") + + functions = dict() + for name, func in sorted(getmembers(mod, isfunction)): + if name.startswith("_") or not name.endswith("_func"): + continue + if not name.startswith("create_"): + raise ValueError("Function creators must start with create_") + title = name.replace("create_", "").replace("_func", "").replace("_", " ").capitalize() + func_name, cmds = func() + functions = dict() + functions[func_name] = cmds + project = EvgProject(functions=functions, tasks=None, buildvariants=None) + out = ShrubService.generate_yaml(project).splitlines() + with target.open("a") as fid: + fid.write(f" # {title}\n") + for line in out[1:]: + fid.write(f"{line}\n") + fid.write("\n") + + # Remove extra trailing newline: + data = target.read_text().splitlines() + with target.open("w") as fid: + for line in data[:-1]: + fid.write(f"{line}\n") + + write_variants_to_file() write_tasks_to_file() +write_functions_to_file() diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index deab0724a..a570e55ad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -121,4 +121,4 @@ repos: entry: .evergreen/scripts/generate-config.sh language: python require_serial: true - additional_dependencies: ["shrub.py>=3.8.0", "pyyaml>=6.0.2"] + additional_dependencies: ["shrub.py>=3.9.0", "pyyaml>=6.0.2"] From 4d4a26cbbe994675551234b15953bd2cf27d6d8a Mon Sep 17 00:00:00 2001 From: Shane Harvey Date: Mon, 7 Apr 2025 11:34:01 -0700 Subject: [PATCH 4/4] PYTHON-5270 Server selection should log remainingTimeMS as milliseconds (#2263) --- pymongo/asynchronous/topology.py | 2 +- pymongo/synchronous/topology.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pymongo/asynchronous/topology.py b/pymongo/asynchronous/topology.py index b315cc33b..32776bf7b 100644 --- a/pymongo/asynchronous/topology.py +++ b/pymongo/asynchronous/topology.py @@ -354,7 +354,7 @@ class Topology: operationId=operation_id, topologyDescription=self.description, clientId=self.description._topology_settings._topology_id, - remainingTimeMS=int(end_time - time.monotonic()), + remainingTimeMS=int(1000 * (end_time - time.monotonic())), ) logged_waiting = True diff --git a/pymongo/synchronous/topology.py b/pymongo/synchronous/topology.py index 7df475b4c..df23bff28 100644 --- a/pymongo/synchronous/topology.py +++ b/pymongo/synchronous/topology.py @@ -354,7 +354,7 @@ class Topology: operationId=operation_id, topologyDescription=self.description, clientId=self.description._topology_settings._topology_id, - remainingTimeMS=int(end_time - time.monotonic()), + remainingTimeMS=int(1000 * (end_time - time.monotonic())), ) logged_waiting = True