From e650da5278868bcb3e2c359ddeef693938862d84 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 11 Mar 2014 14:52:20 -0400 Subject: [PATCH] Make sure a JSON error in build or trigger config never causes a crash --- endpoints/api.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/endpoints/api.py b/endpoints/api.py index b46bcb5f9..22a571be4 100644 --- a/endpoints/api.py +++ b/endpoints/api.py @@ -1129,9 +1129,16 @@ def get_repo(namespace, repository): abort(403) # Permission denied +def get_trigger_config(trigger): + try: + return json.loads(trigger.config) + except: + return {} + + def trigger_view(trigger): if trigger and trigger.uuid: - config_dict = json.loads(trigger.config) + config_dict = get_trigger_config(trigger) build_trigger = BuildTrigger.get_trigger_for_service(trigger.service.name) return { 'service': trigger.service.name, @@ -1144,15 +1151,23 @@ def trigger_view(trigger): return None +def get_job_config(build_obj): + try: + return json.loads(build_obj.job_config) + except: + return None + + def build_status_view(build_obj, can_write=False): status = build_logs.get_status(build_obj.uuid) + return { 'id': build_obj.uuid, 'phase': build_obj.phase, 'started': build_obj.started, 'display_name': build_obj.display_name, 'status': status, - 'job_config': json.loads(build_obj.job_config) if can_write else None, + 'job_config': get_job_config(build_obj) if can_write else None, 'is_writer': can_write, 'trigger': trigger_view(build_obj.trigger), 'resource_key': build_obj.resource_key, @@ -1419,7 +1434,7 @@ def activate_build_trigger(namespace, repository, trigger_uuid): return handler = BuildTrigger.get_trigger_for_service(trigger.service.name) - existing_config_dict = json.loads(trigger.config) + existing_config_dict = get_trigger_config(trigger) if handler.is_active(existing_config_dict): abort(400) return @@ -1478,13 +1493,12 @@ def manually_start_build_trigger(namespace, repository, trigger_uuid): return handler = BuildTrigger.get_trigger_for_service(trigger.service.name) - existing_config_dict = json.loads(trigger.config) - if not handler.is_active(existing_config_dict): + config_dict = get_trigger_config(trigger) + if not handler.is_active(config_dict): abort(400) return - specs = handler.manual_start(trigger.auth_token, - json.loads(trigger.config)) + specs = handler.manual_start(trigger.auth_token, config_dict) dockerfile_id, tags, name, subdir = specs repo = model.get_repository(namespace, repository) @@ -1571,7 +1585,7 @@ def delete_build_trigger(namespace, repository, trigger_uuid): return handler = BuildTrigger.get_trigger_for_service(trigger.service.name) - config_dict = json.loads(trigger.config) + config_dict = get_trigger_config(trigger) if handler.is_active(config_dict): try: handler.deactivate(trigger.auth_token, config_dict)