diff --git a/.gitignore b/.gitignore index 5caa44e..7fe800e 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ /grpc-1.37.0.tar.gz /grpc-1.37.1.tar.gz /googletest-release-1.11.0.tar.gz +/grpc-1.39.0.tar.gz diff --git a/grpc-0001-enforce-system-crypto-policies.patch b/grpc-0001-enforce-system-crypto-policies.patch deleted file mode 100644 index 14add7d..0000000 --- a/grpc-0001-enforce-system-crypto-policies.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 5d56d52e0829e503e403568de66bb6cebfec3202 Mon Sep 17 00:00:00 2001 -From: Sergey Avseyev -Date: Wed, 28 Nov 2018 18:53:22 +0300 -Subject: [PATCH 1/4] enforce system crypto policies - ---- - test/core/handshake/client_ssl.cc | 3 +-- - test/core/handshake/server_ssl_common.cc | 3 +-- - 2 files changed, 2 insertions(+), 4 deletions(-) - -diff --git a/test/core/handshake/client_ssl.cc b/test/core/handshake/client_ssl.cc -index 467df6e229..b31934e51b 100644 ---- a/test/core/handshake/client_ssl.cc -+++ b/test/core/handshake/client_ssl.cc -@@ -161,8 +161,7 @@ static void server_thread(void* arg) { - // Set the cipher list to match the one expressed in - // src/core/tsi/ssl_transport_security.c. - const char* cipher_list = -- "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-" -- "SHA384:ECDHE-RSA-AES256-GCM-SHA384"; -+ "PROFILE=SYSTEM"; - if (!SSL_CTX_set_cipher_list(ctx, cipher_list)) { - ERR_print_errors_fp(stderr); - gpr_log(GPR_ERROR, "Couldn't set server cipher list."); -diff --git a/test/core/handshake/server_ssl_common.cc b/test/core/handshake/server_ssl_common.cc -index 41b2829d8b..8b21ea7c73 100644 ---- a/test/core/handshake/server_ssl_common.cc -+++ b/test/core/handshake/server_ssl_common.cc -@@ -167,8 +167,7 @@ bool server_ssl_test(const char* alpn_list[], unsigned int alpn_list_len, - // Set the cipher list to match the one expressed in - // src/core/tsi/ssl_transport_security.c. - const char* cipher_list = -- "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-" -- "SHA384:ECDHE-RSA-AES256-GCM-SHA384"; -+ "PROFILE=SYSTEM"; - if (!SSL_CTX_set_cipher_list(ctx, cipher_list)) { - ERR_print_errors_fp(stderr); - gpr_log(GPR_ERROR, "Couldn't set server cipher list."); --- -2.21.0 - diff --git a/grpc-1.37.0-python-grpcio_tools-use-system-protobuf.patch b/grpc-1.39.0-python-grpcio_tools-use-system-protobuf.patch similarity index 95% rename from grpc-1.37.0-python-grpcio_tools-use-system-protobuf.patch rename to grpc-1.39.0-python-grpcio_tools-use-system-protobuf.patch index 832f1d9..6ac95b5 100644 --- a/grpc-1.37.0-python-grpcio_tools-use-system-protobuf.patch +++ b/grpc-1.39.0-python-grpcio_tools-use-system-protobuf.patch @@ -1,6 +1,6 @@ -diff -Naur grpc-1.37.0-original/tools/distrib/python/grpcio_tools/protoc_lib_deps.py grpc-1.37.0/tools/distrib/python/grpcio_tools/protoc_lib_deps.py ---- grpc-1.37.0-original/tools/distrib/python/grpcio_tools/protoc_lib_deps.py 2021-04-06 18:48:56.000000000 -0400 -+++ grpc-1.37.0/tools/distrib/python/grpcio_tools/protoc_lib_deps.py 2021-04-08 15:30:28.142459012 -0400 +diff -Naur grpc-1.39.0-original/tools/distrib/python/grpcio_tools/protoc_lib_deps.py grpc-1.39.0/tools/distrib/python/grpcio_tools/protoc_lib_deps.py +--- grpc-1.39.0-original/tools/distrib/python/grpcio_tools/protoc_lib_deps.py 2021-07-20 18:39:39.000000000 -0400 ++++ grpc-1.39.0/tools/distrib/python/grpcio_tools/protoc_lib_deps.py 2021-07-23 14:46:07.887714469 -0400 @@ -14,10 +14,9 @@ # limitations under the License. @@ -13,6 +13,6 @@ diff -Naur grpc-1.37.0-original/tools/distrib/python/grpcio_tools/protoc_lib_dep -CC_INCLUDE='third_party/protobuf/src' -PROTO_INCLUDE='third_party/protobuf/src' - --PROTOBUF_SUBMODULE_VERSION="d7e943b8d2bc444a8c770644e73d090b486f8b37" +-PROTOBUF_SUBMODULE_VERSION="436bd7880e458532901c58f4d9d1ea23fa7edd52" +CC_INCLUDE='/usr/include' +PROTO_INCLUDE='/usr/include' diff --git a/grpc-1.39.0-python2-test-scripts.patch b/grpc-1.39.0-python2-test-scripts.patch new file mode 100644 index 0000000..fb73963 --- /dev/null +++ b/grpc-1.39.0-python2-test-scripts.patch @@ -0,0 +1,69 @@ +diff -Naur --no-dereference grpc-1.39.0-original/test/core/http/test_server.py grpc-1.39.0/test/core/http/test_server.py +--- grpc-1.39.0-original/test/core/http/test_server.py 2021-07-20 18:39:39.000000000 -0400 ++++ grpc-1.39.0/test/core/http/test_server.py 2021-08-02 15:53:10.756821227 -0400 +@@ -15,7 +15,7 @@ + """Server for httpcli_test""" + + import argparse +-import BaseHTTPServer ++import http.server + import os + import ssl + import sys +@@ -26,7 +26,7 @@ + _KEY = os.path.abspath( + os.path.join(os.path.dirname(sys.argv[0]), '../../..', + 'src/core/tsi/test_creds/server1.key')) +-print _PEM ++print(_PEM) + open(_PEM).close() + + argp = argparse.ArgumentParser(description='Server for httpcli_test') +@@ -34,29 +34,29 @@ + argp.add_argument('-s', '--ssl', default=False, action='store_true') + args = argp.parse_args() + +-print 'server running on port %d' % args.port ++print('server running on port %d' % args.port) + + +-class Handler(BaseHTTPServer.BaseHTTPRequestHandler): ++class Handler(http.server.BaseHTTPRequestHandler): + + def good(self): + self.send_response(200) + self.send_header('Content-Type', 'text/html') + self.end_headers() +- self.wfile.write('Hello world!') +- self.wfile.write('

This is a test

') ++ self.wfile.write(b'Hello world!') ++ self.wfile.write(b'

This is a test

') + + def do_GET(self): + if self.path == '/get': + self.good() + + def do_POST(self): +- content = self.rfile.read(int(self.headers.getheader('content-length'))) ++ content = self.rfile.read(int(self.headers.get('content-length'))) + if self.path == '/post' and content == 'hello': + self.good() + + +-httpd = BaseHTTPServer.HTTPServer(('localhost', args.port), Handler) ++httpd = http.server.HTTPServer(('localhost', args.port), Handler) + if args.ssl: + httpd.socket = ssl.wrap_socket(httpd.socket, + certfile=_PEM, +diff -Naur --no-dereference grpc-1.39.0-original/tools/distrib/python_wrapper.sh grpc-1.39.0/tools/distrib/python_wrapper.sh +--- grpc-1.39.0-original/tools/distrib/python_wrapper.sh 2021-07-20 18:39:39.000000000 -0400 ++++ grpc-1.39.0/tools/distrib/python_wrapper.sh 2021-08-02 13:04:51.034495917 -0400 +@@ -14,7 +14,7 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-for p in python2.7 python2.6 python2 python not_found ; do ++for p in python3 not_found ; do + + python=$(which $p || echo not_found) + diff --git a/grpc-1.39.0-python_wrapper-path.patch b/grpc-1.39.0-python_wrapper-path.patch new file mode 100644 index 0000000..5b7a227 --- /dev/null +++ b/grpc-1.39.0-python_wrapper-path.patch @@ -0,0 +1,30 @@ +diff -Naur grpc-1.39.0-original/test/core/http/httpcli_test.cc grpc-1.39.0/test/core/http/httpcli_test.cc +--- grpc-1.39.0-original/test/core/http/httpcli_test.cc 2021-07-20 18:39:39.000000000 -0400 ++++ grpc-1.39.0/test/core/http/httpcli_test.cc 2021-08-02 11:38:43.215629892 -0400 +@@ -165,9 +165,9 @@ + lslash = me + (lslash - me) - sizeof("http"); + } + root = static_cast( +- gpr_malloc(static_cast(lslash - me + sizeof("/../..")))); ++ gpr_malloc(static_cast(lslash - me + sizeof("/..")))); + memcpy(root, me, static_cast(lslash - me)); +- memcpy(root + (lslash - me), "/../..", sizeof("/../..")); ++ memcpy(root + (lslash - me), "/..", sizeof("/..")); + } else { + root = gpr_strdup("."); + } +diff -Naur grpc-1.39.0-original/test/core/http/httpscli_test.cc grpc-1.39.0/test/core/http/httpscli_test.cc +--- grpc-1.39.0-original/test/core/http/httpscli_test.cc 2021-07-20 18:39:39.000000000 -0400 ++++ grpc-1.39.0/test/core/http/httpscli_test.cc 2021-08-02 11:38:52.825572125 -0400 +@@ -166,9 +166,9 @@ + lslash = me + (lslash - me) - sizeof("http"); + } + root = static_cast( +- gpr_malloc(static_cast(lslash - me + sizeof("/../..")))); ++ gpr_malloc(static_cast(lslash - me + sizeof("/..")))); + memcpy(root, me, static_cast(lslash - me)); +- memcpy(root + (lslash - me), "/../..", sizeof("/../..")); ++ memcpy(root + (lslash - me), "/..", sizeof("/..")); + } else { + root = gpr_strdup("."); + } diff --git a/grpc-1.39.0-system-crypto-policies.patch b/grpc-1.39.0-system-crypto-policies.patch new file mode 100644 index 0000000..f6db782 --- /dev/null +++ b/grpc-1.39.0-system-crypto-policies.patch @@ -0,0 +1,40 @@ +diff -Naur grpc-1.39.0-original/src/objective-c/tests/CronetTests/CronetUnitTests.mm grpc-1.39.0/src/objective-c/tests/CronetTests/CronetUnitTests.mm +--- grpc-1.39.0-original/src/objective-c/tests/CronetTests/CronetUnitTests.mm 2021-07-20 18:39:39.000000000 -0400 ++++ grpc-1.39.0/src/objective-c/tests/CronetTests/CronetUnitTests.mm 2021-07-23 14:42:11.649278304 -0400 +@@ -103,7 +103,7 @@ + BIO_free(pem); + + // Select cipher suite +- SSL_CTX_set_cipher_list(ctx, "ECDHE-RSA-AES128-GCM-SHA256"); ++ SSL_CTX_set_cipher_list(ctx, "PROFILE=SYSTEM"); + + // Select ALPN protocol + SSL_CTX_set_alpn_select_cb(ctx, alpn_cb, NULL); +diff -Naur grpc-1.39.0-original/test/core/handshake/client_ssl.cc grpc-1.39.0/test/core/handshake/client_ssl.cc +--- grpc-1.39.0-original/test/core/handshake/client_ssl.cc 2021-07-20 18:39:39.000000000 -0400 ++++ grpc-1.39.0/test/core/handshake/client_ssl.cc 2021-07-23 14:41:27.549570232 -0400 +@@ -220,9 +220,7 @@ + + // Set the cipher list to match the one expressed in + // src/core/tsi/ssl_transport_security.cc. +- const char* cipher_list = +- "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-" +- "SHA384:ECDHE-RSA-AES256-GCM-SHA384"; ++ const char* cipher_list = "PROFILE=SYSTEM"; + if (!SSL_CTX_set_cipher_list(ctx, cipher_list)) { + ERR_print_errors_fp(stderr); + gpr_log(GPR_ERROR, "Couldn't set server cipher list."); +diff -Naur grpc-1.39.0-original/test/core/handshake/server_ssl_common.cc grpc-1.39.0/test/core/handshake/server_ssl_common.cc +--- grpc-1.39.0-original/test/core/handshake/server_ssl_common.cc 2021-07-20 18:39:39.000000000 -0400 ++++ grpc-1.39.0/test/core/handshake/server_ssl_common.cc 2021-07-23 14:41:14.369657480 -0400 +@@ -204,9 +204,7 @@ + + // Set the cipher list to match the one expressed in + // src/core/tsi/ssl_transport_security.c. +- const char* cipher_list = +- "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-" +- "SHA384:ECDHE-RSA-AES256-GCM-SHA384"; ++ const char* cipher_list = "PROFILE=SYSTEM"; + if (!SSL_CTX_set_cipher_list(ctx, cipher_list)) { + ERR_print_errors_fp(stderr); + gpr_log(GPR_ERROR, "Couldn't set server cipher list."); diff --git a/grpc.rpmlintrc b/grpc.rpmlintrc index 81e601f..84be906 100644 --- a/grpc.rpmlintrc +++ b/grpc.rpmlintrc @@ -1,6 +1,7 @@ # These are not real spelling errors... addFilter(r' spelling-error .*[ \(]en_US\)? (microservices|auth|gRPC|' - r'channelz|proto(buf)?|unary|rpc)|grpcio ') + r'channelz|proto(buf)?|unary|rpc|grpcio|csds|localhost|' + r'grpc(debug)?|servicers|[Dx]DS|programatically) ') # Maybe some of these are supposed to be CRNL-terminated: addFilter(r' wrong-file-end-of-line-encoding ' r'/usr/share/doc/grpc/examples/csharp/') @@ -24,3 +25,8 @@ addFilter(r' shared-lib-without-dependency-information ' addFilter(r' no-manual-page-for-binary grpc_.*_plugin$') # There is really no version information available. addFilter(r' unversioned-explicit-provides bundled\(upb\)') +# We use rpmautospec, which rpmlint may not yet understand +addFilter(r' Possible unexpanded macro in: .*%autorelease$') +addFilter(r' %changelog entries must start with \*$') +# This really does make sense: +addFilter(r' summary-not-capitalized .*xDS$') diff --git a/grpc.spec b/grpc.spec index 1a44089..68d1402 100644 --- a/grpc.spec +++ b/grpc.spec @@ -2,11 +2,19 @@ # errors. %global cpp_std 17 +# Bootstrapping breaks the circular dependency on python3dist(xds-protos), +# which is packaged separately but ultimately generated from grpc sources using +# the proto compilers in this package; the consequence is that we cannot build +# the python3-grpcio-admin or python3-grpcio-csds, or the Python documentation, +# until after bootstrapping. +%bcond_with bootstrap + # However, gtest in Fedora uses the C++11 ABI, so we get linker errors building # the tests if we use C++17. We must therefore bundle a copy of gtest in the # source RPM rather than using the system copy. This is to be discouraged, but # there is no alternative in this case. It is not treated as a bundled library -# because it is used only at build time, and is not installed. +# because it is used only at build time, and contributes nothing to the +# installed files. %global gtest_version 1.11.0 %bcond_with system_gtest @@ -28,16 +36,16 @@ %bcond_with python_gevent_tests Name: grpc -Version: 1.37.1 +Version: 1.39.0 Release: %autorelease Summary: RPC library and framework # CMakeLists.txt: gRPC_CORE_SOVERSION -%global c_so_version 15 +%global c_so_version 18 # CMakeLists.txt: gRPC_CPP_SOVERSION -%global cpp_so_version 1.37 +%global cpp_so_version 1.39 # CMakeLists.txt: gRPC_CSHARP_SOVERSION -%global csharp_so_version 2.37 +%global csharp_so_version 2.39 # See https://github.com/abseil/abseil-cpp/issues/950#issuecomment-843169602 # regarding unusual SOVERSION style (not a single number). @@ -157,6 +165,7 @@ BuildRequires: python3dist(cython) # grpcio_tests (src/python/grpcio_tests/setup.py) install_requires: # enum34>=1.0.4; python_version<'3.4' +# grpcio_csds (src/python/grpcio_csds/setup.py) install_requires: # grpcio_channelz (src/python/grpcio_channelz/setup.py) install_requires: # grpcio_health_checking (src/python/grpcio_health_checking/setup.py) # install_requires: @@ -174,9 +183,16 @@ BuildRequires: python3dist(protobuf) >= 3.6.0 # grpcio_status (src/python/grpcio_status/setup.py) install_requires: BuildRequires: python3dist(googleapis-common-protos) >= 1.5.5 +%if %{without bootstrap} +# grpcio_csds (src/python/grpcio_csds/setup.py) install_requires +BuildRequires: python3dist(xds-protos) >= 0.0.7 +%endif + # Several packages have dependencies on grpcio or grpcio_tools—and grpcio-tests # depends on all of the other Python packages—which are satisfied within this # package. +# +# Similarly, grpcio_admin depends on grpcio_channelz and grpcio_csds. # grpcio_tests (src/python/grpcio_tests/setup.py) install_requires: BuildRequires: python3dist(coverage) >= 4.0 @@ -213,11 +229,13 @@ BuildRequires: dos2unix # Apply Fedora system crypto policies. Since this is Fedora-specific, the patch # is not suitable for upstream. # https://docs.fedoraproject.org/en-US/packaging-guidelines/CryptoPolicies/#_cc_applications -Patch0: %{name}-0001-enforce-system-crypto-policies.patch +# +# In fact, this may not be needed, since only testing code is patched. +Patch0: %{name}-1.39.0-system-crypto-policies.patch # Build python3-grpcio_tools against system protobuf packages instead of # expecting a git submodule. Must also add requisite linker flags using # GRPC_PYTHON_LDFLAGS. -Patch1: %{name}-1.37.0-python-grpcio_tools-use-system-protobuf.patch +Patch1: %{name}-1.39.0-python-grpcio_tools-use-system-protobuf.patch # Add an option GRPC_PYTHON_BUILD_SYSTEM_ABSL to go with the gRPC_ABSL_PROVIDER # option already provided upstream. See # https://github.com/grpc/grpc/issues/25559. @@ -239,9 +257,12 @@ Patch5: %{name}-1.36.4-python-grpcio_tests-skip-compression-tests.patch # Remove it. We still have to build the core tests and link a test library # (libgrpc++_test_config.so…) Patch6: %{name}-1.37.0-grpc_cli-do-not-link-gtest-gmock.patch -# In Python 3.10, “import importlib” does not implicitly import importlib.abc. -# See https://github.com/grpc/grpc/issues/26062. -Patch7: %{name}-1.37.0-importlib-abc-python3.10.patch +# Fix confusion about path to python_wrapper.sh in httpcli/httpscli tests. I +# suppose that the unpatched code must be correct for how upstream runs the +# tests, somehow. +Patch7: %{name}-1.39.0-python_wrapper-path.patch +# Port Python 2 scripts used in core tests to Python 3 +Patch8: %{name}-1.39.0-python2-test-scripts.patch Requires: %{name}-data = %{version}-%{release} @@ -310,11 +331,15 @@ BuildArch: noarch Obsoletes: python-grpcio-doc < 1.26.0-13 Provides: python-grpcio-doc = %{version}-%{release} +%if %{without bootstrap} +Provides: python-grpcio-admin-doc = %{version}-%{release} +Provides: python-grpcio-csds-doc = %{version}-%{release} Provides: python-grpcio-channelz-doc = %{version}-%{release} Provides: python-grpcio-health-checking-doc = %{version}-%{release} Provides: python-grpcio-reflection-doc = %{version}-%{release} Provides: python-grpcio-status-doc = %{version}-%{release} Provides: python-grpcio-testing-doc = %{version}-%{release} +%endif %description doc Documentation and examples for gRPC, including documentation for the following: @@ -330,6 +355,8 @@ Documentation and examples for gRPC, including documentation for the following: ○ Internals • Python ○ grpcio + ○ grpcio_admin + ○ grpcio_csds ○ grpcio_channelz ○ grpcio_health_checking ○ grpcio_reflection @@ -424,12 +451,69 @@ Summary: Package for gRPC Python tools Package for gRPC Python tools. +%if %{without bootstrap} +%package -n python3-grpcio-admin +Summary: A collection of admin services +License: ASL 2.0 +BuildArch: noarch + +%description -n python3-grpcio-admin +gRPC Python Admin Interface Package +=================================== + +Debugging gRPC library can be a complex task. There are many configurations and +internal states, which will affect the behavior of the library. This Python +package will be the collection of admin services that are exposing debug +information. Currently, it includes: + +* Channel tracing metrics (grpcio-channelz) +* Client Status Discovery Service (grpcio-csds) + +Here is a snippet to create an admin server on "localhost:50051": + + server = grpc.server(ThreadPoolExecutor()) + port = server.add_insecure_port('localhost:50051') + grpc_admin.add_admin_servicers(self._server) + server.start() + +Welcome to explore the admin services with CLI tool "grpcdebug": +https://github.com/grpc-ecosystem/grpcdebug. + +For any issues or suggestions, please send to +https://github.com/grpc/grpc/issues. +%endif + + +%if %{without bootstrap} +%package -n python3-grpcio-csds +Summary: xDS configuration dump library +License: ASL 2.0 +BuildArch: noarch + +%description -n python3-grpcio-csds +gRPC Python Client Status Discovery Service package +=================================================== + +CSDS is part of the Envoy xDS protocol: +https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/status/v3/csds.proto. +It allows the gRPC application to programmatically expose the received traffic +configuration (xDS resources). Welcome to explore with CLI tool "grpcdebug": +https://github.com/grpc-ecosystem/grpcdebug. + +For any issues or suggestions, please send to +https://github.com/grpc/grpc/issues. +%endif + + %package -n python3-grpcio-channelz Summary: Channel Level Live Debug Information Service for gRPC License: ASL 2.0 BuildArch: noarch %description -n python3-grpcio-channelz +gRPC Python Channelz package +============================ + Channelz is a live debug tool in gRPC Python. @@ -439,6 +523,9 @@ License: ASL 2.0 BuildArch: noarch %description -n python3-grpcio-health-checking +gRPC Python Health Checking +=========================== + Reference package for GRPC Python health checking. @@ -448,6 +535,9 @@ License: ASL 2.0 BuildArch: noarch %description -n python3-grpcio-reflection +gRPC Python Reflection package +============================== + Reference package for reflection in GRPC Python. @@ -457,6 +547,9 @@ License: ASL 2.0 BuildArch: noarch %description -n python3-grpcio-status +gRPC Python Status Proto +=========================== + Reference package for GRPC Python status proto mapping. @@ -466,12 +559,16 @@ License: ASL 2.0 BuildArch: noarch %description -n python3-grpcio-testing +gRPC Python Testing Package +=========================== + Testing utilities for gRPC Python. %prep %autosetup -p1 +echo '===== Preparing gtest/gmock =====' 2>&1 %if %{without system_gtest} # Copy in the needed gtest/gmock implementations. %setup -q -T -D -b 1 @@ -499,12 +596,14 @@ sed -r -i 's/^([[:blank:]]*)(\$\{_gRPC_GFLAGS_LIBRARIES\})/'\ '\1\2\n\1gtest\n\1gmock/' CMakeLists.txt %endif +echo '===== Removing bundled wyhash =====' 2>&1 # Remove bundled wyhash (via upb); to avoid patching the build system, simply # use a symlink to find the system copy. This is sufficient since it is a # header-only library. rm -rvf third_party/upb/third_party/wyhash ln -s %{_includedir}/wyhash_final1/ third_party/upb/third_party/wyhash +echo '===== Removing bundled xxhash =====' 2>&1 # Remove bundled xxhash rm -rvf third_party/xxhash # Since grpc sets XXH_INCLUDE_ALL wherever it uses xxhash, it is using xxhash @@ -513,14 +612,17 @@ rm -rvf third_party/xxhash # found instead, and there are no linker flags to add. See also # https://github.com/grpc/grpc/issues/25945. +echo '===== Fixing permissions =====' 2>&1 # Fix some of the weirdest accidentally-executable files find . -type f -name '*.md' -perm /0111 -execdir chmod -v a-x '{}' '+' +echo '===== Loosening version specifications =====' 2>&1 # Allow building Python documentation with a newer Sphinx; the upstream version # requirement is needlessly strict. (It is fine for upstream’s own purposes, as # they are happy to build documentation with a pinned old version.) sed -r -i "s/('Sphinx)~=.*'/\1'/" setup.py +echo '===== Removing selected unused sources =====' 2>&1 # Remove unused sources that have licenses not in the License field, to ensure # they are not accidentally used in the build. See the comment above the base # package License field for more details. @@ -549,6 +651,7 @@ rm -rvf examples/android src/android # to do that. find . -type f -name .gitignore -print -delete +echo '===== Fixing shebangs =====' 2>&1 # Find executables with /usr/bin/env shebangs in the examples, and fix them. find examples -type f -perm /0111 | while read -r fn @@ -560,12 +663,14 @@ find examples -type f -perm /0111 | fi done +echo '===== Fixing line endings =====' 2>&1 # Fix some CRNL line endings: dos2unix \ examples/cpp/helloworld/CMakeLists.txt \ examples/cpp/helloworld/cmake_externalproject/CMakeLists.txt # We leave those under examples/csharp alone. +echo '===== Fixing hard-coded C++ standard =====' 2>&1 # We need to adjust the C++ standard to avoid abseil-related linker errors. For # the main C++ build, we can use CMAKE_CXX_STANDARD. For extensions, examples, # etc., we must patch. @@ -576,23 +681,27 @@ sed -r -i 's/(std=c\+\+)11/\1%{cpp_std}/g' \ tools/run_tests/artifacts/artifact_targets.py \ tools/distrib/python/grpcio_tools/setup.py +echo '===== Fixing .pc install path =====' 2>&1 # Fix the install path for .pc files # https://github.com/grpc/grpc/issues/25635 sed -r -i 's|lib(/pkgconfig)|\${gRPC_INSTALL_LIBDIR}\1|' CMakeLists.txt +echo '===== Patching to skip certain broken tests =====' 2>&1 %if %{without unexplained_failing_python_lite_tests} +# Confirmed in 1.39.0 2021-07-29 # TODO figure out how to report this upstream in a useful/actionable way -sed -r -i "s/^([[:blank:]]*)(def \ -test_immediately_connectable_channel_connectivity)\\b/\ +sed -r -i "s/^([[:blank:]]*)(def test_deallocated_server_stops)\\b/\ \\1@unittest.skip('May hang unexplainedly')\\n\\1\\2/" \ - 'src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py' + 'src/python/grpcio_tests/tests/unit/_server_shutdown_test.py' %ifarch %{ix86} %{arm32} +# Confirmed in 1.39.0 2021-07-29 # TODO figure out how to report this upstream in a useful/actionable way sed -r -i "s/^([[:blank:]]*)(def test_concurrent_stream_stream)\\b/\ \\1@unittest.skip('May hang unexplainedly')\\n\\1\\2/" \ 'src/python/grpcio_tests/tests/testing/_client_test.py' +# Confirmed in 1.39.0 2021-07-29 # These tests fail with: # OverflowError: Python int too large to convert to C ssize_t # TODO figure out how to report this upstream in a useful/actionable way @@ -603,39 +712,13 @@ sed -r -i \ 'src/python/grpcio_tests/tests/unit/_session_cache_test.py' %endif -%ifarch s390x -# Unexplained segmentation fault -# TODO figure out how to report this upstream in a useful/actionable way -sed -r -i "s/^([[:blank:]]*)(def test_start_xds_server)\\b/\ -\\1@unittest.skip('Unexplained segmentation fault')\\n\\1\\2/" \ - 'src/python/grpcio_tests/tests/unit/_xds_credentials_test.py' -%endif - -%if 0%{?fedora} > 34 || 0%{?rhel} > 8 -# Python 3.10 failures: - -# AssertionError: 'StatusCode.NOT_FOUND' not found in '<_InactiveRpcError of -# RPC that terminated with:\n\tstatus = NOT_FOUND\n\tdetails = "Failed to get -# the channel, please ensure your channel_id==10000 is -# valid"\n\tdebug_error_string = -# "{"created":"@1619130545.513500675","description":"Error received from peer -# ipv6:[::1]:35867","file":"src/core/lib/surface/call.cc","file_line":1067,"grpc_message":"Failed -# to get the channel, please ensure your channel_id==10000 is -# valid","grpc_status":5}"\n>' -# -# AttributeError: 'NoneType' object has no attribute 'IsInitialized' -sed -r -i "s/^([[:blank:]]*)(def test_invalid_query_get_\ -(channel|server(_sockets)?|socket|subchannel))\\b/\ -\\1@unittest.skip('Unexplained failure')\\n\\1\\2/" \ - 'src/python/grpcio_tests/tests/channelz/_channelz_servicer_test.py' -%endif - %endif %build # ~~~~ C (core) and C++ (cpp) ~~~~ +echo '===== Building C (core) and C++ components =====' 2>&1 # We could use either make or ninja as the backend; ninja is faster and has no # disadvantages (except a small additional BR, given we already need Python) # @@ -672,8 +755,13 @@ sed -r -i "s/^([[:blank:]]*)(def test_invalid_query_get_\ -GNinja %cmake_build +echo '===== Building C (core) and C++ documentation =====' 2>&1 +# Doxygen (reference: C/core, C++, objc) +./tools/doxygen/run_doxygen.sh + # ~~~~ Python ~~~~ +echo '===== Building Python grpcio package =====' 2>&1 # Since we will need all of the Python packages for the documentation build, # and there are some other interdependencies (e.g., many have setup_requires: # grpcio-tools), we do a temporary install of the built packages into a local @@ -711,6 +799,7 @@ export GRPC_PYTHON_LDFLAGS="$(pkg-config --libs protobuf)" -O1 --skip-build --root "${PYROOT}" # ~~ grpcio-tools ~~ +echo '===== Building Python grpcio_tools package =====' 2>&1 pushd "tools/distrib/python/grpcio_tools/" >/dev/null # When copying more things in here, make sure the subpackage License field # stays correct. We need copies, not symlinks, so that the “graft” in @@ -734,13 +823,17 @@ find . -type f -name protoc.py -execdir sed -r -i '1{/^#!/d}' '{}' '+' -O1 --skip-build --root "${PYROOT}" popd >/dev/null -# ~~ pure-python modules grpcio-* ~~ -for suffix in channelz health_checking reflection status testing tests +echo '===== Building pure-Python packages =====' 1>&2 +for suffix in channelz %{?!with_bootstrap:csds admin} health_checking \ + reflection status testing tests do echo "----> grpcio_${suffix} <----" 1>&2 pushd "src/python/grpcio_${suffix}/" >/dev/null - %{__python3} %{py_setup} %{?py_setup_args} preprocess - if [ "${suffix}" != 'testing' ] + if ! echo "${suffix}" | grep -E "^(admin|csds)$" >/dev/null + then + %{__python3} %{py_setup} %{?py_setup_args} preprocess + fi + if ! echo "${suffix}" | grep -E "^(admin|csds|testing)$" >/dev/null then %{__python3} %{py_setup} %{?py_setup_args} build_package_protos fi @@ -750,12 +843,12 @@ do popd >/dev/null done -# ~~ documentation ~~ -# Doxygen (reference: C/core, C++, objc) -./tools/doxygen/run_doxygen.sh +echo '===== Building pure-Python documentation =====' 1>&2 +%if %{without bootstrap} # Sphinx (Python) %{__python3} %{py_setup} %{?py_setup_args} doc rm -vrf doc/build/.buildinfo doc/build/.doctrees +%endif %install @@ -808,7 +901,8 @@ pushd "tools/distrib/python/grpcio_tools/" >/dev/null popd >/dev/null # ~~ pure-python modules grpcio-* ~~ -for suffix in channelz health_checking reflection status testing +for suffix in channelz %{?!with_bootstrap:csds admin} health_checking \ + reflection status testing do pushd "src/python/grpcio_${suffix}/" >/dev/null %py3_install @@ -842,8 +936,10 @@ rm -rvf "%{buildroot}$(dirname '%{sysbundle}')" install -D -t '%{buildroot}%{_pkgdocdir}' -m 0644 -p AUTHORS *.md cp -rp doc/ref examples '%{buildroot}%{_pkgdocdir}' +%if %{without bootstrap} install -d '%{buildroot}%{_pkgdocdir}/python' cp -rp doc/build '%{buildroot}%{_pkgdocdir}/python/html' +%endif %check @@ -878,11 +974,24 @@ flaky_network # Bad assumption about which directory the tests are running in: # -# E0413 22:43:56.610039235 19861 subprocess_posix.cc:61] -# execv 'x86_64-redhat-linux-gnu/../../test/core/http/python_wrapper.sh' +# E0802 01:16:33.084040928 3911182 subprocess_posix.cc:61] +# execv 'redhat-linux-build/../../test/core/http/python_wrapper.sh' # failed: No such file or directory -# E0413 22:44:02.613251909 19856 httpscli_test.cc:55] +# E0802 01:16:39.086691950 3911178 httpcli_test.cc:52] # assertion failed: response->status == 200 +# *** SIGABRT received at time=16278 66999 on cpu 1 *** + +# While we have fixed a couple of problems with these tests, including porting +# the test server to Python 3, success still eludes us. +# +# 127.0.0.1 - - [02/Aug/2021 20:34:47] "GET /get HTTP/1.0" 200 - +# E0802 20:34:48.343858742 1765052 httpcli_test.cc:52] +# assertion failed: response->status == 200 +# *** SIGABRT received at time=1627936488 on cpu 2 *** +# PC: @ 0x7fe44b4f2783 (unknown) pthread_kill@@GLIBC_2.34 +# @ ... and at least 1 more frames +# +# Confirmed in 1.39.0 2021-08-02 httpcli httpscli @@ -907,6 +1016,8 @@ httpscli # This server is not currently running. # # To start it, run tools/run_tests/start_port_server.py +# +# CHECKME admin_services_end2end alts_concurrent_connectivity async_end2end @@ -943,6 +1054,8 @@ xds_end2end # *** SIGSEGV received at time=1618368497 *** # PC: @ 0x7fc56bfc1d3a (unknown) __strlen_sse2 # @ ... and at least 1 more frames +# +# CHECKME evaluate_args # Unexplained: # @@ -951,6 +1064,8 @@ evaluate_args # Value of: stack_trace->find("GetCurrentStackTrace") != std::string::npos # Actual: false # Expected: true +# +# CHECKME examine_stack # Unexplained: # @@ -960,6 +1075,8 @@ examine_stack # Actual: false # Expected: true # [ FAILED ] StackTracerTest.Basic (3 ms) +# +# CHECKME stack_tracer # Unexplained: # @@ -968,6 +1085,8 @@ stack_tracer # [{"access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_", "expires_in":3599, # "token_type":"Bearer"}]. # *** SIGSEGV received at time=1618368426 *** +# +# CHECKME test_core_security_credentials %ifarch s390x @@ -985,6 +1104,8 @@ test_core_security_credentials # Which is: "::" # "::1" # [ FAILED ] AddressSortingTest.TestSorterKnowsIpv6LoopbackIsAvailable (0 ms) +# +# CHECKME address_sorting # Unexplained: @@ -1004,16 +1125,22 @@ address_sorting # @ 0x2aa3ed8155e (unknown) main # @ 0x3ff8372bdf4 (unknown) __libc_start_main # @ 0x2aa3ed82724 (unknown) (unknown) +# +# CHECKME alts_crypt # Unexplained: # # (aborted without output) +# +# CHECKME alts_crypter # Unexplained: # # (aborted without output) +# +# CHECKME alts_frame_protector # Unexplained: @@ -1035,6 +1162,8 @@ alts_frame_protector # @ 0x2aa11481b08 (unknown) main # @ 0x3ff939abdf4 (unknown) __libc_start_main # @ 0x2aa11481bc4 (unknown) (unknown) +# +# CHECKME alts_grpc_record_protocol # Unexplained: @@ -1067,11 +1196,15 @@ alts_grpc_record_protocol # @ 0x2aa3760281e (unknown) main # @ 0x3ff98aabdf4 (unknown) __libc_start_main # @ 0x2aa376028b4 (unknown) (unknown) +# +# CHECKME alts_handshaker_client # Unexplained: # # (aborted without output) +# +# CHECKME alts_iovec_record_protocol # Unexplained: @@ -1105,6 +1238,8 @@ alts_iovec_record_protocol # fails to parse ALTS context. # E0506 13:27:12.407261763 2895549 alts_util.cc:43] # contains zero or more than one ALTS context. +# +# CHECKME alts_util # Unexplained: @@ -1128,6 +1263,8 @@ alts_util # @ 0x2aa112019d6 (unknown) main # @ 0x3ffae52bdf4 (unknown) __libc_start_main # @ 0x2aa11201a84 (unknown) (unknown) +# +# CHECKME alts_zero_copy_grpc_protector # Unexplained: @@ -1148,6 +1285,8 @@ alts_zero_copy_grpc_protector # @ 0x2aa1e9833ce (unknown) main # @ 0x3ffa05abdf4 (unknown) __libc_start_main # @ 0x2aa1e983ac4 (unknown) (unknown) +# +# CHECKME goaway_server # Unexplained: @@ -1163,6 +1302,8 @@ goaway_server # @ 0x2aa27600a24 (unknown) main # @ 0x3ffa332bdf4 (unknown) __libc_start_main # @ 0x2aa27600aa4 (unknown) (unknown) +# +# CHECKME murmur_hash # Unexplained: @@ -1186,9 +1327,38 @@ murmur_hash # @ 0x40000028c8 (unknown) main # @ 0x4001f3edf4 (unknown) __libc_start_main # @ 0x40000029f4 (unknown) (unknown) +# +# CHECKME tcp_posix %endif +%ifarch x86_64 %{ix86} %{arm64} +# Unexplained hang. +# +# This may be flaky and sometimes succeed; this is known to be the case on +# x86_64. +# +# mutex: 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 done 1.372237159 s +# mutex try: 256 512 1024 2048 4096 8192 16384 32768 65536 131072 done 1.285748396 s +# cv: 256 512 1024 2048 done 1.134636147 s +# timedcv: 256 512 1024 done 1.925035489 s +# queue: 256timeout: sending signal TERM to command 'redhat-linux-build/sync_test' +# *** SIGTERM received at time=1627413101 on cpu 0 *** +# PC: @ 0xffff8299f8a8 (unknown) syscall +# @ 0xffff82896850 1732032480 (unknown) +# @ 0xffff82d7b7bc 112 (unknown) +# @ 0xffff8237ac44 48 AbslInternalPerThreadSemWait_lts_20210324 +# @ 0xffff8237e5c8 144 absl::lts_20210324::CondVar::WaitCommon() +# @ 0xffff82ce82c4 64 gpr_cv_wait +# @ 0xaaaae0ae2118 288 test() +# @ 0xaaaae0ae1560 64 main +# @ 0xffff828e10c4 272 __libc_start_call_main +# @ 0xffff828e1198 (unknown) __libc_start_main@GLIBC_2.17 +# +# Confirmed in 1.39.0 2021-08-01 +sync +%endif + %ifarch %{ix86} # Unexplained: # @@ -1200,6 +1370,8 @@ tcp_posix # expected # Which is: 4 # [ FAILED ] ChannelTracerTest.TestMultipleEviction (2 ms) +# +# CHECKME channel_trace %endif @@ -1211,6 +1383,8 @@ channel_trace # *** SIGABRT received at time=1619103150 *** # PC: @ 0xf7fa3559 (unknown) __kernel_vsyscall # @ ... and at least 1 more frames +# +# CHECKME certificate_provider_store # Unexplained: @@ -1222,6 +1396,8 @@ certificate_provider_store # @ 0xb67e817c (unknown) (unknown) # @ 0xb682d6b0 (unknown) (unknown) # @ 0xb682c114 (unknown) raise +# +# CHECKME grpc_tls_certificate_distributor # Unexplained: @@ -1231,6 +1407,8 @@ grpc_tls_certificate_distributor # Expected: (busy) <= (total), actual: 9025859384538762329 vs # 3751280126112716351 # [ FAILED ] GetCpuStatsTest.BusyNoLargerThanTotal (0 ms) +# +# CHECKME lb_get_cpu_stats %endif @@ -1259,13 +1437,16 @@ for suite in \ %{?with_python_gevent_tests:test_gevent} \ test_py3_only do + echo "==== $(date -u --iso-8601=ns): Python ${suite} ====" # See the implementation of the %%pytest macro, upon which our environment - # setup is based: + # setup is based. We add a timeout that is rather long, as it must apply to + # the entire test suite. (Patching in a per-test timeout would be harder.) env CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" \ LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}" \ PATH="%{buildroot}%{_bindir}:$PATH" \ PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}}" \ PYTHONDONTWRITEBYTECODE=1 \ + timeout -k 31m -v 30m \ %{__python3} %{py_setup} %{?py_setup_args} "${suite}" done popd @@ -1368,11 +1549,25 @@ fi %{python3_sitearch}/grpcio_tools-%{version}-py%{python3_version}.egg-info +%if %{without bootstrap} +%files -n python3-grpcio-admin +%{python3_sitelib}/grpc_admin +%{python3_sitelib}/grpcio_admin-%{version}-py%{python3_version}.egg-info +%endif + + %files -n python3-grpcio-channelz %{python3_sitelib}/grpc_channelz %{python3_sitelib}/grpcio_channelz-%{version}-py%{python3_version}.egg-info +%if %{without bootstrap} +%files -n python3-grpcio-csds +%{python3_sitelib}/grpc_csds +%{python3_sitelib}/grpcio_csds-%{version}-py%{python3_version}.egg-info +%endif + + %files -n python3-grpcio-health-checking %{python3_sitelib}/grpc_health %{python3_sitelib}/grpcio_health_checking-%{version}-py%{python3_version}.egg-info diff --git a/sources b/sources index 92a9e0f..271eb61 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (grpc-1.37.1.tar.gz) = fe02447f558116e9ed2de48142b9bd3b8908d496aea7816406eee2c6ad136714ee14c2104a82a32f56ab486c5050b4665c55bacb24c91ceabcf1b998a5fc86b7 +SHA512 (grpc-1.39.0.tar.gz) = bf1095d03eb1eb8a803730702edd43a4d4a448f3f1370aff8688f8ea8fc3a8f29bb8399e6356a9a347c775129960632e0e3b883a3b82f4af41022786ff40df00 SHA512 (googletest-release-1.11.0.tar.gz) = 6fcc7827e4c4d95e3ae643dd65e6c4fc0e3d04e1778b84f6e06e390410fe3d18026c131d828d949d2f20dde6327d30ecee24dcd3ef919e21c91e010d149f3a28