From e0c975a98086882127f2c1b2c30a28876d84ebb7 Mon Sep 17 00:00:00 2001 From: Tristan Cacqueray Date: Tue, 14 May 2019 10:14:03 +0000 Subject: [PATCH] web: remove SafeLoader left-over from ZuulJSONEncoder When a job has a single key vars (or extra-vars/host-vars) that is named after a zuul_node_types such as 'job', then the MappingProxy get a SourceContext and ZuulMark attributes which can not be serialized. The ZuulSafeLoader shouldn't add such node attributes in the first place, but it doesn't seems possible to prevent that. This change also removes the MappingProxyEncoder and replace it by the existing ZuulJSONEncoder. Change-Id: I9fe28a204d41944f86644117c16129234c9d3583 --- .../git/tenant-one-config/zuul.yaml | 3 +++ zuul/lib/jsonutil.py | 6 +++++- zuul/rpclistener.py | 13 +++---------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/fixtures/config/multi-tenant-semaphore/git/tenant-one-config/zuul.yaml b/tests/fixtures/config/multi-tenant-semaphore/git/tenant-one-config/zuul.yaml index ca936b9214..9f3c5f663e 100644 --- a/tests/fixtures/config/multi-tenant-semaphore/git/tenant-one-config/zuul.yaml +++ b/tests/fixtures/config/multi-tenant-semaphore/git/tenant-one-config/zuul.yaml @@ -1,6 +1,9 @@ - job: name: project1-test1 semaphore: test-semaphore + vars: + semaphore: + test: 42 run: playbooks/project1-test1.yaml - project: diff --git a/zuul/lib/jsonutil.py b/zuul/lib/jsonutil.py index d9f4eeb7a4..02f6f6da93 100644 --- a/zuul/lib/jsonutil.py +++ b/zuul/lib/jsonutil.py @@ -17,7 +17,11 @@ import types class ZuulJSONEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, types.MappingProxyType): - return dict(o) + d = dict(o) + # Always remove SafeLoader left-over + d.pop('_source_context', None) + d.pop('_start_mark', None) + return d return json.JSONEncoder.default(self, o) diff --git a/zuul/rpclistener.py b/zuul/rpclistener.py index c97a9cf9d4..5c0294771e 100644 --- a/zuul/rpclistener.py +++ b/zuul/rpclistener.py @@ -17,7 +17,6 @@ import json import logging import threading import traceback -import types import gear @@ -25,13 +24,7 @@ from zuul import model from zuul.connection import BaseConnection from zuul.lib import encryption from zuul.lib.config import get_default - - -class MappingProxyEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj, types.MappingProxyType): - return dict(obj) - return json.JSONEncoder.default(self, obj) +from zuul.lib.jsonutil import ZuulJSONEncoder class RPCListener(object): @@ -361,7 +354,7 @@ class RPCListener(object): output = [] for job in jobs: output.append(job.toDict(tenant)) - gear_job.sendWorkComplete(json.dumps(output, cls=MappingProxyEncoder)) + gear_job.sendWorkComplete(json.dumps(output, cls=ZuulJSONEncoder)) def handle_job_list(self, job): args = json.loads(job.arguments) @@ -431,7 +424,7 @@ class RPCListener(object): config['pipelines'].append(pipeline) result['configs'].append(config) - gear_job.sendWorkComplete(json.dumps(result, cls=MappingProxyEncoder)) + gear_job.sendWorkComplete(json.dumps(result, cls=ZuulJSONEncoder)) def handle_project_list(self, job): args = json.loads(job.arguments)