Initial scheduler integration

This commit is contained in:
Matthew Jones
2014-03-27 15:53:32 -04:00
parent 29a8b46e2f
commit 107fc85110
7 changed files with 144 additions and 61 deletions

View File

@@ -8,6 +8,7 @@ import socket
import urlparse
import logging
import os.path
from dateutil import rrule
# PyYAML
import yaml
@@ -503,6 +504,7 @@ class ProjectSerializer(UnifiedJobTemplateSerializer, ProjectOptionsSerializer):
playbooks = reverse('api:project_playbooks', args=(obj.pk,)),
update = reverse('api:project_update_view', args=(obj.pk,)),
project_updates = reverse('api:project_updates_list', args=(obj.pk,)),
schedules = reverse('api:project_schedules_list', args=(obj.pk,)),
activity_stream = reverse('api:project_activity_stream_list', args=(obj.pk,)),
))
# Backwards compatibility.
@@ -861,6 +863,7 @@ class InventorySourceSerializer(UnifiedJobTemplateSerializer, InventorySourceOpt
res.update(dict(
update = reverse('api:inventory_source_update_view', args=(obj.pk,)),
inventory_updates = reverse('api:inventory_source_updates_list', args=(obj.pk,)),
schedules = reverse('api:inventory_source_schedules_list', args=(obj.pk,)),
activity_stream = reverse('api:inventory_activity_stream_list', args=(obj.pk,)),
#hosts = reverse('api:inventory_source_hosts_list', args=(obj.pk,)),
#groups = reverse('api:inventory_source_groups_list', args=(obj.pk,)),
@@ -1081,6 +1084,7 @@ class JobTemplateSerializer(UnifiedJobTemplateSerializer, JobOptionsSerializer):
res = super(JobTemplateSerializer, self).get_related(obj)
res.update(dict(
jobs = reverse('api:job_template_jobs_list', args=(obj.pk,)),
schedules = reverse('api:job_template_schedules_list', args=(obj.pk,)),
activity_stream = reverse('api:job_template_activity_stream_list', args=(obj.pk,)),
))
if obj.host_config_key:
@@ -1218,7 +1222,7 @@ class JobEventSerializer(BaseSerializer):
class ScheduleSerializer(BaseSerializer):
class Meta:
model = Schedule
fields = ('*', 'unified_job_template', 'enabled', 'dtstart', 'dtend',
@@ -1233,6 +1237,12 @@ class ScheduleSerializer(BaseSerializer):
res['unified_job_template'] = obj.unified_job_template.get_absolute_url()
return res
def validate_rrule(self, attrs, source):
try:
sched_rule = rrule.rrulestr(attrs[source])
except Exception, e:
raise serializers.ValidationError("rrule parsing failed validation")
return attrs
class ActivityStreamSerializer(BaseSerializer):

View File

@@ -41,7 +41,7 @@ project_urls = patterns('awx.api.views',
url(r'^(?P<pk>[0-9]+)/update/$', 'project_update_view'),
url(r'^(?P<pk>[0-9]+)/project_updates/$', 'project_updates_list'),
url(r'^(?P<pk>[0-9]+)/activity_stream/$', 'project_activity_stream_list'),
url(r'^(?P<pk>[0-9]+)/schedules/$', 'schedules_list'),
url(r'^(?P<pk>[0-9]+)/schedules/$', 'project_schedules_list'),
)
project_update_urls = patterns('awx.api.views',
@@ -104,7 +104,7 @@ inventory_source_urls = patterns('awx.api.views',
url(r'^(?P<pk>[0-9]+)/update/$', 'inventory_source_update_view'),
url(r'^(?P<pk>[0-9]+)/inventory_updates/$', 'inventory_source_updates_list'),
url(r'^(?P<pk>[0-9]+)/activity_stream/$', 'inventory_source_activity_stream_list'),
url(r'^(?P<pk>[0-9]+)/schedules/$', 'schedules_list'),
url(r'^(?P<pk>[0-9]+)/schedules/$', 'inventory_source_schedules_list'),
#url(r'^(?P<pk>[0-9]+)/groups/$', 'inventory_source_groups_list'),
#url(r'^(?P<pk>[0-9]+)/hosts/$', 'inventory_source_hosts_list'),
)
@@ -130,7 +130,7 @@ job_template_urls = patterns('awx.api.views',
url(r'^(?P<pk>[0-9]+)/$', 'job_template_detail'),
url(r'^(?P<pk>[0-9]+)/jobs/$', 'job_template_jobs_list'),
url(r'^(?P<pk>[0-9]+)/callback/$', 'job_template_callback'),
url(r'^(?P<pk>[0-9]+)/schedules/$', 'schedules_list'),
url(r'^(?P<pk>[0-9]+)/schedules/$', 'job_template_schedules_list'),
url(r'^(?P<pk>[0-9]+)/activity_stream/$', 'job_template_activity_stream_list'),
)
@@ -155,6 +155,11 @@ job_event_urls = patterns('awx.api.views',
url(r'^(?P<pk>[0-9]+)/hosts/$', 'job_event_hosts_list'),
)
schedule_urls = patterns('awx.api.views',
url(r'^$', 'schedule_list'),
url(r'^(?P<pk>[0-9]+)/$', 'schedule_detail'),
)
activity_stream_urls = patterns('awx.api.views',
url(r'^$', 'activity_stream_list'),
url(r'^(?P<pk>[0-9]+)/$', 'activity_stream_detail'),
@@ -166,7 +171,7 @@ v1_urls = patterns('awx.api.views',
url(r'^authtoken/$', 'auth_token_view'),
url(r'^me/$', 'user_me_list'),
url(r'^dashboard/$', 'dashboard_view'),
url(r'^schedules/$', 'schedules_list'),
url(r'^schedules/$', include(schedule_urls)),
url(r'^unified_jobs/$','unified_jobs_list'),
url(r'^organizations/', include(organization_urls)),
url(r'^users/', include(user_urls)),

View File

@@ -92,7 +92,7 @@ class ApiV1RootView(APIView):
data['hosts'] = reverse('api:host_list')
data['job_templates'] = reverse('api:job_template_list')
data['jobs'] = reverse('api:job_list')
data['schedules'] = reverse('api:schedules_list')
data['schedules'] = reverse('api:schedule_list')
data['unified_jobs'] = reverse('api:unified_jobs_list')
data['activity_stream'] = reverse('api:activity_stream_list')
return Response(data)
@@ -237,63 +237,19 @@ class DashboardView(APIView):
'total': job_template_list.count()}
return Response(data)
class SchedulesList(APIView):
class ScheduleList(ListCreateAPIView):
view_name = "Schedules"
new_in_148 = True
def get(self, request, format=None):
data = {
'count': 3,
'next': None,
'previous': None,
'results': [{
'id': 1,
'url': '/api/v1/schedules/1/',
'related': {},
'summary_fields': {},
'created': "2014-02-10T19:13:11.910Z",
'modified': "2014-02-10T19:13:11.910Z",
'name': 'Test schedule',
'description': "We love chris",
'dtstart': '2014-03-20T14:30:57.123Z',
'dtend': '2015-03-20T14:30:57.123Z',
'rrule': 'FREQ=DAILY;COUNT=100;INTERVAL=4',
'job_template': 1,
'project': None,
'inventory_source': None},
{'id': 2,
'url': '/api/v1/schedules/2/',
'related': {},
'summary_fields': {},
'created': "2014-02-10T19:13:11.910Z",
'modified': "2014-02-10T19:13:11.910Z",
'name': 'Test schedule',
'description': "We love chris",
'dtstart': '2014-03-20T14:30:57.123Z',
'dtend': '2015-03-20T14:30:57.123Z',
'rrule': 'FREQ=DAILY;COUNT=100;INTERVAL=4',
'job_template': None,
'project': 1,
'inventory_source': None},
{'id': 3,
'url': '/api/v1/schedules/3/',
'related': {},
'summary_fields': {},
'created': "2014-02-10T19:13:11.910Z",
'modified': "2014-02-10T19:13:11.910Z",
'name': 'Test schedule',
'description': "We love chris",
'dtstart': '2014-03-20T14:30:57.123Z',
'dtend': '2015-03-20T14:30:57.123Z',
'rrule': 'FREQ=DAILY;COUNT=100;INTERVAL=4',
'job_template': None,
'project': None,
'inventory_source': 12}]}
return Response(data)
model = Schedule
serializer_class = ScheduleSerializer
def post(self, request):
return Response({})
class ScheduleDetail(RetrieveUpdateDestroyAPIView):
new_in_148 = True
model = Schedule
serializer_class = ScheduleSerializer
class UnifiedJobsList(APIView):
@@ -676,6 +632,17 @@ class ProjectTeamsList(SubListCreateAPIView):
parent_model = Project
relationship = 'teams'
class ProjectSchedulesList(SubListCreateAPIView):
view_name = "Project Schedules"
model = Schedule
serializer_class = ScheduleSerializer
parent_model = Project
relationship = 'schedules'
parent_key = 'unified_job_template'
new_in_148 = True
class ProjectActivityStreamList(SubListAPIView):
model = ActivityStream
@@ -1203,6 +1170,18 @@ class InventorySourceDetail(RetrieveUpdateAPIView):
serializer_class = InventorySourceSerializer
new_in_14 = True
class InventorySourceSchedulesList(SubListCreateAPIView):
view_name = "Inventory Source Schedules"
model = Schedule
serializer_class = ScheduleSerializer
parent_model = InventorySource
relationship = 'schedules'
parent_key = 'unified_job_template'
new_in_148 = True
class InventorySourceActivityStreamList(SubListAPIView):
model = ActivityStream
@@ -1281,6 +1260,17 @@ class JobTemplateDetail(RetrieveUpdateDestroyAPIView):
model = JobTemplate
serializer_class = JobTemplateSerializer
class JobTemplateSchedulesList(SubListCreateAPIView):
view_name = "Job Template Schedules"
model = Schedule
serializer_class = ScheduleSerializer
parent_model = JobTemplate
relationship = 'schedules'
parent_key = 'unified_job_template'
new_in_148 = True
class JobTemplateActivityStreamList(SubListAPIView):
model = ActivityStream