Test-Scale:
    Adding scale tests and detailed test methods for various test
    scenarios.

Change-Id: I9f826148061c26b7966cfdd981e2b88daacfa56c
diff --git a/src/test/utils/Scale.py b/src/test/utils/Scale.py
index 1a53c52..04cb5f5 100644
--- a/src/test/utils/Scale.py
+++ b/src/test/utils/Scale.py
@@ -199,6 +199,21 @@
     IGMP_DST_MAC = "01:00:5e:00:00:16"
     igmp_eth = Ether(dst = IGMP_DST_MAC, type = ETH_P_IP)
     igmp_ip = IP(dst = IP_DST)
+	INGRESS_PORT = 1
+    EGRESS_PORT = 2
+    ingress_iface = 1
+    egress_iface = 2
+    MAX_PORTS = 100
+    CURRENT_PORT_NUM = egress_iface
+    ACL_SRC_IP = '192.168.20.3/32'
+    ACL_DST_IP = '192.168.30.2/32'
+    ACL_SRC_IP_RULE_2 = '192.168.40.3/32'
+    ACL_DST_IP_RULE_2 = '192.168.50.2/32'
+    ACL_SRC_IP_PREFIX_24 = '192.168.20.3/24'
+    ACL_DST_IP_PREFIX_24 = '192.168.30.2/24'
+    HOST_DST_IP = '192.168.30.0/24'
+    HOST_DST_IP_RULE_2 = '192.168.50.0/24'
+
 
 
 
@@ -338,8 +353,75 @@
         self.send_multicast_data_traffic(group,source=source)
         t.join()
         return self.success
+##################### acl utility functions ###############################
 
     @classmethod
+    def acl_hosts_add(cls, dstHostIpMac, egress_iface_count = 1,  egress_iface_num = None):
+        index = 0
+        if egress_iface_num is None:
+            egress_iface_num = cls.egress_iface
+        for ip,_ in dstHostIpMac:
+            egress = cls.port_map[egress_iface_num]
+            log.info('Assigning ip %s to interface %s' %(ip, egress))
+            config_cmds_egress = ( 'ifconfig {} 0'.format(egress),
+                                   'ifconfig {0} up'.format(egress),
+                                   'ifconfig {0} {1}'.format(egress, ip),
+                                   'arping -I {0} {1} -c 2'.format(egress, ip.split('/')[0]),
+                                   'ifconfig {0}'.format(egress),
+                                 )
+            for cmd in config_cmds_egress:
+                os.system(cmd)
+            index += 1
+            if index == egress_iface_count:
+               break
+            egress_iface_count += 1
+            egress_iface_num += 1
+    @classmethod
+    def acl_hosts_remove(cls, egress_iface_count = 1,  egress_iface_num = None):
+        if egress_iface_num is None:
+           egress_iface_num = cls.egress_iface
+        n = 0
+        for n in range(egress_iface_count):
+           egress = cls.port_map[egress_iface_num]
+           config_cmds_egress = ('ifconfig {} 0'.format(egress))
+           os.system(config_cmds_egress)
+           egress_iface_num += 1
+    def acl_rule_traffic_send_recv(self, srcMac, dstMac, srcIp, dstIp, ingress =None, egress=None, ip_proto=None, dstPortNum = None, positive_test = True):
+        if ingress is None:
+           ingress = self.ingress_iface
+        if egress is None:
+           egress = self.egress_iface
+        ingress = self.port_map[ingress]
+        egress = self.port_map[egress]
+        self.success = False if positive_test else True
+        timeout = 10 if positive_test else 1
+        count = 2 if positive_test else 1
+        self.start_sending = True
+        def recv_task():
+            def recv_cb(pkt):
+                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+                self.success = True if positive_test else False
+            sniff(count=count, timeout=timeout,
+                  lfilter = lambda p: IP in p and p[IP].dst == dstIp.split('/')[0] and p[IP].src == srcIp.split('/')[0],
+                  prn = recv_cb, iface = egress)
+            self.start_sending = False
+
+        t = threading.Thread(target = recv_task)
+        t.start()
+        L2 = Ether(src = srcMac, dst = dstMac)
+        L3 = IP(src = srcIp.split('/')[0], dst = dstIp.split('/')[0])
+        pkt = L2/L3
+		        log.info('Sending a packet with dst ip %s, src ip %s , dst mac %s src mac %s on port %s to verify if flows are correct' %
+                 (dstIp.split('/')[0], srcIp.split('/')[0], dstMac, srcMac, ingress))
+        while self.start_sending is True:
+            sendp(pkt, count=50, iface = ingress)
+        t.join()
+        assert_equal(self.success, True)
+
+
+
+############################# vrouter utility functiuons ####################
+    @classmethod
     def vrouter_setup(cls):
         apps = ('org.onosproject.proxyarp', 'org.onosproject.hostprovider', 'org.onosproject.vrouter', 'org.onosproject.fwd')
         for app in apps:
@@ -432,7 +514,6 @@
         bgp_speakers_list.append(speaker_dict)
         cls.peer_list = peer_list
         return (cls.vrouter_device_dict, ports_dict, quagga_dict)
-
     @classmethod
     def generate_conf(cls, networks = 4, peer_address = None, router_address = None):
         num = 0
@@ -727,7 +808,6 @@
           ssm_groups = map(lambda sub: sub.channels, self.subscriber_list)
           ssm_list = reduce(lambda ssm1, ssm2: ssm1+ssm2, ssm_groups)
           igmpChannel.igmp_load_ssm_config(ssm_list)
-
     def subscriber_join_verify( self, num_subscribers = 10, num_channels = 1,
                                   channel_start = 0, cbs = None, port_list = [],
                                   services = None, negative_subscriber_auth = None):
@@ -962,9 +1042,9 @@
         return ':'.join(mac)
 
     def inc_ip(self, ip, i):
+
         ip[i] =str(int(ip[i])+1)
         return '.'.join(ip)
-
     def next_ip(self, ip):
 
         lst = ip.split('.')
@@ -985,4 +1065,3 @@
         lst=ip.split('.')
         lst[0] = '182'
         return '.'.join(lst)
-