From 53fbfeaf4da2d77dd12bbc95ea71df554b419a67 Mon Sep 17 00:00:00 2001 From: Tamar Ben-Shachar Date: Mon, 13 Jul 2015 17:32:29 -0700 Subject: [PATCH] dcos-2313 don't crash if schema not correctly formatted --- dcos/package.py | 7 ++- tests/test_package.py | 106 +++++++++++++++++++++++++++--------------- 2 files changed, 73 insertions(+), 40 deletions(-) diff --git a/dcos/package.py b/dcos/package.py index 2b76d75..c36235a 100644 --- a/dcos/package.py +++ b/dcos/package.py @@ -509,10 +509,13 @@ def _extract_default_values(config_schema): """ defaults = {} + if not config_schema.get('properties'): + raise DCOSException("Error with config schema. " + + "Please make sure it's a valid jsonschema.") for key, value in config_schema['properties'].items(): - if 'default' in value: + if isinstance(value, dict) and 'default' in value: defaults[key] = value['default'] - elif value.get('type', '') == 'object': + elif isinstance(value, dict) and value.get('type', '') == 'object': # Generate the default value from the embedded schema defaults[key] = _extract_default_values(value) diff --git a/tests/test_package.py b/tests/test_package.py index cd53de9..b9e50fa 100644 --- a/tests/test_package.py +++ b/tests/test_package.py @@ -1,6 +1,7 @@ import collections from dcos import package +from dcos.errors import DCOSException import pytest @@ -35,45 +36,74 @@ def merge_data(request): return request.param -def test_extract_default_values(): - config_schema = { - "type": "object", - "properties": { - "foo": { - "type": "object", - "properties": { - "bar": { - "type": "string", - "description": "A bar name." - }, - "baz": { - "type": "integer", - "description": "How many times to do baz.", - "minimum": 0, - "maximum": 16, - "required": False, - "default": 4 - } - } - }, - "fiz": { - "type": "boolean", - "default": True, - }, - "buz": { - "type": "string" - } - } - } - - expected = {'foo': {'baz': 4}, 'fiz': True} - - result = package._extract_default_values(config_schema) - - assert result == expected - - def test_option_merge(merge_data): assert merge_data.expected == package._merge_options( merge_data.first, merge_data.second) + + +DefaultConfigValues = collections.namedtuple( + 'DefaultConfigValue', + ['schema', 'expected']) + + +@pytest.fixture(params=[ + DefaultConfigValues( + schema={ + "type": "object", + "properties": { + "foo": { + "type": "object", + "properties": { + "bar": { + "type": "string", + "description": "A bar name." + }, + "baz": { + "type": "integer", + "description": "How many times to do baz.", + "minimum": 0, + "maximum": 16, + "required": False, + "default": 4 + } + } + }, + "fiz": { + "type": "boolean", + "default": True, + }, + "buz": { + "type": "string" + } + } + }, + expected={'foo': {'baz': 4}, 'fiz': True}), + DefaultConfigValues( + schema={ + "type": "object", + "properties": { + "fiz": { + "type": "boolean", + "default": True, + }, + "additionalProperties": False + } + }, + expected={'fiz': True}), + DefaultConfigValues( + schema={ + "type": "object", + }, + expected="Error with config schema. " + + "Please make sure it's a valid jsonschema.")]) +def config_value(request): + return request.param + + +def test_extract_default_values(config_value): + try: + result = package._extract_default_values(config_value.schema) + except DCOSException as e: + result = str(e) + assert result == config_value.expected