blob: 370861f7e697769f405dfddfc9f327aa96877503 [file] [log] [blame]
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -08001import unittest
2from nose.tools import *
3from nose.twistedtools import reactor, deferred
4from twisted.internet import defer
5from scapy.all import *
6import time
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -08007import copy
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -08008from DHCP import DHCPTest
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -08009from OnosCtrl import OnosCtrl
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -080010log.setLevel('INFO')
11
12class dhcp_exchange(unittest.TestCase):
13
14 dhcp_server_config = {
15 "ip": "10.1.11.50",
16 "mac": "ca:fe:ca:fe:ca:fe",
17 "subnet": "255.255.252.0",
18 "broadcast": "10.1.11.255",
19 "router": "10.1.8.1",
20 "domain": "8.8.8.8",
21 "ttl": "63",
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -080022 "delay": "2",
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -080023 "startip": "10.1.11.51",
24 "endip": "10.1.11.100"
25 }
26
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080027 app = 'org.onosproject.dhcp'
28
29 def setUp(self):
30 ''' Activate the dhcp app'''
Chetan Gaonkerc0566b52016-03-09 11:31:51 -080031 self.maxDiff = None ##for assert_equal compare outputs on failure
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080032 self.onos_ctrl = OnosCtrl(self.app)
33 status, _ = self.onos_ctrl.activate()
34 assert_equal(status, True)
35 time.sleep(3)
36
37 def teardown(self):
38 '''Deactivate the dhcp app'''
39 self.onos_ctrl.deactivate()
40
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -080041 def onos_load_config(self, config):
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080042 status, code = self.onos_ctrl.config(config)
43 if status is False:
44 log.info('JSON request returned status %d' %code)
45 assert_equal(status, True)
Chetan Gaonkerc0566b52016-03-09 11:31:51 -080046 time.sleep(3)
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -080047
48 def onos_dhcp_table_load(self, config = None):
49 dhcp_dict = {'apps' : { 'org.onosproject.dhcp' : { 'dhcp' : copy.copy(self.dhcp_server_config) } } }
50 dhcp_config = dhcp_dict['apps']['org.onosproject.dhcp']['dhcp']
51 if config:
52 for k in config.keys():
53 if dhcp_config.has_key(k):
54 dhcp_config[k] = config[k]
55 self.onos_load_config(dhcp_dict)
56
57 def send_recv(self, update_seed = False):
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -080058 cip, sip = self.dhcp.discover(update_seed = update_seed)
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -080059 assert_not_equal(cip, None)
60 assert_not_equal(sip, None)
61 log.info('Got dhcp client IP %s from server %s for mac %s' %
62 (cip, sip, self.dhcp.get_mac(cip)[0]))
63 return cip,sip
64
65 def test_dhcp_1request(self, iface = 'veth0'):
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080066 config = {'startip':'10.10.10.20', 'endip':'10.10.10.69',
67 'ip':'10.10.10.2', 'mac': "ca:fe:ca:fe:ca:fe",
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -080068 'subnet': '255.255.255.0', 'broadcast':'10.10.10.255', 'router':'10.10.10.1'}
69 self.onos_dhcp_table_load(config)
70 self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
71 self.send_recv()
72
73 def test_dhcp_Nrequest(self, iface = 'veth0'):
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080074 config = {'startip':'192.168.1.20', 'endip':'192.168.1.69',
Chetan Gaonkerb2bd8242016-03-03 15:39:24 -080075 'ip':'192.168.1.2', 'mac': "ca:fe:ca:fe:cc:fe",
76 'subnet': '255.255.255.0', 'broadcast':'192.168.1.255', 'router': '192.168.1.1'}
77 self.onos_dhcp_table_load(config)
78 self.dhcp = DHCPTest(seed_ip = '192.169.1.1', iface = iface)
79 ip_map = {}
80 for i in range(10):
81 cip, sip = self.send_recv(update_seed = True)
82 if ip_map.has_key(cip):
83 log.info('IP %s given out multiple times' %cip)
84 assert_equal(False, ip_map.has_key(cip))
85 ip_map[cip] = sip
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -080086
87 def test_dhcp_1release(self, iface = 'veth0'):
Chetan Gaonkerc0566b52016-03-09 11:31:51 -080088 config = {'startip':'10.10.100.20', 'endip':'10.10.100.21',
89 'ip':'10.10.100.2', 'mac': "ca:fe:ca:fe:8a:fe",
90 'subnet': '255.255.255.0', 'broadcast':'10.10.100.255', 'router':'10.10.100.1'}
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -080091 self.onos_dhcp_table_load(config)
Chetan Gaonkerc0566b52016-03-09 11:31:51 -080092 self.dhcp = DHCPTest(seed_ip = '10.10.100.10', iface = iface)
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -080093 cip, sip = self.send_recv()
94 log.info('Releasing ip %s to server %s' %(cip, sip))
95 assert_equal(self.dhcp.release(cip), True)
96 log.info('Triggering DHCP discover again after release')
97 cip2, sip2 = self.send_recv(update_seed = True)
98 log.info('Verifying released IP was given back on rediscover')
99 assert_equal(cip, cip2)
100 log.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
101 assert_equal(self.dhcp.release(cip2), True)
102
103 def test_dhcp_Nrelease(self, iface = 'veth0'):
Chetan Gaonkerc0566b52016-03-09 11:31:51 -0800104 config = {'startip':'192.170.1.20', 'endip':'192.170.1.30',
105 'ip':'192.170.1.2', 'mac': "ca:fe:ca:fe:9a:fe",
106 'subnet': '255.255.255.0', 'broadcast':'192.170.1.255', 'router': '192.170.1.1'}
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800107 self.onos_dhcp_table_load(config)
Chetan Gaonkerc0566b52016-03-09 11:31:51 -0800108 self.dhcp = DHCPTest(seed_ip = '192.170.1.10', iface = iface)
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800109 ip_map = {}
110 for i in range(10):
111 cip, sip = self.send_recv(update_seed = True)
112 if ip_map.has_key(cip):
113 log.info('IP %s given out multiple times' %cip)
114 assert_equal(False, ip_map.has_key(cip))
115 ip_map[cip] = sip
116
117 for ip in ip_map.keys():
118 log.info('Releasing IP %s' %ip)
119 assert_equal(self.dhcp.release(ip), True)
120
121 ip_map2 = {}
122 log.info('Triggering DHCP discover again after release')
123 for i in range(len(ip_map.keys())):
124 cip, sip = self.send_recv(update_seed = True)
125 ip_map2[cip] = sip
126
127 log.info('Verifying released IPs were given back on rediscover')
Chetan Gaonkerc0566b52016-03-09 11:31:51 -0800128 if ip_map != ip_map2:
129 log.info('Map before release %s' %ip_map)
130 log.info('Map after release %s' %ip_map2)
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800131 assert_equal(ip_map, ip_map2)