mirror of
https://github.com/ansible/awx.git
synced 2026-05-06 17:07:36 -02:30
Initial scheduler integration
This commit is contained in:
@@ -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):
|
||||
|
||||
|
||||
@@ -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)),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user