blob: 74a9e52d88c6918309c8123f0973ac7f33b32a9f [file] [log] [blame]
ChetanGaonkerf0dd5bb2016-07-28 16:22:06 -07001#
2# Copyright 2016-present Ciena Corporation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16import json
17import requests
18import os,sys,time
19from scapy.all import *
A R Karthick456e9cf2016-10-03 14:37:44 -070020from OnosCtrl import OnosCtrl, get_mac, get_controller
ChetanGaonkerf0dd5bb2016-07-28 16:22:06 -070021from OnosFlowCtrl import OnosFlowCtrl
22
23conf.verb = 0 # Disable Scapy verbosity
24conf.checkIPaddr = 0 # Don't check response packets for matching destination IPs
25
26class ACLTest:
27
28 auth = ('karaf', 'karaf')
A R Karthick456e9cf2016-10-03 14:37:44 -070029 controller = get_controller()
ChetanGaonkerf0dd5bb2016-07-28 16:22:06 -070030 add_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules' %(controller)
31 remove_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules/%s' %(controller, id)
32 clear_all_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules' %(controller)
33 iface_create_onos_url = 'http://%s:8181/onos/v1/network/configuration' %(controller)
A R Karthicka337f4d2016-10-06 13:53:15 -070034 device_id = 'of:' + get_mac()
ChetanGaonkerf0dd5bb2016-07-28 16:22:06 -070035 MAX_PORTS = 100
36
37 def __init__(self, ipv4Prefix ='v4', srcIp ='null', dstIp ='null', ipProto = 'null', dstTpPort = 0, action = 'null', ingress_iface = 1, egress_iface = 2,iface_num = 0, iface_name = 'null', iface_count = 0, iface_ip = 'null'):
38 self.ipv4Prefix = ipv4Prefix
39 self.srcIp = srcIp
40 self.ingress_iface = ingress_iface
41 self.egress_iface = egress_iface
42 self.dstIp = dstIp
43 self.ipProto = ipProto
44 self.dstTpPort = dstTpPort
45 self.action = action
46 self.iface_count = iface_count
47 self.iface_num = iface_num
48 self.iface_name = iface_name
49 self.iface_ip = iface_ip
A R Karthicka337f4d2016-10-06 13:53:15 -070050 self.device_id = OnosCtrl.get_device_id()
ChetanGaonkerf0dd5bb2016-07-28 16:22:06 -070051
52 def adding_acl_rule(self, ipv4Prefix, srcIp, dstIp, ipProto ='null', dstTpPort='null', action= 'include'):
53 '''This function is generating ACL json file and post to ONOS for creating a ACL rule'''
54 if ipv4Prefix is 'v4':
A R Karthick2b93d6a2016-09-06 15:19:09 -070055 acl_dict = {}
ChetanGaonkerf0dd5bb2016-07-28 16:22:06 -070056 if srcIp and dstIp and action:
57 acl_dict['srcIp'] = '{}'.format(srcIp)
58 acl_dict['dstIp'] = '{}'.format(dstIp)
59 acl_dict['action'] = '{}'.format(action)
60 if ipProto is not 'null':
61 acl_dict['ipProto'] = '{}'.format(ipProto)
62 if dstTpPort is not 'null':
63 acl_dict['dstTpPort'] = '{}'.format(dstTpPort)
64 json_data = json.dumps(acl_dict)
65 resp = requests.post(self.add_acl_rule_url, auth = self.auth, data = json_data)
66 return resp.ok, resp.status_code
67
68 def get_acl_rules(self):
69 '''This function is getting a ACL rules from ONOS with json formate'''
70 resp = requests.get(self.add_acl_rule_url, auth = self.auth)
71 return resp
72
73 @classmethod
74 def remove_acl_rule(cls,id = None):
75 '''This function is delete one or all ACL rules in ONOS'''
76 if id is None:
77 remove_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules' %(cls.controller)
78 else:
79 remove_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules/%s' %(cls.controller, id)
80 resp = requests.delete(remove_acl_rule_url, auth = cls.auth)
81 return resp.ok, resp.status_code
A R Karthick2b93d6a2016-09-06 15:19:09 -070082
ChetanGaonkerf0dd5bb2016-07-28 16:22:06 -070083 def generate_onos_interface_config(self,iface_num = 4, iface_name = 'null',iface_count = 1,iface_ip = '198.162.10.1'):
84 '''This function is generate interface config data in json format and post to ONOS for creating it '''
85 ''' To add interfaces on ONOS to test acl with trffic'''
86 num = 0
87 egress_host_list = []
88 interface_list = []
89 ip = iface_ip.split('/')[0]
90 start_iface_ip = ip.split('.')
91 start_ip = ( int(start_iface_ip[0]) << 24) | ( int(start_iface_ip[1]) << 16) | ( int(start_iface_ip[2]) << 8) | 0
92 end_ip = ( 200 << 24 ) | (168 << 16) | (10 << 8) | 0
93 ports_dict = { 'ports' : {} }
94 for n in xrange(start_ip, end_ip, 256):
95 port_map = ports_dict['ports']
96 port = iface_num if num < self.MAX_PORTS - 1 else self.MAX_PORTS - 1
97 device_port_key = '{0}/{1}'.format(self.device_id, port)
98 try:
99 interfaces = port_map[device_port_key]['interfaces']
100 except:
101 port_map[device_port_key] = { 'interfaces' : [] }
102 interfaces = port_map[device_port_key]['interfaces']
103 ip = n + 2
104 peer_ip = n + 1
105 ips = '%d.%d.%d.%d/%d'%( (ip >> 24) & 0xff, ( (ip >> 16) & 0xff ), ( (ip >> 8 ) & 0xff ), ip & 0xff, int(iface_ip.split('/')[1]))
106 peer = '%d.%d.%d.%d' % ( (peer_ip >> 24) & 0xff, ( ( peer_ip >> 16) & 0xff ), ( (peer_ip >> 8 ) & 0xff ), peer_ip & 0xff )
107 mac = RandMAC()._fix()
108 egress_host_list.append((peer, mac))
109 if num < self.MAX_PORTS - 1:
110 interface_dict = { 'name' : '{0}-{1}'.format(iface_name,port), 'ips': [ips], 'mac' : mac }
111 interfaces.append(interface_dict)
112 interface_list.append(interface_dict['name'])
113 else:
114 interfaces[0]['ips'].append(ips)
115 num += 1
116 if num == iface_count:
117 break
118 json_data = json.dumps(ports_dict)
119 resp = requests.post(self.iface_create_onos_url, auth = self.auth, data = json_data)
120 return resp.ok, resp.status_code, egress_host_list
121