From dfef03cc68e84b261a3f1a55ebdb0eb59981e777 Mon Sep 17 00:00:00 2001 From: AJ Date: Thu, 22 Jul 2021 09:02:57 -0400 Subject: [PATCH 1/7] bug fix for `output_value[output_key]` is not iterable if output_value[output_key] is not iterable and instead a boolean I receive the following error code from the st2api. IE: ``` output_value: {'stdout': '', 'stderr': '', 'exit_code': 0, 'result': True} spec: {'status': 'bool'} key: output output_key: result ``` ERROR: ``` ERROR: 500 Server Error: Internal Server Error MESSAGE: Internal Server Error for url: https://stackstorm-vf.ifp.lmco.com/api/executions/60f94708c3a6d1a338dc0ad7/children/?depth=-1 ``` --- st2common/st2common/util/output_schema.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/st2common/st2common/util/output_schema.py b/st2common/st2common/util/output_schema.py index 6070fe08a8..6251f7ca99 100644 --- a/st2common/st2common/util/output_schema.py +++ b/st2common/st2common/util/output_schema.py @@ -69,8 +69,9 @@ def mask_secret_output(ac_ex, output_value): return output_value for key, spec in output_schema.items(): - if key in output_value[output_key] and spec.get("secret", False): - output_value[output_key][key] = MASKED_ATTRIBUTE_VALUE + if not isinstance(output_value[output_key], bool): + if key in output_value[output_key] and spec.get("secret", False): + output_value[output_key][key] = MASKED_ATTRIBUTE_VALUE return output_value From 11e8d91b78d9f22b77af658d17915c5e40c7976b Mon Sep 17 00:00:00 2001 From: AJ Date: Thu, 22 Jul 2021 12:59:12 -0400 Subject: [PATCH 2/7] Update st2common/st2common/util/output_schema.py switch to using Collection instead of bool check Co-authored-by: Jacob Floyd --- st2common/st2common/util/output_schema.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/st2common/st2common/util/output_schema.py b/st2common/st2common/util/output_schema.py index 6251f7ca99..324ca4061c 100644 --- a/st2common/st2common/util/output_schema.py +++ b/st2common/st2common/util/output_schema.py @@ -69,7 +69,7 @@ def mask_secret_output(ac_ex, output_value): return output_value for key, spec in output_schema.items(): - if not isinstance(output_value[output_key], bool): + if isinstance(output_value[output_key], Collection): if key in output_value[output_key] and spec.get("secret", False): output_value[output_key][key] = MASKED_ATTRIBUTE_VALUE From 811e7b390350220f4f083a9fff0f09bcf336780f Mon Sep 17 00:00:00 2001 From: AJ Date: Thu, 22 Jul 2021 13:00:21 -0400 Subject: [PATCH 3/7] add import Collections add import collections --- st2common/st2common/util/output_schema.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/st2common/st2common/util/output_schema.py b/st2common/st2common/util/output_schema.py index 324ca4061c..8d50307bae 100644 --- a/st2common/st2common/util/output_schema.py +++ b/st2common/st2common/util/output_schema.py @@ -18,11 +18,13 @@ import traceback import jsonschema +from collections.abc import Collection from st2common.util import schema from st2common.constants import action as action_constants from st2common.constants.secrets import MASKED_ATTRIBUTE_VALUE + LOG = logging.getLogger(__name__) From 3898a0f077420176148260da4b6c50bf7376e296 Mon Sep 17 00:00:00 2001 From: AJ Date: Thu, 22 Jul 2021 13:13:09 -0400 Subject: [PATCH 4/7] Update output_schema.py whitespace fix --- st2common/st2common/util/output_schema.py | 1 - 1 file changed, 1 deletion(-) diff --git a/st2common/st2common/util/output_schema.py b/st2common/st2common/util/output_schema.py index 8d50307bae..d4489d3e2b 100644 --- a/st2common/st2common/util/output_schema.py +++ b/st2common/st2common/util/output_schema.py @@ -24,7 +24,6 @@ from st2common.constants.secrets import MASKED_ATTRIBUTE_VALUE - LOG = logging.getLogger(__name__) From 16020232b7d318882560d5329d4920feac786017 Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Tue, 5 Oct 2021 12:25:42 -0500 Subject: [PATCH 5/7] bail out of output_schema processing earlier --- st2common/st2common/util/output_schema.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/st2common/st2common/util/output_schema.py b/st2common/st2common/util/output_schema.py index d4489d3e2b..17f5699fb5 100644 --- a/st2common/st2common/util/output_schema.py +++ b/st2common/st2common/util/output_schema.py @@ -18,7 +18,7 @@ import traceback import jsonschema -from collections.abc import Collection +from collections.abc import Mapping from st2common.util import schema from st2common.constants import action as action_constants from st2common.constants.secrets import MASKED_ATTRIBUTE_VALUE @@ -69,10 +69,14 @@ def mask_secret_output(ac_ex, output_value): if not output_value.get(output_key): return output_value + if not isinstance(output_value[output_key], Mapping): + # TODO: Allow output_schema + masking for non-dict action output. + # Current implementation expects actions to return JSON dicts. + return output_value + for key, spec in output_schema.items(): - if isinstance(output_value[output_key], Collection): - if key in output_value[output_key] and spec.get("secret", False): - output_value[output_key][key] = MASKED_ATTRIBUTE_VALUE + if key in output_value[output_key] and spec.get("secret", False): + output_value[output_key][key] = MASKED_ATTRIBUTE_VALUE return output_value From 12068c3e4a349a17548fcd6528fa19747853ca62 Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Tue, 5 Oct 2021 13:11:01 -0500 Subject: [PATCH 6/7] add changelog entry for output_schema fix --- CHANGELOG.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e3fa1c7904..fa879861bf 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -61,6 +61,11 @@ Fixed * Correct error reported when encrypted key value is reported, and another key value parameter that requires conversion is present. #5328 Contributed by @amanda11, Ammeon Solutions +* Fix "not iterable" error for ``output_schema`` handling. If a schema is not well-formed, we ignore it. + Also, if action output is anything other than a JSON object, we do not try to process it any more. + ``output_schema`` will change in a future release to support non-object output. #5309 + + Contributed by @guzzijones 3.5.0 - June 23, 2021 From 6eac60fbb645c9cf95ecd3fe37117ca42df5b2f0 Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Tue, 5 Oct 2021 13:12:50 -0500 Subject: [PATCH 7/7] ignore invalid output_schema property schemas --- st2common/st2common/util/output_schema.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/st2common/st2common/util/output_schema.py b/st2common/st2common/util/output_schema.py index 17f5699fb5..7397e91ec3 100644 --- a/st2common/st2common/util/output_schema.py +++ b/st2common/st2common/util/output_schema.py @@ -75,6 +75,10 @@ def mask_secret_output(ac_ex, output_value): return output_value for key, spec in output_schema.items(): + if not isinstance(spec, Mapping): + # TODO: Spec should be a jsonschema object. This will change in a future + # release, so we just ignore invalid schemas for now. + continue if key in output_value[output_key] and spec.get("secret", False): output_value[output_key][key] = MASKED_ATTRIBUTE_VALUE