Skip to content

Commit

Permalink
Celery task to clear schedule was added (getredash#3801)
Browse files Browse the repository at this point in the history
* Celery task to clear schedule was added

* fix formating

* empty_schedules task was put in separate task

* worker interval changed, new tests added

* past artifact deleted

* test queries moved to right class, lambda was used to filter data

* unnecessary changes eliminated

* more unnecessary files deleted

* line shortened

* Line shortened more

* codeclimate changes

* Unused test deleted, logs added
  • Loading branch information
aidarbek authored and arikfr committed Jun 12, 2019
1 parent 4e0a251 commit 2bab144
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 1 deletion.
16 changes: 16 additions & 0 deletions redash/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,22 @@ def by_user(cls, user):
def by_api_key(cls, api_key):
return cls.query.filter(cls.api_key == api_key).one()

@classmethod
def past_scheduled_queries(cls):
now = utils.utcnow()
queries = (
Query.query
.filter(Query.schedule.isnot(None))
.order_by(Query.id)
)
return filter(
lambda x:
x.schedule["until"] is not None and pytz.utc.localize(
datetime.datetime.strptime(x.schedule['until'], '%Y-%m-%d')
) <= now,
queries
)

@classmethod
def outdated_queries(cls):
queries = (
Expand Down
2 changes: 1 addition & 1 deletion redash/tasks/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from .general import record_event, version_check, send_mail, sync_user_details
from .queries import QueryTask, refresh_queries, refresh_schemas, cleanup_query_results, execute_query
from .queries import QueryTask, refresh_queries, refresh_schemas, cleanup_query_results, execute_query, empty_schedules
from .alerts import check_alerts_for_query
12 changes: 12 additions & 0 deletions redash/tasks/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,18 @@ def enqueue_query(query, data_source, user_id, is_api_key=False, scheduled_query
return job


@celery.task(name="redash.tasks.empty_schedules")
def empty_schedules():
logger.info("Deleting schedules of past scheduled queries...")

queries = models.Query.past_scheduled_queries()
for query in queries:
query.schedule = None
models.db.session.commit()

logger.info("Deleted %d schedules.", len(queries))


@celery.task(name="redash.tasks.refresh_queries")
def refresh_queries():
logger.info("Refreshing queries...")
Expand Down
4 changes: 4 additions & 0 deletions redash/worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
'task': 'redash.tasks.refresh_queries',
'schedule': timedelta(seconds=30)
},
'empty_schedules': {
'task': 'redash.tasks.empty_schedules',
'schedule': timedelta(minutes=60)
},
'refresh_schemas': {
'task': 'redash.tasks.refresh_schemas',
'schedule': timedelta(minutes=settings.SCHEMAS_REFRESH_SCHEDULE)
Expand Down
13 changes: 13 additions & 0 deletions tests/models/test_queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import datetime
from redash.models import Query, Group, Event, db
from redash.utils import utcnow
import mock


class QueryTest(BaseTestCase):
Expand Down Expand Up @@ -170,6 +171,18 @@ def test_search_query_parser_emails(self):
self.assertNotIn(q1, queries)
self.assertIn(q2, queries)

def test_past_scheduled_queries(self):
query = self.factory.create_query()
one_day_ago = (utcnow() - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
one_day_later = (utcnow() + datetime.timedelta(days=1)).strftime("%Y-%m-%d")
query1 = self.factory.create_query(schedule={'interval':'3600','until':one_day_ago})
query2 = self.factory.create_query(schedule={'interval':'3600','until':one_day_later})
oq = staticmethod(lambda: [query1, query2])
with mock.patch.object(query.query.filter(), 'order_by', oq):
res = query.past_scheduled_queries()
self.assertTrue(query1 in res)
self.assertFalse(query2 in res)


class QueryRecentTest(BaseTestCase):
def test_global_recent(self):
Expand Down
16 changes: 16 additions & 0 deletions tests/tasks/test_empty_schedule.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import datetime
from mock import patch
from tests import BaseTestCase
from redash.tasks import empty_schedules
from redash.models import Query
from redash.utils import utcnow


class TestEmptyScheduleQuery(BaseTestCase):
def test_empty_schedules(self):
one_day_ago = (utcnow() - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
query = self.factory.create_query(schedule={'interval':'3600','until':one_day_ago})
oq = staticmethod(lambda: [query])
with patch.object(Query, 'past_scheduled_queries', oq):
empty_schedules()
self.assertEqual(query.schedule, None)

0 comments on commit 2bab144

Please sign in to comment.