Numerous model-related updates and supporing changes, including:

- Add variables field on Host/Group models and remove separate VariableData model.
- Add data migrations for existing variable data.
- Update views, serializers and tests to keep roughly the same API interface for variable data.
- Add has_active_failures properties on Group/Host models to provide indication of last job status.
- Add job_tags field on JobTemplate/Job models to specify tags to ansible-playbook.
- Add host_config_key field to JobTemplate model for use by empheral hosts.
- Add job_args, job_cwd and job_env fields to Job model to capture more info from running the job.
- Add failed flag on JobHostSummary model.
- Add play/task fields on JobEvent model to capture new context variables from callback.
- Add parent field on JobEvent model to capture hierarchy of job events.
- Add hosts field on JobEvent model to capture all hosts associated with the event (especially useful for parent events in the hierarchy).
- Removed existing Tag model, replace with django-taggit instead.
- Removed existing AuditLog model, replacement TBD.
This commit is contained in:
Chris Church
2013-06-10 17:21:04 -04:00
parent 7b0bbff376
commit cba55a061a
24 changed files with 1924 additions and 498 deletions

View File

@@ -1,6 +1,9 @@
# Copyright (c) 2013 AnsibleWorks, Inc.
# All Rights Reserved.
# Python
import json
# Django
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
@@ -126,28 +129,16 @@ class OrganizationSerializer(BaseSerializer):
def get_related(self, obj):
res = super(OrganizationSerializer, self).get_related(obj)
res.update(dict(
audit_trail = reverse('main:organizations_audit_trail_list', args=(obj.pk,)),
#audit_trail = reverse('main:organizations_audit_trail_list', args=(obj.pk,)),
projects = reverse('main:organizations_projects_list', args=(obj.pk,)),
inventories = reverse('main:organizations_inventories_list', args=(obj.pk,)),
users = reverse('main:organizations_users_list', args=(obj.pk,)),
admins = reverse('main:organizations_admins_list', args=(obj.pk,)),
tags = reverse('main:organizations_tags_list', args=(obj.pk,)),
#tags = reverse('main:organizations_tags_list', args=(obj.pk,)),
teams = reverse('main:organizations_teams_list', args=(obj.pk,)),
))
return res
class AuditTrailSerializer(BaseSerializer):
class Meta:
model = AuditTrail
fields = ('url', 'id', 'modified_by', 'delta', 'detail', 'comment')
def get_related(self, obj):
res = super(AuditTrailSerializer, self).get_related(obj)
if obj.modified_by:
res['modified_by'] = reverse('main:users_detail', args=(obj.modified_by.pk,))
return res
class ProjectSerializer(BaseSerializer):
playbooks = serializers.Field(source='playbooks')
@@ -197,9 +188,11 @@ class InventorySerializer(BaseSerializer):
class HostSerializer(BaseSerializer):
has_active_failures = serializers.Field(source='has_active_failures')
class Meta:
model = Host
fields = BASE_FIELDS + ('inventory',)
fields = BASE_FIELDS + ('inventory', 'variables', 'has_active_failures')
def get_related(self, obj):
res = super(HostSerializer, self).get_related(obj)
@@ -218,9 +211,11 @@ class HostSerializer(BaseSerializer):
class GroupSerializer(BaseSerializer):
has_active_failures = serializers.Field(source='has_active_failures')
class Meta:
model = Group
fields = BASE_FIELDS + ('inventory',)
fields = BASE_FIELDS + ('inventory', 'variables', 'has_active_failures')
def get_related(self, obj):
res = super(GroupSerializer, self).get_related(obj)
@@ -235,6 +230,28 @@ class GroupSerializer(BaseSerializer):
))
return res
class BaseVariableDataSerializer(BaseSerializer):
def to_native(self, obj):
ret = super(BaseVariableDataSerializer, self).to_native(obj)
return json.loads(ret.get('variables', '') or '{}')
def from_native(self, data, files):
data = {'variables': json.dumps(data)}
return super(BaseVariableDataSerializer, self).from_native(data, files)
class HostVariableDataSerializer(BaseVariableDataSerializer):
class Meta:
model = Host
fields = ('variables',)
class GroupVariableDataSerializer(BaseVariableDataSerializer):
class Meta:
model = Group
fields = ('variables',)
class TeamSerializer(BaseSerializer):
class Meta:
@@ -319,42 +336,13 @@ class UserSerializer(BaseSerializer):
))
return res
class TagSerializer(BaseSerializer):
class Meta:
model = Tag
fields = ('id', 'url', 'name')
def get_related(self, obj):
res = super(TagSerializer, self).get_related(obj)
res.pop('created_by', None)
return res
class VariableDataSerializer(BaseSerializer):
class Meta:
model = VariableData
fields = BASE_FIELDS + ('data',)
def get_related(self, obj):
res = super(VariableDataSerializer, self).get_related(obj)
try:
res['host'] = reverse('main:hosts_detail', args=(obj.host.pk,))
except Host.DoesNotExist:
pass
try:
res['group'] = reverse('main:groups_detail', args=(obj.group.pk,))
except Group.DoesNotExist:
pass
return res
class JobTemplateSerializer(BaseSerializer):
class Meta:
model = JobTemplate
fields = BASE_FIELDS + ('job_type', 'inventory', 'project', 'playbook',
'credential', 'forks', 'limit', 'verbosity',
'extra_vars')
'extra_vars', 'job_tags')
def get_related(self, obj):
res = super(JobTemplateSerializer, self).get_related(obj)
@@ -383,7 +371,7 @@ class JobSerializer(BaseSerializer):
fields = BASE_FIELDS + ('job_template', 'job_type', 'inventory',
'project', 'playbook', 'credential',
'forks', 'limit', 'verbosity', 'extra_vars',
'status', 'failed', 'result_stdout',
'job_tags', 'status', 'failed', 'result_stdout',
'result_traceback',
'passwords_needed_to_start')
@@ -424,6 +412,7 @@ class JobSerializer(BaseSerializer):
data.setdefault('limit', job_template.limit)
data.setdefault('verbosity', job_template.verbosity)
data.setdefault('extra_vars', job_template.extra_vars)
data.setdefault('job_tags', job_template.job_tags)
return super(JobSerializer, self).from_native(data, files)
class JobHostSummarySerializer(BaseSerializer):
@@ -431,7 +420,8 @@ class JobHostSummarySerializer(BaseSerializer):
class Meta:
model = JobHostSummary
fields = ('id', 'url', 'job', 'host', 'summary_fields', 'related',
'changed', 'dark', 'failures', 'ok', 'processed', 'skipped')
'changed', 'dark', 'failures', 'ok', 'processed', 'skipped',
'failed')
def get_related(self, obj):
res = super(JobHostSummarySerializer, self).get_related(obj)