zoukankan      html  css  js  c++  java
  • 期末作业验收

    一.实验代码

    
    import httplib2
    import time
    import json
    class OdlUtil:
    	url = ''
    	def __init__(self, host, port):
    		self.url = 'http://' + host + ':' + str(port)
    	def install_flow(self, container_name='default',username="admin", password="admin"):
    		http = httplib2.Http()
    		http.add_credentials(username, password)
    		headers = {'Accept': 'application/json'}
    		flow_name = 'flow_' + str(int(time.time()*1000))
    		#s2流表
    		#h2工作时s2端口1流量空闲时下发的流表
    		h2_to_s2_1 ='{"flow": [{"id": "0","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.2/32","ipv4-destination": "10.0.0.1/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                		'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "1"},"order": "0"}]}}]},'
                		'"priority": "101","cookie": "1","table_id": "0"}]}'
    		#h3工作时s2端口1流量空闲时下发的流表
    		h3_to_s2_1 ='{"flow": [{"id": "1","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                    	'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "1"},"order": "0"}]}}]},'
                		'"priority": "101","cookie": "1","table_id": "0"}]}'
    		mh3_to_s2_1 ='{"flow": [{"id": "1","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                    	'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "1"},"order": "0"}]}}]},'
                		'"priority": "100","cookie": "1","table_id": "0"}]}'
    		#h3工作时s2端口1流量满载时下发的流表	
    		h3_to_s2_2 ='{"flow": [{"id": "2","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                    	'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "2"},"order": "0"}]}}]},'
                		'"priority": "101","cookie": "1","table_id": "0"}]}'
    		mh3_to_s2_2 ='{"flow": [{"id": "2","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                    	'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "2"},"order": "0"}]}}]},'
                		'"priority": "100","cookie": "1","table_id": "0"}]}'
    		#s3流表
    		s3_1='{"flow": [{"id": "0","match": {"ethernet-match":'
                '{"ethernet-type": {"type": "2048"}},'
    			'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
                '"instructions": {"instruction": [{"order": "0",'
                '"apply-actions": {"action": [{"output-action": {'
                '"output-node-connector": "1"},"order": "0"}]}}]},'
                '"priority": "101","cookie": "1","table_id": "0"}]}'
    		s3_2='{"flow": [{"id": "1","match": {"ethernet-match":'
                '{"ethernet-type": {"type": "2048"}},'
    			'"ipv4-source":"10.0.0.1/32","ipv4-destination": "10.0.0.3/32"},'
                '"instructions": {"instruction": [{"order": "0",'
                '"apply-actions": {"action": [{"output-action": {'
                '"output-node-connector": "2"},"order": "0"}]}}]},'
                '"priority": "101","cookie": "2","table_id": "0"}]}'
    		#s1流表
    		s1_2To1='{"flow": [{"id": "0","match": {"ethernet-match":'
                	'{"ethernet-type": {"type": "2048"}},'
    				'"ipv4-source":"10.0.0.2/32","ipv4-destination": "10.0.0.1/32"},'
                	'"instructions": {"instruction": [{"order": "0",'
                	'"apply-actions": {"action": [{"output-action": {'
                	'"output-node-connector": "1"},"order": "0"}]}}]},'
                	'"priority": "101","cookie": "1","table_id": "0"}]}'
    		s1_3To1='{"flow": [{"id": "1","match": {"ethernet-match":'
                	'{"ethernet-type": {"type": "2048"}},'
    				'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
                	'"instructions": {"instruction": [{"order": "0",'
                	'"apply-actions": {"action": [{"output-action": {'
                	'"output-node-connector": "1"},"order": "0"}]}}]},'
                	'"priority": "101","cookie": "1","table_id": "0"}]}'
    		#h1工作时s1端口2流量空闲时下发的流表
    		h1_to_s1_2 ='{"flow": [{"id": "2","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.1/32","ipv4-destination": "10.0.0.3/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                    	'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "2"},"order": "0"}]}}]},'
                		'"priority": "101","cookie": "2","table_id": "0"}]}'
    		mh1_to_s1_2 ='{"flow": [{"id": "3","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.1/32","ipv4-destination": "10.0.0.3/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                    	'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "2"},"order": "0"}]}}]},'
                		'"priority": "100","cookie": "3","table_id": "0"}]}'
    		#h1工作时s1端口2流量满载时下发的流表	
    		h1_to_s1_3 ='{"flow": [{"id": "2","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.1/32","ipv4-destination": "10.0.0.3/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                    	'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "3"},"order": "0"}]}}]},'
                		'"priority": "101","cookie": "2","table_id": "0"}]}'
    		mh1_to_s1_3 ='{"flow": [{"id": "3","match": {"ethernet-match":'
                   		'{"ethernet-type": {"type": "2048"}},'
    					'"ipv4-source":"10.0.0.1/32","ipv4-destination": "10.0.0.3/32"},'
                		'"instructions": {"instruction": [{"order": "0",'
                    	'"apply-actions": {"action": [{"output-action": {'
                    	'"output-node-connector": "3"},"order": "0"}]}}]},'
                		'"priority": "100","cookie": "3","table_id": "0"}]}'
    		headers = {'Content-type': 'application/json'}
    		num=0
    		#下发流表,地址由ODL上获得
    		#下发s1与s3的流表
    		response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/0', body=s1_2To1, method='PUT',headers=headers)	
    		response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1', body=s1_3To1, method='PUT',headers=headers)
    		response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:3/flow-node-inventory:table/0/flow/0', body=s3_1, method='PUT',headers=headers)
    		response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:3/flow-node-inventory:table/0/flow/0', body=s3_2, method='PUT',headers=headers)
    
    		#s2调用h2到1的流表			
    		response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/0', body=h2_to_s2_1, method='PUT',headers=headers)
    		while num < 4 :
    			s1_uri = 'http://127.0.0.1:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/node-connector/openflow:1:2'
    			s2_uri = 'http://127.0.0.1:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:2/node-connector/openflow:2:1'
    			#获取s1端口2的流量
    			response, content = http.request(uri=s1_uri, method='GET')
    			content = json.loads(content)
    			statistics = content['node-connector'][0]['opendaylight-port-statistics:flow-capable-node-connector-statistics']
    			s1_bytes1 = statistics['bytes']['transmitted']
    			#0.5秒后再次获取
    			time.sleep(0.5)
    			response, content = http.request(uri=s1_uri, method='GET')
    			content = json.loads(content)
    			statistics = content['node-connector'][0]['opendaylight-port-statistics:flow-capable-node-connector-statistics']
    			s1_bytes2 = statistics['bytes']['transmitted']
    
    			s1_speed=float(s1_bytes2-s1_bytes1)/0.5
    			
    			if s1_speed !=0 :#获取有效的速度
    				print ('s1端口2速度:')
    				print s1_speed
    				#在检测到s1端口2流量空闲时发的流表
    				if s1_speed < 1000 :
    					print(' s1端口2空闲,h1数据包改为往s1端口2通过')
    					response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/2', body=h1_to_s1_2, method='PUT',headers=headers)
    					response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/3', body=mh1_to_s1_2, method='PUT',headers=headers)
    				#在检测到s1端口2流量满载时发的流表
    				else :
    					print(' s1端口2满载,h1数据包改为往s1端口3通过')
    					response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/2', body=h1_to_s1_3, method='PUT',headers=headers)
    					response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/3', body=mh1_to_s1_3, method='PUT',headers=headers)
    
    			#获取s2端口1的流量
    			response, content = http.request(uri=s2_uri, method='GET')
    			content = json.loads(content)
    			statistics = content['node-connector'][0]['opendaylight-port-statistics:flow-capable-node-connector-statistics']
    			s2_bytes1 = statistics['bytes']['transmitted']
    			#0.5秒后再次获取
    			time.sleep(0.5)
    			response, content = http.request(uri=s2_uri, method='GET')
    			content = json.loads(content)
    			statistics = content['node-connector'][0]['opendaylight-port-statistics:flow-capable-node-connector-statistics']
    			s2_bytes2 = statistics['bytes']['transmitted']
    			
    			s2_speed=float(s2_bytes2-s2_bytes1)/0.5
    		
    			if s2_speed !=0 :#获取有效的速度
    				print ('s2端口1速度:')
    				print s2_speed
    				#在检测到s2端口1流量空闲时发的流表
    				if s2_speed < 1000 :
    					print(' s2端口1空闲,h3数据包改为往s2端口1通过')
    					response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/1', body=h3_to_s2_1, method='PUT',headers=headers)
    					response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/2', body=mh3_to_s2_2, method='PUT',headers=headers)
    				#在检测到s2端口1流量满载时发的流表
    				else :
    					print(' s2端口1满载,h3数据包改为往s2端口2通过')
    					response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/1', body=mh3_to_s2_1, method='PUT',headers=headers)
    					response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/2', body=h3_to_s2_2, method='PUT',headers=headers)
    odl = OdlUtil('127.0.0.1', '8181')
    odl.install_flow()
    
    
    
    

    二.实验场景

    服务器h2 h3上各自有不同的服务,h1是客户端。实现一个负载均衡的北向程序,当h2和h3向h1传输数据时,北向应用根据链路的使用状况动态的调整路由规则。
    主要思路:过一定的时间后,下发新的流表,使得流量流向另一个交换机,从而实现负载均衡。类似于轮询法。

    三.视频演示
    1.打开ODL

    2.查看拓扑

    3.查看拥塞状况

    4.调用负载均衡

    5。负载均衡调用后的结果

    三.小组分工
    负责查找相关资料,与小组成员一起完成代码的编写,使其可以成功下发流表实现负载均衡,后期视频的剪辑。

    四.课程总结
    1.了解了什么是 SDN ,SDN 的基本思想、特点
    ODL设计的三个层次
    SDN 的应用领域
    openflow多级流表机制的优点
    opendaylight控制器
    2.掌握了在mninet上创建拓扑并通过floodlight验证器正确
    运用ODL控制器下发流表并通过OVS命令查看验证
    运用Postman通过ODL的北向接口下发流表
    运用Wireshark抓包验证拓扑结构的正确性
    3.ECMP与负载均衡
    对ECMP与负载均衡的定义及实现有了充分的掌握,可以实现较简单的负载均衡场景,理解了几种负载均衡的简单算法以及对负载均衡的优化。

  • 相关阅读:
    关于表单的jQuery练习
    jQuery中的综合动画
    jQuery中自定义简单动画的实现
    清除浮动
    定位
    盒子模型
    笔记
    笔记
    翻页
    DOM
  • 原文地址:https://www.cnblogs.com/micheallll/p/8343749.html
Copyright © 2011-2022 走看看