From 8ce106cb4b82eb7cd55c129868aa9e317d65dd16 Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Thu, 27 Feb 2020 19:36:02 +0100 Subject: [PATCH] Move request to background task --- netbox/utilities/background_tasks.py | 40 +++++++++++++++++++++++++++ netbox/utilities/releases.py | 41 ++++++++++------------------ 2 files changed, 55 insertions(+), 26 deletions(-) create mode 100644 netbox/utilities/background_tasks.py diff --git a/netbox/utilities/background_tasks.py b/netbox/utilities/background_tasks.py new file mode 100644 index 000000000..d3810705c --- /dev/null +++ b/netbox/utilities/background_tasks.py @@ -0,0 +1,40 @@ +import logging + +import requests +from cacheops import cache +from django.conf import settings +from django_rq import job +from packaging import version + +# Get an instance of a logger +logger = logging.getLogger(__name__) + + +@job +def get_releases(pre_releases=False): + url = '{}/releases'.format(settings.UPDATE_REPO_URL) + headers = { + 'Accept': 'application/vnd.github.v3+json', + } + + releases = [] + + # noinspection PyBroadException + try: + response = requests.get(url, headers=headers) + for release in response.json(): + if 'tag_name' not in release: + continue + + if not pre_releases and (release.get('is_devrelease') or release.get('is_prerelease')): + continue + + releases.append((version.parse(release['tag_name']), release.get('html_url'))) + except Exception: + logger.exception("Error while fetching {}".format(url)) + return [] + + logger.debug("Found NetBox releases {}".format([str(release) for release, url in releases])) + + cache.set('netbox_releases', releases, settings.UPDATE_CACHE_TIMEOUT) + return releases diff --git a/netbox/utilities/releases.py b/netbox/utilities/releases.py index 30ee8c295..1374957a2 100644 --- a/netbox/utilities/releases.py +++ b/netbox/utilities/releases.py @@ -1,35 +1,24 @@ -import requests -from cacheops import cached +import logging + +from cacheops import CacheMiss, cache from django.conf import settings -from packaging import version +from utilities.background_tasks import get_releases -@cached(timeout=settings.UPDATE_CACHE_TIMEOUT, extra=settings.UPDATE_REPO_URL) -def get_releases(pre_releases=False): - url = '{}/releases'.format(settings.UPDATE_REPO_URL) - headers = { - 'Accept': 'application/vnd.github.v3+json', - } - try: - response = requests.get(url, headers=headers) - releases = [(version.parse(release['tag_name']), release.get('html_url')) - for release in response.json() - if 'tag_name' in release] - except Exception: - releases = [] - - if not pre_releases: - releases = [(release, url) - for release, url in releases - if not release.is_devrelease and not release.is_prerelease] - - return releases +# Get an instance of a logger +logger = logging.getLogger(__name__) def get_latest_release(pre_releases=False): if settings.UPDATE_REPO_URL: - releases = get_releases(pre_releases) - if releases: - return max(releases) + try: + releases = cache.get('netbox_releases') + if releases: + return max(releases) + except CacheMiss: + logger.debug("Starting background task to get releases") + + # Get the releases in the background worker, it will fill the cache + get_releases.delay(pre_releases=pre_releases) return 'unknown', None