diff options
-rw-r--r-- | ncserver/module/interfaces.py | 43 | ||||
-rw-r--r-- | ncserver/module/ip.py | 13 |
2 files changed, 42 insertions, 14 deletions
diff --git a/ncserver/module/interfaces.py b/ncserver/module/interfaces.py index ec3861c..d6e0196 100644 --- a/ncserver/module/interfaces.py +++ b/ncserver/module/interfaces.py @@ -19,6 +19,7 @@ from netconf import error, util from ncserver.base.modman import MODMAN from ncserver.base.util import _, node_operation, yang_dt_for_timestamp +from ncserver.util import maybe_raise_on_invalid_node QName = etree.QName # pylint: disable=I1101 @@ -251,6 +252,17 @@ def _edit_description(session, rpc, node, def_op, iface: str): def _edit_enabled(session, rpc, node, def_op, iface: str): """Edit the enabled property of an interface.""" + operation = node_operation(node, def_op) + nmsa = _get_nmsa() + + if operation == 'create': + raise error.DataExistsAppError(rpc) + + if operation not in ('merge', 'replace'): + # You cannot delete the enabled node. + raise error.OperationNotSupportedAppError(rpc) + + nmsa.set_param(iface, 'enabled', (node.text == 'true')) def edit(session, rpc, node, def_op): @@ -267,16 +279,35 @@ def edit(session, rpc, node, def_op): if QName(interface.tag).localname != 'interface': raise error.UnknownElementAppError(rpc, interface) - iface_name = interface.find('{'+M_NS+'}name').text - # One never knows if some admin or utility will set an operation on - # the interface node itself. This is legal, so we handle it here: - operation = node_operation(node, def_op) + name_node = interface.find('{'+M_NS+'}name') + if name_node is None: + raise error.MissingElementAppError(rpc, interface) + iface = name_node.text + + operation = node_operation(interface, def_op) + if operation in ('create', 'delete', 'remove'): + # We are operating on the "entire" interface here, not just a + # single element. + if operation == 'delete' and iface not in nmsa.interface_list(): + raise error.DataMissingAppError(rpc) + + if operation in ('delete', 'remove'): + nmsa.remove_interface(iface) + continue + + enable_node = interface.find('{'+M_NS+'}enabled') + if enable_node is None: + nmsa.set_param(iface, 'enabled', True) # Default. + else: + nmsa.set_param(iface, 'enabled', enable_node.text == 'true') + # Don't let _edit_enabled raise an error due to 'create' op. + interface.remove(enable_node) for candidate in interface: name = QName(candidate.tag).localname if name in methods: - methods[name](session, rpc, candidate, operation, iface_name) + methods[name](session, rpc, candidate, operation, iface) elif name == 'name': continue else: - raise error.UnknownElementAppError(rpc, candidate) + maybe_raise_on_invalid_node(M_NS, rpc, candidate) diff --git a/ncserver/module/ip.py b/ncserver/module/ip.py index 065a4d4..25975a4 100644 --- a/ncserver/module/ip.py +++ b/ncserver/module/ip.py @@ -47,11 +47,8 @@ M_REVISION = "2018-02-22" M_IMPORTS = { - 'ietf-interfaces@2018-02-20': { - 'ns': "urn:ietf:params:xml:ns:yang:ietf-interfaces", 'prefix': "if" - }, - 'iana-inet-types@2013-07-15': { - 'ns': "urn:ietf:params:xml:ns:yang:iana-inet-types", 'prefix': "inet" + 'ietf-inet-types@2013-07-15': { + 'ns': "urn:ietf:params:xml:ns:yang:ietf-inet-types", 'prefix': "inet" }, 'ietf-yang-types@2013-07-15': { 'ns': "urn:ietf:params:xml:ns:yang:ietf-yang-types", 'prefix': "yang" @@ -99,13 +96,13 @@ def _add_ipv4(iface, getter): """Add IPv4 configuration nodes.""" name = iface.find('{'+IF_NS+'}name').text ipv4 = util.subelm(iface, 'ip:ipv4') - ipv4.append(util.leaf_elm('ip:enabled', - from_bool(getter(name, 'ipv4_enabled')))) + #ipv4.append(util.leaf_elm('ip:enabled', + # from_bool(getter(name, 'ipv4_enabled')))) ipv4.append(util.leaf_elm('ip:forwarding', from_bool(getter(name, 'ipv4_forwarding')))) v4mtu = getter(name, 'ipv4_mtu') if v4mtu is not None: - ipv4.append(util.leaf_elm('ip:mtu', v4mtu)) + ipv4.append(util.leaf_elm('ip:mtu', v4mtu - 28)) return ipv4 |