Fix netconf module and plugin issues (#45140)
* Fix netconf netconf issues
* Identifier is optional for get_schema api
* Fix dispatch api mandatory argument check
* Add save option handling to copy config from target datastore
to startup datastore if supported
* Validate config in check-mode or if validate option set to true
* Copy config if check-mode is not enabled
(cherry picked from commit 455dfbe732
)
This commit is contained in:
parent
ceb90f6632
commit
2a8ffbc0ed
2 changed files with 12 additions and 11 deletions
|
@ -100,7 +100,8 @@ options:
|
||||||
version_added: "2.7"
|
version_added: "2.7"
|
||||||
save:
|
save:
|
||||||
description:
|
description:
|
||||||
- The C(save) argument instructs the module to save the running-config to the startup-config if changed.
|
- The C(save) argument instructs the module to save the configuration in C(target) datastore to the
|
||||||
|
startup-config if changed and if :startup capability is supported by Netconf server.
|
||||||
default: false
|
default: false
|
||||||
version_added: "2.4"
|
version_added: "2.4"
|
||||||
backup:
|
backup:
|
||||||
|
@ -275,6 +276,7 @@ def main():
|
||||||
confirm_commit = module.params['confirm_commit']
|
confirm_commit = module.params['confirm_commit']
|
||||||
confirm = module.params['confirm']
|
confirm = module.params['confirm']
|
||||||
validate = module.params['validate']
|
validate = module.params['validate']
|
||||||
|
save = module.params['save']
|
||||||
|
|
||||||
conn = Connection(module._socket_path)
|
conn = Connection(module._socket_path)
|
||||||
capabilities = get_capabilities(module)
|
capabilities = get_capabilities(module)
|
||||||
|
@ -298,10 +300,10 @@ def main():
|
||||||
module.fail_json(msg='neither :candidate nor :writable-running are supported by this netconf server')
|
module.fail_json(msg='neither :candidate nor :writable-running are supported by this netconf server')
|
||||||
|
|
||||||
# Netconf server capability validation against input options
|
# Netconf server capability validation against input options
|
||||||
if module.params['save'] and not supports_startup:
|
if save and not supports_startup:
|
||||||
module.fail_json(msg='cannot copy <running/> to <startup/>, while :startup is not supported')
|
module.fail_json(msg='cannot copy <%s/> to <startup/>, while :startup is not supported' % target)
|
||||||
|
|
||||||
if module.params['confirm_commit'] and not operations.get('supports_confirm_commit', False):
|
if confirm_commit and not operations.get('supports_confirm_commit', False):
|
||||||
module.fail_json(msg='confirm commit is not supported by Netconf server')
|
module.fail_json(msg='confirm commit is not supported by Netconf server')
|
||||||
|
|
||||||
if confirm_commit or (confirm > 0) and not operations.get('supports_confirm_commit', False):
|
if confirm_commit or (confirm > 0) and not operations.get('supports_confirm_commit', False):
|
||||||
|
@ -329,8 +331,7 @@ def main():
|
||||||
before = to_text(response, errors='surrogate_then_replace').strip()
|
before = to_text(response, errors='surrogate_then_replace').strip()
|
||||||
result['__backup__'] = before.strip()
|
result['__backup__'] = before.strip()
|
||||||
if validate:
|
if validate:
|
||||||
if not module.check_mode:
|
conn.validate(target)
|
||||||
conn.validate(target)
|
|
||||||
if source:
|
if source:
|
||||||
if not module.check_mode:
|
if not module.check_mode:
|
||||||
conn.copy(source, target)
|
conn.copy(source, target)
|
||||||
|
@ -377,8 +378,10 @@ def main():
|
||||||
if sanitized_before != sanitized_after:
|
if sanitized_before != sanitized_after:
|
||||||
result['changed'] = True
|
result['changed'] = True
|
||||||
|
|
||||||
if module._diff:
|
if result['changed']:
|
||||||
if result['changed']:
|
if save and not module.check_mode:
|
||||||
|
conn.copy_config(target, 'startup')
|
||||||
|
if module._diff:
|
||||||
result['diff'] = {'before': sanitized_before, 'after': sanitized_after}
|
result['diff'] = {'before': sanitized_before, 'after': sanitized_after}
|
||||||
|
|
||||||
except ConnectionError as e:
|
except ConnectionError as e:
|
||||||
|
|
|
@ -204,7 +204,7 @@ class NetconfBase(AnsiblePlugin):
|
||||||
:param filter: specifies the portion of the configuration to retrieve (by default entire configuration is retrieved)
|
:param filter: specifies the portion of the configuration to retrieve (by default entire configuration is retrieved)
|
||||||
:return: Returns xml string containing the RPC response received from remote host
|
:return: Returns xml string containing the RPC response received from remote host
|
||||||
"""
|
"""
|
||||||
if rpc_command:
|
if rpc_command is None:
|
||||||
raise ValueError('rpc_command value must be provided')
|
raise ValueError('rpc_command value must be provided')
|
||||||
req = fromstring(rpc_command)
|
req = fromstring(rpc_command)
|
||||||
resp = self.m.dispatch(req, source=source, filter=filter)
|
resp = self.m.dispatch(req, source=source, filter=filter)
|
||||||
|
@ -270,8 +270,6 @@ class NetconfBase(AnsiblePlugin):
|
||||||
:param format: format of the schema to be retrieved, yang is the default
|
:param format: format of the schema to be retrieved, yang is the default
|
||||||
:return: Returns xml string containing the RPC response received from remote host
|
:return: Returns xml string containing the RPC response received from remote host
|
||||||
"""
|
"""
|
||||||
if identifier:
|
|
||||||
raise ValueError('identifier value must be provided')
|
|
||||||
resp = self.m.get_schema(identifier, version=version, format=format)
|
resp = self.m.get_schema(identifier, version=version, format=format)
|
||||||
return resp.data_xml if hasattr(resp, 'data_xml') else resp.xml
|
return resp.data_xml if hasattr(resp, 'data_xml') else resp.xml
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue