Skip to content

Commit 993f926

Browse files
authored
Merge pull request #228 from globocom/task_history_api
Task history api
2 parents 35bf977 + 8d2cafd commit 993f926

File tree

9 files changed

+144
-33
lines changed

9 files changed

+144
-33
lines changed

dbaas/backup/tasks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ def make_instance_snapshot_backup(instance, error):
193193

194194

195195
@app.task(bind=True)
196-
@only_one(key="makedatabasebackupkey", timeout=1200)
196+
@only_one(key="makedatabasebackupkey")
197197
def make_databases_backup(self):
198198

199199
LOG.info("Making databases backups")
@@ -269,7 +269,7 @@ def remove_snapshot_backup(snapshot):
269269

270270

271271
@app.task(bind=True)
272-
@only_one(key="removedatabaseoldbackupkey", timeout=1200)
272+
@only_one(key="removedatabaseoldbackupkey")
273273
def remove_database_old_backups(self):
274274

275275
worker_name = get_worker_name()

dbaas/dbaas/urls.py

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,26 @@
99

1010
admin.autodiscover()
1111

12-
urlpatterns = patterns('',
13-
# Examples:
14-
url(r'^$', RedirectView.as_view(
15-
url='/admin'), name='home'),
16-
# url(r'^dbaas/', include('dbaas.foo.urls')),
17-
18-
# Uncomment the admin/doc line below to enable admin documentation:
19-
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
20-
21-
# Uncomment the next line to enable the admin:
22-
url(r'^admin/', include(admin.site.urls)),
23-
url(r'^dashboard/', include('dashboard.urls')),
24-
url(r'^([^/]+)/tsuru/', include('tsuru.urls'),),
25-
url(r'^logical/', include('logical.urls')),
26-
url(r'^account/', include('account.urls')),
27-
url(r'^system/', include('system.urls')),
28-
url('^api/', include(api.urls)),
29-
url('^extra_dns/', include('extra_dns.urls')),
30-
# url(r'^acl/', include('dbaas_aclapi.urls')),
31-
url(r'^admin/', include('dbaas_services.analyzing.urls')),
32-
(r'^ckeditor/', include('ckeditor.urls')),
33-
)
12+
urlpatterns = patterns(
13+
'',
14+
url(r'^$', RedirectView.as_view(url='/admin'), name='home'),
15+
url(r'^admin/', include(admin.site.urls)),
16+
url(r'^dashboard/', include('dashboard.urls')),
17+
url(r'^([^/]+)/tsuru/', include('tsuru.urls')),
18+
url(r'^logical/', include('logical.urls')),
19+
url(r'^account/', include('account.urls')),
20+
url(r'^system/', include('system.urls')),
21+
url('^api/', include(api.urls)),
22+
url('^extra_dns/', include('extra_dns.urls')),
23+
url(r'^admin/', include('dbaas_services.analyzing.urls')),
24+
url(r'^notification/', include('notification.urls'), name="notification"),
25+
url(r'^ckeditor/', include('ckeditor.urls')),
26+
)
3427

3528
# django flatpages
36-
urlpatterns += patterns('django.contrib.flatpages.views',
37-
(r'^(?P<url>.*/)$', 'flatpage'),)
29+
urlpatterns += patterns(
30+
'django.contrib.flatpages.views', (r'^(?P<url>.*/)$', 'flatpage'),
31+
)
3832

3933
if settings.DEBUG:
4034
urlpatterns += staticfiles_urlpatterns()

dbaas/notification/models.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,11 @@ def register(cls, request=None, user=None, task_history=None, worker_name=None):
176176
task_history.save()
177177

178178
return task_history
179+
180+
@classmethod
181+
def running_tasks(cls):
182+
return cls.objects.filter(task_status=cls.STATUS_RUNNING)
183+
184+
@classmethod
185+
def waiting_tasks(cls):
186+
return cls.objects.filter(task_status=cls.STATUS_WAITING)

dbaas/notification/tests/factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
from .. import models
55

66

7-
class NotificationHistoryFactory(factory.DjangoModelFactory):
7+
class TaskHistoryFactory(factory.DjangoModelFactory):
88
FACTORY_FOR = models.TaskHistory
99

1010
task_name = factory.Sequence(lambda n: 'task_name_{0}'.format(n))
1111
task_id = factory.Sequence(lambda n: 'task_id_{0}'.format(n))
1212
user = factory.Sequence(lambda n: 'user_{0}'.format(n))
13-
task_status = "PENDING"
13+
task_status = models.TaskHistory.STATUS_PENDING

dbaas/notification/tests/test_disk_resize.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from physical.tests import factory as physical_factory
66
from logical.tests import factory as logical_factory
77
from ..tasks_disk_resize import update_disk
8-
from .factory import NotificationHistoryFactory
8+
from .factory import TaskHistoryFactory
99

1010
UPDATE_USED_SIZE_SUCCESS = '---> Used disk size updated. NFS: {}'
1111
UPDATE_USED_SIZE_WRONG_HOST = '---> {} not found for: {}'
@@ -16,7 +16,7 @@
1616
class DiskResizeTestCase(TestCase):
1717

1818
def setUp(self):
19-
self.task = NotificationHistoryFactory()
19+
self.task = TaskHistoryFactory()
2020
self.instance = physical_factory.InstanceFactory()
2121
self.databaseinfra = self.instance.databaseinfra
2222

dbaas/notification/tests/test_task_history.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import absolute_import
33
from django.test import TestCase
4-
from .factory import NotificationHistoryFactory
4+
from notification.models import TaskHistory
5+
from notification.tests.factory import TaskHistoryFactory
56

67

78
class TaskHistoryTestCase(TestCase):
89

910
def setUp(self):
10-
self.task = NotificationHistoryFactory()
11+
self.task = TaskHistoryFactory()
1112

1213
def test_can_add_message_detail(self):
1314
self.assertIsNone(self.task.details)
@@ -26,3 +27,27 @@ def test_can_add_message_detail_with_level(self):
2627

2728
self.task.add_detail(message='Again, with new line', level=2)
2829
self.assertEqual('-> Testing\n--> Again, with new line', self.task.details)
30+
31+
def test_can_get_running_tasks(self):
32+
self.task.task_status = TaskHistory.STATUS_RUNNING
33+
self.task.save()
34+
35+
tasks = TaskHistory.running_tasks()
36+
self.assertIsNotNone(tasks)
37+
self.assertIn(self.task, tasks)
38+
39+
def test_can_get_running_tasks_empty(self):
40+
tasks = TaskHistory.running_tasks()
41+
self.assertEqual(len(tasks), 0)
42+
43+
def test_can_get_waiting_tasks(self):
44+
self.task.task_status = TaskHistory.STATUS_WAITING
45+
self.task.save()
46+
47+
tasks = TaskHistory.waiting_tasks()
48+
self.assertIsNotNone(tasks)
49+
self.assertIn(self.task, tasks)
50+
51+
def test_can_get_waiting_tasks_empty(self):
52+
tasks = TaskHistory.waiting_tasks()
53+
self.assertEqual(len(tasks), 0)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import absolute_import
3+
from json import loads
4+
from django.test import TestCase
5+
from django.core.urlresolvers import reverse
6+
from notification.models import TaskHistory
7+
from notification.views import running_tasks_api, waiting_tasks_api
8+
from notification.tests.factory import TaskHistoryFactory
9+
10+
11+
class UrlTest(TestCase):
12+
13+
def test_can_access_tasks_running(self):
14+
url = reverse(running_tasks_api)
15+
response = self.client.get(url)
16+
self.assertEqual(response.status_code, 200)
17+
18+
tasks = loads(response.content)
19+
self.assertEqual(len(tasks), 0)
20+
21+
def test_find_tasks_running(self):
22+
task_running = TaskHistoryFactory()
23+
task_running.task_status = TaskHistory.STATUS_RUNNING
24+
task_running.save()
25+
task_pending = TaskHistoryFactory()
26+
27+
url = reverse(running_tasks_api)
28+
response = self.client.get(url)
29+
tasks = loads(response.content)
30+
31+
self.assertIn(str(task_running.id), tasks)
32+
self.assertEqual(tasks[str(task_running.id)], task_running.task_name)
33+
self.assertNotIn(str(task_pending.id), tasks)
34+
35+
def test_can_access_tasks_waiting(self):
36+
url = reverse(waiting_tasks_api)
37+
response = self.client.get(url)
38+
self.assertEqual(response.status_code, 200)
39+
40+
tasks = loads(response.content)
41+
self.assertEqual(len(tasks), 0)
42+
43+
def test_find_tasks_waiting(self):
44+
task_waiting = TaskHistoryFactory()
45+
task_waiting.task_status = TaskHistory.STATUS_WAITING
46+
task_waiting.save()
47+
task_pending = TaskHistoryFactory()
48+
49+
url = reverse(waiting_tasks_api)
50+
response = self.client.get(url)
51+
tasks = loads(response.content)
52+
53+
self.assertIn(str(task_waiting.id), tasks)
54+
self.assertEqual(tasks[str(task_waiting.id)], task_waiting.task_name)
55+
self.assertNotIn(str(task_pending.id), tasks)

dbaas/notification/urls.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# -*- coding: utf-8 -*-
2+
from django.conf.urls import patterns, url
3+
import views
4+
5+
6+
urlpatterns = patterns(
7+
views,
8+
url(r"^tasks_running/$", views.running_tasks_api, name="notification:tasks_running"),
9+
url(r"^tasks_waiting/$", views.waiting_tasks_api, name="notification:tasks_waiting"),
10+
)

dbaas/notification/views.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,20 @@
1-
# Create your views here.
1+
# -*- coding: utf-8 -*-
2+
from json import dumps
3+
from django.http import HttpResponse
4+
from models import TaskHistory
5+
6+
7+
def running_tasks_api(self):
8+
tasks = TaskHistory.running_tasks()
9+
response_json = dumps({
10+
task.id: task.task_name for task in tasks
11+
})
12+
return HttpResponse(response_json, content_type="application/json")
13+
14+
15+
def waiting_tasks_api(self):
16+
tasks = TaskHistory.waiting_tasks()
17+
response_json = dumps({
18+
task.id: task.task_name for task in tasks
19+
})
20+
return HttpResponse(response_json, content_type="application/json")

0 commit comments

Comments
 (0)