1. 程式人生 > 實用技巧 >實驗7:OpenDaylight 實驗——Python 中的 REST API 呼叫

實驗7:OpenDaylight 實驗——Python 中的 REST API 呼叫

實驗7:OpenDaylight 實驗——Python 中的 REST API 呼叫

一、實驗目的

對 Python 呼叫 OpenDaylight 的 REST API 方法有初步瞭解。

二、實驗任務

本實驗需要用另一種方法完成上一個實驗相同的功能,即通過 Python 程式呼叫

OpenDaylight 的北向介面下發關於硬超時的流表,實現拓撲內主機在一定時間

內的網路通斷。實驗拓撲如下:

三、實驗步驟

1、實驗環境

安裝了 Ubuntu 16.04.5 Desktop amd64 的虛擬機器

2、實驗過程

(1)生成拓撲

$ sudo mn --topo=single,3 --controller=remote,ip=127.0.0.1,port=6633 --switch

ovsk,protocols=OpenFlow13

生成拓撲的方法同之前的實驗一致。

使用 pingall 進行連線,如連線不上,則使用實驗六的方法清空流表。最終得到下圖:

(2)編寫 Python 程式碼和 JSON 格式的請求內容

$ nano 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 

 

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 檔案:

$ nano 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

執行程式碼如果報錯:ImportError: No module named requests,可嘗試

如下方法。

$ sudo apt-get install python-pip

$ sudo pip install requests

最終驗證得到下圖: