Hello community,
here is the log from the commit of package python-pynetbox for openSUSE:Factory
checked in at 2020-03-24 22:34:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pynetbox (Old)
and /work/SRC/openSUSE:Factory/.python-pynetbox.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pynetbox"
Tue Mar 24 22:34:27 2020 rev:11 rq:787519 version:4.3.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pynetbox/python-pynetbox.changes
2020-02-11 22:25:44.599578682 +0100
+++
/work/SRC/openSUSE:Factory/.python-pynetbox.new.3160/python-pynetbox.changes
2020-03-24 22:34:31.513153061 +0100
@@ -1,0 +2,6 @@
+Mon Mar 23 14:49:20 UTC 2020 - [email protected]
+
+- version update to 4.3.0
+ * Adds the ability to thread calls to NetBox from .filter() and .all()
methods. (PR #216)
+
+-------------------------------------------------------------------
Old:
----
pynetbox-4.2.5.tar.gz
New:
----
pynetbox-4.3.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pynetbox.spec ++++++
--- /var/tmp/diff_new_pack.MRlyd1/_old 2020-03-24 22:34:32.089153341 +0100
+++ /var/tmp/diff_new_pack.MRlyd1/_new 2020-03-24 22:34:32.093153343 +0100
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-pynetbox
-Version: 4.2.5
+Version: 4.3.0
Release: 0
Summary: NetBox API client library
License: Apache-2.0
@@ -35,7 +35,7 @@
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires: python-netaddr
-Requires: python-requests
+Requires: python-requests >= 2.20.0
BuildArch: noarch
%python_subpackages
++++++ pynetbox-4.2.5.tar.gz -> pynetbox-4.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pynetbox-4.2.5/PKG-INFO new/pynetbox-4.3.0/PKG-INFO
--- old/pynetbox-4.2.5/PKG-INFO 2020-02-11 04:34:29.000000000 +0100
+++ new/pynetbox-4.3.0/PKG-INFO 2020-03-16 22:20:52.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: pynetbox
-Version: 4.2.5
+Version: 4.3.0
Summary: NetBox API client library
Home-page: https://github.com/digitalocean/pynetbox
Author: Zach Moody
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pynetbox-4.2.5/README.md new/pynetbox-4.3.0/README.md
--- old/pynetbox-4.2.5/README.md 2020-02-11 04:34:14.000000000 +0100
+++ new/pynetbox-4.3.0/README.md 2020-03-16 22:20:37.000000000 +0100
@@ -38,3 +38,13 @@
[test1-leaf1, test1-leaf2]
```
+### Threading
+
+pynetbox supports multithreaded calls (in Python 3 only) for `.filter()` and
`.all()` queries. It is **highly recommended** you have `MAX_PAGE_SIZE` in your
Netbox install set to anything *except* `0` or `None`. The default value of
`1000` is usually a good value to use. To enable threading, add
`threading=True` parameter to the `.api`:
+
+```python
+nb = pynetbox.api(
+ 'http://localhost:8000',
+ threading=True,
+)
+```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pynetbox-4.2.5/pynetbox/api.py
new/pynetbox-4.3.0/pynetbox/api.py
--- old/pynetbox-4.2.5/pynetbox/api.py 2020-02-11 04:34:14.000000000 +0100
+++ new/pynetbox-4.3.0/pynetbox/api.py 2020-03-16 22:20:37.000000000 +0100
@@ -13,6 +13,8 @@
See the License for the specific language governing permissions and
limitations under the License.
"""
+import sys
+
import requests
from pynetbox.core.endpoint import Endpoint
@@ -152,6 +154,7 @@
private_key=None,
private_key_file=None,
ssl_verify=True,
+ threading=False,
):
if private_key and private_key_file:
raise ValueError(
@@ -165,6 +168,10 @@
self.ssl_verify = ssl_verify
self.session_key = None
self.http_session = requests.Session()
+ if threading and sys.version_info.major == 2:
+ raise NotImplementedError("Threaded pynetbox calls not supported \
+ in Python 2")
+ self.threading = threading
if self.private_key_file:
with open(self.private_key_file, "r") as kf:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pynetbox-4.2.5/pynetbox/core/endpoint.py
new/pynetbox-4.3.0/pynetbox/core/endpoint.py
--- old/pynetbox-4.2.5/pynetbox/core/endpoint.py 2020-02-11
04:34:14.000000000 +0100
+++ new/pynetbox-4.3.0/pynetbox/core/endpoint.py 2020-03-16
22:20:37.000000000 +0100
@@ -96,6 +96,7 @@
session_key=self.session_key,
ssl_verify=self.ssl_verify,
http_session=self.api.http_session,
+ threading=self.api.threading,
)
return [self._response_loader(i) for i in req.get()]
@@ -220,6 +221,7 @@
session_key=self.session_key,
ssl_verify=self.ssl_verify,
http_session=self.api.http_session,
+ threading=self.api.threading,
)
ret = [self._response_loader(i) for i in req.get()]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pynetbox-4.2.5/pynetbox/core/query.py
new/pynetbox-4.3.0/pynetbox/core/query.py
--- old/pynetbox-4.2.5/pynetbox/core/query.py 2020-02-11 04:34:14.000000000
+0100
+++ new/pynetbox-4.3.0/pynetbox/core/query.py 2020-03-16 22:20:37.000000000
+0100
@@ -13,6 +13,10 @@
See the License for the specific language governing permissions and
limitations under the License.
"""
+try:
+ import concurrent.futures as cf
+except ImportError:
+ pass
import json
from six.moves.urllib.parse import urlencode
@@ -28,6 +32,11 @@
return "?{}".format(urlencode(param_dict))
+def calc_pages(limit, count):
+ """ Calculate number of pages required for full results set. """
+ return int(count / limit) + (limit % count > 0)
+
+
class RequestError(Exception):
"""Basic Request Exception
@@ -141,6 +150,7 @@
session_key=None,
ssl_verify=True,
url=None,
+ threading=False,
):
"""
Instantiates a new Request object
@@ -164,6 +174,7 @@
self.ssl_verify = ssl_verify
self.http_session = http_session
self.url = self.base if not key else "{}{}/".format(self.base, key)
+ self.threading = threading
def get_version(self):
""" Gets the API version of NetBox.
@@ -262,6 +273,19 @@
else:
raise RequestError(req)
+ def concurrent_get(self, ret, page_size, page_offsets):
+ futures_to_results = []
+ with cf.ThreadPoolExecutor(max_workers=4) as pool:
+ for offset in page_offsets:
+ new_params = {"offset": offset, "limit": page_size}
+ futures_to_results.append(
+ pool.submit(self._make_call, add_params=new_params)
+ )
+
+ for future in cf.as_completed(futures_to_results):
+ result = future.result()
+ ret.extend(result["results"])
+
def get(self, add_params=None):
"""Makes a GET request.
@@ -297,6 +321,32 @@
else:
return req
+ def req_all_threaded(add_params):
+ if add_params is None:
+ # Limit must be 0 to discover the max page size
+ add_params = {"limit": 0}
+ req = self._make_call(add_params=add_params)
+ if isinstance(req, dict) and req.get("results") is not None:
+ ret = req["results"]
+ if req.get("next"):
+ page_size = len(req["results"])
+ pages = calc_pages(page_size, req["count"])
+ page_offsets = [
+ increment * page_size for increment in range(1, pages)
+ ]
+ if pages == 1:
+ req = self._make_call(url_override=req.get("next"))
+ ret.extend(req["results"])
+ else:
+ self.concurrent_get(ret, page_size, page_offsets)
+
+ return ret
+ else:
+ return req
+
+ if self.threading:
+ return req_all_threaded(add_params)
+
return req_all()
def put(self, data):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pynetbox-4.2.5/pynetbox.egg-info/PKG-INFO
new/pynetbox-4.3.0/pynetbox.egg-info/PKG-INFO
--- old/pynetbox-4.2.5/pynetbox.egg-info/PKG-INFO 2020-02-11
04:34:29.000000000 +0100
+++ new/pynetbox-4.3.0/pynetbox.egg-info/PKG-INFO 2020-03-16
22:20:52.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: pynetbox
-Version: 4.2.5
+Version: 4.3.0
Summary: NetBox API client library
Home-page: https://github.com/digitalocean/pynetbox
Author: Zach Moody