Skip to content

Commit 7e2e23e

Browse files
authored
feat(api_core): add deprecation warning for grpcio < 1.83.0 for PQC (#18045)
Adds deprecation warnings for `grpcio < 1.83.0` to `google.api_core._python_package_support`. In October 2026, Google Cloud client libraries will raise their minimum requirements to enforce `grpcio >= 1.83.0` for Post-Quantum Cryptography (PQC) support. Towards: b/537446703
1 parent ccc7498 commit 7e2e23e

3 files changed

Lines changed: 80 additions & 6 deletions

File tree

‎packages/google-api-core/google/api_core/_python_package_support.py‎

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,37 @@
3030
# about deprecated and unsupported versions.
3131
DependencyConstraint = namedtuple(
3232
"DependencyConstraint",
33-
["package_name", "minimum_fully_supported_version", "recommended_version"],
33+
[
34+
"package_name",
35+
"minimum_fully_supported_version",
36+
"recommended_version",
37+
"message_template",
38+
],
39+
defaults=(None, None),
3440
)
41+
42+
PQC_GRPC_WARNING_TEMPLATE = (
43+
"Package {consumer_package} depends on {dependency_package}, currently installed at version {version_used_string}. "
44+
"grpcio < 1.83.0 does not support Post-Quantum Cryptography (PQC). "
45+
"Support for non-PQC environments is deprecated. In October 2026, "
46+
"Google Cloud Python packages will raise their minimum requirements "
47+
"(including google-api-core, grpcio, and grpcio-status) to enforce grpcio >= 1.83.0. "
48+
"For more details on Google Cloud's post-quantum security migration, visit: "
49+
"https://cloud.google.com/security/resources/post-quantum-cryptography"
50+
)
51+
3552
_PACKAGE_DEPENDENCY_WARNINGS = [
3653
DependencyConstraint(
3754
"google.protobuf",
3855
minimum_fully_supported_version="6.33.5",
3956
recommended_version="6.x",
40-
)
57+
),
58+
DependencyConstraint(
59+
"grpcio",
60+
minimum_fully_supported_version="1.83.0",
61+
recommended_version="1.83.x",
62+
message_template=PQC_GRPC_WARNING_TEMPLATE,
63+
),
4164
]
4265

4366

@@ -162,7 +185,7 @@ def warn_deprecation_for_versions_less_than(
162185
) = _get_distribution_and_import_packages(consumer_import_package)
163186

164187
recommendation = (
165-
" (we recommend {recommended_version})" if recommended_version else ""
188+
f" (we recommend {recommended_version})" if recommended_version else ""
166189
)
167190
message_template = message_template or _flatten_message(
168191
"""
@@ -222,4 +245,5 @@ def check_dependency_versions(
222245
package_info.package_name,
223246
package_info.minimum_fully_supported_version,
224247
recommended_version=package_info.recommended_version,
248+
message_template=package_info.message_template,
225249
)

‎packages/google-api-core/pyproject.toml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ filterwarnings = [
8585
"error",
8686
# Prevent Python version warnings from interfering with tests
8787
"ignore:.* Python version .*:FutureWarning",
88+
# TODO: Remove once b/544782314 is resolved (when grpcio >= 1.83.0 is enforced)
89+
"ignore:.*does not support Post-Quantum Cryptography.*:FutureWarning",
8890
# Remove once https://github.com/pytest-dev/pytest-cov/issues/621 is fixed
8991
"ignore:.*The --rsyncdir command line argument and rsyncdirs config variable are deprecated:DeprecationWarning",
9092
# Remove once https://github.com/protocolbuffers/protobuf/issues/12186 is fixed

‎packages/google-api-core/tests/unit/test_python_package_support.py‎

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import pytest
1919

2020
from google.api_core._python_package_support import (
21+
PQC_GRPC_WARNING_TEMPLATE,
2122
DependencyConstraint,
2223
DependencyVersion,
2324
check_dependency_versions,
@@ -37,7 +38,6 @@ def test_get_dependency_version(mocker, version_string_to_test):
3738
parse_version_to_tuple(version_string_to_test), version_string_to_test
3839
)
3940
assert get_dependency_version("some-package") == expected
40-
4141
mock_importlib.assert_called_once_with("some-package")
4242

4343
# Test package not found
@@ -112,6 +112,22 @@ def test_warn_deprecation_for_versions_less_than(mock_get_version, mock_get_pack
112112
in str(record[0].message)
113113
)
114114

115+
# Case 6: Recommended version is properly formatted.
116+
mock_get_packages.reset_mock()
117+
mock_get_packages.side_effect = [
118+
("dep-package (dep.package)", "dep-package"),
119+
("my-package (my.package)", "my-package"),
120+
]
121+
mock_get_version.return_value = DependencyVersion(
122+
parse_version_to_tuple("1.0.0"), "1.0.0"
123+
)
124+
with pytest.warns(FutureWarning) as record:
125+
warn_deprecation_for_versions_less_than(
126+
"my.package", "dep.package", "2.0.0", recommended_version="3.0.0"
127+
)
128+
assert len(record) == 1
129+
assert "version 2.0.0 or higher (we recommend 3.0.0)." in str(record[0].message)
130+
115131

116132
@patch(
117133
"google.api_core._python_package_support.warn_deprecation_for_versions_less_than"
@@ -125,8 +141,40 @@ def test_check_dependency_versions_with_custom_warnings(mock_warn):
125141

126142
assert mock_warn.call_count == 2
127143
mock_warn.assert_any_call(
128-
"my-consumer", "pkg1", "1.0.0", recommended_version="2.0.0"
144+
"my-consumer",
145+
"pkg1",
146+
"1.0.0",
147+
recommended_version="2.0.0",
148+
message_template=None,
149+
)
150+
mock_warn.assert_any_call(
151+
"my-consumer",
152+
"pkg2",
153+
"2.0.0",
154+
recommended_version="3.0.0",
155+
message_template=None,
156+
)
157+
158+
159+
@patch(
160+
"google.api_core._python_package_support.warn_deprecation_for_versions_less_than"
161+
)
162+
def test_check_dependency_versions_default(mock_warn):
163+
"""Test check_dependency_versions with default package dependency warnings."""
164+
check_dependency_versions("my-consumer")
165+
166+
assert mock_warn.call_count == 2
167+
mock_warn.assert_any_call(
168+
"my-consumer",
169+
"google.protobuf",
170+
"6.33.5",
171+
recommended_version="6.x",
172+
message_template=None,
129173
)
130174
mock_warn.assert_any_call(
131-
"my-consumer", "pkg2", "2.0.0", recommended_version="3.0.0"
175+
"my-consumer",
176+
"grpcio",
177+
"1.83.0",
178+
recommended_version="1.83.x",
179+
message_template=PQC_GRPC_WARNING_TEMPLATE,
132180
)

0 commit comments

Comments
 (0)