[Ryu-devel] [PATCH] of_config: hardcoded namespace for edit_config
Brought to you by:
nz_gizmoguy
From: Roman <bu...@pi...> - 2015-03-25 11:16:45
|
Ryu of_config library doesn't use namespace, compatible with ofc-server (howewer, it obtains it with get_config), in edit_config request. Instead of this, Ryu send request in its own hardcoded 'urn:onf:of111:config:yang' namespace. Signed-off-by: Raman Budny <ram...@ep...> --- I try to setup OVS with OF-Config. I think, that it's possible with openvswitch/of-config project (https://github.com/openvswitch/of-config), and Ryu of_config library. However, when I'm trying to test them by simple get_config/set_config requests, I got this error: Traceback (most recent call last): File "test_ovs_ofconfig.py", line 23, in <module> client.get_set() File "test_ovs_ofconfig.py", line 19, in get_set self.switch.edit_config('running', csw) File "/usr/local/lib/python2.7/dist-packages/ryu/lib/of_config/capable_switch.py", line 118, in edit_config self.raw_edit_config(target, xml, default_operation) File "/usr/local/lib/python2.7/dist-packages/ryu/lib/of_config/capable_switch.py", line 108, in raw_edit_config default_operation, test_option, error_option) File "/usr/local/lib/python2.7/dist-packages/ryu/contrib/ncclient/manager.py", line 78, in wrapper return self.execute(op_cls, *args, **kwds) File "/usr/local/lib/python2.7/dist-packages/ryu/contrib/ncclient/manager.py", line 132, in execute raise_mode=self._raise_mode).request(*args, **kwds) File "/usr/local/lib/python2.7/dist-packages/ryu/contrib/ncclient/operations/edit.py", line 58, in request return self._request(node) File "/usr/local/lib/python2.7/dist-packages/ryu/contrib/ncclient/operations/rpc.py", line 289, in _request raise self._reply.error ncclient.operations.rpc.RPCError: Some unspecified error occurred. Maintainer of openvswitch/of-config project has figured out, that this error appear due to hardcoded namespace sent by Ryu in edit_config request. For more detailed information, see https://github.com/openvswitch/of-config/issues/3 https://github.com/openvswitch/of-config/issues/5 Patch body: diff --git a/ryu/lib/of_config/__init__.py b/ryu/lib/of_config/__init__.py index b2dbd05..0f47e97 100644 --- a/ryu/lib/of_config/__init__.py +++ b/ryu/lib/of_config/__init__.py @@ -47,7 +47,11 @@ OFCONFIG_1_1_YANG = 'urn:onf:of12:config:yang' # LINC specific? OFCONFIG_1_1_1_YANG = 'urn:onf:of111:config:yang' +# OVS OF-Config specific? +OFCONFIG_OFC_YANG = 'urn:onf:config:yang' + OFCONFIG_YANG_NAMESPACES = { '1.1': OFCONFIG_1_1_YANG, '1.1.1': OFCONFIG_1_1_1_YANG, + 'ofc': OFCONFIG_OFC_YANG, } diff --git a/ryu/lib/of_config/base.py b/ryu/lib/of_config/base.py index c657b10..8122152 100644 --- a/ryu/lib/of_config/base.py +++ b/ryu/lib/of_config/base.py @@ -51,11 +51,20 @@ class _ct(_e): class _Base(stringify.StringifyMixin): - _M = objectify.ElementMaker(annotate=False, - namespace=_ns_of111, - nsmap=_nsmap) - def __init__(self, **kwargs): + ns_of = _ns_of111 + if 'namespace' in kwargs: + ns_of = kwargs.pop('namespace') + + nsmap = { + 'of': ns_of, + 'nc': _ns_netconf, + } + + self._m = objectify.ElementMaker(annotate=False, + namespace=ns_of, + nsmap=nsmap) + for e in self._ELEMENTS: k = _pythonify(e.name) try: @@ -81,7 +90,7 @@ class _Base(stringify.StringifyMixin): elif isinstance(v, objectify.ObjectifiedElement): assert ET.QName(v.tag).localname == itag return v - return self._M(itag, v) + return self._m(itag, v) args = [] for e in self._ELEMENTS: @@ -97,25 +106,27 @@ class _Base(stringify.StringifyMixin): assert not e.is_list ele = [convert(v)] args.extend(ele) - return self._M(tag, *args) + return self._m(tag, *args) def to_xml(self, tag): e = self.to_et(tag) return ET.tostring(e, pretty_print=True) @classmethod - def from_xml(cls, xmlstring): + def from_xml(cls, xmlstring, namespace=_ns_of111): et = objectify.fromstring(xmlstring) - return cls.from_et(et) + return cls.from_et(et, namespace) @classmethod - def from_et(cls, et): + def from_et(cls, et, namespace=_ns_of111): def convert(v): if e.cls is not None: - return e.cls.from_et(v) + return e.cls.from_et(v, namespace) return v - kwargs = {} + kwargs = { + 'namespace': namespace, + } for e in cls._ELEMENTS: try: v = et[e.name] diff --git a/ryu/lib/of_config/capable_switch.py b/ryu/lib/of_config/capable_switch.py index 91f4013..11ff202 100644 --- a/ryu/lib/of_config/capable_switch.py +++ b/ryu/lib/of_config/capable_switch.py @@ -108,13 +108,13 @@ class OFCapableSwitch(object): default_operation, test_option, error_option) def get(self): - return ofc.OFCapableSwitchType.from_xml(self.raw_get()) + return ofc.OFCapableSwitchType.from_xml(self.raw_get(), self.namespace) def get_config(self, source): - return ofc.OFCapableSwitchType.from_xml(self.raw_get_config(source)) + return ofc.OFCapableSwitchType.from_xml(self.raw_get_config(source), self.namespace) def edit_config(self, target, capable_switch, default_operation=None): - xml = ofc.NETCONF_Config(capable_switch=capable_switch).to_xml() + xml = ofc.NETCONF_Config(namespace=self.namespace, capable_switch=capable_switch).to_xml() self.raw_edit_config(target, xml, default_operation) def delete_config(self, source): |