zoukankan      html  css  js  c++  java
  • 实验 7:OpenDaylight 实验——Python 中的 REST API 调用 (含选做)

    实验 7:OpenDaylight 实验——Python 中的 REST API 调用 (含选做)

    一、实验目的

    对 Python 调用 OpenDaylight 的 REST API 方法有初步了解。

    二、实验任务

    本实验需要用另一种方法完成上一个实验相同的功能,即通过 Python 程序调用 OpenDaylight 的北向接口下发关于硬超时的流表,实现拓扑内主机在一定时间 内的网络通断。实验拓扑如下:

    三、实验步骤

    1.实验环境

    安装了 Ubuntu 18.04.5 Desktop amd64 的虚拟机

    2.实验过程

    (1)开启 OpneDaylight,并且生成拓扑

    $ sudo ./distribution-karaf-0.6.4-Carbon/bin/karaf //开启ODL控制器
    $ sudo mn --topo=single,3 --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13//生成拓扑
    

    生成拓扑的方法同之前的实验一致。

    (2)编写 Python 代码和 JSON 格式的请求内容

    $ gedit odlnorth.py
    

    odlnorth.py

    #!/usr/bin/python
    import requests
    from requests.auth import HTTPBasicAuth
    def http_put(url,jstr):
        url= url
        headers = {'Content-Type':'application/json'}
        resp = requests.put(url,jstr,headers=headers,auth=HTTPBasicAuth('admin', 'admin'))
        return resp
    #复制 url 时,请注意检查是否复制错误。
    if __name__ == "__main__":
        url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1'
        with open('hardtimeout.json') as f:
            jstr = f.read()
        resp = http_put(url,jstr)
        print resp.content
    

    由于是下发流表,因此需要有 http 请求的具体内容,同之前的 Postman 一样, 也是以 JSON 格式来表示。 编辑 hardtimeout.json 文件:

    $ gedit hardtimeout.json
    

    文件中不包含 http 请求的 url 地址:

    {
        "flow": [
            {
                "id": "1",
                "match": {
                    "in-port": "1",
                    "ethernet-match": {
                        "ethernet-type": {
                            "type": "0x0800"
                        }
                    },
                    "ipv4-destination": "10.0.0.3/32"
                },
                "instructions": {
                    "instruction": [
                        {
                            "order": "0",
                            "apply-actions": {
                                "action": [
                                    {
                                        "order": "0",
                                        "drop-action": {}
                                    }
                                ]
                            }
                        }
                    ]
                },
                "flow-name": "flow1",
                "priority": "65535",
                "hard-timeout": "10",
                "cookie": "2",
                "table_id": "0"
            }
        ]
    }
    

    (3)运行 Python 代码,完成流表下发

    $ python odlnorth.py
    

    为了验证方法结果是否正确,则在运行 Python 代码时,请先在 mininet 运行 h1 ping h3若出现下图,则表示实验成功:

    提示:运行代码如果报错:ImportError: No module named requests,可尝试 如下方法。

    $ sudo apt-get install python-pip //如果 pip 没装的话需要运行
    $ sudo pip install requests
    

    * 更多 OpenDaylight 的 REST API 文档可以在下面的地址中查找: http://127.0.0.1:8181/apidoc/explorer/index.html

    (4)选做

    github:https://github.com/HL1123/SDN_7

    #!/usr/bin/python
    import requests
    import json
    from requests.auth import HTTPBasicAuth
    
    
    def http_get(url):
        url= url
        headers = {'Content-Type':'application/json'}
        resp = requests.get(url,headers=headers,auth=HTTPBasicAuth('admin', 'admin'))
        return resp
    
    
    if __name__ == "__main__":
        url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0'
        resp = http_get(url)
        res = json.loads(resp.content)
        if res=='{}':
    	print("error")
        else:
        	print(resp.content)
       	print(len(res['flow-node-inventory:table'][0]['flow']))
    

    结果:

    四、实验总结

    遇到问题:

    • 错误:

    • 解决办法:没打开 ODL ,请在使用 mininet 创建拓扑前,打开 ODL。

    • 错误:

    • 解决办法:python 文件内 URL 格式错误。

      #错误 url
      url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flownode-inventory:table/0/flow/1'
      #正确 url
      url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1'
      

    总而言之:

    本实验操作较简单,但在根据实验指导书操作时,容易出现 PDF 复制容易漏 ‘-’,导致实验中出现奇奇怪怪的错误 。

    • 请注意检查代码内容和 URL 的正确性,最好是自己一个个打。
    • 通过本实验更加熟悉了流表的硬超时,并且通过 Python 程序来进行调用 ODL 的北向接口下发流表。

    五、实验要求

    1. 根据实验步骤复现上述实验,指导书仅提供参考方法,如果你对 Python 比较 熟悉,且有其他方法,欢迎使用。
    2. 利用Python程序获取本实验拓扑中的交换机s1中活动的流表数目active-flows。 (选做题,不做强制要求)
    3. 在博客园发表一篇博客,记录主要步骤,如果完成了选做题,请在博客标题上 标注,并提交程序到 GitHub,展示运行结果。
  • 相关阅读:
    CS229 6.4 Neurons Networks Autoencoders and Sparsity
    CS229 6.3 Neurons Networks Gradient Checking
    【Leetcode】【Easy】Min Stack
    【Leetcode】【Easy】Merge Sorted Array
    【Leetcode】【Easy】ZigZag Conversion
    【Leetcode】【Easy】Valid Palindrome
    【Leetcode】【Easy】Reverse Integer
    【Leetcode】【Easy】Palindrome Number
    【Leetcode】【Easy】Length of Last Word
    【Leetcode】【Easy】Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/huanglong1123/p/13815917.html
Copyright © 2011-2022 走看看