Fix issue with setting values in choices (#33574)
This commit is contained in:
parent
882065b9b4
commit
c8a5e689e3
2 changed files with 103 additions and 1 deletions
|
@ -407,7 +407,7 @@ class ValueBuilder(object):
|
||||||
parent_schema = all_schema['data']
|
parent_schema = all_schema['data']
|
||||||
meta = all_schema['meta']
|
meta = all_schema['meta']
|
||||||
|
|
||||||
schema = self._get_child(parent_schema, key)
|
schema = self._find_child(parent_path, parent_schema, key)
|
||||||
if self._is_leaf(schema):
|
if self._is_leaf(schema):
|
||||||
path_type = schema['type']
|
path_type = schema['type']
|
||||||
if path_type.get('primitive', False):
|
if path_type.get('primitive', False):
|
||||||
|
@ -443,11 +443,20 @@ class ValueBuilder(object):
|
||||||
def _get_choice_child(self, schema, qname):
|
def _get_choice_child(self, schema, qname):
|
||||||
name_key = ':' in qname and 'qname' or 'name'
|
name_key = ':' in qname and 'qname' or 'name'
|
||||||
for child_case in schema['cases']:
|
for child_case in schema['cases']:
|
||||||
|
# look for direct child
|
||||||
choice_child_schema = next(
|
choice_child_schema = next(
|
||||||
(c for c in child_case['children']
|
(c for c in child_case['children']
|
||||||
if c.get(name_key, None) == qname), None)
|
if c.get(name_key, None) == qname), None)
|
||||||
if choice_child_schema is not None:
|
if choice_child_schema is not None:
|
||||||
return choice_child_schema
|
return choice_child_schema
|
||||||
|
|
||||||
|
# look for nested choice
|
||||||
|
for child_schema in child_case['children']:
|
||||||
|
if child_schema['kind'] != 'choice':
|
||||||
|
continue
|
||||||
|
choice_child_schema = self._get_choice_child(child_schema, qname)
|
||||||
|
if choice_child_schema is not None:
|
||||||
|
return choice_child_schema
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _is_leaf(self, schema):
|
def _is_leaf(self, schema):
|
||||||
|
|
|
@ -28,6 +28,7 @@ from ansible.module_utils.network.nso import nso
|
||||||
MODULE_PREFIX_MAP = '''
|
MODULE_PREFIX_MAP = '''
|
||||||
{
|
{
|
||||||
"ansible-nso": "an",
|
"ansible-nso": "an",
|
||||||
|
"test": "test",
|
||||||
"tailf-ncs": "ncs"
|
"tailf-ncs": "ncs"
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
|
@ -148,6 +149,67 @@ SCHEMA_DATA = {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
''',
|
||||||
|
'/test:test': '''
|
||||||
|
{
|
||||||
|
"meta": {},
|
||||||
|
"data": {
|
||||||
|
"kind": "list",
|
||||||
|
"name":"test",
|
||||||
|
"qname":"test:test",
|
||||||
|
"key":["name"],
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"kind": "key",
|
||||||
|
"name": "name",
|
||||||
|
"qname": "test:name",
|
||||||
|
"type": {"name":"string","primitive":true}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"kind": "choice",
|
||||||
|
"name": "test-choice",
|
||||||
|
"qname": "test:test-choice",
|
||||||
|
"cases": [
|
||||||
|
{
|
||||||
|
"kind": "case",
|
||||||
|
"name": "direct-child-case",
|
||||||
|
"qname":"test:direct-child-case",
|
||||||
|
"children":[
|
||||||
|
{
|
||||||
|
"kind": "leaf",
|
||||||
|
"name": "direct-child",
|
||||||
|
"qname": "test:direct-child",
|
||||||
|
"type": {"name":"string","primitive":true}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"kind":"case","name":"nested-child-case","qname":"test:nested-child-case",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"kind": "choice",
|
||||||
|
"name": "nested-choice",
|
||||||
|
"qname": "test:nested-choice",
|
||||||
|
"cases": [
|
||||||
|
{
|
||||||
|
"kind":"case","name":"nested-child","qname":"test:nested-child",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"kind": "leaf",
|
||||||
|
"name":"nested-child",
|
||||||
|
"qname":"test:nested-child",
|
||||||
|
"type":{"name":"string","primitive":true}}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,3 +305,34 @@ class TestValueBuilder(unittest.TestCase):
|
||||||
self.assertEquals('1', value.value)
|
self.assertEquals('1', value.value)
|
||||||
|
|
||||||
self.assertEqual(0, len(calls))
|
self.assertEqual(0, len(calls))
|
||||||
|
|
||||||
|
@patch('ansible.module_utils.network.nso.nso.open_url')
|
||||||
|
def test_nested_choice(self, open_url_mock):
|
||||||
|
calls = [
|
||||||
|
MockResponse('new_trans', {}, 200, '{"result": {"th": 1}}'),
|
||||||
|
get_schema_response('/test:test'),
|
||||||
|
MockResponse('exists', {'path': '/test:test{direct}'}, 200, '{"result": {"exists": true}}'),
|
||||||
|
MockResponse('exists', {'path': '/test:test{nested}'}, 200, '{"result": {"exists": true}}')
|
||||||
|
]
|
||||||
|
open_url_mock.side_effect = lambda *args, **kwargs: mock_call(calls, *args, **kwargs)
|
||||||
|
|
||||||
|
parent = "/test:test"
|
||||||
|
schema_data = json.loads(
|
||||||
|
SCHEMA_DATA['/test:test'])
|
||||||
|
schema = schema_data['data']
|
||||||
|
|
||||||
|
vb = nso.ValueBuilder(nso.JsonRpc('http://localhost:8080/jsonrpc'))
|
||||||
|
vb.build(parent, None, [{'name': 'direct', 'direct-child': 'direct-value'},
|
||||||
|
{'name': 'nested', 'nested-child': 'nested-value'}], schema)
|
||||||
|
self.assertEquals(2, len(vb.values))
|
||||||
|
value = vb.values[0]
|
||||||
|
self.assertEquals('{0}{{direct}}/direct-child'.format(parent), value.path)
|
||||||
|
self.assertEquals('set', value.state)
|
||||||
|
self.assertEquals('direct-value', value.value)
|
||||||
|
|
||||||
|
value = vb.values[1]
|
||||||
|
self.assertEquals('{0}{{nested}}/nested-child'.format(parent), value.path)
|
||||||
|
self.assertEquals('set', value.state)
|
||||||
|
self.assertEquals('nested-value', value.value)
|
||||||
|
|
||||||
|
self.assertEqual(0, len(calls))
|
||||||
|
|
Loading…
Reference in a new issue