Move all version check logic into a module of its own

This commit is contained in:
Arik Fraimovich
2015-11-30 17:05:40 +02:00
parent becb4decf1
commit 60cdb85cc4
4 changed files with 59 additions and 30 deletions

View File

@@ -38,3 +38,6 @@ mail.init_mail(settings.all_settings())
statsd_client = StatsClient(host=settings.STATSD_HOST, port=settings.STATSD_PORT, prefix=settings.STATSD_PREFIX)
import_query_runners(settings.QUERY_RUNNERS)
from redash.version_check import reset_new_version_status
reset_new_version_status()

View File

@@ -6,6 +6,7 @@ from flask_login import current_user, login_required
from redash import settings, __version__, redis_connection
from redash.wsgi import app
from redash.version_check import get_latest_version
@app.route('/admin/<anything>/<whatever>')
@@ -42,7 +43,7 @@ def index(**kwargs):
'highChartsTurboThreshold': settings.HIGHCHARTS_TURBO_THRESHOLD,
'dateFormat': settings.DATE_FORMAT,
'dateTimeFormat': "{0} HH:mm".format(settings.DATE_FORMAT),
'newVersionAvailable': redis_connection.get('new_version_available'),
'newVersionAvailable': get_latest_version(),
'version': __version__
}

View File

@@ -1,18 +1,16 @@
import time
import logging
import signal
import requests
import semver
from flask.ext.mail import Message
import redis
from celery import Task
from celery.result import AsyncResult
from celery.utils.log import get_task_logger
from redash import redis_connection, models, statsd_client, settings, utils, mail
from redash.utils import gen_query_hash, json_dumps
from redash.utils import gen_query_hash
from redash.worker import celery
from redash.query_runner import get_query_runner, InterruptException
from redash import __version__ as current_version
from version_check import run_version_check
logger = get_task_logger(__name__)
@@ -330,28 +328,4 @@ def record_event(event):
@celery.task(base=BaseTask)
def version_check():
logger.info("Performing version check.")
logger.info("Current version: %s", current_version)
data = json_dumps({
'current_version': current_version
})
headers = {'content-type': 'application/json'}
try:
response = requests.post('https://version.redash.io/api/report?channel=stable',
data=data, headers=headers, timeout=3.0)
latest_version = response.json()['release']['version']
# TODO: support alpha channel (allow setting which channel to check & parse build number)
is_newer = semver.compare(current_version, latest_version) == -1
logger.info("Latest version: %s (newer: %s)", latest_version, is_newer)
if is_newer:
redis_connection.set("new_version_available", latest_version)
else:
redis_connection.delete("new_version_available")
except requests.RequestException:
logging.exception("Failed checking for new version.")
except (ValueError, KeyError):
logging.exception("Failed checking for new version (probably bad/non-JSON response).")
run_version_check()

51
redash/version_check.py Normal file
View File

@@ -0,0 +1,51 @@
import logging
import requests
import semver
from redash import __version__ as current_version
from redash import redis_connection
from redash.utils import json_dumps
REDIS_KEY = "new_version_available"
def run_version_check():
logging.info("Performing version check.")
logging.info("Current version: %s", current_version)
data = json_dumps({
'current_version': current_version
})
headers = {'content-type': 'application/json'}
try:
response = requests.post('https://version.redash.io/api/report?channel=stable',
data=data, headers=headers, timeout=3.0)
latest_version = response.json()['release']['version']
_compare_and_update(latest_version)
except requests.RequestException:
logging.exception("Failed checking for new version.")
except (ValueError, KeyError):
logging.exception("Failed checking for new version (probably bad/non-JSON response).")
def reset_new_version_status():
latest_version = get_latest_version()
if latest_version:
_compare_and_update(latest_version)
def get_latest_version():
return redis_connection.get(REDIS_KEY)
def _compare_and_update(latest_version):
# TODO: support alpha channel (allow setting which channel to check & parse build number)
is_newer = semver.compare(current_version, latest_version) == -1
logging.info("Latest version: %s (newer: %s)", latest_version, is_newer)
if is_newer:
redis_connection.set(REDIS_KEY, latest_version)
else:
redis_connection.delete(REDIS_KEY)