Repository: cloudstack
Updated Branches:
  refs/heads/4.4-forward 7a0fa6b45 -> eaf04d44a


CLOUDSTACK-6592: OVS distributed routing: make populate flooding rules
transactional

creats a file with all openflow rules updates and using ovs-ofctl file
option updates the brige in one go


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/eaf04d44
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/eaf04d44
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/eaf04d44

Branch: refs/heads/4.4-forward
Commit: eaf04d44a72351d250725c9194bd0cafae0ea1e6
Parents: 7a0fa6b
Author: Murali Reddy <muralimmre...@gmail.com>
Authored: Wed May 7 19:29:45 2014 +0530
Committer: Murali Reddy <muralimmre...@gmail.com>
Committed: Wed May 7 19:31:40 2014 +0530

----------------------------------------------------------------------
 .../xenserver/cloudstack_pluginlib.py           | 270 ++++++++++---------
 scripts/vm/hypervisor/xenserver/ovstunnel       |   6 +-
 2 files changed, 150 insertions(+), 126 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eaf04d44/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py 
b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
index bccb7ae..fb28cae 100644
--- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
+++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
@@ -243,7 +243,9 @@ def del_port(bridge, port):
 
 def get_network_id_for_vif(vif_name):
     domain_id, device_id = vif_name[3:len(vif_name)].split(".")
-    dom_uuid = do_cmd([XE_PATH, "vm-list", "dom-id=%s" % domain_id, 
"--minimal"])
+    hostname = do_cmd(["/bin/bash", "-c", "hostname"])
+    this_host_uuid = do_cmd([XE_PATH, "host-list", "hostname=%s" % hostname, 
"--minimal"])
+    dom_uuid = do_cmd([XE_PATH, "vm-list", "dom-id=%s" % domain_id, 
"resident-on=%s" %this_host_uuid, "--minimal"])
     vif_uuid = do_cmd([XE_PATH, "vif-list", "vm-uuid=%s" % dom_uuid, 
"device=%s" % device_id, "--minimal"])
     vnet = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  
"param-name=other-config",
                              "param-key=cloudstack-network-id"])
@@ -344,7 +346,7 @@ def get_acl(vpcconfig, required_acl_id):
 
 # Configures the bridge created for a VPC enabled for distributed routing. 
Management server sends VPC physical topology
 # details. Based on the VPC physical topology L2 lookup table and L3 lookup 
tables are updated by this function.
-def configure_bridge_for_network_topology(bridge, this_host_id, json_config, 
sequence_no):
+def configure_vpc_bridge_for_network_topology(bridge, this_host_id, 
json_config, sequence_no):
 
     vpconfig = jsonLoader(json.loads(json_config)).vpc
     if vpconfig is None:
@@ -357,7 +359,7 @@ def configure_bridge_for_network_topology(bridge, 
this_host_id, json_config, seq
 
         # create a temporary file to store OpenFlow rules corresponding to L2 
and L3 lookup table updates
         ofspec_filename = "/var/run/cloud/" + bridge + sequence_no + ".ofspec"
-        ofspec = open(ofspec_filename, 'w')
+        ofspec = open(ofspec_filename, 'w+')
 
         # get the list of VM's in all the tiers of VPC running in this host 
from the JSON config
         this_host_vms = get_vpc_vms_on_host(vpconfig, this_host_id)
@@ -372,7 +374,7 @@ def configure_bridge_for_network_topology(bridge, 
this_host_id, json_config, seq
 
                 # Add OF rule in L2 look up table, if packet's destination mac 
matches MAC of the VM's nic
                 # then send packet on the found OFPORT
-                ofspec.write(" table=%s" %L2_LOOKUP_TABLE + " priority=1100 
dl_dst=%s " %mac_addr +
+                ofspec.write("table=%s" %L2_LOOKUP_TABLE + " priority=1100 
dl_dst=%s " %mac_addr +
                              " actions=output:%s" %of_port + "\n")
 
                 # Add OF rule in L3 look up table: if packet's destination IP 
matches VM's IP then modify the packet
@@ -380,16 +382,16 @@ def configure_bridge_for_network_topology(bridge, 
this_host_id, json_config, seq
                 # emulates steps VPC virtual router would have done on the 
current host itself.
                 action_str = " mod_dl_src:%s"%network.gatewaymac + 
",mod_dl_dst:%s" % mac_addr \
                              + ",resubmit(,%s)"%INGRESS_ACL_TABLE
-                action_str = " table=%s"%L3_LOOKUP_TABLE + " ip nw_dst=%s"%ip 
+ " actions=%s" %action_str
+                action_str = "table=%s"%L3_LOOKUP_TABLE + " ip nw_dst=%s"%ip + 
" actions=%s" %action_str
                 ofspec.write(action_str + "\n")
 
                 # Add OF rule to send intra-tier traffic from this nic of the 
VM to L2 lookup path (L2 switching)
-                action_str = " table=%s" %CLASSIFIER_TABLE + " priority=1200 
in_port=%s " %of_port + \
+                action_str = "table=%s" %CLASSIFIER_TABLE + " priority=1200 
in_port=%s " %of_port + \
                              " ip nw_dst=%s " %network.cidr + " 
actions=resubmit(,%s)" %L2_LOOKUP_TABLE
                 ofspec.write(action_str + "\n")
 
                 # Add OF rule to send inter-tier traffic from this nic of the 
VM to egress ACL table(L3 lookup path)
-                action_str = " table=%s "%CLASSIFIER_TABLE + " priority=1100 
in_port=%s " %of_port +\
+                action_str = "table=%s "%CLASSIFIER_TABLE + " priority=1100 
in_port=%s " %of_port +\
                              " ip dl_dst=%s " %network.gatewaymac + " 
nw_dst=%s " %vpconfig.cidr + \
                              " actions=resubmit(,%s)" %EGRESS_ACL_TABLE
                 ofspec.write(action_str + "\n")
@@ -427,34 +429,40 @@ def configure_bridge_for_network_topology(bridge, 
this_host_id, json_config, seq
                     action_str = "table=%s"%L3_LOOKUP_TABLE + " ip 
nw_dst=%s"%ip + " actions=%s" %action_str
                     ofspec.write(action_str + "\n")
 
-        action_str = "table=%s "%L2_LOOKUP_TABLE + " priority=0 " + " 
actions=resubmit(,%s)"%L2_FLOOD_TABLE
-        ofspec.write(action_str + "\n")
-        action_str = "table=%s "%L3_LOOKUP_TABLE + " priority=0 " + " 
actions=resubmit(,%s)"%L2_LOOKUP_TABLE
-        ofspec.write(action_str + "\n")
+        # add a default rule in L2_LOOKUP_TABLE to send unknown mac address to 
L2 flooding table
+        ofspec.write("table=%s "%L2_LOOKUP_TABLE + " priority=0 " + " 
actions=resubmit(,%s)"%L2_FLOOD_TABLE + "\n")
+
+        # add a default rule in L3 lookup table to forward (unknown 
destination IP) packets to L2 lookup table. This
+        # is fallback option to send the packet to VPC VR, when routing can 
not be performed at the host
+        ofspec.write("table=%s "%L3_LOOKUP_TABLE + " priority=0 " + " 
actions=resubmit(,%s)"%L2_LOOKUP_TABLE + "\n")
 
+        # First flush current L2_LOOKUP_TABLE & L3_LOOKUP_TABLE before 
re-applying L2 & L3 lookup entries
         del_flows(bridge, table=L2_LOOKUP_TABLE)
         del_flows(bridge, table=L3_LOOKUP_TABLE)
 
-        # update bridge with the flow-rules added in the file in one attempt
-        do_cmd([OFCTL_PATH, 'add-flows', bridge, ofspec_filename])
+        ofspec.seek(0)
+        logging.debug("Adding below flows rules L2 & L3 lookup tables:\n" + 
ofspec.read())
 
+        # update bridge with the flow-rules for L2 lookup and L3 lookup in the 
file in one attempt
         ofspec.close()
-        return "SUCCESS: successfully configured bridge as per the VPC 
topology update with sequence no: %s"%sequence_no
+        do_cmd([OFCTL_PATH, 'add-flows', bridge, ofspec_filename])
 
-    except:
-        logging.debug("An unexpected error occurred while configuring bridge 
as per VPC topology "
-                      "update with sequence no: %s"%sequence_no)
-        # now that we updated the bridge with flow rules delete the file.
+        # now that we updated the bridge with flow rules close and delete the 
file.
         os.remove(ofspec_filename)
-        raise
 
-    else:
-        # now that we updated the bridge with flow rules delete the file.
-        os.remove(ofspec_filename)
+        return "SUCCESS: successfully configured bridge as per the VPC 
topology update with sequence no: %s"%sequence_no
+
+    except Exception,e:
+        error_message = "An unexpected error occurred while configuring bridge 
" + bridge + \
+                        " as per latest VPC topology update with sequence no: 
%s" %sequence_no
+        logging.debug(error_message + " due to " + str(e))
+        if os.path.isfile(ofspec_filename):
+            os.remove(ofspec_filename)
+        raise error_message
 
 # Configures the bridge created for a VPC enabled for distributed firewall. 
Management server sends VPC routing policies
 # details. Based on the VPC routing policies ingress ACL table and egress ACL 
tables are updated by this function.
-def configure_ovs_bridge_for_routing_policies(bridge, json_config, 
sequence_no):
+def configure_vpc_bridge_for_routing_policies(bridge, json_config, 
sequence_no):
 
     vpconfig = jsonLoader(json.loads(json_config)).vpc
     if vpconfig is None:
@@ -468,10 +476,7 @@ def configure_ovs_bridge_for_routing_policies(bridge, 
json_config, sequence_no):
 
         # create a temporary file to store OpenFlow rules corresponding to 
ingress and egress ACL table updates
         ofspec_filename = "/var/run/cloud/" + bridge + sequence_no + ".ofspec"
-        ofspec = open(ofspec_filename, 'w')
-
-        egress_rules_added = False
-        ingress_rules_added = False
+        ofspec = open(ofspec_filename, 'w+')
 
         tiers = vpconfig.tiers
         for tier in tiers:
@@ -486,6 +491,8 @@ def configure_ovs_bridge_for_routing_policies(bridge, 
json_config, sequence_no):
                 source_port_start = acl_item.sourceportstart
                 source_port_end = acl_item.sourceportend
                 protocol = acl_item.protocol
+                if protocol == "all":
+                    protocol = "*"
                 source_cidrs = acl_item.sourcecidrs
                 acl_priority = 1000 + number
                 if direction == "ingress":
@@ -496,28 +503,27 @@ def configure_ovs_bridge_for_routing_policies(bridge, 
json_config, sequence_no):
                     resubmit_table = L3_LOOKUP_TABLE
 
                 for source_cidr in source_cidrs:
-                    ingress_rules_added = True
                     if source_port_start is None and source_port_end is None:
                         if source_cidr.startswith('0.0.0.0'):
                             if action == "deny":
-                                ofspec.write(" table=%s "%matching_table + " 
priority=%s " %acl_priority +
+                                ofspec.write("table=%s "%matching_table + " 
priority=%s " %acl_priority + " ip " +
                                              " nw_dst=%s " %tier_cidr + " 
nw_proto=%s " %protocol +
-                                             " actions='drop'" + "\n")
+                                             " actions=drop" + "\n")
                             if action == "allow":
-                                ofspec.write(" table=%s "%matching_table + " 
priority=%s " %acl_priority +
+                                ofspec.write("table=%s "%matching_table + " 
priority=%s " %acl_priority + " ip " +
                                              " nw_dst=%s " %tier_cidr + " 
nw_proto=%s " %protocol +
-                                             " 
actions='resubmit(,%s)'"%resubmit_table + "\n")
+                                             " 
actions=resubmit(,%s)"%resubmit_table + "\n")
 
                         else:
                             if action == "deny":
-                                ofspec.write(" table=%s "%matching_table + " 
priority=%s " %acl_priority +
+                                ofspec.write("table=%s "%matching_table + " 
priority=%s " %acl_priority + " ip " +
                                              " nw_src=%s " %source_cidr + " 
nw_dst=%s " %tier_cidr +
-                                             " nw_proto=%s " %protocol + " 
actions='drop'" + "\n")
+                                             " nw_proto=%s " %protocol + " 
actions=drop" + "\n")
                             if action == "allow":
-                                ofspec.write(" table=%s "%matching_table + " 
priority=%s " %acl_priority +
+                                ofspec.write("table=%s "%matching_table + " 
priority=%s " %acl_priority + " ip " +
                                              " nw_src=%s "%source_cidr + " 
nw_dst=%s " %tier_cidr +
                                              " nw_proto=%s " %protocol +
-                                             " 
actions='resubmit(,%s)'"%resubmit_table  + "\n")
+                                             " 
actions=resubmit(,%s)"%resubmit_table  + "\n")
                         continue
 
                     # add flow rule to do action (allow/deny) for flows where 
source IP of the packet is in
@@ -526,128 +532,146 @@ def configure_ovs_bridge_for_routing_policies(bridge, 
json_config, sequence_no):
                     while (port < source_port_end):
                         if source_cidr.startswith('0.0.0.0'):
                             if action == "deny":
-                                ofspec.write(" table=%s " %matching_table + " 
priority=%s " %acl_priority +
+                                ofspec.write("table=%s " %matching_table + " 
priority=%s " %acl_priority + " ip " +
                                              " tp_dst=%s " %port + " nw_dst=%s 
" %tier_cidr +
-                                             " nw_proto=%s " %protocol + " 
actions='drop'"  + "\n")
+                                             " nw_proto=%s " %protocol + " 
actions=drop"  + "\n")
                             if action == "allow":
-                                ofspec.write(" table=%s "%matching_table + " 
priority=%s " %acl_priority +
+                                ofspec.write("table=%s "%matching_table + " 
priority=%s " %acl_priority + " ip " +
                                              " tp_dst=%s " %port + " nw_dst=%s 
" %tier_cidr +
                                              " nw_proto=%s " %protocol +
-                                             " 
actions='resubmit(,%s)'"%resubmit_table  + "\n")
+                                             " 
actions=resubmit(,%s)"%resubmit_table  + "\n")
                         else:
                             if action == "deny":
-                                ofspec.write(" table=%s " %matching_table + " 
priority=%s " %acl_priority +
+                                ofspec.write("table=%s " %matching_table + " 
priority=%s " %acl_priority + " ip " +
                                              " tp_dst=%s " %port + " nw_src=%s 
"%source_cidr + " nw_dst=%s "%tier_cidr +
-                                             " nw_proto=%s " %protocol + " 
actions='drop'"  + "\n")
+                                             " nw_proto=%s " %protocol + " 
actions=drop"  + "\n")
                             if action == "allow":
-                                ofspec.write(" table=%s "%matching_table + " 
priority=%s " %acl_priority +
+                                ofspec.write("table=%s "%matching_table + " 
priority=%s " %acl_priority + " ip " +
                                              " tp_dst=%s " %port + " nw_src=%s 
"%source_cidr + " nw_dst=%s "%tier_cidr +
                                              " nw_proto=%s " %protocol +
-                                             " 
actions='resubmit(,%s)'"%resubmit_table + "\n")
+                                             " 
actions=resubmit(,%s)"%resubmit_table + "\n")
                         port = port + 1
 
         # add a default rule in egress table to allow packets (so forward 
packet to L3 lookup table)
-        ofspec.write(" table=%s " %EGRESS_ACL_TABLE + " priority=0 
actions='resubmit(,%s)')"%L3_LOOKUP_TABLE + "\n")
+        ofspec.write("table=%s " %EGRESS_ACL_TABLE + " priority=0 
actions=resubmit(,%s)" %L3_LOOKUP_TABLE + "\n")
 
-        # add a default rule in ingress table drop packets
-        ofspec.write(" table=%s " %INGRESS_ACL_TABLE + " priority=0 
actions='drop'" + "\n")
+        # add a default rule in ingress table to drop packets
+        ofspec.write("table=%s " %INGRESS_ACL_TABLE + " priority=0 
actions=drop" + "\n")
 
         # First flush current ingress and egress ACL's before re-applying the 
ACL's
         del_flows(bridge, table=EGRESS_ACL_TABLE)
         del_flows(bridge, table=INGRESS_ACL_TABLE)
 
-        # update bridge with the flow-rules for ingress and egress ACL's added 
in the file in one attempt
-        do_cmd([OFCTL_PATH, 'add-flows', bridge, ofspec_filename])
+        ofspec.seek(0)
+        logging.debug("Adding below flows rules Ingress & Egress ACL 
tables:\n" + ofspec.read())
 
+        # update bridge with the flow-rules for ingress and egress ACL's added 
in the file in one attempt
         ofspec.close()
-        return "SUCCESS: successfully configured bridge as per the latest 
routing policies of the VPC"
+        do_cmd([OFCTL_PATH, 'add-flows', bridge, ofspec_filename])
 
-    except:
-        logging.debug("An unexpected error occurred while configuring bridge 
as per VPC's routing policies.")
         # now that we updated the bridge with flow rules delete the file.
-        ofspec.close()
         os.remove(ofspec_filename)
-        raise
 
-    else:
-        # now that we updated the bridge with flow rules delete the file.
-        ofspec.close()
-        os.remove(ofspec_filename)
+        return "SUCCESS: successfully configured bridge as per the latest 
routing policies update with " \
+               "sequence no: %s"%sequence_no
+
+    except Exception,e:
+        error_message = "An unexpected error occurred while configuring bridge 
" + bridge + \
+                        " as per latest VPC's routing policy update with 
sequence number %s." %sequence_no
+        logging.debug(error_message + " due to " + str(e))
+        if os.path.isfile(ofspec_filename):
+            os.remove(ofspec_filename)
+        raise error_message
 
+# configures bridge L2 flooding rules stored in table=2. Single bridge is used 
for all the tiers of VPC. So controlled
+# flooding is required to restrict the broadcast to only to the ports (vifs 
and tunnel interfaces) in the tier. Also
+# packets arrived from the tunnel ports should not be flooded on the other 
tunnel ports.
 def update_flooding_rules_on_port_plug_unplug(bridge, interface, command, 
if_network_id):
 
-    vnet_vif_ofports = []
-    vnet_tunnelif_ofports = []
-    vnet_all_ofports = []
+    class tier_ports:
+        tier_vif_ofports = []
+        tier_tunnelif_ofports = []
+        tier_all_ofports = []
 
-    logging.debug("Updating the flooding rules as interface  %s" %interface + 
" is %s"%command + " now.")
+    logging.debug("Updating the flooding rules on bridge " + bridge + " as 
interface  %s" %interface +
+                  " is %s"%command + " now.")
     try:
+
+        if not os.path.exists('/var/run/cloud'):
+            os.makedirs('/var/run/cloud')
+
+        # create a temporary file to store OpenFlow rules corresponding L2 
flooding table
+        ofspec_filename = "/var/run/cloud/" + bridge + "-" +interface + "-" + 
command + ".ofspec"
+        ofspec = open(ofspec_filename, 'w+')
+
+        all_tiers = dict()
+
         vsctl_output = do_cmd([VSCTL_PATH, 'list-ports', bridge])
         ports = vsctl_output.split('\n')
 
         for port in ports:
+
             if_ofport = do_cmd([VSCTL_PATH, 'get', 'Interface', port, 
'ofport'])
+
             if port.startswith('vif'):
-                # check VIF is in same network as that of plugged vif
-                if if_network_id != get_network_id_for_vif(port):
-                    continue
-                vnet_vif_ofports.append(if_ofport)
-                vnet_all_ofports.append(if_ofport)
+                network_id = get_network_id_for_vif(port)
+                if network_id not in all_tiers.keys():
+                    all_tiers[network_id] = tier_ports()
+                tier_ports_info = all_tiers[network_id]
+                tier_ports_info.tier_vif_ofports.append(if_ofport)
+                tier_ports_info.tier_all_ofports.append(if_ofport)
+                all_tiers[network_id] = tier_ports_info
 
             if port.startswith('t'):
-                # check tunnel port is in same network as that of plugged vif
-                if if_network_id != get_network_id_for_tunnel_port(port)[1:-1]:
-                    continue
-                vnet_tunnelif_ofports.append(if_ofport)
-                vnet_all_ofports.append(if_ofport)
-
-        if command == 'online':
-            if len(vnet_all_ofports) == 1 :
-                return
-
-            for port in vnet_all_ofports:
-                clear_flooding_rules_for_port(bridge, port)
-
-            # for a packet arrived from tunnel port, flood only on VIF ports
-            for port in vnet_tunnelif_ofports:
-                add_flooding_rules_for_port(bridge, port, vnet_vif_ofports)
-
-            # for a packet arrived from VIF port send on all VIF and tunnel 
port excluding the port
-            # on which packet arrived
-            for port in vnet_vif_ofports:
-                vnet_all_ofports_copy = copy.copy(vnet_all_ofports)
-                vnet_all_ofports_copy.remove(port)
-                add_flooding_rules_for_port(bridge, port, 
vnet_all_ofports_copy)
-
-            this_if_ofport = do_cmd([VSCTL_PATH, 'get', 'Interface', 
interface, 'ofport'])
-
-            #learn that MAC is reachable through the VIF port
-            if interface.startswith('vif'):
-                mac = get_macaddress_of_vif(interface)
-                add_mac_lookup_table_entry(bridge, mac, this_if_ofport)
-
-        if command == 'offline':
-            for port in vnet_all_ofports:
-                clear_flooding_rules_for_port(bridge, port)
-
-            vnet_all_ofports.remove(this_if_ofport)
-            vnet_vif_ofports.remove(this_if_ofport)
-
-            # for a packet arrived from tunnel port, flood only on VIF ports
-            for port in vnet_tunnelif_ofports:
-                add_flooding_rules_for_port(bridge, port, vnet_vif_ofports)
-
-            # for a packet from VIF port send on all VIF's and tunnel ports 
excluding the port on which packet arrived
-            for port in vnet_vif_ofports:
-                vnet_all_ofports_copy = copy.copy(vnet_all_ofports)
-                vnet_all_ofports_copy.remove(port)
-                add_flooding_rules_for_port(bridge, port, 
vnet_all_ofports_copy)
-
-            # un-learn that MAC is reachable through the VIF port
-            if interface.startswith('vif'):
-                mac = get_macaddress_of_vif(interface)
-                delete_mac_lookup_table_entry(bridge, mac)
-    except:
-        logging.debug("An unexpected error occurred while updating the 
flooding rules when interface "
-                    + " %s" %interface + " is %s"%command)
-        raise
\ No newline at end of file
+                network_id = get_network_id_for_tunnel_port(port)[1:-1]
+                if network_id not in all_tiers.keys():
+                    all_tiers[network_id] = tier_ports()
+                tier_ports_info = all_tiers[network_id]
+                tier_ports_info.tier_tunnelif_ofports.append(if_ofport)
+                tier_ports_info.tier_all_ofports.append(if_ofport)
+                all_tiers[network_id] = tier_ports_info
+
+        for network_id, tier_ports_info in all_tiers.items():
+            if len(tier_ports_info.tier_all_ofports) == 1 :
+                continue
+
+            # for a packet arrived from tunnel port, flood only on to VIF 
ports connected to bridge for this tier
+            for port in tier_ports_info.tier_tunnelif_ofports:
+                action = "".join("output:%s," %ofport for ofport in 
tier_ports_info.tier_vif_ofports)[:-1]
+                ofspec.write("table=%s " %L2_FLOOD_TABLE + " priority=1100 
in_port=%s " %port +
+                             "actions=%s " %action + "\n")
+
+            # for a packet arrived from VIF port send on all VIF and tunnel 
ports corresponding to the tier excluding
+            # the port on which packet arrived
+            for port in tier_ports_info.tier_vif_ofports:
+                tier_all_ofports_copy = 
copy.copy(tier_ports_info.tier_all_ofports)
+                tier_all_ofports_copy.remove(port)
+                action = "".join("output:%s," %ofport for ofport in 
tier_all_ofports_copy)[:-1]
+                ofspec.write("table=%s " %L2_FLOOD_TABLE + " priority=1100 
in_port=%s " %port +
+                             "actions=%s " %action + "\n")
+
+        # add a default rule in L2 flood table to drop packet
+        ofspec.write("table=%s " %L2_FLOOD_TABLE + " priority=0 actions=drop")
+
+        # First flush current L2 flooding table before re-populating the tables
+        del_flows(bridge, table=L2_FLOOD_TABLE)
+
+        ofspec.seek(0)
+        logging.debug("Adding below flows rules L2 flooding table: \n" + 
ofspec.read())
+
+        # update bridge with the flow-rules for broadcast rules added in the 
file in one attempt
+        ofspec.close()
+        do_cmd([OFCTL_PATH, 'add-flows', bridge, ofspec_filename])
+
+        # now that we updated the bridge with flow rules delete the file.
+        os.remove(ofspec_filename)
+
+        logging.debug("successfully configured bridge %s as per the latest 
flooding rules " %bridge)
+
+    except Exception,e:
+        if os.path.isfile(ofspec_filename):
+            os.remove(ofspec_filename)
+        error_message = "An unexpected error occurred while updating the 
flooding rules for the bridge " + \
+                        bridge + " when interface " + " %s" %interface + " is 
%s" %command
+        logging.debug(error_message + " due to " + str(e))
+        raise error_message
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eaf04d44/scripts/vm/hypervisor/xenserver/ovstunnel
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovstunnel 
b/scripts/vm/hypervisor/xenserver/ovstunnel
index 2d6105e..358cd54 100755
--- a/scripts/vm/hypervisor/xenserver/ovstunnel
+++ b/scripts/vm/hypervisor/xenserver/ovstunnel
@@ -418,23 +418,23 @@ def configure_ovs_bridge_for_network_topology(session, 
args):
     last_seq_no = last_seq_no[1:-1]
     if long(sequence_no) > long(last_seq_no):
         lib.do_cmd([lib.VSCTL_PATH, "set", "bridge", bridge, 
"other-config:sequence-number=%s"%sequence_no])
-        return lib.configure_bridge_for_network_topology(bridge, this_host_id, 
json_config, sequence_no)
+        return lib.configure_vpc_bridge_for_network_topology(bridge, 
this_host_id, json_config, sequence_no)
     else:
         return "SUCCESS: Ignoring the update with the sequence number %s" 
%sequence_no + " as there is already recent" \
                 " update received and applied with sequence number %s" 
%last_seq_no
 
-
 @echo
 def configure_ovs_bridge_for_routing_policies(session, args):
     bridge = args.pop("bridge")
     json_config = args.pop("config")
     sequence_no = args.pop("seq-no")
+
     # get the last update sequence number
     last_seq_no = lib.do_cmd([lib.VSCTL_PATH, "get", "bridge", bridge, 
"other-config:sequence-number"])
     last_seq_no = last_seq_no[1:-1]
     if long(sequence_no) > long(last_seq_no):
         lib.do_cmd([lib.VSCTL_PATH, "set", "bridge", bridge, 
"other-config:sequence-number=%s"%sequence_no])
-        return lib.configure_ovs_bridge_for_routing_policies(bridge, 
json_config, sequence_no)
+        return lib.configure_vpc_bridge_for_routing_policies(bridge, 
json_config, sequence_no)
     else:
         return "SUCCESS: Ignoring the update with the sequence number %s" 
%sequence_no + " as there is already recent" \
                 " update received and applied with sequence number %s" 
%last_seq_no

Reply via email to