<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      導(dǎo)航

      實(shí)驗(yàn)7:基于REST API的SDN北向應(yīng)用實(shí)踐

      Posted on 2022-10-25 21:43  寄風(fēng)  閱讀(51)  評(píng)論(0)    收藏  舉報(bào)

      實(shí)驗(yàn)7:基于REST API的SDN北向應(yīng)用實(shí)踐

      二、實(shí)驗(yàn)環(huán)境

      Ubuntu 20.04 Desktop amd64

      三、實(shí)驗(yàn)要求

      (一)基本要求

      1.編寫(xiě)Python程序,調(diào)用OpenDaylight的北向接口實(shí)現(xiàn)以下功能
      (1)利用Mininet平臺(tái)搭建下圖所示網(wǎng)絡(luò)拓?fù)洌⑦B接OpenDaylight;

      拓?fù)浣Y(jié)構(gòu)

      啟動(dòng)連接ODL控制器,查看圖形界面

      (2) 下發(fā)指令刪除s1上的流表數(shù)據(jù)
      delete.py

      import requests
      from requests.auth import HTTPBasicAuth
      
      if __name__ == "__main__":
      
          url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/'
          headers = {'Content-Type': 'application/json'}
          res = requests.delete(url, headers=headers, auth=HTTPBasicAuth('admin', 'admin'))
          print (res.content)
      
      

      (3)下發(fā)硬超時(shí)流表,實(shí)現(xiàn)拓?fù)鋬?nèi)主機(jī)h1和h3網(wǎng)絡(luò)中斷20s
      timeout.py

      #!/usr/bin/python
      import requests
      from requests.auth import HTTPBasicAuth
      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("./timeout.json") as file:
              str = file.read()
          headers = {'Content-Type': 'application/json'}
          res = requests.put(url, str, headers=headers, auth=HTTPBasicAuth('admin', 'admin'))
          print (res.conten)
      

      timeout.json

      {
          "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": "flow",
              "priority": "65535",
              "hard-timeout": "20",
              "cookie": "2",
              "table_id": "0"
            }
          ]
        }
      
      

      實(shí)驗(yàn)截圖


      (4) 獲取s1上活動(dòng)的流表數(shù)
      getflow.py

      #!/usr/bin/python
      import requests
      from requests.auth import HTTPBasicAuth
      if __name__ == "__main__":
          url = 'http://127.0.0.1:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/opendaylight-flow-table-statistics:flow-table-statistics'![](https://img2022.cnblogs.com/blog/2910255/202210/2910255-20221025192732800-2024171952.png)
      
          headers = {'Content-Type': 'application/json'}
          res = requests.get(url,headers=headers, auth=HTTPBasicAuth('admin', 'admin'))
          print (res.content)
      
      

      實(shí)驗(yàn)截圖

      2.編寫(xiě)Python程序,調(diào)用Ryu的北向接口實(shí)現(xiàn)以下功能

      (1) 實(shí)現(xiàn)上述OpenDaylight實(shí)驗(yàn)拓?fù)渖舷嗤挠渤瑫r(shí)流表下發(fā)

      ryu_timeout.py

      #!/usr/bin/python
      import requests
      if __name__ == "__main__":
          url = 'http://127.0.0.1:8080/stats/flowentry/add'
          with open("./ryu_timeout.json") as file:
              str = file.read()
          headers = {'Content-Type': 'application/json'}
          res = requests.post(url, str, headers=headers)
          print (res.content)
      
      

      ryu_timeout.json

      {
          "dpid": 1,
          "cookie": 1,
          "cookie_mask": 1,
          "table_id": 0,
          "hard_timeout": 20,
          "priority": 65535,
          "flags": 1,
          "match":{
              "in_port":1
          },
          "actions":[
      
          ]
       }
      
      
      
      

      實(shí)驗(yàn)截圖

      (2) 參考Ryu REST API的文檔,基于VLAN實(shí)驗(yàn)的網(wǎng)絡(luò)拓?fù)洌幊虒?shí)現(xiàn)相同的VLAN配置。

      topo.py

      #topo.py
      from mininet.topo import Topo
      
      class MyTopo(Topo):
          def __init__(self):
              # initilaize topology
              Topo.__init__(self)
      
              self.addSwitch("s1")
              self.addSwitch("s2")
      
              self.addHost("h1")
              self.addHost("h2")
              self.addHost("h3")
              self.addHost("h4")
      
              self.addLink("s1", "h1")
              self.addLink("s1", "h2")
              self.addLink("s2", "h3")
              self.addLink("s2", "h4")
              self.addLink("s1", "s2")
      
      topos = {'mytopo': (lambda: MyTopo())}
      
      

      vlan.py

      import json
      
      import requests
      
      if __name__ == "__main__":
          url = 'http://127.0.0.1:8080/stats/flowentry/add'
          headers = {'Content-Type': 'application/json'}
          flow1 = {
              "dpid": 1,
              "priority": 1,
              "match":{
                  "in_port": 1
              },
              "actions":[
                  {
                      "type": "PUSH_VLAN",    
                      "ethertype": 33024      
                  },
                  {
                      "type": "SET_FIELD",
                      "field": "vlan_vid",    
                      "value": 4096           
                  },
                  {
                      "type": "OUTPUT",
                      "port": 3
                  }
              ]
          }
          flow2 = {
              "dpid": 1,
              "priority": 1,
              "match":{
                  "in_port": 2
              },
              "actions":[
                  {
                      "type": "PUSH_VLAN",     
                      "ethertype": 33024      
                  },
                  {
                      "type": "SET_FIELD",
                      "field": "vlan_vid",     
                      "value": 4097           
                  },
                  {
                      "type": "OUTPUT",
                      "port": 3
                  }
              ]
          }
          flow3 = {
              "dpid": 1,
              "priority": 1,
              "match":{
                  "vlan_vid": 0
              },
              "actions":[
                  {
                      "type": "POP_VLAN",    
                      "ethertype": 33024     
                  },
                  {
                      "type": "OUTPUT",
                      "port": 1
                  }
              ]
          }
          flow4 = {
              "dpid": 1,
              "priority": 1,
              "match": {
                  "vlan_vid": 1
              },
              "actions": [
                  {
                      "type": "POP_VLAN", 
                      "ethertype": 33024  
                  },
                  {
                      "type": "OUTPUT",
                      "port": 2
                  }
              ]
          }
          flow5 = {
              "dpid": 2,
              "priority": 1,
              "match": {
                  "in_port": 1
              },
              "actions": [
                  {
                      "type": "PUSH_VLAN", 
                      "ethertype": 33024 
                  },
                  {
                      "type": "SET_FIELD",
                      "field": "vlan_vid", 
                      "value": 4096  
                  },
                  {
                      "type": "OUTPUT",
                      "port": 3
                  }
              ]
          }
          flow6 = {
              "dpid": 2,
              "priority": 1,
              "match": {
                  "in_port": 2
              },
              "actions": [
                  {
                      "type": "PUSH_VLAN",  
                      "ethertype": 33024  
                  },
                  {
                      "type": "SET_FIELD",
                      "field": "vlan_vid",  
                      "value": 4097 
                  },
                  {
                      "type": "OUTPUT",
                      "port": 3
                  }
              ]
          }
          flow7 = {
              "dpid": 2,
              "priority": 1,
              "match": {
                  "vlan_vid": 0
              },
              "actions": [
                  {
                      "type": "POP_VLAN", 
                      "ethertype": 33024  
                  },
                  {
                      "type": "OUTPUT",
                      "port": 1
                  }
              ]
          }
          flow8 = {
              "dpid": 2,
              "priority": 1,
              "match": {
                  "vlan_vid": 1
              },
              "actions": [
                  {
                      "type": "POP_VLAN", 
                      "ethertype": 33024  
                  },
                  {
                      "type": "OUTPUT",
                      "port": 2
                  }
              ]
          }
          res1 = requests.post(url, json.dumps(flow1), headers=headers)
          res2 = requests.post(url, json.dumps(flow2), headers=headers)
          res3 = requests.post(url, json.dumps(flow3), headers=headers)
          res4 = requests.post(url, json.dumps(flow4), headers=headers)
          res5 = requests.post(url, json.dumps(flow5), headers=headers)
          res6 = requests.post(url, json.dumps(flow6), headers=headers)
          res7 = requests.post(url, json.dumps(flow7), headers=headers)
          res8 = requests.post(url, json.dumps(flow8), headers=headers)
      
      

      實(shí)驗(yàn)截圖

      進(jìn)階要求

      查看前序VLAN實(shí)驗(yàn)拓?fù)渲兴泄?jié)點(diǎn)(含交換機(jī)、主機(jī))的名稱(chēng),以及顯示每臺(tái)交換機(jī)的所有流表項(xiàng)。
      getnode.py

      import requests
      import time
      import re
      
      
      class GetNodes:
          def __init__(self, ip):
              self.ip = ip
              
          def get_switch_id(self):
              url = 'http://' + self.ip + '/stats/switches'
              re_switch_id = requests.get(url=url).json()
              switch_id_hex = []
              for i in re_switch_id:
                  switch_id_hex.append(hex(i))
      
              return switch_id_hex
      
          def getflow(self):
              url = 'http://' + self.ip + '/stats/flow/%d'
              switch_list = self.get_switch_id()
              ret_flow = []
              for switch in switch_list:
                  new_url = format(url % int(switch, 16))
                  re_switch_flow = requests.get(url=new_url).json()
                  ret_flow.append(re_switch_flow)
              return ret_flow
      
          def show(self):
              flow_list = self.getflow()
              for flow in flow_list:
                  for dpid in flow.keys():
                      dp_id = dpid
                      switchnum= '{1}'.format(hex(int(dp_id)), int(dp_id))        
                      print('s'+switchnum,end = " ")
                      switchnum = int(switchnum)
                  for list_table in flow.values():
                      for table in list_table:          
                          string1 = str(table)
                          if re.search("'dl_vlan': '(.*?)'", string1) is not None:
                             num = re.search("'dl_vlan': '(.*?)'", string1).group(1);
                             if num == '0' and switchnum == 1:
                                print('h1',end = " ")
                             if num == '1' and switchnum == 1:
                                print('h2',end = " ")
                             if num == '0' and switchnum == 2:
                                print('h3',end = " ")
                             if num == '1' and switchnum == 2:
                                print('h4',end = " ")
              print("")
              flow_list = self.getflow()
              for flow in flow_list:
                  for dpid in flow.keys():
                      dp_id = dpid
                      print('switch_name:s{1}'.format(hex(int(dp_id)), int(dp_id)))
                  for list_table in flow.values():
                      for table in list_table:
                          print(table)
      s1 = GetNodes("127.0.0.1:8080")
      s1.show()
      
      

      實(shí)驗(yàn)截圖:

      四、個(gè)人總結(jié)

      本次實(shí)驗(yàn)是一個(gè)比較綜合的實(shí)驗(yàn),包括的前幾次的實(shí)驗(yàn)內(nèi)容。最開(kāi)始ping不通,因?yàn)闆](méi)有連接OpenDaylight。調(diào)用Ryu的北向接口實(shí)現(xiàn)硬超時(shí)流表下發(fā)時(shí),需要同時(shí)開(kāi)啟REST API和運(yùn)行一個(gè)支持OpenFlow 1.3的交換機(jī):ryu-manager ryu/ryu/app/ofctl_rest.py ryu/ryu/app/simple_switch_13.py。無(wú)法識(shí)別“curl”,按照提示安裝sudo apt-get install curl。學(xué)會(huì)了調(diào)用OpenDaylight REST API實(shí)現(xiàn)特定網(wǎng)絡(luò)功能和調(diào)用Ryu REST API實(shí)現(xiàn)特定網(wǎng)絡(luò)功能。

      主站蜘蛛池模板: 午夜精品久久久久久久爽| 亚洲欧美日韩人成在线播放| 亚洲大尺度无码专区尤物| 又大又粗又硬又爽黄毛少妇 | 欧洲精品码一区二区三区| 高级艳妇交换俱乐部小说| 亚洲国产成人久久精品不卡| 国产成人无码A区在线观| 婷婷四房播播| av天堂久久精品影音先锋| 有码中文字幕一区三区| 国产成人精品视频不卡| 亚洲日本乱码熟妇色精品| 亚欧成人精品一区二区乱| 中国亚州女人69内射少妇| 116美女极品a级毛片| 成人国产乱对白在线观看| 亚洲人成网站77777在线观看| 亚洲人成人伊人成综合网无码| 国产亚洲精品第一综合另类灬| 色噜噜亚洲男人的天堂| 一区二区三区鲁丝不卡| 99热精品毛片全部国产无缓冲| 彰化市| 中文字幕99国产精品| 九九热这里只有精品在线| 亚洲av永久无码天堂影院| 天天做天天爱夜夜夜爽毛片| 色噜噜在线视频免费观看| 免费久久人人爽人人爽AV| 国产女人在线视频| 日韩精品一区二区三区蜜臀 | 中文熟妇人妻av在线| 国产精品高清国产三级囯产AV| 国产精品黄色一区二区三区 | 亚洲精品三区二区一区一| 熟女人妻视频| 国外av片免费看一区二区三区| 黑森林福利视频导航 | 精品综合一区二区三区四区| 动漫av网站免费观看|