Protect against very large stdout fields

* Defer loading result_stdout_text until specifically needed
* Conditionally display it based on the size of the field
* Provide a helpful message otherwise
This commit is contained in:
Matthew Jones
2015-07-22 14:13:48 -04:00
parent 0ff280a363
commit 55da712a95
4 changed files with 42 additions and 2 deletions

View File

@@ -464,7 +464,8 @@ class UnifiedJobTemplateSerializer(BaseSerializer):
class UnifiedJobSerializer(BaseSerializer):
result_stdout = serializers.CharField(source='result_stdout', label='result stdout', read_only=True)
#result_stdout = serializers.CharField(source='result_stdout', label='result stdout', read_only=True)
result_stdout = serializers.SerializerMethodField('get_result_stdout')
unified_job_template = serializers.Field(source='unified_job_template_id', label='unified job template')
job_env = serializers.CharField(source='job_env', label='job env', read_only=True)
@@ -475,6 +476,13 @@ class UnifiedJobSerializer(BaseSerializer):
'job_cwd', 'job_env', 'job_explanation', 'result_stdout',
'result_traceback')
def get_result_stdout(self, obj):
obj_size = obj.result_stdout_size
if obj_size > settings.STDOUT_MAX_BYTES_DISPLAY:
return "Standard Output too large to display (%d bytes), only download supported for sizes over %d bytes" % (obj_size, settings.STDOUT_MAX_BYTES_DISPLAY)
return obj.result_stdout
def get_types(self):
if type(self) is UnifiedJobSerializer:
return ['project_update', 'inventory_update', 'job', 'ad_hoc_command', 'system_job']