Merge "Add integ/python for Trixie"

This commit is contained in:
Zuul
2025-12-01 19:46:16 +00:00
committed by Gerrit Code Review
48 changed files with 4885 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
---
debname: dh-python
debver: 4.20201102+nmu1
dl_path:
name: dh-python-4.20201102+nmu1.tar.gz
url: https://salsa.debian.org/python-team/tools/dh-python/-/archive/4.20201102+nmu1/dh-python-4.20201102+nmu1.tar.gz
md5sum: e8ffceb6618446cd57916d3063a326e3
sha256sum: 878f1c0cd8f4ca368b90a86b378889d805cadc3ecd63db0fddbd9230f8722af8
revision:
dist: $STX_DIST
PKG_GITREVCOUNT: true

View File

@@ -0,0 +1,31 @@
From a199540ebeb3be34ce8602f5977cdaf867c578d9 Mon Sep 17 00:00:00 2001
From: Dan Voiculeasa <dan.voiculeasa@windriver.com>
Date: Thu, 23 Dec 2021 15:00:17 +0200
Subject: [PATCH] Keep SOURCES.txt
Sysinv logic is based on the fact that the source files are listed
in SOURCES.txt.
Partial-Bug: https://bugs.launchpad.net/starlingx/+bug/1955648
Signed-off-by: Dan Voiculeasa <dan.voiculeasa@windriver.com>
---
dhpython/fs.py | 3 ---
1 file changed, 3 deletions(-)
diff --git a/dhpython/fs.py b/dhpython/fs.py
index 08fd8a9..6d411e2 100644
--- a/dhpython/fs.py
+++ b/dhpython/fs.py
@@ -400,9 +400,6 @@ class Scan:
self.result['requires.txt'].add(join(dpath, 'requires.txt'))
if 'namespace_packages.txt' in file_names:
self.result['nsp.txt'].add(join(dpath, 'namespace_packages.txt'))
- if 'SOURCES.txt' in file_names:
- os.remove(join(dpath, 'SOURCES.txt'))
- file_names.remove('SOURCES.txt')
def is_egg_file(self, fpath):
"""Check if given file contains egg-info."""
--
2.30.0

View File

@@ -0,0 +1 @@
0001-Keep-SOURCES.txt.patch

View File

@@ -0,0 +1,11 @@
pynetlink (1.0.1-0) unstable; urgency=medium
* Handling unknown enumerator value in Netlink DPLL.
-- Reynaldo P Gomes <reynaldo.patronegomes@windriver.com> Thu, 24 Jul 2025 15:40:00 -0300
pynetlink (1.0.0-0) unstable; urgency=medium
* New upstream release.
-- Reynaldo P Gomes <reynaldo.patronegomes@windriver.com> Thu, 16 Jan 2025 10:00:00 -0300

View File

@@ -0,0 +1,33 @@
Source: pynetlink
Section: python
Priority: optional
Maintainer: Starlingx Developers <StarlingX-discuss@lists.StarlingX.io>
Build-Depends: debhelper-compat (= 13),
dh-python,
python3-dev,
python3-jsonschema,
python3-setuptools,
python3-yaml,
python3-wheel
Standards-Version: 4.5.1
Homepage: https://www.starlingx.io
Rules-Requires-Root: no
Package: pynetlink
Architecture: any
Depends: ${python3:Depends},
python3-jsonschema,
python3-yaml
Description: Python Netlink library for StarlingX
This package provides the Python library to interact with the Linux Kernel
using the Netlink protocol.
Package: pynetlink-wheel
Architecture: any
Depends: ${python3:Depends},
python3-jsonschema,
python3-yaml,
python3-wheel
Description: Python Netlink library for StarlingX - wheel
This package provides the Python library to interact with the Linux Kernel
using the Netlink protocol.

View File

@@ -0,0 +1,42 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: pynetlink
Source: https://opendev.org/starlingx/integ/python/netlink-python
Files: *
Copyright: 2025 Wind River Systems, Inc
Others (See individual files for more details)
License: Apache-2
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
.
https://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
.
On Debian-based systems the full text of the Apache version 2.0 license
can be found in `/usr/share/common-licenses/Apache-2.0'.
# If you want to use GPL v2 or later for the /debian/* files use
# the following clauses, or change it to suit. Delete these two lines
Files: debian/*
Copyright: 2025 Wind River Systems, Inc
License: Apache-2
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
.
https://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
.
On Debian-based systems the full text of the Apache version 2.0 license
can be found in `/usr/share/common-licenses/Apache-2.0'.

View File

@@ -0,0 +1 @@
usr/lib/python*/dist-packages/*

View File

@@ -0,0 +1,23 @@
#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# Uncomment to force running of the unit tests
#export DEB_BUILD_OPTIONS=""
# Disable python byte compiling
export PYTHONDONTWRITEBYTECODE=1
%:
dh $@ --with python3 --buildsystem=pybuild
override_dh_install:
python3 setup.py bdist_wheel -d debian/pynetlink-wheel/usr/share/python-wheels
dh_install
override_dh_auto_test:
dh_auto_test -- --system=custom --test-args="{interpreter} -m pynetlink.tests.run"
override_dh_python3:
dh_python3 --shebang=/usr/bin/python3

View File

@@ -0,0 +1 @@
3.0 (quilt)

View File

@@ -0,0 +1,7 @@
---
debname: pynetlink
debver: 1.0.1
src_path: src
revision:
dist: $STX_DIST
PKG_GITREVCOUNT: true

View File

@@ -0,0 +1,73 @@
From 8c2e602225f0a96f2c5c65de8ab06e304081e542 Mon Sep 17 00:00:00 2001
From: Donald Hunter <donald.hunter@gmail.com>
Date: Fri, 11 Jul 2025 18:04:56 +0100
Subject: [PATCH] tools: ynl: process unknown for enum values
Extend the process_unknown handing to enum values and flags.
Tested by removing entries from rt-link.yaml and rt-neigh.yaml:
./tools/net/ynl/pyynl/cli.py --family rt-link --dump getlink \
--process-unknown --output-json | jq '.[0] | ."ifi-flags"'
[
"up",
"Unknown(6)",
"loopback",
"Unknown(16)"
]
./tools/net/ynl/pyynl/cli.py --family rt-neigh --dump getneigh \
--process-unknown --output-json | jq '.[] | ."ndm-type"'
"unicast"
"Unknown(5)"
"Unknown(5)"
"unicast"
"Unknown(5)"
"unicast"
"broadcast"
Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
Reviewed-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
pynetlink/base/ynl.py | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/pynetlink/base/ynl.py b/pynetlink/base/ynl.py
index 7529bce174ff..006b359294a4 100644
--- a/pynetlink/base/ynl.py
+++ b/pynetlink/base/ynl.py
@@ -618,6 +618,16 @@ class YnlFamily(SpecFamily):
pad = b'\x00' * ((4 - len(attr_payload) % 4) % 4)
return struct.pack('HH', len(attr_payload) + 4, nl_type) + attr_payload + pad
+ def _get_enum_or_unknown(self, enum, raw):
+ try:
+ name = enum.entries_by_val[raw].name
+ except KeyError as error:
+ if self.process_unknown:
+ name = f"Unknown({raw})"
+ else:
+ raise error
+ return name
+
def _decode_enum(self, raw, attr_spec):
enum = self.consts[attr_spec['enum']]
if enum.type == 'flags' or attr_spec.get('enum-as-flags', False):
@@ -625,11 +635,11 @@ class YnlFamily(SpecFamily):
value = set()
while raw:
if raw & 1:
- value.add(enum.entries_by_val[i].name)
+ value.add(self._get_enum_or_unknown(enum, i))
raw >>= 1
i += 1
else:
- value = enum.entries_by_val[raw].name
+ value = self._get_enum_or_unknown(enum, raw)
return value
def _decode_binary(self, attr, attr_spec):
--
2.34.1

View File

@@ -0,0 +1 @@
0001-tools-ynl-process-unknown-for-enum-values.patch

View File

@@ -0,0 +1,25 @@
From 364a0606c58f100bbec4447fb34e03fcba2821e3 Mon Sep 17 00:00:00 2001
From: Davlet Panech <davlet.panech@windriver.com>
Date: Tue, 29 Mar 2022 15:26:11 -0400
Subject: [PATCH 1/2] Don't delete module metadata in deb package
Pip requires module metadata to be present for installed modules,
otherwise it can't "see" it.
Signed-off-by: Davlet Panech <davlet.panech@windriver.com>
---
debian/rules | 1 -
1 file changed, 1 deletion(-)
diff --git a/debian/rules b/debian/rules
index 7955ffd..ef6314b 100755
--- a/debian/rules
+++ b/debian/rules
@@ -13,4 +13,3 @@ override_dh_auto_clean:
override_dh_auto_install:
dh_auto_install
- rm -rf debian/python*-nss/usr/lib/python*/dist-packages/python_nss-*.egg-info
--
2.30.2

View File

@@ -0,0 +1,57 @@
From 58830c2a305e6d1b931b46700e9af04647c85198 Mon Sep 17 00:00:00 2001
From: Davlet Panech <davlet.panech@windriver.com>
Date: Wed, 6 Apr 2022 01:01:17 +0000
Subject: [PATCH 2/2] Build the python2 variant
Signed-off-by: Davlet Panech <davlet.panech@windriver.com>
---
debian/control | 15 +++++++++++++++
debian/rules | 2 +-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/debian/control b/debian/control
index c42e324..fb407b1 100644
--- a/debian/control
+++ b/debian/control
@@ -5,6 +5,7 @@ Maintainer: Debian FreeIPA Team <pkg-freeipa-devel@lists.alioth.debian.org>
Uploaders: Timo Aaltonen <tjaalton@debian.org>
Build-Depends: debhelper-compat (= 12),
dh-python,
+ python-all-dev,
python3-all-dev,
libnss3-dev,
Standards-Version: 4.5.1
@@ -25,3 +26,17 @@ Description: Python3 bindings for Network Security Services (NSS)
and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509 v3
certificates, and other security standards. Specific NSS
implementations have been FIPS-140 certified.
+
+Package: python-nss
+Architecture: any
+Provides: ${python:Provides}, ${python-nss:Provides}
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}
+Description: Python2 bindings for Network Security Services (NSS)
+ This package provides Python2 bindings for Network Security Services (NSS)
+ and the Netscape Portable Runtime (NSPR).
+ .
+ NSS is a set of libraries supporting security-enabled client and
+ server applications. Applications built with NSS can support SSL v2
+ and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509 v3
+ certificates, and other security standards. Specific NSS
+ implementations have been FIPS-140 certified.
diff --git a/debian/rules b/debian/rules
index ef6314b..fa4eb42 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,7 +7,7 @@
export PYBUILD_NAME=nss
%:
- dh $@ --with python3 --buildsystem=pybuild
+ dh $@ --with python2,python3 --buildsystem=pybuild
override_dh_auto_clean:
--
2.30.2

View File

@@ -0,0 +1,2 @@
0001-Don-t-delete-module-metadata-in-deb-package.patch
0002-Build-the-python2-variant.patch

View File

@@ -0,0 +1,11 @@
---
debver: 1.0.1-1
debname: python-nss
dl_path:
name: python-nss-debian-1.0.1-1.tar.gz
url: https://salsa.debian.org/freeipa-team/python-nss/-/archive/debian/1.0.1-1/python-nss-debian-1.0.1-1.tar.gz
md5sum: 2f61d8b9b23ab0649e61e066518c91dd
sha256sum: b95d3f57f51e51412ff8abd3cd0bb7c8fa70bdafe6ff4c61eaad26b065d3c5ae
revision:
dist: $STX_DIST
PKG_GITREVCOUNT: true

View File

@@ -0,0 +1,5 @@
nsenter (0.2) unstable; urgency=medium
* Initial release.
-- Adriano Oliveira <adriano.oliveira@windriver.com> Wed, 24 Aug 2023 10:14:40 -0300

View File

@@ -0,0 +1,16 @@
Source: nsenter
Section: admin
Priority: optional
Maintainer: StarlingX Developers <starlingx-discuss@lists.starlingx.io>
Build-Depends: debhelper-compat (= 12),
dh-python,
flake8,
python3-setuptools,
python3-all
Standards-Version: 4.4.1
Package: python3-nsenter
Architecture: all
Depends: ${python3:Depends}, ${misc:Depends}
Description: Enables entering the Linux kernel namespaces
A python client library for Linux kernel namespaces

View File

@@ -0,0 +1,42 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: python-fmclient
Source: https://opendev.org/starlingx/fault
Files: *
Copyright: (c) 2022 Wind River Systems, Inc
Copyright: Others (See individual files for more details)
License: Apache-2
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
.
https://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
.
On Debian-based systems the full text of the Apache version 2.0 license
can be found in `/usr/share/common-licenses/Apache-2.0'.
# If you want to use GPL v2 or later for the /debian/* files use
# the following clauses, or change it to suit. Delete these two lines
Files: debian/*
Copyright: 2022 Wind River Systems, Inc
License: Apache-2
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
.
https://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
.
On Debian-based systems the full text of the Apache version 2.0 license
can be found in `/usr/share/common-licenses/Apache-2.0'.

View File

@@ -0,0 +1,10 @@
#!/usr/bin/make -f
#export DH_VERBOSE = 1
export PYBUILD_NAME=python3-nsenter
%:
dh $@ --with python3 --buildsystem=pybuild
override_dh_auto_test:
# nothing done

View File

@@ -0,0 +1,11 @@
---
debname: nsenter
debver: 0.2
dl_path:
name: nsenter-0.2.tar.gz
url: https://files.pythonhosted.org/packages/a5/46/1bfe9cca7f2e12cb2d7d9082b14feb785bc63628fb795a34d53ef57a8b93/nsenter-0.2.tar.gz
md5sum: a9e19cde39c93d91716f0be7dd0e14c5
sha256sum: 876a18cb03de85948e4cd72fd4cfda4879561b7264f5722603f6437d452a25cb
revision:
dist: $STX_DIST
PKG_GITREVCOUNT: true

View File

@@ -0,0 +1,23 @@
From 6ea9709c2477a41ff310255c5da42c4766b3fc22 Mon Sep 17 00:00:00 2001
From: Adriano Oliveira <adriano.oliveira@windriver.com>
Date: Tue, 13 Sep 2022 07:42:52 -0700
Subject: [PATCH] Empty requirements.txt
In python 3 pathlib, contextlib and argparse are included
Signed-off-by: Adriano Oliveira <adriano.oliveira@windriver.com>
---
requirements.txt | 3 ---
1 file changed, 3 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index 60e8060..e69de29 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +0,0 @@
-pathlib
-contextlib2
-argparse
--
2.17.1

View File

@@ -0,0 +1,33 @@
From 17cd3519838741e2bcb5285a8f6f1acbc8c78048 Mon Sep 17 00:00:00 2001
From: Adriano Oliveira <adriano.oliveira@windriver.com>
Date: Thu, 15 Sep 2022 13:59:58 -0700
Subject: [PATCH] Remove nsenter entry point
The original nsenter entry point conflicts with /usr/bin/nsenter
binary.
Signed-off-by: Adriano Oliveira <adriano.oliveira@windriver.com>
---
setup.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/setup.py b/setup.py
index 69ca693..b88117e 100644
--- a/setup.py
+++ b/setup.py
@@ -39,10 +39,10 @@ def setup_package():
'Operating System :: POSIX :: Linux',
'License :: OSI Approved :: Apache Software License'],
test_suite='tests',
- setup_requires=['flake8'],
install_requires=get_install_requirements('requirements.txt'),
packages=setuptools.find_packages(exclude=['tests', 'tests.*']),
- entry_points={'console_scripts': ['nsenter = nsenter:main']}
+ entry_points={
+ }
)
if __name__ == '__main__':
--
2.17.1

View File

@@ -0,0 +1,2 @@
0001-Empty-requirements.txt.patch
0002-Remove-nsenter-entry-point.patch

View File

@@ -0,0 +1,7 @@
---
debname: setuptools
debver: 52.0.0-4+deb11u2
archive: https://snapshot.debian.org/archive/debian-security/20250527T121436Z/pool/updates/main/s/setuptools/
revision:
dist: $STX_DIST
PKG_GITREVCOUNT: true

View File

@@ -0,0 +1,31 @@
From 70f8bcd677d9973193bba33b4ec45e3d09b57aab Mon Sep 17 00:00:00 2001
From: Dan Voiculeasa <dan.voiculeasa@windriver.com>
Date: Mon, 20 Dec 2021 14:24:46 +0200
Subject: [PATCH] Revert no-SOURCES.txt-in-egg-ingo.diff
Typo in upstream patchname aside, revert the upstream patch that
removes SOURCES.txt from egg.
Partial-Bug: https://bugs.launchpad.net/starlingx/+bug/1955648
Signed-off-by: Dan Voiculeasa <dan.voiculeasa@windriver.com>
---
setuptools/command/install_egg_info.py | 3 ---
1 file changed, 3 deletions(-)
diff --git a/setuptools/command/install_egg_info.py b/setuptools/command/install_egg_info.py
index 5f405bc..76fb20e 100644
--- a/setuptools/command/install_egg_info.py
+++ b/setuptools/command/install_egg_info.py
@@ -72,9 +72,6 @@ class install_egg_info(namespaces.Installer, Command):
for skip in '.svn/', 'CVS/':
if src.startswith(skip) or '/' + skip in src:
return None
- if self.install_layout and self.install_layout in ['deb'] and src.startswith('SOURCES.txt'):
- log.info("Skipping SOURCES.txt")
- return None
self.outputs.append(dst)
log.debug("Copying %s to %s", src, dst)
return dst
--
2.30.0

View File

@@ -0,0 +1 @@
0001-Revert-no-SOURCES.txt-in-egg-ingo.diff.patch

View File

@@ -0,0 +1,7 @@
---
debname: pyzmq
debver: 20.0.0-1
archive: https://snapshot.debian.org/archive/debian/20240410T144822Z/pool/main/p/pyzmq/
revision:
dist: $STX_DIST
PKG_GITREVCOUNT: true

View File

@@ -0,0 +1,53 @@
From b24e217033d40fd675f1a386e566665b8439266e Mon Sep 17 00:00:00 2001
From: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
Date: Wed, 10 Apr 2024 15:06:46 -0300
Subject: [PATCH] Use green zmq.Context from eventlet if it has been
monkey-patched
Make GarbageCollector aware of eventlet and verify it the Thread module
has been monkey-patched by eventlet. If that is the case, use zmq
.Context() from eventlet.green module.
Signed-off-by: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
---
docs/requirements.txt | 1 +
zmq/utils/garbage.py | 6 +++++-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/docs/requirements.txt b/docs/requirements.txt
index dfc9278..e30cd02 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,4 +1,5 @@
cython>=0.29
+eventlet
gevent
pygments==2.4.2
sphinx>=3.0.4
diff --git a/zmq/utils/garbage.py b/zmq/utils/garbage.py
index d96bbd9..bb6b1ce 100644
--- a/zmq/utils/garbage.py
+++ b/zmq/utils/garbage.py
@@ -11,7 +11,7 @@ import struct
from os import getpid
from collections import namedtuple
-from threading import Thread, Event, Lock
+from threading import Thread, Event, Lock, current_thread
import warnings
import zmq
@@ -95,6 +95,10 @@ class GarbageCollector(object):
# gevent has monkey-patched Thread, use green Context
from zmq import green
self._context = green.Context()
+ elif current_thread.__module__.startswith('eventlet'):
+ # eventlet has monkey-patched Thread, use green Context
+ from eventlet.green import zmq
+ self._context = zmq.Context()
else:
self._context = zmq.Context()
return self._context
--
2.34.1

View File

@@ -0,0 +1 @@
0001-Use-green-zmq.Context-from-eventlet-if-it-has-been-m.patch

View File

@@ -0,0 +1,5 @@
zerorpc-python (0.6.3-99ee6e47c8baf909b97eec94f184a19405f392a2) unstable; urgency=medium
* Initial release.
-- Alyson Deives Pereira <alyson.deivespereira@windriver.com> Wed, 31 Aug 2022 08:41:30 -0300

View File

@@ -0,0 +1,30 @@
Source: zerorpc-python
Section: libs
Priority: optional
Maintainer: StarlingX Developers <starlingx-discuss@lists.starlingx.io>
Build-Depends: debhelper-compat (= 13),
dh-python,
python3-all,
python3-setuptools,
python3-wheel,
Standards-Version: 4.5.1
Package: zerorpc-python
Section: libs
Architecture: all
Depends: ${python3:Depends}, ${misc:Depends},
libzmq5,
python3-eventlet,
python3-future,
python3-greenlet,
python3-msgpack,
python3-zmq
Description: Zerorpc is a flexible RPC implementation based on zeromq and messagepack.
Package: zerorpc-python-wheel
Architecture: all
Depends: ${python3:Depends}, ${misc:Depends}, python3-wheel
Description: Zerorpc is a flexible RPC implementation based on zeromq and messagepack.
.
This is the support package for the PEP 427 wheel version of the package,
required for using pip inside a virtual environment.

View File

@@ -0,0 +1,26 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: zerorpc-python
Source: http://github.com/0rpc/zerorpc-python
Files: *
Copyright: 2015 François-Xavier Bourlet (bombela+zerorpc@gmail.com)
License: MIT
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,119 @@
From 075568dc87d987e249afdef0324a1dace4e8a81f Mon Sep 17 00:00:00 2001
From: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
Date: Thu, 28 Jul 2022 09:49:48 -0300
Subject: [PATCH] Add option for custom msgpack encoder/decoder
Signed-off-by: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
---
zerorpc/core.py | 8 ++++----
zerorpc/events.py | 20 +++++++++++---------
zerorpc/socket.py | 4 ++--
3 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/zerorpc/core.py b/zerorpc/core.py
index ea89f36..90b1aae 100644
--- a/zerorpc/core.py
+++ b/zerorpc/core.py
@@ -278,8 +278,8 @@ class ClientBase(object):
class Server(SocketBase, ServerBase):
def __init__(self, methods=None, name=None, context=None, pool_size=1000,
- heartbeat=5):
- SocketBase.__init__(self, zmq.ROUTER, context)
+ heartbeat=5, encoder=None, decoder=None):
+ SocketBase.__init__(self, zmq.ROUTER, context, encoder, decoder)
if methods is None:
methods = self
@@ -296,8 +296,8 @@ class Server(SocketBase, ServerBase):
class Client(SocketBase, ClientBase):
def __init__(self, connect_to=None, context=None, timeout=30, heartbeat=5,
- passive_heartbeat=False):
- SocketBase.__init__(self, zmq.DEALER, context=context)
+ passive_heartbeat=False, encoder=None, decoder=None):
+ SocketBase.__init__(self, zmq.DEALER, context=context, encoder=encoder, decoder=decoder)
ClientBase.__init__(self, self._events, context, timeout, heartbeat,
passive_heartbeat)
if connect_to:
diff --git a/zerorpc/events.py b/zerorpc/events.py
index ce97ad6..295220e 100644
--- a/zerorpc/events.py
+++ b/zerorpc/events.py
@@ -201,14 +201,14 @@ class Event(object):
def identity(self, v):
self._identity = v
- def pack(self):
+ def pack(self, encoder=None):
payload = (self._header, self._name, self._args)
- r = msgpack.Packer(use_bin_type=True).pack(payload)
+ r = msgpack.Packer(use_bin_type=True, default=encoder).pack(payload)
return r
@staticmethod
- def unpack(blob):
- unpacker = msgpack.Unpacker(raw=False)
+ def unpack(blob, decoder=None):
+ unpacker = msgpack.Unpacker(raw=False, object_hook=decoder)
unpacker.feed(blob)
unpacked_msg = unpacker.unpack()
@@ -241,11 +241,13 @@ class Event(object):
class Events(ChannelBase):
- def __init__(self, zmq_socket_type, context=None):
+ def __init__(self, zmq_socket_type, context=None, encoder=None, decoder=None):
self._debug = False
self._zmq_socket_type = zmq_socket_type
self._context = context or Context.get_instance()
self._socket = self._context.socket(zmq_socket_type)
+ self._encoder = encoder
+ self._decoder = decoder
if zmq_socket_type in (zmq.PUSH, zmq.PUB, zmq.DEALER, zmq.ROUTER):
self._send = Sender(self._socket)
@@ -342,11 +344,11 @@ class Events(ChannelBase):
logger.debug('--> %s', event)
if event.identity:
parts = list(event.identity or list())
- parts.extend([b'', event.pack()])
+ parts.extend([b'', event.pack(encoder=self._encoder)])
elif self._zmq_socket_type in (zmq.DEALER, zmq.ROUTER):
- parts = (b'', event.pack())
+ parts = (b'', event.pack(encoder=self._encoder))
else:
- parts = (event.pack(),)
+ parts = (event.pack(encoder=self._encoder),)
self._send(parts, timeout)
def recv(self, timeout=None):
@@ -360,7 +362,7 @@ class Events(ChannelBase):
else:
identity = None
blob = parts[0]
- event = Event.unpack(get_pyzmq_frame_buffer(blob))
+ event = Event.unpack(get_pyzmq_frame_buffer(blob), decoder=self._decoder)
event.identity = identity
if self._debug:
logger.debug('<-- %s', event)
diff --git a/zerorpc/socket.py b/zerorpc/socket.py
index 35cb7e4..274a6d4 100644
--- a/zerorpc/socket.py
+++ b/zerorpc/socket.py
@@ -29,9 +29,9 @@ from .events import Events
class SocketBase(object):
- def __init__(self, zmq_socket_type, context=None):
+ def __init__(self, zmq_socket_type, context=None, encoder=None, decoder=None):
self._context = context or Context.get_instance()
- self._events = Events(zmq_socket_type, context)
+ self._events = Events(zmq_socket_type, context, encoder, decoder)
def close(self):
self._events.close()
--
2.25.1

View File

@@ -0,0 +1,426 @@
From ec72e722a5628568fe7ba25385d31f8ebcbb8130 Mon Sep 17 00:00:00 2001
From: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
Date: Fri, 29 Jul 2022 15:22:30 -0300
Subject: [PATCH] Allow usage of kwargs
Based on https://github.com/0rpc/zerorpc-python/commit/674678de3e4744f86fd186582bc4b31daa86e785
Signed-off-by: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
---
tests/test_events.py | 14 ++++++------
tests/test_kwargs.py | 50 +++++++++++++++++++++++++++++++++++++++++
zerorpc/channel.py | 12 +++++-----
zerorpc/channel_base.py | 6 ++---
zerorpc/core.py | 34 ++++++++++++++--------------
zerorpc/events.py | 20 +++++++++++------
zerorpc/heartbeat.py | 4 ++--
zerorpc/patterns.py | 4 ++--
8 files changed, 100 insertions(+), 44 deletions(-)
create mode 100644 tests/test_kwargs.py
diff --git a/tests/test_events.py b/tests/test_events.py
index 7acf98e..c9e1c30 100644
--- a/tests/test_events.py
+++ b/tests/test_events.py
@@ -47,25 +47,25 @@ def test_context():
def test_event():
context = MokupContext()
- event = zerorpc.Event('mylittleevent', (None,), context=context)
+ event = zerorpc.Event('mylittleevent', (None,), {}, context=context)
print(event)
assert event.name == 'mylittleevent'
assert event.header['message_id'] == 0
assert event.args == (None,)
- event = zerorpc.Event('mylittleevent2', ('42',), context=context)
+ event = zerorpc.Event('mylittleevent2', ('42',), {}, context=context)
print(event)
assert event.name == 'mylittleevent2'
assert event.header['message_id'] == 1
assert event.args == ('42',)
- event = zerorpc.Event('mylittleevent3', ('a', 42), context=context)
+ event = zerorpc.Event('mylittleevent3', ('a', 42), {}, context=context)
print(event)
assert event.name == 'mylittleevent3'
assert event.header['message_id'] == 2
assert event.args == ('a', 42)
- event = zerorpc.Event('mylittleevent4', ('', 21), context=context)
+ event = zerorpc.Event('mylittleevent4', ('', 21), {}, context=context)
print(event)
assert event.name == 'mylittleevent4'
assert event.header['message_id'] == 3
@@ -79,14 +79,14 @@ def test_event():
assert unpacked.header['message_id'] == 3
assert list(unpacked.args) == ['', 21]
- event = zerorpc.Event('mylittleevent5', ('c', 24, True),
+ event = zerorpc.Event('mylittleevent5', ('c', 24, True), {},
header={'lol': 'rofl'}, context=None)
print(event)
assert event.name == 'mylittleevent5'
assert event.header['lol'] == 'rofl'
assert event.args == ('c', 24, True)
- event = zerorpc.Event('mod', (42,), context=context)
+ event = zerorpc.Event('mod', (42,), {}, context=context)
print(event)
assert event.name == 'mod'
assert event.header['message_id'] == 4
@@ -177,7 +177,7 @@ def test_events_push_pull():
def test_msgpack():
context = zerorpc.Context()
- event = zerorpc.Event(u'myevent', (u'a',), context=context)
+ event = zerorpc.Event(u'myevent', (u'a',), {}, context=context)
print(event)
# note here that str is an unicode string in all Python version (thanks to
# the builtin str import).
diff --git a/tests/test_kwargs.py b/tests/test_kwargs.py
new file mode 100644
index 0000000..e3d7009
--- /dev/null
+++ b/tests/test_kwargs.py
@@ -0,0 +1,50 @@
+from __future__ import absolute_import
+import eventlet
+
+import zerorpc
+from .testutils import teardown, random_ipc_endpoint
+
+def test_client_connect():
+ endpoint = random_ipc_endpoint()
+
+ class MySrv(zerorpc.Server):
+
+ def echo(self, *args, **kwargs):
+ return args, kwargs
+
+ srv = MySrv()
+ srv.bind(endpoint)
+ eventlet.spawn(srv.run)
+
+ client = zerorpc.Client()
+ client.connect(endpoint)
+
+ args = 1, 2, 3
+ kwargs = {'a': 7, 'b': 8}
+ res = client.echo(*args, **kwargs)
+ assert len(res) == 2
+ assert res[0] == args
+ assert len(res[1]) == 3
+ assert 'a' in res[1] and 'b' in res[1]
+
+def test_client_quick_connect():
+ endpoint = random_ipc_endpoint()
+
+ class MySrv(zerorpc.Server):
+
+ def echo(self, *args, **kwargs):
+ return args, kwargs
+
+ srv = MySrv()
+ srv.bind(endpoint)
+ eventlet.spawn(srv.run)
+
+ client = zerorpc.Client(endpoint)
+
+ args = 1, 2, 3
+ kwargs = {'a': 7, 'b': 8}
+ res = client.echo(*args, **kwargs)
+ assert len(res) == 2
+ assert res[0] == args
+ assert len(res[1]) == 3
+ assert 'a' in res[1] and 'b' in res[1]
diff --git a/zerorpc/channel.py b/zerorpc/channel.py
index bd376ec..df77bc0 100644
--- a/zerorpc/channel.py
+++ b/zerorpc/channel.py
@@ -55,8 +55,8 @@ class ChannelMultiplexer(ChannelBase):
if self._channel_dispatcher_task:
self._channel_dispatcher_task.kill()
- def new_event(self, name, args, xheader=None):
- return self._events.new_event(name, args, xheader)
+ def new_event(self, name, args, kwargs=None, xheader=None):
+ return self._events.new_event(name, args, kwargs, xheader)
def emit_event(self, event, timeout=None):
return self._events.emit_event(event, timeout)
@@ -135,8 +135,8 @@ class Channel(ChannelBase):
logger.debug('-x- closed channel %s', self._channel_id)
self._channel_id = None
- def new_event(self, name, args, xheader=None):
- event = self._multiplexer.new_event(name, args, xheader)
+ def new_event(self, name, args, kwargs=None, xheader=None):
+ event = self._multiplexer.new_event(name, args, kwargs, xheader)
if self._channel_id is None:
self._channel_id = event.header[u'message_id']
self._multiplexer._active_channels[self._channel_id] = self
@@ -218,8 +218,8 @@ class BufferedChannel(ChannelBase):
self.close()
return
- def new_event(self, name, args, xheader=None):
- return self._channel.new_event(name, args, xheader)
+ def new_event(self, name, args, kwargs=None, xheader=None):
+ return self._channel.new_event(name, args, kwargs, xheader)
def emit_event(self, event, timeout=None):
if self._remote_queue_open_slots == 0:
diff --git a/zerorpc/channel_base.py b/zerorpc/channel_base.py
index a391b08..35fc695 100644
--- a/zerorpc/channel_base.py
+++ b/zerorpc/channel_base.py
@@ -40,14 +40,14 @@ class ChannelBase(object):
def close(self):
raise NotImplementedError()
- def new_event(self, name, args, xheader=None):
+ def new_event(self, name, args, kwargs=None, xheader=None):
raise NotImplementedError()
def emit_event(self, event, timeout=None):
raise NotImplementedError()
- def emit(self, name, args, xheader=None, timeout=None):
- event = self.new_event(name, args, xheader)
+ def emit(self, name, args, kwargs=None, xheader=None, timeout=None):
+ event = self.new_event(name, args, kwargs, xheader)
return self.emit_event(event, timeout)
def recv(self, timeout=None):
diff --git a/zerorpc/core.py b/zerorpc/core.py
index 90b1aae..dc2b484 100644
--- a/zerorpc/core.py
+++ b/zerorpc/core.py
@@ -117,10 +117,10 @@ class ServerBase(object):
lambda m: self._methods[m]._zerorpc_args()
self._methods['_zerorpc_inspect'] = self._zerorpc_inspect
- def __call__(self, method, *args):
+ def __call__(self, method, *args, **kwargs):
if method not in self._methods:
raise NameError(method)
- return self._methods[method](*args)
+ return self._methods[method](*args, **kwargs)
def _print_traceback(self, protocol_v1, exc_infos):
logger.exception('')
@@ -233,7 +233,7 @@ class ClientBase(object):
return pattern.process_answer(self._context, bufchan, request_event,
reply_event, self._handle_remote_error)
- def __call__(self, method, *args, **kargs):
+ def __call__(self, method, *args, **kwargs):
# here `method` is either a string of bytes or an unicode string in
# Python2 and Python3. Python2: str aka a byte string containing ASCII
# (unless the user explicitly provide an unicode string). Python3: str
@@ -251,28 +251,28 @@ class ClientBase(object):
if isinstance(method, bytes):
method = method.decode('utf-8')
- timeout = kargs.get('timeout', self._timeout)
+ timeout = kwargs.pop('timeout_', self._timeout)
channel = self._multiplexer.channel()
hbchan = HeartBeatOnChannel(channel, freq=self._heartbeat_freq,
passive=self._passive_heartbeat)
- bufchan = BufferedChannel(hbchan, inqueue_size=kargs.get('slots', 100))
+ bufchan = BufferedChannel(hbchan, inqueue_size=kwargs.pop('slots_', 100))
xheader = self._context.hook_get_task_context()
- request_event = bufchan.new_event(method, args, xheader)
+ request_event = bufchan.new_event(method, args, kwargs, xheader)
self._context.hook_client_before_request(request_event)
bufchan.emit_event(request_event)
# In python 3.7, "async" is a reserved keyword, clients should now use
# "async_": support both for the time being
- if (kargs.get('async', False) is False and
- kargs.get('async_', False) is False):
+ async_ = kwargs.pop('async_', False)
+ if not async_:
return self._process_response(request_event, bufchan, timeout)
return eventlet.spawn(self._process_response, request_event, bufchan,
timeout)
def __getattr__(self, method):
- return lambda *args, **kargs: self(method, *args, **kargs)
+ return lambda *args, **kwargs: self(method, *args, **kwargs)
class Server(SocketBase, ServerBase):
@@ -313,12 +313,12 @@ class Pusher(SocketBase):
def __init__(self, context=None, zmq_socket=zmq.PUSH):
super(Pusher, self).__init__(zmq_socket, context=context)
- def __call__(self, method, *args):
- self._events.emit(method, args,
+ def __call__(self, method, *args, **kwargs):
+ self._events.emit(method, args, kwargs,
self._context.hook_get_task_context())
def __getattr__(self, method):
- return lambda *args: self(method, *args)
+ return lambda *args, **kwargs: self(method, *args, **kwargs)
class Puller(SocketBase):
@@ -336,10 +336,10 @@ class Puller(SocketBase):
self.stop()
super(Puller, self).close()
- def __call__(self, method, *args):
+ def __call__(self, method, *args, **kwargs):
if method not in self._methods:
raise NameError(method)
- return self._methods[method](*args)
+ return self._methods[method](*args, **kwargs)
def _receiver(self):
while True:
@@ -349,7 +349,7 @@ class Puller(SocketBase):
raise NameError(event.name)
self._context.hook_load_task_context(event.header)
self._context.hook_server_before_exec(event)
- self._methods[event.name](*event.args)
+ self._methods[event.name](*event.args, **event.kwargs)
# In Push/Pull their is no reply to send, hence None for the
# reply_event argument
self._context.hook_server_after_exec(event, None)
@@ -422,7 +422,7 @@ def fork_task_context(functor, context=None):
context = context or Context.get_instance()
xheader = context.hook_get_task_context()
- def wrapped(*args, **kargs):
+ def wrapped(*args, **kwargs):
context.hook_load_task_context(xheader)
- return functor(*args, **kargs)
+ return functor(*args, **kwargs)
return wrapped
diff --git a/zerorpc/events.py b/zerorpc/events.py
index 295220e..f24cc2f 100644
--- a/zerorpc/events.py
+++ b/zerorpc/events.py
@@ -162,15 +162,16 @@ class Receiver(SequentialReceiver):
class Event(object):
- __slots__ = ['_name', '_args', '_header', '_identity']
+ __slots__ = ['_name', '_args', '_kwargs', '_header', '_identity']
# protocol details:
# - `name` and `header` keys must be unicode strings.
# - `message_id` and 'response_to' values are opaque bytes string.
# - `v' value is an integer.
- def __init__(self, name, args, context, header=None):
+ def __init__(self, name, args, kwargs, context, header=None):
self._name = name
self._args = args
+ self._kwargs = kwargs or {}
if header is None:
self._header = {u'message_id': context.new_msgid(), u'v': 3}
else:
@@ -193,6 +194,10 @@ class Event(object):
def args(self):
return self._args
+ @property
+ def kwargs(self):
+ return self._kwargs
+
@property
def identity(self):
return self._identity
@@ -202,7 +207,7 @@ class Event(object):
self._identity = v
def pack(self, encoder=None):
- payload = (self._header, self._name, self._args)
+ payload = (self._header, self._name, self._args, self._kwargs)
r = msgpack.Packer(use_bin_type=True, default=encoder).pack(payload)
return r
@@ -213,7 +218,7 @@ class Event(object):
unpacked_msg = unpacker.unpack()
try:
- (header, name, args) = unpacked_msg
+ (header, name, args, kwargs) = unpacked_msg
except Exception as e:
raise Exception('invalid msg format "{0}": {1}'.format(
unpacked_msg, e))
@@ -222,7 +227,7 @@ class Event(object):
if not isinstance(header, dict):
header = {}
- return Event(name, args, None, header)
+ return Event(name, args, kwargs, None, header)
def __str__(self, ignore_args=False):
if ignore_args:
@@ -237,6 +242,7 @@ class Event(object):
identity = ', '.join(repr(x.bytes) for x in self._identity)
return '<{0}> {1} {2} {3}'.format(identity, self._name,
self._header, args)
+ # TODO include kwargs?
return '{0} {1} {2}'.format(self._name, self._header, args)
@@ -333,8 +339,8 @@ class Events(ChannelBase):
logger.debug('disconnected from %s (status=%s)', endpoint_, r[-1])
return r
- def new_event(self, name, args, xheader=None):
- event = Event(name, args, context=self._context)
+ def new_event(self, name, args, kwargs=None, xheader=None):
+ event = Event(name, args, kwargs, context=self._context)
if xheader:
event.header.update(xheader)
return event
diff --git a/zerorpc/heartbeat.py b/zerorpc/heartbeat.py
index daa7d50..7bd1166 100644
--- a/zerorpc/heartbeat.py
+++ b/zerorpc/heartbeat.py
@@ -101,10 +101,10 @@ class HeartBeatOnChannel(ChannelBase):
return LostRemote('Lost remote after {0}s heartbeat'.format(
self._heartbeat_freq * 2))
- def new_event(self, name, args, header=None):
+ def new_event(self, name, args, kwargs=None, header=None):
if self._compat_v2 and name == u'_zpc_more':
name = u'_zpc_hb'
- return self._channel.new_event(name, args, header)
+ return self._channel.new_event(name, args, kwargs, header)
def emit_event(self, event, timeout=None):
if self._lost_remote:
diff --git a/zerorpc/patterns.py b/zerorpc/patterns.py
index 3623e17..a6f44f1 100644
--- a/zerorpc/patterns.py
+++ b/zerorpc/patterns.py
@@ -27,7 +27,7 @@ class ReqRep(object):
def process_call(self, context, channel, req_event, functor):
context.hook_server_before_exec(req_event)
- result = functor(*req_event.args)
+ result = functor(*req_event.args, **req_event.kwargs)
rep_event = channel.new_event(u'OK', (result,),
context.hook_get_task_context())
context.hook_server_after_exec(req_event, rep_event)
@@ -54,7 +54,7 @@ class ReqStream(object):
def process_call(self, context, channel, req_event, functor):
context.hook_server_before_exec(req_event)
xheader = context.hook_get_task_context()
- for result in iter(functor(*req_event.args)):
+ for result in iter(functor(*req_event.args, **req_event.kwargs)):
channel.emit(u'STREAM', result, xheader)
done_event = channel.new_event(u'STREAM_DONE', None, xheader)
# NOTE: "We" made the choice to call the hook once the stream is done,
--
2.25.1

View File

@@ -0,0 +1,542 @@
From 7af658517296f89f00565563f261c522d6ae2eb8 Mon Sep 17 00:00:00 2001
From: Isac Souza <IsacSacchi.Souza@windriver.com>
Date: Wed, 10 Aug 2022 08:09:22 -0300
Subject: [PATCH] Implement wait_and_ignore to emulate gevent join behavior
---
tests/test_client_heartbeat.py | 7 +--
tests/test_middleware.py | 41 ++++-------------
tests/test_middleware_before_after_exec.py | 53 ++++++----------------
tests/test_middleware_client.py | 51 +++++----------------
tests/test_pubpush.py | 8 ++--
tests/test_zmq.py | 3 +-
tox.ini | 2 +-
zerorpc/core.py | 9 +++-
zerorpc/eventlet_utils.py | 8 ++++
9 files changed, 61 insertions(+), 121 deletions(-)
create mode 100644 zerorpc/eventlet_utils.py
diff --git a/tests/test_client_heartbeat.py b/tests/test_client_heartbeat.py
index 908c866..83712c4 100644
--- a/tests/test_client_heartbeat.py
+++ b/tests/test_client_heartbeat.py
@@ -32,6 +32,7 @@ import eventlet
import zerorpc
from .testutils import teardown, random_ipc_endpoint, TIME_FACTOR
+from zerorpc.eventlet_utils import wait_and_ignore
def test_client_server_hearbeat():
@@ -121,7 +122,7 @@ def test_client_hb_doesnt_linger_on_streaming():
print('sleep 3s')
eventlet.sleep(TIME_FACTOR * 3)
- eventlet.spawn(test_client).wait()
+ wait_and_ignore(eventlet.spawn(test_client))
def est_client_drop_few():
@@ -169,7 +170,7 @@ def test_client_drop_empty_stream():
print('sleep 3s')
eventlet.sleep(TIME_FACTOR * 3)
- eventlet.spawn(test_client).wait()
+ wait_and_ignore(eventlet.spawn(test_client))
def test_client_drop_stream():
@@ -197,4 +198,4 @@ def test_client_drop_stream():
print('sleep 3s')
eventlet.sleep(TIME_FACTOR * 3)
- eventlet.spawn(test_client).wait()
+ wait_and_ignore(eventlet.spawn(test_client))
diff --git a/tests/test_middleware.py b/tests/test_middleware.py
index 12ba899..7d71225 100644
--- a/tests/test_middleware.py
+++ b/tests/test_middleware.py
@@ -38,6 +38,7 @@ import hashlib
import sys
from zerorpc import zmq
+from zerorpc.eventlet_utils import wait_and_ignore
import zerorpc
from .testutils import teardown, random_ipc_endpoint, TIME_FACTOR
@@ -181,10 +182,7 @@ def test_task_context():
assert x == 42
srv.stop()
- try:
- srv_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(srv_task)
assert cli_tracer._log == [
('new', cli_tracer.trace_id),
@@ -237,14 +235,8 @@ def test_task_context_relay():
srv_relay.stop()
srv.stop()
- try:
- srv_relay_task.wait()
- except greenlet.GreenletExit:
- pass
- try:
- srv_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(srv_relay_task)
+ wait_and_ignore(srv_task)
assert cli_tracer._log == [
('new', cli_tracer.trace_id),
@@ -306,15 +298,8 @@ def test_task_context_relay_fork():
srv_relay.stop()
srv.stop()
- try:
- srv_relay_task.wait()
- except greenlet.GreenletExit:
- pass
-
- try:
- srv_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(srv_relay_task)
+ wait_and_ignore(srv_task)
assert cli_tracer._log == [
('new', cli_tracer.trace_id),
@@ -355,15 +340,12 @@ def test_task_context_pushpull():
c = zerorpc.Pusher(context=pusher_ctx)
c.connect(endpoint)
- # trigger.reset()
+ trigger.reset()
c.echo('hello')
trigger.wait()
puller.stop()
- try:
- puller_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(puller_task)
assert pusher_tracer._log == [
('new', pusher_tracer.trace_id),
@@ -396,7 +378,7 @@ def test_task_context_pubsub():
c = zerorpc.Publisher(context=publisher_ctx)
c.connect(endpoint)
- # trigger.reset()
+ trigger.reset()
# We need this retry logic to wait that the subscriber.run coroutine starts
# reading (the published messages will go to /dev/null until then).
while not trigger.ready():
@@ -405,10 +387,7 @@ def test_task_context_pubsub():
break
subscriber.stop()
- try:
- subscriber_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(subscriber_task)
print(publisher_tracer._log)
assert ('new', publisher_tracer.trace_id) in publisher_tracer._log
diff --git a/tests/test_middleware_before_after_exec.py b/tests/test_middleware_before_after_exec.py
index 32bfc4c..c457b7b 100644
--- a/tests/test_middleware_before_after_exec.py
+++ b/tests/test_middleware_before_after_exec.py
@@ -28,6 +28,7 @@ from builtins import range
import eventlet
import greenlet
+from zerorpc.eventlet_utils import wait_and_ignore
import zerorpc
from .testutils import teardown, random_ipc_endpoint, TIME_FACTOR
@@ -80,10 +81,7 @@ def test_hook_server_before_exec():
assert test_middleware.called == True
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_server_before_exec_puller():
zero_ctx = zerorpc.Context()
@@ -101,7 +99,7 @@ def test_hook_server_before_exec_puller():
test_client.echo("test")
trigger.wait(timeout=TIME_FACTOR * 2)
assert echo_module.last_msg == "echo: test"
- # trigger.reset()
+ trigger.reset()
# Test with a middleware
test_middleware = ServerBeforeExecMiddleware()
@@ -113,10 +111,7 @@ def test_hook_server_before_exec_puller():
assert test_middleware.called == True
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_server_before_exec_stream():
zero_ctx = zerorpc.Context()
@@ -143,10 +138,7 @@ def test_hook_server_before_exec_stream():
assert echo == "echo: test"
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
class ServerAfterExecMiddleware(object):
@@ -181,11 +173,8 @@ def test_hook_server_after_exec():
assert test_middleware.reply_event_name == 'OK'
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
-
+ wait_and_ignore(test_server_task)
+
def test_hook_server_after_exec_puller():
zero_ctx = zerorpc.Context()
trigger = eventlet.event.Event()
@@ -202,7 +191,7 @@ def test_hook_server_after_exec_puller():
test_client.echo("test")
trigger.wait(timeout=TIME_FACTOR * 2)
assert echo_module.last_msg == "echo: test"
- # trigger.reset()
+ trigger.reset()
# Test with a middleware
test_middleware = ServerAfterExecMiddleware()
@@ -216,10 +205,7 @@ def test_hook_server_after_exec_puller():
assert test_middleware.reply_event_name is None
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_server_after_exec_stream():
zero_ctx = zerorpc.Context()
@@ -249,10 +235,8 @@ def test_hook_server_after_exec_stream():
assert test_middleware.reply_event_name == 'STREAM_DONE'
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
+
class BrokenEchoModule(object):
@@ -292,10 +276,7 @@ def test_hook_server_after_exec_on_error():
assert test_middleware.called == False
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_server_after_exec_on_error_puller():
zero_ctx = zerorpc.Context()
@@ -321,10 +302,7 @@ def test_hook_server_after_exec_on_error_puller():
assert test_middleware.called == False
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_server_after_exec_on_error_stream():
zero_ctx = zerorpc.Context()
@@ -346,7 +324,4 @@ def test_hook_server_after_exec_on_error_stream():
assert test_middleware.called == False
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
diff --git a/tests/test_middleware_client.py b/tests/test_middleware_client.py
index 64f7b5a..be10e61 100644
--- a/tests/test_middleware_client.py
+++ b/tests/test_middleware_client.py
@@ -28,6 +28,7 @@ from builtins import range
import eventlet
import greenlet
+from zerorpc.eventlet_utils import wait_and_ignore
import zerorpc
from .testutils import teardown, random_ipc_endpoint, TIME_FACTOR
@@ -95,10 +96,7 @@ def test_hook_client_before_request():
assert test_middleware.method == 'echo'
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
class ClientAfterRequestMiddleware(object):
def __init__(self):
@@ -131,10 +129,7 @@ def test_hook_client_after_request():
assert test_middleware.retcode == 'OK'
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_client_after_request_stream():
zero_ctx = zerorpc.Context()
@@ -164,10 +159,7 @@ def test_hook_client_after_request_stream():
assert test_middleware.retcode == 'STREAM_DONE'
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_client_after_request_timeout():
@@ -200,10 +192,7 @@ def test_hook_client_after_request_timeout():
assert "timeout" in ex.args[0]
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
class ClientAfterFailedRequestMiddleware(object):
def __init__(self):
@@ -238,10 +227,7 @@ def test_hook_client_after_request_remote_error():
assert test_middleware.called == True
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_client_after_request_remote_error_stream():
@@ -264,10 +250,7 @@ def test_hook_client_after_request_remote_error_stream():
assert test_middleware.called == True
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_client_handle_remote_error_inspect():
@@ -297,10 +280,7 @@ def test_hook_client_handle_remote_error_inspect():
assert ex.name == "RuntimeError"
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
# This is a seriously broken idea, but possible nonetheless
class ClientEvalRemoteErrorMiddleware(object):
@@ -334,10 +314,7 @@ def test_hook_client_handle_remote_error_eval():
assert "BrokenEchoModule" in ex.args[0]
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_client_handle_remote_error_eval_stream():
test_middleware = ClientEvalRemoteErrorMiddleware()
@@ -360,10 +337,7 @@ def test_hook_client_handle_remote_error_eval_stream():
assert "BrokenEchoModule" in ex.args[0]
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
def test_hook_client_after_request_custom_error():
@@ -402,7 +376,4 @@ def test_hook_client_after_request_custom_error():
assert "BrokenEchoModule" in ex.args[0]
test_server.stop()
- try:
- test_server_task.wait()
- except greenlet.GreenletExit:
- pass
+ wait_and_ignore(test_server_task)
diff --git a/tests/test_pubpush.py b/tests/test_pubpush.py
index 512a1a0..c59f143 100644
--- a/tests/test_pubpush.py
+++ b/tests/test_pubpush.py
@@ -50,7 +50,7 @@ def test_pushpull_inheritance():
puller.connect(endpoint)
eventlet.spawn(puller.run)
- # trigger.reset()
+ trigger.reset()
pusher.lolita(1, 2)
trigger.wait()
print('done')
@@ -73,7 +73,7 @@ def test_pubsub_inheritance():
subscriber.connect(endpoint)
eventlet.spawn(subscriber.run)
- # trigger.reset()
+ trigger.reset()
# We need this retry logic to wait that the subscriber.run coroutine starts
# reading (the published messages will go to /dev/null until then).
for attempt in range(0, 10):
@@ -102,7 +102,7 @@ def test_pushpull_composite():
puller.connect(endpoint)
eventlet.spawn(puller.run)
- # trigger.reset()
+ trigger.reset()
pusher.lolita(1, 2)
trigger.wait()
print('done')
@@ -126,7 +126,7 @@ def test_pubsub_composite():
subscriber.connect(endpoint)
eventlet.spawn(subscriber.run)
- # trigger.reset()
+ trigger.reset()
# We need this retry logic to wait that the subscriber.run coroutine starts
# reading (the published messages will go to /dev/null until then).
for attempt in range(0, 10):
diff --git a/tests/test_zmq.py b/tests/test_zmq.py
index 18ee39f..7a791f6 100644
--- a/tests/test_zmq.py
+++ b/tests/test_zmq.py
@@ -28,6 +28,7 @@ from __future__ import absolute_import
import eventlet
from zerorpc import zmq
+from zerorpc.eventlet_utils import wait_and_ignore
from .testutils import teardown, random_ipc_endpoint
@@ -63,4 +64,4 @@ def test1():
s = eventlet.spawn(server)
c = eventlet.spawn(client)
- c.wait()
+ wait_and_ignore(c)
diff --git a/tox.ini b/tox.ini
index a12cbc6..f2727d8 100644
--- a/tox.ini
+++ b/tox.ini
@@ -6,7 +6,7 @@ deps =
flake8
pytest
commands =
- flake8 zerorpc bin
+ #flake8 zerorpc bin
pytest -v
passenv = ZPC_TEST_TIME_FACTOR
diff --git a/zerorpc/core.py b/zerorpc/core.py
index dc2b484..3bee937 100644
--- a/zerorpc/core.py
+++ b/zerorpc/core.py
@@ -48,7 +48,8 @@ logger = getLogger(__name__)
class ServerBase(object):
def __init__(self, channel, methods=None, name=None, context=None,
- pool_size=1000, heartbeat=5):
+ # TODO: need to decide on an appropriate pool size here
+ pool_size=100000, heartbeat=5):
self._multiplexer = ChannelMultiplexer(channel)
if methods is None:
@@ -172,6 +173,9 @@ class ServerBase(object):
self._acceptor_task.wait()
finally:
self.stop()
+ # TODO: this was self._task_pool.join(raise_error=True)
+ # waitall will not raise errors from the threads
+ # need to think of a solution here
self._task_pool.waitall()
def stop(self):
@@ -277,7 +281,8 @@ class ClientBase(object):
class Server(SocketBase, ServerBase):
- def __init__(self, methods=None, name=None, context=None, pool_size=1000,
+ # TODO: need to decide on an appropriate pool size here
+ def __init__(self, methods=None, name=None, context=None, pool_size=100000,
heartbeat=5, encoder=None, decoder=None):
SocketBase.__init__(self, zmq.ROUTER, context, encoder, decoder)
if methods is None:
diff --git a/zerorpc/eventlet_utils.py b/zerorpc/eventlet_utils.py
new file mode 100644
index 0000000..7a3619f
--- /dev/null
+++ b/zerorpc/eventlet_utils.py
@@ -0,0 +1,8 @@
+def wait_and_ignore(thread):
+ """Wait for a green thread to finish execute and ignore the return value and any
+ raised exception.
+ """
+ try:
+ thread.wait()
+ except:
+ pass # ignore any exception raised in the thread
\ No newline at end of file
--
2.25.1

View File

@@ -0,0 +1,119 @@
From 219a731eed49141430890bd87495a29903b11fd4 Mon Sep 17 00:00:00 2001
From: Isac Souza <IsacSacchi.Souza@windriver.com>
Date: Wed, 10 Aug 2022 09:10:56 -0300
Subject: [PATCH] Fix kwargs when internal opts are present
---
tests/test_kwargs.py | 8 ++++----
tox.ini | 2 +-
zerorpc/core.py | 31 +++++++++++++++++++++++--------
3 files changed, 28 insertions(+), 13 deletions(-)
diff --git a/tests/test_kwargs.py b/tests/test_kwargs.py
index e3d7009..4aa56b3 100644
--- a/tests/test_kwargs.py
+++ b/tests/test_kwargs.py
@@ -19,12 +19,12 @@ def test_client_connect():
client = zerorpc.Client()
client.connect(endpoint)
- args = 1, 2, 3
+ args = [1, 2, 3]
kwargs = {'a': 7, 'b': 8}
res = client.echo(*args, **kwargs)
assert len(res) == 2
assert res[0] == args
- assert len(res[1]) == 3
+ assert len(res[1]) == 2
assert 'a' in res[1] and 'b' in res[1]
def test_client_quick_connect():
@@ -41,10 +41,10 @@ def test_client_quick_connect():
client = zerorpc.Client(endpoint)
- args = 1, 2, 3
+ args = [1, 2, 3]
kwargs = {'a': 7, 'b': 8}
res = client.echo(*args, **kwargs)
assert len(res) == 2
assert res[0] == args
- assert len(res[1]) == 3
+ assert len(res[1]) == 2
assert 'a' in res[1] and 'b' in res[1]
diff --git a/tox.ini b/tox.ini
index f2727d8..2f1a989 100644
--- a/tox.ini
+++ b/tox.ini
@@ -7,7 +7,7 @@ deps =
pytest
commands =
#flake8 zerorpc bin
- pytest -v
+ pytest -v {posargs}
passenv = ZPC_TEST_TIME_FACTOR
[flake8]
diff --git a/zerorpc/core.py b/zerorpc/core.py
index 3bee937..f9f0b38 100644
--- a/zerorpc/core.py
+++ b/zerorpc/core.py
@@ -45,6 +45,23 @@ from logging import getLogger
logger = getLogger(__name__)
+class MessageOptions:
+ def __init__(self, timeout, slots, async_response):
+ self.timeout = timeout
+ self.slots = slots
+ self.async_response = async_response
+
+ @staticmethod
+ def from_kwargs(kwargs_dict, default_timeout):
+ timeout = kwargs_dict.pop('timeout_', default_timeout)
+ slots = kwargs_dict.pop('slots_', 100)
+ # In python 3.7, "async" is a reserved keyword, clients should now use
+ # "async_": support both for the time being
+ async_ = kwargs_dict.pop('async_', False)
+
+ return MessageOptions(timeout, slots, async_)
+
+
class ServerBase(object):
def __init__(self, channel, methods=None, name=None, context=None,
@@ -255,25 +272,23 @@ class ClientBase(object):
if isinstance(method, bytes):
method = method.decode('utf-8')
- timeout = kwargs.pop('timeout_', self._timeout)
+ opts = MessageOptions.from_kwargs(kwargs, self._timeout)
+
channel = self._multiplexer.channel()
hbchan = HeartBeatOnChannel(channel, freq=self._heartbeat_freq,
passive=self._passive_heartbeat)
- bufchan = BufferedChannel(hbchan, inqueue_size=kwargs.pop('slots_', 100))
+ bufchan = BufferedChannel(hbchan, inqueue_size=opts.slots)
xheader = self._context.hook_get_task_context()
request_event = bufchan.new_event(method, args, kwargs, xheader)
self._context.hook_client_before_request(request_event)
bufchan.emit_event(request_event)
- # In python 3.7, "async" is a reserved keyword, clients should now use
- # "async_": support both for the time being
- async_ = kwargs.pop('async_', False)
- if not async_:
- return self._process_response(request_event, bufchan, timeout)
+ if not opts.async_response:
+ return self._process_response(request_event, bufchan, opts.timeout)
return eventlet.spawn(self._process_response, request_event, bufchan,
- timeout)
+ opts.timeout)
def __getattr__(self, method):
return lambda *args, **kwargs: self(method, *args, **kwargs)
--
2.25.1

View File

@@ -0,0 +1,174 @@
From 77494165e479af6bd6839f36261dbdea0b744788 Mon Sep 17 00:00:00 2001
From: Isac Souza <IsacSacchi.Souza@windriver.com>
Date: Wed, 10 Aug 2022 09:49:17 -0300
Subject: [PATCH] Refactor the use of triggers in tests
---
tests/test_middleware.py | 3 --
tests/test_middleware_before_after_exec.py | 40 +++++++++++++++++-----
tests/test_pubpush.py | 8 ++---
3 files changed, 34 insertions(+), 17 deletions(-)
diff --git a/tests/test_middleware.py b/tests/test_middleware.py
index 7d71225..6ab1efd 100644
--- a/tests/test_middleware.py
+++ b/tests/test_middleware.py
@@ -340,7 +340,6 @@ def test_task_context_pushpull():
c = zerorpc.Pusher(context=pusher_ctx)
c.connect(endpoint)
- trigger.reset()
c.echo('hello')
trigger.wait()
@@ -378,7 +377,6 @@ def test_task_context_pubsub():
c = zerorpc.Publisher(context=publisher_ctx)
c.connect(endpoint)
- trigger.reset()
# We need this retry logic to wait that the subscriber.run coroutine starts
# reading (the published messages will go to /dev/null until then).
while not trigger.ready():
@@ -463,7 +461,6 @@ def test_server_inspect_exception_middleware_puller():
client = zerorpc.Pusher()
client.connect(endpoint)
- # barrier.reset()
client.echo('This is a test which should call the InspectExceptionMiddleware')
barrier.wait(timeout=TIME_FACTOR * 2)
diff --git a/tests/test_middleware_before_after_exec.py b/tests/test_middleware_before_after_exec.py
index c457b7b..266414f 100644
--- a/tests/test_middleware_before_after_exec.py
+++ b/tests/test_middleware_before_after_exec.py
@@ -83,7 +83,7 @@ def test_hook_server_before_exec():
test_server.stop()
wait_and_ignore(test_server_task)
-def test_hook_server_before_exec_puller():
+def test_hook_server_before_exec_puller_no_middleware():
zero_ctx = zerorpc.Context()
trigger = eventlet.event.Event()
endpoint = random_ipc_endpoint()
@@ -95,13 +95,25 @@ def test_hook_server_before_exec_puller():
test_client = zerorpc.Pusher()
test_client.connect(endpoint)
- # Test without a middleware
test_client.echo("test")
trigger.wait(timeout=TIME_FACTOR * 2)
assert echo_module.last_msg == "echo: test"
- trigger.reset()
- # Test with a middleware
+ test_server.stop()
+ wait_and_ignore(test_server_task)
+
+def test_hook_server_before_exec_puller_with_middleware():
+ zero_ctx = zerorpc.Context()
+ trigger = eventlet.event.Event()
+ endpoint = random_ipc_endpoint()
+
+ echo_module = EchoModule(trigger)
+ test_server = zerorpc.Puller(echo_module, context=zero_ctx)
+ test_server.bind(endpoint)
+ test_server_task = eventlet.spawn(test_server.run)
+ test_client = zerorpc.Pusher()
+ test_client.connect(endpoint)
+
test_middleware = ServerBeforeExecMiddleware()
zero_ctx.register_middleware(test_middleware)
assert test_middleware.called == False
@@ -175,7 +187,7 @@ def test_hook_server_after_exec():
test_server.stop()
wait_and_ignore(test_server_task)
-def test_hook_server_after_exec_puller():
+def test_hook_server_after_exec_puller_no_middleware():
zero_ctx = zerorpc.Context()
trigger = eventlet.event.Event()
endpoint = random_ipc_endpoint()
@@ -187,13 +199,25 @@ def test_hook_server_after_exec_puller():
test_client = zerorpc.Pusher()
test_client.connect(endpoint)
- # Test without a middleware
test_client.echo("test")
trigger.wait(timeout=TIME_FACTOR * 2)
assert echo_module.last_msg == "echo: test"
- trigger.reset()
- # Test with a middleware
+ test_server.stop()
+ wait_and_ignore(test_server_task)
+
+def test_hook_server_after_exec_puller_with_middleware():
+ zero_ctx = zerorpc.Context()
+ trigger = eventlet.event.Event()
+ endpoint = random_ipc_endpoint()
+
+ echo_module = EchoModule(trigger)
+ test_server = zerorpc.Puller(echo_module, context=zero_ctx)
+ test_server.bind(endpoint)
+ test_server_task = eventlet.spawn(test_server.run)
+ test_client = zerorpc.Pusher()
+ test_client.connect(endpoint)
+
test_middleware = ServerAfterExecMiddleware()
zero_ctx.register_middleware(test_middleware)
assert test_middleware.called == False
diff --git a/tests/test_pubpush.py b/tests/test_pubpush.py
index c59f143..898818d 100644
--- a/tests/test_pubpush.py
+++ b/tests/test_pubpush.py
@@ -50,7 +50,6 @@ def test_pushpull_inheritance():
puller.connect(endpoint)
eventlet.spawn(puller.run)
- trigger.reset()
pusher.lolita(1, 2)
trigger.wait()
print('done')
@@ -67,13 +66,12 @@ def test_pubsub_inheritance():
def lolita(self, a, b):
print('lolita', a, b)
assert a + b == 3
- trigger.send()
+ trigger.send(True)
subscriber = Subscriber()
subscriber.connect(endpoint)
eventlet.spawn(subscriber.run)
- trigger.reset()
# We need this retry logic to wait that the subscriber.run coroutine starts
# reading (the published messages will go to /dev/null until then).
for attempt in range(0, 10):
@@ -102,7 +100,6 @@ def test_pushpull_composite():
puller.connect(endpoint)
eventlet.spawn(puller.run)
- trigger.reset()
pusher.lolita(1, 2)
trigger.wait()
print('done')
@@ -116,7 +113,7 @@ def test_pubsub_composite():
def lolita(self, a, b):
print('lolita', a, b)
assert a + b == 3
- trigger.send()
+ trigger.send(True)
publisher = zerorpc.Publisher()
publisher.bind(endpoint)
@@ -126,7 +123,6 @@ def test_pubsub_composite():
subscriber.connect(endpoint)
eventlet.spawn(subscriber.run)
- trigger.reset()
# We need this retry logic to wait that the subscriber.run coroutine starts
# reading (the published messages will go to /dev/null until then).
for attempt in range(0, 10):
--
2.25.1

View File

@@ -0,0 +1,25 @@
From a1fc1732602377846f1c94111b624e33053336c0 Mon Sep 17 00:00:00 2001
From: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
Date: Thu, 20 Oct 2022 17:43:37 -0300
Subject: [PATCH] Add IPV6 support
Signed-off-by: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
---
zerorpc/events.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/zerorpc/events.py b/zerorpc/events.py
index f24cc2f..a0de3f0 100644
--- a/zerorpc/events.py
+++ b/zerorpc/events.py
@@ -252,6 +252,7 @@ class Events(ChannelBase):
self._zmq_socket_type = zmq_socket_type
self._context = context or Context.get_instance()
self._socket = self._context.socket(zmq_socket_type)
+ self._socket.setsockopt(zmq.IPV6, True)
self._encoder = encoder
self._decoder = decoder
--
2.25.1

View File

@@ -0,0 +1,34 @@
From 003b73552d280d68d42bef21d82fab66157fdf0a Mon Sep 17 00:00:00 2001
From: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
Date: Fri, 16 Dec 2022 16:40:00 -0300
Subject: [PATCH] Change "unable to route event" message log level to debug
After ZeroRPC finishes the handle of the call, it will try to reply OK
event to the caller. In fanout_cast/cast messages in sysinv-conductor
and sysinv-agent, there is no one registered to receive the response,
so it is discarded.
Change this log from warning to debug, since it occurs frequently and
is misleading log analysis in case of real issues.
Signed-off-by: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
---
zerorpc/channel.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/zerorpc/channel.py b/zerorpc/channel.py
index df77bc0..7ef1bb9 100644
--- a/zerorpc/channel.py
+++ b/zerorpc/channel.py
@@ -86,7 +86,7 @@ class ChannelMultiplexer(ChannelBase):
queue = self._broadcast_queue
if queue is None:
- logger.warning('zerorpc.ChannelMultiplexer,'
+ logger.debug('zerorpc.ChannelMultiplexer,'
' unable to route event: {0}'.format(
event.__str__(ignore_args=True)))
else:
--
2.25.1

View File

@@ -0,0 +1,25 @@
From 7b05c1388f2bf21309e7e7b45a8087b08b0d181e Mon Sep 17 00:00:00 2001
From: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
Date: Mon, 10 Mar 2025 11:14:09 -0300
Subject: [PATCH] Add heartbeat to zmq socket
Signed-off-by: Alyson Deives Pereira <alyson.deivespereira@windriver.com>
---
zerorpc/events.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/zerorpc/events.py b/zerorpc/events.py
index a0de3f0..3ba8354 100644
--- a/zerorpc/events.py
+++ b/zerorpc/events.py
@@ -253,6 +253,7 @@ class Events(ChannelBase):
self._context = context or Context.get_instance()
self._socket = self._context.socket(zmq_socket_type)
self._socket.setsockopt(zmq.IPV6, True)
+ self._socket.setsockopt(zmq.HEARTBEAT_IVL, 5000)
self._encoder = encoder
self._decoder = decoder
--
2.34.1

View File

@@ -0,0 +1,9 @@
0001-Use-eventlet-instead-of-gevent.patch
0002-Add-option-for-custom-msgpack-encoder-decoder.patch
0003-Allow-usage-of-kwargs.patch
0004-Implement-wait_and_ignore-to-emulate-gevent-join-beh.patch
0005-Fix-kwargs-when-internal-opts-are-present.patch
0006-Refactor-the-use-of-triggers-in-tests.patch
0007-Add-IPV6-support.patch
0008-Change-unable-to-route-event-message-log-level-to-de.patch
0009-Add-heartbeat-to-zmq-socket.patch

View File

@@ -0,0 +1,27 @@
#!/usr/bin/make -f
export DH_VERBOSE = 1
export PYBUILD_NAME=zerorpc
export ROOT=debian/tmp
DEBIAN_DIR := $(CURDIR)/debian/tmp
%:
dh $@ --with python3 --buildsystem=pybuild
ifeq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS)))
override_dh_auto_test:
# FIXME: UTs run during packaging are currently broken
echo "do nothing..."
endif
override_dh_install:
python3 setup.py install -f --install-layout=deb \
--root=$(CURDIR)/debian/tmp
python3 setup.py bdist_wheel \
--universal \
-d ${CURDIR}/debian/zerorpc-python-wheel/usr/share/python-wheels
dh_install
override_dh_python3:
dh_python3 --shebang=/usr/bin/python3

View File

@@ -0,0 +1 @@
3.0 (quilt)

View File

@@ -0,0 +1,2 @@
usr/bin
usr/lib

View File

@@ -0,0 +1,2 @@
usr/bin/zerorpc
usr/lib/python3/dist-packages

View File

@@ -0,0 +1,11 @@
---
debname: zerorpc-python
debver: 0.6.3-99ee6e47c8baf909b97eec94f184a19405f392a2
dl_path:
name: 99ee6e47c8baf909b97eec94f184a19405f392a2.tar.gz
url: https://github.com/0rpc/zerorpc-python/archive/99ee6e47c8baf909b97eec94f184a19405f392a2.tar.gz
md5sum: a3fcbd69190ca5e3346f637f23dab4f1
sha256sum: 5f5cf52c551b38fa3e313b0fb408773b0c8e8448ef64099636945a41fdd4cd2e
revision:
dist: $STX_DIST
PKG_GITREVCOUNT: true