From 54cdc434ff7beefe8b5fdb6c12635dd4a3ed49e1 Mon Sep 17 00:00:00 2001 From: Luke Murphy Date: Sun, 3 Mar 2019 22:03:51 +0100 Subject: [PATCH] Coerce `exposed_ports` to string Closes https://github.com/ansible/molecule/issues/1781. Refs: * http://docs.python-cerberus.org/en/stable/normalization-rules.html#value-coercion * https://github.com/pyeve/cerberus/issues/316 Signed-off-by: Luke Murphy --- molecule/model/schema_v2.py | 15 +++++++++++++-- test/unit/model/v2/test_platforms_section.py | 9 ++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/molecule/model/schema_v2.py b/molecule/model/schema_v2.py index d0fd1e35bf..996c2a6aad 100644 --- a/molecule/model/schema_v2.py +++ b/molecule/model/schema_v2.py @@ -25,8 +25,7 @@ import cerberus import cerberus.errors -from molecule import interpolation -from molecule import util +from molecule import interpolation, util def coerce_env(env, keep_string, v): @@ -681,6 +680,7 @@ def pre_validate_base_schema(env, keep_string): 'type': 'list', 'schema': { 'type': 'string', + 'coerce': 'exposed_ports' } }, 'published_ports': { @@ -954,6 +954,17 @@ def _validate_disallowed(self, disallowed, field, value): msg = 'disallowed user provided config option' self._error(field, msg) + def _normalize_coerce_exposed_ports(self, value): + """Coerce ``exposed_ports`` values to string. + + Not all types that can be specified by the user are acceptable and + therefore we cannot simply pass a ``'coerce': 'string'`` to the schema + definition. + """ + if type(value) == int: + return str(value) + return value + def _validate_molecule_env_var(self, molecule_env_var, field, value): """ Readonly but with a custom error. diff --git a/test/unit/model/v2/test_platforms_section.py b/test/unit/model/v2/test_platforms_section.py index f5a5c28f06..c958b954fa 100644 --- a/test/unit/model/v2/test_platforms_section.py +++ b/test/unit/model/v2/test_platforms_section.py @@ -115,6 +115,13 @@ def test_platforms_docker(_config): assert {} == schema_v2.validate(_config) +@pytest.mark.parametrize( + '_config', ['_model_platforms_docker_section_data'], indirect=True) +def test_platforms_docker_exposed_ports_coerced(_config): + _config['platforms'][0]['exposed_ports'] = [9904] + assert {} == schema_v2.validate(_config) + + @pytest.fixture def _model_platforms_docker_errors_section_data(): return { @@ -149,7 +156,7 @@ def _model_platforms_docker_errors_section_data(): int(), ], 'exposed_ports': [ - int(), + bool(), ], 'published_ports': [ int(),