From fa9926391891504a5e9a2e2dbe625fe62963fd8d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 7 Jul 2021 21:50:48 -0400 Subject: [PATCH] Remove release checkng background task --- netbox/netbox/releases.py | 32 ------- netbox/netbox/tests/test_releases.py | 138 --------------------------- netbox/netbox/views/__init__.py | 10 +- netbox/utilities/background_tasks.py | 42 -------- 4 files changed, 5 insertions(+), 217 deletions(-) delete mode 100644 netbox/netbox/releases.py delete mode 100644 netbox/netbox/tests/test_releases.py delete mode 100644 netbox/utilities/background_tasks.py diff --git a/netbox/netbox/releases.py b/netbox/netbox/releases.py deleted file mode 100644 index 57aa37e54..000000000 --- a/netbox/netbox/releases.py +++ /dev/null @@ -1,32 +0,0 @@ -import logging - -from django.conf import settings -from django.core.cache import cache -from django_rq import get_queue - -from utilities.background_tasks import get_releases - -logger = logging.getLogger('netbox.releases') - - -def get_latest_release(pre_releases=False): - if settings.RELEASE_CHECK_URL: - logger.debug("Checking for most recent release") - latest_release = cache.get('latest_release') - if latest_release: - logger.debug(f"Found cached release: {latest_release}") - return latest_release - else: - # Check for an existing job. This can happen if the RQ worker process is not running. - queue = get_queue('check_releases') - if queue.jobs: - logger.warning("Job to check for new releases is already queued; skipping") - else: - # Get the releases in the background worker, it will fill the cache - logger.info("Initiating background task to retrieve updated releases list") - get_releases.delay(pre_releases=pre_releases) - - else: - logger.debug("Skipping release check; RELEASE_CHECK_URL not defined") - - return 'unknown', None diff --git a/netbox/netbox/tests/test_releases.py b/netbox/netbox/tests/test_releases.py deleted file mode 100644 index 5af25754c..000000000 --- a/netbox/netbox/tests/test_releases.py +++ /dev/null @@ -1,138 +0,0 @@ -from io import BytesIO -from logging import ERROR -from unittest.mock import Mock, patch - -import requests -from django.conf import settings -from django.core.cache import cache -from django.test import SimpleTestCase, override_settings -from packaging.version import Version -from requests import Response - -from utilities.background_tasks import get_releases - - -def successful_github_response(url, *_args, **_kwargs): - r = Response() - r.url = url - r.status_code = 200 - r.reason = 'OK' - r.headers = { - 'Content-Type': 'application/json; charset=utf-8', - } - r.raw = BytesIO(b'''[ - { - "html_url": "https://github.com/netbox-community/netbox/releases/tag/v2.7.8", - "tag_name": "v2.7.8", - "prerelease": false - }, - { - "html_url": "https://github.com/netbox-community/netbox/releases/tag/v2.6-beta1", - "tag_name": "v2.6-beta1", - "prerelease": true - }, - { - "html_url": "https://github.com/netbox-community/netbox/releases/tag/v2.5.9", - "tag_name": "v2.5.9", - "prerelease": false - } - ] - ''') - return r - - -def unsuccessful_github_response(url, *_args, **_kwargs): - r = Response() - r.url = url - r.status_code = 404 - r.reason = 'Not Found' - r.headers = { - 'Content-Type': 'application/json; charset=utf-8', - } - r.raw = BytesIO(b'''{ - "message": "Not Found", - "documentation_url": "https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository" - } - ''') - return r - - -@override_settings(RELEASE_CHECK_URL='https://localhost/unittest/releases', RELEASE_CHECK_TIMEOUT=160876) -class GetReleasesTestCase(SimpleTestCase): - @patch.object(requests, 'get') - @patch.object(cache, 'set') - def test_pre_releases(self, dummy_cache_set: Mock, dummy_request_get: Mock): - dummy_request_get.side_effect = successful_github_response - - releases = get_releases(pre_releases=True) - - # Check result - self.assertListEqual(releases, [ - (Version('2.7.8'), 'https://github.com/netbox-community/netbox/releases/tag/v2.7.8'), - (Version('2.6b1'), 'https://github.com/netbox-community/netbox/releases/tag/v2.6-beta1'), - (Version('2.5.9'), 'https://github.com/netbox-community/netbox/releases/tag/v2.5.9') - ]) - - # Check if correct request is made - dummy_request_get.assert_called_once_with( - 'https://localhost/unittest/releases', - headers={'Accept': 'application/vnd.github.v3+json'}, - proxies=settings.HTTP_PROXIES - ) - - # Check if result is put in cache - dummy_cache_set.assert_called_once_with( - 'latest_release', - max(releases), - 160876 - ) - - @patch.object(requests, 'get') - @patch.object(cache, 'set') - def test_no_pre_releases(self, dummy_cache_set: Mock, dummy_request_get: Mock): - dummy_request_get.side_effect = successful_github_response - - releases = get_releases(pre_releases=False) - - # Check result - self.assertListEqual(releases, [ - (Version('2.7.8'), 'https://github.com/netbox-community/netbox/releases/tag/v2.7.8'), - (Version('2.5.9'), 'https://github.com/netbox-community/netbox/releases/tag/v2.5.9') - ]) - - # Check if correct request is made - dummy_request_get.assert_called_once_with( - 'https://localhost/unittest/releases', - headers={'Accept': 'application/vnd.github.v3+json'}, - proxies=settings.HTTP_PROXIES - ) - - # Check if result is put in cache - dummy_cache_set.assert_called_once_with( - 'latest_release', - max(releases), - 160876 - ) - - @patch.object(requests, 'get') - def test_failed_request(self, dummy_request_get: Mock): - dummy_request_get.side_effect = unsuccessful_github_response - - with self.assertLogs(level=ERROR) as cm: - releases = get_releases() - - # Check log entry - self.assertEqual(len(cm.output), 1) - log_output = cm.output[0] - last_log_line = log_output.split('\n')[-1] - self.assertRegex(last_log_line, '404 .* Not Found') - - # Check result - self.assertListEqual(releases, []) - - # Check if correct request is made - dummy_request_get.assert_called_once_with( - 'https://localhost/unittest/releases', - headers={'Accept': 'application/vnd.github.v3+json'}, - proxies=settings.HTTP_PROXIES - ) diff --git a/netbox/netbox/views/__init__.py b/netbox/netbox/views/__init__.py index d54c79e10..ccd383c1f 100644 --- a/netbox/netbox/views/__init__.py +++ b/netbox/netbox/views/__init__.py @@ -3,6 +3,7 @@ import sys from django.conf import settings from django.contrib.contenttypes.models import ContentType +from django.core.cache import cache from django.db.models import F from django.http import HttpResponseServerError from django.shortcuts import redirect, render @@ -23,7 +24,6 @@ from extras.models import ObjectChange, JobResult from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF from netbox.constants import SEARCH_MAX_RESULTS, SEARCH_TYPES from netbox.forms import SearchForm -from netbox.releases import get_latest_release from tenancy.models import Tenant from virtualization.models import Cluster, VirtualMachine @@ -119,10 +119,10 @@ class HomeView(View): # Check whether a new release is available. (Only for staff/superusers.) new_release = None if request.user.is_staff or request.user.is_superuser: - latest_release, release_url = get_latest_release() - if isinstance(latest_release, version.Version): - current_version = version.parse(settings.VERSION) - if latest_release > current_version: + latest_release = cache.get('latest_release') + if latest_release: + release_version, release_url = latest_release + if release_version > version.parse(settings.VERSION): new_release = { 'version': str(latest_release), 'url': release_url, diff --git a/netbox/utilities/background_tasks.py b/netbox/utilities/background_tasks.py deleted file mode 100644 index e0af6ebef..000000000 --- a/netbox/utilities/background_tasks.py +++ /dev/null @@ -1,42 +0,0 @@ -import logging - -import requests -from django.conf import settings -from django.core.cache import cache -from django_rq import job -from packaging import version - -# Get an instance of a logger -logger = logging.getLogger('netbox.releases') - - -@job('check_releases') -def get_releases(pre_releases=False): - url = settings.RELEASE_CHECK_URL - headers = { - 'Accept': 'application/vnd.github.v3+json', - } - releases = [] - - try: - logger.info(f"Fetching new releases from {url}") - response = requests.get(url, headers=headers, proxies=settings.HTTP_PROXIES) - response.raise_for_status() - total_releases = len(response.json()) - - for release in response.json(): - if 'tag_name' not in release: - continue - if not pre_releases and (release.get('devrelease') or release.get('prerelease')): - continue - releases.append((version.parse(release['tag_name']), release.get('html_url'))) - logger.debug(f"Found {total_releases} releases; {len(releases)} usable") - - except requests.exceptions.RequestException as exc: - logger.exception(f"Error while fetching latest release from {url}: {exc}") - return [] - - # Cache the most recent release - cache.set('latest_release', max(releases), settings.RELEASE_CHECK_TIMEOUT) - - return releases