mirror of
https://github.com/valitydev/redash.git
synced 2024-11-07 01:25:16 +00:00
5a5fdecdde
* add rq and an rq_worker service
* add rq_scheduler and an rq_scheduler service
* move beat schedule to periodic_jobs queue
* move version checks to RQ
* move query result cleanup to RQ
* use timedelta and DRY up a bit
* move custom tasks to RQ
* do actual schema refreshes in rq
* rename 'period_jobs' to 'periodic', as it obviously holds jobs
* move send_email to rq
* DRY up enqueues
* ditch and use a partially applied decorator
* move subscribe to rq
* move check_alerts_for_query to rq
* move record_event to rq
* make tests play nicely with rq
* 👋 beat
* rename rq_scheduler to plain scheduler, now that there's no Celery scheduler entrypoint
* add some color to rq-worker's output
* add logging context to rq jobs (while keeping execute_query context via get_task_logger for now)
* move schedule to its own module
* cancel previously scheduled periodic jobs. not sure this is a good idea.
* rename redash.scheduler to redash.schedule
* allow custom dynamic jobs to be added decleratively
* add basic monitoring to rq queues
* add worker monitoring
* pleasing the CodeClimate overlords
* adjust cypress docker-compose.yml to include rq changes
* DRY up Cypress docker-compose
* add rq dependencies to cypress docker-compose service
* an odd attempt at watching docker-compose logs when running with Cypress
* Revert "an odd attempt at watching docker-compose logs when running with Cypress"
This reverts commit 016bd1a93e3efa84a9f27d0f2acb972ce1957bcd.
* show docker-compose logs at Cypress shutdown
* Revert "DRY up Cypress docker-compose"
This reverts commit 43abac7084c207ab9e39192ac79d520448c2c527.
* minimal version for binding is 3.2
* remove unneccesary code reloads on cypress
* add a command which errors if any of the workers running inside the current machine haven't been active in the last minute
* SCHEMAS_REFRESH_QUEUE is no longer a required setting
* split tasks/queries.py to execution.py and maintenance.py
* fix tests after query execution split
* pleasing the CodeClimate overlords
* rename worker to celery_worker and rq_worker to worker
* use /rq_status instead of /jobs
* show started jobs' time ago according to UTC
* replace all spaces in column names
* fix query tests after execution split
* exit with an int
* general lint
* add an entrypoint for rq_healthcheck
* fix indentation
* delete all existing periodic jobs before scheduling them
* remove some unrequired requires
* move schedule example to redash.schedule
* add RQ integration to Sentry's setup
* pleasing the CodeClimate overlords
* remove replication settings from docker-compose - a proper way to scale using docker-compose would be the --scale CLI option, which will be described in the knowledge based
* revert to calling a function in dynamic settings to allow periodic jobs to be scheduled after app has been loaded
* don't need to depend on context when templating failure reports
* set the timeout_ttl to double the interval to avoid job results from expiring and having periodic jobs not reschedule
* whoops, bad merge
* describe custom jobs and don't actually schedule them
* fix merge
107 lines
4.3 KiB
Python
107 lines
4.3 KiB
Python
from mock import patch, call, ANY
|
|
from tests import BaseTestCase
|
|
from redash.tasks.queries.maintenance import refresh_queries
|
|
from redash.models import Query
|
|
|
|
ENQUEUE_QUERY = 'redash.tasks.queries.maintenance.enqueue_query'
|
|
|
|
class TestRefreshQuery(BaseTestCase):
|
|
def test_enqueues_outdated_queries(self):
|
|
"""
|
|
refresh_queries() launches an execution task for each query returned
|
|
from Query.outdated_queries().
|
|
"""
|
|
query1 = self.factory.create_query()
|
|
query2 = self.factory.create_query(
|
|
query_text="select 42;",
|
|
data_source=self.factory.create_data_source())
|
|
oq = staticmethod(lambda: [query1, query2])
|
|
with patch(ENQUEUE_QUERY) as add_job_mock, \
|
|
patch.object(Query, 'outdated_queries', oq):
|
|
refresh_queries()
|
|
self.assertEqual(add_job_mock.call_count, 2)
|
|
add_job_mock.assert_has_calls([
|
|
call(query1.query_text, query1.data_source, query1.user_id,
|
|
scheduled_query=query1, metadata=ANY),
|
|
call(query2.query_text, query2.data_source, query2.user_id,
|
|
scheduled_query=query2, metadata=ANY)], any_order=True)
|
|
|
|
def test_doesnt_enqueue_outdated_queries_for_paused_data_source(self):
|
|
"""
|
|
refresh_queries() does not launch execution tasks for queries whose
|
|
data source is paused.
|
|
"""
|
|
query = self.factory.create_query()
|
|
oq = staticmethod(lambda: [query])
|
|
query.data_source.pause()
|
|
with patch.object(Query, 'outdated_queries', oq):
|
|
with patch(ENQUEUE_QUERY) as add_job_mock:
|
|
refresh_queries()
|
|
add_job_mock.assert_not_called()
|
|
|
|
query.data_source.resume()
|
|
|
|
with patch(ENQUEUE_QUERY) as add_job_mock:
|
|
refresh_queries()
|
|
add_job_mock.assert_called_with(
|
|
query.query_text, query.data_source, query.user_id,
|
|
scheduled_query=query, metadata=ANY)
|
|
|
|
def test_enqueues_parameterized_queries(self):
|
|
"""
|
|
Scheduled queries with parameters use saved values.
|
|
"""
|
|
query = self.factory.create_query(
|
|
query_text="select {{n}}",
|
|
options={"parameters": [{
|
|
"global": False,
|
|
"type": "text",
|
|
"name": "n",
|
|
"value": "42",
|
|
"title": "n"}]})
|
|
oq = staticmethod(lambda: [query])
|
|
with patch(ENQUEUE_QUERY) as add_job_mock, \
|
|
patch.object(Query, 'outdated_queries', oq):
|
|
refresh_queries()
|
|
add_job_mock.assert_called_with(
|
|
"select 42", query.data_source, query.user_id,
|
|
scheduled_query=query, metadata=ANY)
|
|
|
|
def test_doesnt_enqueue_parameterized_queries_with_invalid_parameters(self):
|
|
"""
|
|
Scheduled queries with invalid parameters are skipped.
|
|
"""
|
|
query = self.factory.create_query(
|
|
query_text="select {{n}}",
|
|
options={"parameters": [{
|
|
"global": False,
|
|
"type": "text",
|
|
"name": "n",
|
|
"value": 42, # <-- should be text!
|
|
"title": "n"}]})
|
|
oq = staticmethod(lambda: [query])
|
|
with patch(ENQUEUE_QUERY) as add_job_mock, \
|
|
patch.object(Query, 'outdated_queries', oq):
|
|
refresh_queries()
|
|
add_job_mock.assert_not_called()
|
|
|
|
def test_doesnt_enqueue_parameterized_queries_with_dropdown_queries_that_are_detached_from_data_source(self):
|
|
"""
|
|
Scheduled queries with a dropdown parameter which points to a query that is detached from its data source are skipped.
|
|
"""
|
|
query = self.factory.create_query(
|
|
query_text="select {{n}}",
|
|
options={"parameters": [{
|
|
"global": False,
|
|
"type": "query",
|
|
"name": "n",
|
|
"queryId": 100,
|
|
"title": "n"}]})
|
|
|
|
dropdown_query = self.factory.create_query(id=100, data_source=None)
|
|
|
|
oq = staticmethod(lambda: [query])
|
|
with patch(ENQUEUE_QUERY) as add_job_mock, \
|
|
patch.object(Query, 'outdated_queries', oq):
|
|
refresh_queries()
|
|
add_job_mock.assert_not_called() |