mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-23 04:22:01 -06:00
Remove release checkng background task
This commit is contained in:
parent
e173c8b548
commit
fa99263918
@ -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
|
@ -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
|
||||
)
|
@ -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,
|
||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user