Merge pull request #2655 from shin-/updated_volume_definition

Properly validate volume definition
This commit is contained in:
Aanand Prasad 2016-01-14 16:37:39 +00:00
commit dbe04a70f0
3 changed files with 44 additions and 23 deletions

View File

@ -273,9 +273,21 @@ def load_volumes(config_files):
volumes = {}
for config_file in config_files:
for name, volume_config in config_file.config.get('volumes', {}).items():
if volume_config is None:
volumes.update({name: {}})
continue
volumes.update({name: volume_config})
external = volume_config.get('external')
if external:
if len(volume_config.keys()) > 1:
raise ConfigurationError(
'Volume {0} declared as external but specifies'
' additional attributes ({1}). '.format(
name,
', '.join([k for k in volume_config.keys() if k != 'external'])
)
)
if isinstance(external, dict):
volume_config['external_name'] = external.get('name')
else:

View File

@ -32,32 +32,24 @@
"definitions": {
"volume": {
"id": "#/definitions/volume",
"oneOf": [{
"type": "object",
"properties": {
"driver": {"type": "string"},
"driver_opts": {
"type": "object",
"patternProperties": {
"^.+$": {"type": ["string", "number"]}
},
"additionalProperties": false
"type": ["object", "null"],
"properties": {
"driver": {"type": "string"},
"driver_opts": {
"type": "object",
"patternProperties": {
"^.+$": {"type": ["string", "number"]}
}
},
"external": {
"type": ["boolean", "object"],
"properties": {
"name": {"type": "string"}
}
},
"additionalProperties": false
}, {
"type": "object",
"properties": {
"external": {
"type": ["boolean", "object"],
"properties": {
"name": {"type": "string"}
},
"additionalProperties": false
}
},
"additionalProperties": false
}]
},
"additionalProperties": false
}
},
"additionalProperties": false

View File

@ -112,6 +112,23 @@ class ConfigTest(unittest.TestCase):
}
})
def test_named_volume_config_empty(self):
config_details = build_config_details({
'version': 2,
'services': {
'simple': {'image': 'busybox'}
},
'volumes': {
'simple': None,
'other': {},
}
})
config_result = config.load(config_details)
volumes = config_result.volumes
assert 'simple' in volumes
assert volumes['simple'] == {}
assert volumes['other'] == {}
def test_load_service_with_name_version(self):
config_data = config.load(
build_config_details({