SDN第七次上机作业

  • OpenDaylight

任务一

利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;

2524849-20211018091853449-1033922986.png

任务二

编写Python程序,调用OpenDaylight的北向接口下发指令删除s1上的流表数据。

2524849-20211025213229088-346463346.png

#!/usr/bin/python

import requests

from requests.auth import HTTPBasicAuth

 

def http_detele(url):

    url = url

    headers = {'Content-Type': 'application/json'}

    resp = requests.delete(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/'

    resp = http_detele(url)

    print(resp.content)

2524849-20211025213245442-1366008379.png

任务三

编写Python程序,调用OpenDaylight的北向接口下发硬超时流表,实现拓扑内主机h1和h3网络中断20s。

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('oal_3.json') as f:

        jstr = f.read()

    resp = http_put(url,jstr)

    print (resp.content)

2524849-20211025215404168-1763704120.png

任务四

编写Python程序,调用OpenDaylight的北向接口获取s1上活动的流表数。

#!/usr/bin/python

import requests

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/operational/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/opendaylight-flow-table-statistics:flow-table-statistics'

resp = http_get(url)

print(resp.content)

2524849-20211025213847336-2078023481.png

  • Ryu

任务一

编写Python程序,调用Ryu的北向接口,实现上述OpenDaylight实验拓扑上相同的硬超时流表下发。

import requests

from requests.auth import HTTPBasicAuth

def http_post(url,jstr):

    url= url

    headers = {'Content-Type':'application/json'}

    resp = requests.post(url,jstr,headers=headers)

    return resp

 

if __name__ == "__main__":

    url='http://127.0.0.1:8080/stats/flowentry/add'

    with open('ryu_1.json') as f:

        jstr = f.read()

    resp = http_post(url,jstr)

    print (resp.content)

2524849-20211025220848721-397865670.png

任务二

利用Mininet平台搭建下图所示网络拓扑,要求支持OpenFlow 1.3协议,主机名、交换机名以及端口对应正确。拓扑生成后需连接Ryu,且Ryu应能够提供REST API服务。

2524849-20211018092028666-278818513.png

2524849-20211025221228378-1724271568.png

2524849-20211025221614336-676368901.png

2524849-20211025221633469-283600199.png

任务三

整理一个Shell脚本,参考Ryu REST API的文档,利用curl命令,实现和实验2相同的VLAN。

VLAN_ID

Hosts

0

h1 h3

1

h2 h4

curl -X POST -d '{

  "dpid": 1,

  "match": {

    "in_port": 1

  },

  "actions": [

    {

      "type": "PUSH_VLAN",

      "ethertype": 33024

    },

    {

      "type": "SET_FIELD",

      "field": "vlan_vid",

      "value": 4096

    },

    {

      "type":"OUTPUT",

      "port": 3

    }

    ],

    "priority":5

}' http://localhost:8080/stats/flowentry/add

 

curl -X POST -d '

{

  "dpid": 1,

  "priority":5,

  "match": {

    "in_port": 2

  },

  "actions": [

    {

      "type": "PUSH_VLAN",

      "ethertype": 33024

    },

    {

      "type": "SET_FIELD",

      "field": "vlan_vid",

      "value": 4097

    },

    {

      "type":"OUTPUT",

      "port": 3

    }

    ]

}' http://localhost:8080/stats/flowentry/add

 

curl -X POST -d '

{

  "dpid": 1,

  "match": {

    "vlan_vid": 0

  },

  "actions": [

    {

      "type": "POP_VLAN",

      "ethertype": 33024

    },

    {

      "type":"OUTPUT",

      "port": 1

    }

    ],

    "priority":5

}

' http://localhost:8080/stats/flowentry/add

 

curl -X POST -d'

{

  "dpid": 1,

  "match": {

    "vlan_vid": 1

  },

  "actions": [

    {

      "type": "POP_VLAN",

      "ethertype": 33024

    },

    {

      "type":"OUTPUT",

      "port": 2

    }

    ],

    "priority":5

}

' http://localhost:8080/stats/flowentry/add

curl -X POST -d '{

  "dpid": 2,

  "match": {

    "in_port": 1

  },

  "actions": [

    {

      "type": "PUSH_VLAN",

      "ethertype": 33024

    },

    {

      "type": "SET_FIELD",

      "field": "vlan_vid",

      "value": 4096

    },

    {

      "type":"OUTPUT",

      "port": 3

    }

    ],

    "priority":5

}' http://localhost:8080/stats/flowentry/add

 

curl -X POST -d '

{

  "dpid": 2,

  "match": {

    "in_port": 2

  },

  "actions": [

    {

      "type": "PUSH_VLAN",

      "ethertype": 33024

    },

    {

      "type": "SET_FIELD",

      "field": "vlan_vid",

      "value": 4097

    },

    {

      "type":"OUTPUT",

      "port": 3

    }

    ],

    "priority":5

}' http://localhost:8080/stats/flowentry/add

 

curl -X POST -d '

{

  "dpid": 2,

  "match": {

    "vlan_vid": 0

  },

  "actions": [

    {

      "type": "POP_VLAN",

      "ethertype": 33024

    },

    {

      "type":"OUTPUT",

      "port": 1

    }

    ],

    "priority":5

}

' http://localhost:8080/stats/flowentry/add

 

curl -X POST -d'

{

  "dpid": 2,

  "match": {

    "vlan_vid": 1

  },

  "actions": [

    {

      "type": "POP_VLAN",

      "ethertype": 33024

    },

    {

      "type":"OUTPUT",

      "port": 2

    }

    ],

    "priority":5

}' http://localhost:8080/stats/flowentry/add

2524849-20211025223132288-1562085428.png

  • 进阶任务

编程实现基本要求第2部分Ryu(3)中的VLAN划分。

import requests

 

def http_post(url, js):

    headers = {'Content-Type': 'application/json'}

    resp = requests.post(url, jstr, headers=headers)

    print(resp.content)

 

 

if __name__ == '__main__':

    url = 'http://localhost:8080/stats/flowentry/add'

    for i in range(1, 9):

        with open('%s.json' % i) as f:

            jstr = f.read()

        http_post(url, jstr)

 

posted @ 2021-10-26 10:22  UnknownPisco  阅读(78)  评论(0)    收藏  举报