opendaylight:不一致的 api 响应

Posted

技术标签:

【中文标题】opendaylight:不一致的 api 响应【英文标题】:opendaylight: inconsistent api response 【发布时间】:2018-07-06 12:17:40 【问题描述】:

我已经启动并运行了 Opendaylight,但是当我尝试通过 REST api 对其进行配置时,

执行完全相同的请求,第一次收到异常,第二次收到配置已存在的错误消息。

请参阅下面的示例,该示例发出 2 次相同的请求。 一个导致异常,另一个返回响应

我想问你:

    我在哪里可以解决这个问题?

    我正在尝试寻找一些诊断方法 用于 Opendaylight BGP 配置的 restful GET 命令,用于 例子;显示 BGP 会话/组/邻居的所有 BGP 属性。 我在哪里可以找到那个?

    In [9]: cmd = """  <neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions">
       ...:     <neighbor-address>10.20.14.1</neighbor-address>
       ...:     <afi-safis>
       ...:         <afi-safi>
       ...:             <afi-safi-name>LINKSTATE</afi-safi-name>
       ...:         </afi-safi>
       ...:     </afi-safis>
       ...: </neighbor>
       ...: """
    
    In [10]: url = "/restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/bgp-example/bgp/ne
        ...: ighbors"
    
    In [11]: 
    
    In [11]: requests.post('http://:'.format(odl['api']['ipaddr'],odl['api']['port'],url), auth=auth, headers=headers, data=cmd).json()
    ---------------------------------------------------------------------------
    JSONDecodeError                           Traceback (most recent call last)
    <ipython-input-11-6c5beab7d9fb> in <module>()
    ----> 1 requests.post('http://:'.format(odl['api']['ipaddr'],odl['api']['port'],url), auth=auth, headers=headers, data=cmd).json()
    
    /usr/lib/python3.6/site-packages/requests/models.py in json(self, **kwargs)
        894                     # used.
        895                     pass
    --> 896         return complexjson.loads(self.text, **kwargs)
        897 
        898     @property
    
    /usr/lib64/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
        352             parse_int is None and parse_float is None and
        353             parse_constant is None and object_pairs_hook is None and not kw):
    --> 354         return _default_decoder.decode(s)
        355     if cls is None:
        356         cls = JSONDecoder
    
    /usr/lib64/python3.6/json/decoder.py in decode(self, s, _w)
        337 
        338         """
    --> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
        340         end = _w(s, end).end()
        341         if end != len(s):
    
    /usr/lib64/python3.6/json/decoder.py in raw_decode(self, s, idx)
        355             obj, end = self.scan_once(s, idx)
        356         except StopIteration as err:
    --> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
        358         return obj, end
    
    JSONDecodeError: Expecting value: line 1 column 1 (char 0)
    
    In [12]: requests.post('http://:'.format(odl['api']['ipaddr'],odl['api']['port'],url), auth=auth, headers=headers, data=cmd).json()
    Out[12]: 
    'errors': 'error': ['error-type': 'protocol',
        'error-tag': 'data-exists',
        'error-message': 'Data already exists for path: /(http://openconfig.net/yang/network-instance?revision=2015-10-18)network-instances/network-instance/network-instance[(http://openconfig.net/yang/network-instance?revision=2015-10-18)name=global-bgp]/protocols/protocol/protocol[(http://openconfig.net/yang/network-instance?revision=2015-10-18)identifier=(http://openconfig.net/yang/policy-types?revision=2015-10-09)BGP, (http://openconfig.net/yang/network-instance?revision=2015-10-18)name=bgp-example]/AugmentationIdentifierchildNames=[(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2017-12-07)bgp]/(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2017-12-07)bgp/neighbors/neighbor/neighbor[(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2017-12-07)neighbor-address=10.20.14.1]']
    

【问题讨论】:

【参考方案1】:

您正在使用 POST,这意味着如果不存在则创建,因此第二个请求正确返回 RESTCONF RFC 中指定的“数据存在”错误。

【讨论】:

为什么第一个会导致异常? 第一次调用中的 JSONDecodeError 看起来像是来自您的 Python 代码。 @iamsterdam 如果此答案对您有用,您可以标记为已回答吗?

以上是关于opendaylight:不一致的 api 响应的主要内容,如果未能解决你的问题,请参考以下文章

译OpenDaylight控制器:SAL架构概述

译OpenDaylight控制器:MD-SAL 架构

OpenDayLight——HelloWorld

处理古怪的 API JSON 响应体 --- 单例与数组 [重复]

OpenDaylight(一):如何用postman控制ODL查看和下发流表

在 Opendaylight 中修改配置