Initial set of Fabric switch test cases

Change-Id: I86fd2b67d3b773aa496f5ef61f1e1fdf51fd9925
diff --git a/Fabric/Utilities/accton/group_test.py b/Fabric/Utilities/accton/group_test.py
new file mode 100755
index 0000000..67d6fda
--- /dev/null
+++ b/Fabric/Utilities/accton/group_test.py
@@ -0,0 +1,883 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+"""

+Group table test

+Verify each group table can created correctly

+"""

+from oftest import config

+

+import logging

+import random

+

+from oftest import config

+import oftest

+import oftest.base_tests as base_tests

+import ofp

+

+from oftest.testutils import *

+from accton_util import *

+

+def getkey(type):

+    def byGroupId(stats_entry):

+        return stats_entry.group_id

+        

+    def byGroupType(stats_entry):

+        return stats_entry.group_type

+

+        

+    if type == "group_id":

+        return byGroupId

+    elif type == "group_type":

+        return byGroupType

+    else:

+         assert(0)

+    return byGroupId        

+               

+class L2InterfaceGroupOne(base_tests.SimpleDataPlane):

+    def runTest(self):    

+        delete_all_flows(self.controller)

+        delete_all_groups(self.controller)    

+

+        group_list1, msg1 = add_one_l2_interface_group(self.controller, config["port_map"].keys()[0], 1,  False, False)

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+ 

+        verify_group_stats=[ofp.group_desc_stats_entry(

+                          group_type=msg1.group_type,

+                          group_id=msg1.group_id,

+                          buckets=msg1.buckets)]

+

+        self.maxDiff=None

+

+        self.assertEquals(stats, verify_group_stats)

+

+class L2InterfaceGroup(base_tests.SimpleDataPlane):

+    def runTest(self):    

+        delete_all_flows(self.controller)

+        delete_all_groups(self.controller)    

+

+        group_list1, msg1 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1,  False, False)

+        group_list2, msg2 =add_l2_interface_grouop(self.controller, config["port_map"].keys(), 2,  False, False)       

+        

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+ 

+        verify_group_stats=[]

+

+        for msg in msg1:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets))        

+

+        for msg in msg2:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets))

+

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id")) 

+        #self.maxDiff=None        

+        self.assertEquals(stats, verify_group_stats)

+        

+class L2McastGroup(base_tests.SimpleDataPlane):

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+        

+        group_list1, msg1 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1,  False, False)       

+        msg2=add_l2_mcast_group(self.controller, config["port_map"].keys(), 1, 1)

+        

+        group_list1, msg3 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 2,  False, False)               

+        msg4=add_l2_mcast_group(self.controller, config["port_map"].keys(), 2, 2)

+

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        for msg in msg1:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg2.group_type,

+                                  group_id=msg2.group_id,

+                                  buckets=msg2.buckets)

+                                  )

+        

+        for msg in msg3:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg4.group_type,

+                                  group_id=msg4.group_id,

+                                  buckets=msg4.buckets)

+                                  )

+                                  

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))                                   

+        self.maxDiff=None

+        self.assertEquals(stats, verify_group_stats)

+

+

+class L2FloodGroup(base_tests.SimpleDataPlane):

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+        

+        group_list1, msg1 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1,  False, False)       

+        msg2=add_l2_flood_group(self.controller, config["port_map"].keys(), 1, 1)

+        

+        group_list1, msg3 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 2,  False, False)               

+        msg4=add_l2_flood_group(self.controller, config["port_map"].keys(), 2, 2)

+

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        for msg in msg1:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg2.group_type,

+                                  group_id=msg2.group_id,

+                                  buckets=msg2.buckets)

+                                  )

+        

+        for msg in msg3:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg4.group_type,

+                                  group_id=msg4.group_id,

+                                  buckets=msg4.buckets)

+                                  )

+                                  

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))                                   

+        self.maxDiff=None

+        self.assertEquals(stats, verify_group_stats)

+

+

+class L2RewriteGroup(base_tests.SimpleDataPlane):

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+        

+        group_list1, msg1 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1,  False, False)       

+        msg2=add_l2_rewrite_group(self.controller, config["port_map"].keys()[0], 1, 1, [00,11,22,33,44,55], [00,22,22,22,22,22])

+        

+        group_list1, msg3 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 2,  False, False)               

+        msg4=add_l2_rewrite_group(self.controller, config["port_map"].keys()[0], 2, 2, [00,11,22,33,44,55], [00,33,33,33,33,33])

+

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        for msg in msg1:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg2.group_type,

+                                  group_id=msg2.group_id,

+                                  buckets=msg2.buckets)

+                                  )

+        

+        for msg in msg3:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg4.group_type,

+                                  group_id=msg4.group_id,

+                                  buckets=msg4.buckets)

+                                  )

+

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id")) 

+                                  

+        self.maxDiff=None

+        self.assertEquals(stats, verify_group_stats)

+        

+

+class L3UnicastGroup(base_tests.SimpleDataPlane):

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+        

+        group_list1, msg1 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1,  False, False)       

+        msg2=add_l3_unicast_group(self.controller, config["port_map"].keys()[0], 1, 1, [0x00,0x11,0x22,0x33,0x44,0x55], [00,0x22,0x22,0x22,0x22,0x22])

+        

+        group_list1, msg3 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 2,  False, False)               

+        msg4=add_l3_unicast_group(self.controller, config["port_map"].keys()[0], 2, 2, [0x00,0x11,0x22,0x33,0x44,0x55], [00,0x33,0x33,0x33,0x33,0x33])

+

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        for msg in msg1:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg2.group_type,

+                                  group_id=msg2.group_id,

+                                  buckets=msg2.buckets)

+                                  )

+        

+        for msg in msg3:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg4.group_type,

+                                  group_id=msg4.group_id,

+                                  buckets=msg4.buckets)

+                                  )

+                                  

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id")) 

+                                  

+        self.maxDiff=None

+        self.assertEquals(stats, verify_group_stats)  

+

+

+class L3ECMPGroup(base_tests.SimpleDataPlane):

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+        

+        group_list1, msg1 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1,  False, False)       

+        msg2=add_l3_unicast_group(self.controller, config["port_map"].keys()[0], 1, 1, [0x00,0x11,0x22,0x33,0x44,0x55], [00,0x22,0x22,0x22,0x22,0x22])

+        

+        group_list1, msg3 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 2,  False, False)               

+        msg4=add_l3_unicast_group(self.controller, config["port_map"].keys()[0], 2, 2, [0x00,0x11,0x22,0x33,0x44,0x55], [00,0x33,0x33,0x33,0x33,0x33])

+

+        group_ids=[msg2.group_id, msg4.group_id]

+        

+        msg5=add_l3_ecmp_group(self.controller, 1, group_ids)

+        

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+

+        verify_group_stats=[]

+        for msg in msg1:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg2.group_type,

+                                  group_id=msg2.group_id,

+                                  buckets=msg2.buckets)

+                                  )

+        

+        for msg in msg3:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg4.group_type,

+                                  group_id=msg4.group_id,

+                                  buckets=msg4.buckets)

+                                  )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg5.group_type,

+                                  group_id=msg5.group_id,

+                                  buckets=msg5.buckets)

+                                  )

+

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id")) 

+                                  

+        self.maxDiff=None

+        self.assertEquals(stats, verify_group_stats)     

+

+

+class L3InterfaceGroup(base_tests.SimpleDataPlane):

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+        

+        group_list1, msg1 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1,  False, False)               

+        msg2=add_l3_interface_group(self.controller, config["port_map"].keys()[0], 1, 1, [0x00,0x11,0x22,0x33,0x44,0x55])

+        group_list1, msg3 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 2,  False, False)                       

+        msg4=add_l3_interface_group(self.controller, config["port_map"].keys()[0], 2, 2, [0x00,0x11,0x22,0x33,0x44,0x66])

+

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        for msg in msg1:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg2.group_type,

+                                  group_id=msg2.group_id,

+                                  buckets=msg2.buckets)

+                                  )

+        

+        for msg in msg3:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg4.group_type,

+                                  group_id=msg4.group_id,

+                                  buckets=msg4.buckets)

+                                  )

+

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id")) 

+                                  

+        self.maxDiff=None

+        self.assertEquals(stats, verify_group_stats)     

+

+

+class L3McastGroup(base_tests.SimpleDataPlane):

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+

+        # Vlan 3 forward to vlan 3 port 1 and 2

+        # Vlan 3 foward to vlan 1 port 1

+        # Vlan 3 foward to vlan 2 port 1     

+        # Vlan 3 foward to vlan 2 port 2             

+        group_list1_1, msg1 = add_l2_interface_grouop(self.controller, [config["port_map"].keys()[0]], 1,  False, False)               

+        msg2=add_l3_interface_group(self.controller, config["port_map"].keys()[0], 1, 1, [0x00,0x11,0x22,0x33,0x44,0x11])

+        group_list1_2, msg3 = add_l2_interface_grouop(self.controller, [config["port_map"].keys()[0]], 2,  False, False)

+        msg4=add_l3_interface_group(self.controller, config["port_map"].keys()[0], 2, 2, [0x00,0x11,0x22,0x33,0x44,0x22])

+        group_list2_1, msg5 = add_l2_interface_grouop(self.controller, [config["port_map"].keys()[1]], 2,  False, False)

+        msg6=add_l3_interface_group(self.controller, config["port_map"].keys()[1], 2, 3, [0x00,0x11,0x22,0x33,0x44,0x33])

+        group_list3, msg7 = add_l2_interface_grouop(self.controller, config["port_map"].keys(), 3,  False, False)

+        

+        group_actions=[msg2.group_id, msg4.group_id, msg6.group_id]

+        group_actions.extend(group_list3)

+

+        msg8=add_l3_mcast_group(self.controller, 3, 1, group_actions)

+        

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        for msg in msg1:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg2.group_type,

+                                  group_id=msg2.group_id,

+                                  buckets=msg2.buckets)

+                                  )

+        

+        for msg in msg3:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg4.group_type,

+                                  group_id=msg4.group_id,

+                                  buckets=msg4.buckets)

+                                  )

+        for msg in msg5:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg6.group_type,

+                                  group_id=msg6.group_id,

+                                  buckets=msg6.buckets)

+                                  )                                      

+        for msg in msg7:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )                                      

+                                      

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=msg8.group_type,

+                                  group_id=msg8.group_id,

+                                  buckets=msg8.buckets)

+                                  )  

+

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id")) 

+                                  

+        self.maxDiff=None

+        self.assertEquals(stats, verify_group_stats)     

+        

+        

+class mpls_intf_group(base_tests.SimpleDataPlane):

+    """

+	create mpls intf group 

+	1. ref l2_intf_group

+	2. ref l2_flood_group

+	"""

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+

+        test_vid=1

+        

+        #ref l2_intf_group

+        l2_intf_gid, l2_intf_msg = add_one_l2_interface_group(self.controller, config["port_map"].keys()[0], test_vid,  False, False)

+        mpls_intf_gid, mpls_intf_msg=add_mpls_intf_group(self.controller, l2_intf_gid, [0x00,0x11,0x11,0x11,0x11,0x11], [0x00,0x22,0x22,0x22,0x22,0x22], vid=test_vid, index=1)

+            

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=l2_intf_msg.group_type,

+                                  group_id=l2_intf_msg.group_id,

+                                  buckets=l2_intf_msg.buckets)

+                                  )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_intf_msg.group_type,

+                                  group_id=mpls_intf_msg.group_id,

+                                  buckets=mpls_intf_msg.buckets)

+                                  )

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))  

+        self.assertEquals(stats, verify_group_stats)       

+              

+

+class mpls_l2_vpn_group(base_tests.SimpleDataPlane):

+    """

+	create mpls intf group 

+	1. ref l2_intf_group

+	

+	"""

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+

+        test_vid=1

+        test_port=config["port_map"].keys()[0]        

+        #ref l2_intf_group

+        l2_intf_gid, l2_intf_msg = add_one_l2_interface_group(self.controller, test_port, test_vid,  False, False)

+        mpls_intf_gid, mpls_intf_msg=add_mpls_intf_group(self.controller, l2_intf_gid, [0x00,0x11,0x11,0x11,0x11,0x11], [0x00,0x22,0x22,0x22,0x22,0x22], vid=test_vid, index=1)        

+        mpls_label_gid, mpls_label_msg=add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L2_VPN_LABEL, 

+		                                                  index=1, 

+														  ref_gid=mpls_intf_gid, 

+                                                          push_l2_header=True,

+                                                          push_vlan=True,

+                                                          push_mpls_header=True,

+                                                          push_cw=False,

+                                                          set_mpls_label=10,

+                                                          set_bos=0,

+                                                          set_tc=7,

+                                                          set_tc_from_table=False,

+														  cpy_tc_outward=False,														  

+                                                          set_ttl=250,

+                                                          cpy_ttl_outward=False,

+                                                          oam_lm_tx_count=False,

+                                                          set_pri_from_table=False

+                                                          )

+                   

+        verify_group_stats=[]

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=l2_intf_msg.group_type,

+                                  group_id=l2_intf_msg.group_id,

+                                  buckets=l2_intf_msg.buckets)

+                                  )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_intf_msg.group_type,

+                                  group_id=mpls_intf_msg.group_id,

+                                  buckets=mpls_intf_msg.buckets)

+                                  )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_label_msg.group_type,

+                                  group_id=mpls_label_msg.group_id,

+                                  buckets=mpls_label_msg.buckets)

+                                  )                                  

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats= get_stats(self, ofp.message.group_desc_stats_request())        

+        stats=sorted(stats, key=getkey("group_id"))  

+        #DumpGroup(stats, verify_group_stats)

+        #AssertGroup(self, stats, verify_group_stats)

+        self.assertEquals(stats, verify_group_stats)       

+		

+

+class mpls_tunnel_lable1_group(base_tests.SimpleDataPlane):

+    """

+	create mpls intf group 

+	1. ref l2_intf_group

+	

+	"""

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+

+        test_vid=1

+        test_port=config["port_map"].keys()[0]        

+        #ref l2_intf_group

+        l2_intf_gid, l2_intf_msg = add_one_l2_interface_group(self.controller, test_port, test_vid,  False, False)

+        mpls_intf_gid, mpls_intf_msg=add_mpls_intf_group(self.controller, l2_intf_gid, [0x00,0x11,0x11,0x11,0x11,0x11], [0x00,0x22,0x22,0x22,0x22,0x22], vid=test_vid, index=1)                

+        mpls_label_gid, mpls_label_msg=add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_TUNNEL_LABEL1, 

+		                                                  index=1, 

+														  ref_gid=mpls_intf_gid, 

+                                                          push_l2_header=True,

+                                                          push_vlan=True,

+                                                          push_mpls_header=True,

+                                                          push_cw=True,

+                                                          set_mpls_label=10,

+                                                          set_bos=0,

+                                                          set_tc=7,

+                                                          set_tc_from_table=False,

+														  cpy_tc_outward=False,														  

+                                                          set_ttl=250,

+                                                          cpy_ttl_outward=False,

+                                                          oam_lm_tx_count=False,

+                                                          set_pri_from_table=False

+                                                          )

+            

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=l2_intf_msg.group_type,

+                                  group_id=l2_intf_msg.group_id,

+                                  buckets=l2_intf_msg.buckets)

+                                  )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_intf_msg.group_type,

+                                  group_id=mpls_intf_msg.group_id,

+                                  buckets=mpls_intf_msg.buckets)

+                                  )        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_label_msg.group_type,

+                                  group_id=mpls_label_msg.group_id,

+                                  buckets=mpls_label_msg.buckets)

+                                  )

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))  

+        self.assertEquals(stats, verify_group_stats)       

+		

+

+class mpls_tunnel_lable2_group(base_tests.SimpleDataPlane):

+    """

+	create mpls intf group 

+	1. ref l2_intf_group

+	

+	"""

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+

+        test_vid=1

+        test_port=config["port_map"].keys()[0]        

+        #ref l2_intf_group

+        l2_intf_gid, l2_intf_msg = add_one_l2_interface_group(self.controller, test_port, test_vid,  False, False)

+        mpls_intf_gid, mpls_intf_msg=add_mpls_intf_group(self.controller, l2_intf_gid, [0x00,0x11,0x11,0x11,0x11,0x11], [0x00,0x22,0x22,0x22,0x22,0x22], vid=test_vid, index=1)                        

+        mpls_label_gid, mpls_label_msg=add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_TUNNEL_LABEL2, 

+		                                                  index=1, 

+														  ref_gid=mpls_intf_gid, 

+                                                          push_l2_header=True,

+                                                          push_vlan=True,

+                                                          push_mpls_header=True,

+                                                          push_cw=True,

+                                                          set_mpls_label=10,

+                                                          set_bos=0,

+                                                          set_tc=7,

+                                                          set_tc_from_table=False,

+														  cpy_tc_outward=False,														  

+                                                          set_ttl=250,

+                                                          cpy_ttl_outward=False,

+                                                          oam_lm_tx_count=False,

+                                                          set_pri_from_table=False

+                                                          )

+            

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=l2_intf_msg.group_type,

+                                  group_id=l2_intf_msg.group_id,

+                                  buckets=l2_intf_msg.buckets)

+                                  )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_intf_msg.group_type,

+                                  group_id=mpls_intf_msg.group_id,

+                                  buckets=mpls_intf_msg.buckets)

+                                  )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_label_msg.group_type,

+                                  group_id=mpls_label_msg.group_id,

+                                  buckets=mpls_label_msg.buckets)

+                                  )                                  

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))  

+        self.assertEquals(stats, verify_group_stats)       

+		

+class mpls_swap_label_group(base_tests.SimpleDataPlane):

+    """

+	create mpls intf group 

+	1. ref l2_intf_group

+	"""

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller)    

+

+        test_vid=1

+        test_port=config["port_map"].keys()[0]

+        #ref l2_intf_group

+        l2_intf_gid, l2_intf_msg = add_one_l2_interface_group(self.controller, test_port, test_vid,  False, False)

+        mpls_intf_gid, mpls_intf_msg=add_mpls_intf_group(self.controller, l2_intf_gid, [0x00,0x11,0x11,0x11,0x11,0x11], [0x00,0x22,0x22,0x22,0x22,0x22], vid=test_vid, index=1)                                

+        mpls_label_gid, mpls_label_msg=add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_SWAP_LABEL, 

+		                                                  index=1, 

+														  ref_gid=mpls_intf_gid, 

+                                                          push_l2_header=True,

+                                                          push_vlan=True,

+                                                          push_mpls_header=True,

+                                                          push_cw=True,

+                                                          set_mpls_label=10,

+                                                          set_bos=0,

+                                                          set_tc=7,

+                                                          set_tc_from_table=False,

+														  cpy_tc_outward=False,														  

+                                                          set_ttl=250,

+                                                          cpy_ttl_outward=False,

+                                                          oam_lm_tx_count=False,

+                                                          set_pri_from_table=False

+                                                          )

+            

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=l2_intf_msg.group_type,

+                                  group_id=l2_intf_msg.group_id,

+                                  buckets=l2_intf_msg.buckets)

+                                  )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_intf_msg.group_type,

+                                  group_id=mpls_intf_msg.group_id,

+                                  buckets=mpls_intf_msg.buckets)

+                                  )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_label_msg.group_type,

+                                  group_id=mpls_label_msg.group_id,

+                                  buckets=mpls_label_msg.buckets)

+                                  )                                    

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))  

+        self.assertEquals(stats, verify_group_stats)       

+

+

+class mpls_forwarding_group_fastfailover(base_tests.SimpleDataPlane):

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller) 

+

+        test_vid=1

+        test_port=config["port_map"].keys()[0]

+        #ref l2_intf_group

+        l2_intf_gid, l2_intf_msg = add_one_l2_interface_group(self.controller, test_port, test_vid,  False, False)

+        mpls_intf_gid, mpls_intf_msg=add_mpls_intf_group(self.controller, l2_intf_gid, [0x00,0x11,0x11,0x11,0x11,0x11], [0x00,0x22,0x22,0x22,0x22,0x22], vid=test_vid, index=1)                                

+        mpls_label_gid, mpls_label_msg=add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_SWAP_LABEL, 

+		                                                  index=1, 

+														  ref_gid=mpls_intf_gid, 

+                                                          push_l2_header=True,

+                                                          push_vlan=True,

+                                                          push_mpls_header=True,

+                                                          push_cw=True,

+                                                          set_mpls_label=10,

+                                                          set_bos=0,

+                                                          set_tc=7,

+                                                          set_tc_from_table=False,

+														  cpy_tc_outward=False,														  

+                                                          set_ttl=250,

+                                                          cpy_ttl_outward=False,

+                                                          oam_lm_tx_count=False,

+                                                          set_pri_from_table=False

+                                                          )        

+        mpls_fwd_gid, mpls_fwd_msg=add_mpls_forwarding_group(self.controller, 

+                                                             subtype=OFDPA_MPLS_GROUP_SUBTYPE_FAST_FAILOVER_GROUP, 

+                                                             index=1, 

+                                                             ref_gids=[mpls_label_gid], 

+                                                             watch_port=test_port, 

+                                                             watch_group=ofp.OFPP_ANY, 

+                                                             push_vlan=None,

+                                                             pop_vlan=None,

+                                                             set_vid=None)

+            

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=l2_intf_msg.group_type,

+                                  group_id=l2_intf_msg.group_id,

+                                  buckets=l2_intf_msg.buckets)

+                                  )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_intf_msg.group_type,

+                                  group_id=mpls_intf_msg.group_id,

+                                  buckets=mpls_intf_msg.buckets)

+                                  )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_label_msg.group_type,

+                                  group_id=mpls_label_msg.group_id,

+                                  buckets=mpls_label_msg.buckets)

+                                  )

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_fwd_msg.group_type,

+                                  group_id=mpls_fwd_msg.group_id,

+                                  buckets=mpls_fwd_msg.buckets)

+                                  )                                    

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))  

+        self.assertEquals(stats, verify_group_stats)       

+

+

+class mpls_forwarding_group_ecmp(base_tests.SimpleDataPlane):

+    """chip not support to bind flow on trident2 

+    """

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller) 

+

+        test_vid=1

+        mpls_intf_msgs=[]

+        mpls_intf_gids=[]

+        l2_intf_msgs=[]

+        index=1

+        #ref l2_intf_group

+        for port in config["port_map"].keys():

+            l2_intf_gid, l2_intf_msg = add_one_l2_interface_group(self.controller, port, test_vid,  False, False)

+            l2_intf_msgs.append(l2_intf_msg)            

+            mpls_intf_gid, mpls_intf_msg=add_mpls_intf_group(self.controller, l2_intf_gid, [0x00,0x11,0x11,0x11,0x11,0x11], [0x00,0x22,0x22,0x22,0x22,0x22], vid=test_vid, index=index)

+            index=index+1

+            mpls_intf_msgs.append(mpls_intf_msg)

+            mpls_intf_gids.append(mpls_intf_gid)

+            

+        mpls_fwd_gid, mpls_fwd_msg=add_mpls_forwarding_group(self.controller, 

+                                                             subtype=OFDPA_MPLS_GROUP_SUBTYPE_ECMP, 

+                                                             index=1, 

+                                                             ref_gids=mpls_intf_gids, 

+                                                             watch_port=None, 

+                                                             watch_group=None,

+                                                             push_vlan=None,

+                                                             pop_vlan=None,

+                                                             set_vid=None)

+            

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        for msg in l2_intf_msgs:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+        

+        for msg in mpls_intf_msgs:

+            verify_group_stats.append(ofp.group_desc_stats_entry(

+                                      group_type=msg.group_type,

+                                      group_id=msg.group_id,

+                                      buckets=msg.buckets)

+                                      )

+

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_fwd_msg.group_type,

+                                  group_id=mpls_fwd_msg.group_id,

+                                  buckets=mpls_fwd_msg.buckets)

+                                  )                                    

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))  

+        self.assertEquals(stats, verify_group_stats)       

+

+

+class mpls_forwarding_group_l2tag(base_tests.SimpleDataPlane):

+    """chip not support

+    """

+    def runTest(self):

+        delete_all_flows(self.controller)    

+        delete_all_groups(self.controller) 

+

+        test_vid=1

+        test_port=config["port_map"].keys()[0]

+        index=1

+        #ref l2_intf_group        

+        l2_intf_gid, l2_intf_msg = add_one_l2_interface_group(self.controller, test_port, test_vid,  False, False)

+

+        mpls_fwd_gid, mpls_fwd_msg=add_mpls_forwarding_group(self.controller, 

+                                                             subtype=OFDPA_MPLS_GROUP_SUBTYPE_L2_TAG, 

+                                                             index=1, 

+                                                             ref_gids=l2_intf_gid, 

+                                                             watch_port=None, 

+                                                             watch_group=None,

+                                                             push_vlan=None,

+                                                             pop_vlan=None,

+                                                             set_vid=1)

+            

+        stats = get_stats(self, ofp.message.group_desc_stats_request())

+        

+        verify_group_stats=[]

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=l2_intf_msg.group_type,

+                                  group_id=l2_intf_msg.group_id,

+                                  buckets=l2_intf_msg.buckets)

+                                  )

+        

+        verify_group_stats.append(ofp.group_desc_stats_entry(

+                                  group_type=mpls_fwd_msg.group_type,

+                                  group_id=mpls_fwd_msg.group_id,

+                                  buckets=mpls_fwd_msg.buckets)

+                                  )                                    

+        verify_group_stats=sorted(verify_group_stats, key=getkey("group_id")) 

+        stats=sorted(stats, key=getkey("group_id"))  

+

+        self.assertEquals(stats, verify_group_stats)  
\ No newline at end of file