GENICLOUD-31 Bring up the bridge devices last.
[pyplnet.git] / plnet.py
index 001bbee..540a699 100755 (executable)
--- a/plnet.py
+++ b/plnet.py
@@ -59,6 +59,9 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa
     interfaces.sort( compare_by('is_primary') )
     interfaces.reverse()
 
+    # The names of the bridge devices
+    bridgeDevices = []
+
     for interface in interfaces:
         logger.verbose('net:InitInterfaces interface %d: %r'%(device_id,interface))
         logger.verbose('net:InitInterfaces macs = %r' % macs)
@@ -79,6 +82,9 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa
 
         details = prepDetails(interface, hostname)
 
+        if interface['is_primary']:
+            gateway = interface['gateway']
+
         if 'interface_tag_ids' in interface:
             version = 4.3
             interface_tag_ids = "interface_tag_ids"
@@ -154,16 +160,16 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa
             if 'IFNAME' in details:
                 ifname = details['IFNAME']
                 device_id -= 1
-            elif orig_ifname:
-                ifname = orig_ifname
+            else:
+                ifname = 'eth0'
                 device_id -= 1
-            if 'PRIMARY' in details: del details['PRIMARY']
             logger.log('net:InitInterfaces: Bridge detected. Adding %s to devices_map' % ifname)
-            devices_map[ifname] = details
+            devices_map[ifname] = removeBridgedIfaceDetails(details)
             bridgeName = details['BRIDGE']
 
             logger.log('net:InitInterfaces: Adding bridge %s' % bridgeName)
             bridgeDetails = prepDetails(interface)
+            bridgeDevices.append(bridgeName)
             bridgeDetails['TYPE']   = 'Bridge'
             devices_map[bridgeName] = bridgeDetails
         else:
@@ -382,10 +388,19 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa
         # handle those correctly
         if getvar("SLAVE") == 'yes': continue
 
+        # Delay bringing up any bridge devices
+        if dev in bridgeDevices: continue
+
         if not files_only:
             logger.verbose('net:InitInterfaces bringing up %s' % dev)
             os.system("/sbin/ifup %s" % dev)
 
+    # Bring up the bridge devices
+    for bridge in bridgeDevices:
+        if not files_only and bridge in newdevs:
+            logger.verbose('net:InitInterfaces bringing up bridge %s' % bridge)
+            os.system("/sbin/ifup %s" % bridge)
+
 ##
 # Prepare the interface details.
 #
@@ -404,7 +419,6 @@ def prepDetails(interface, hostname=''):
         details['NETMASK']   = interface['netmask']
         details['GATEWAY']   = interface['gateway']
         if interface['is_primary']:
-            gateway = interface['gateway']
             if interface['dns1']:
                 details['DNS1'] = interface['dns1']
             if interface['dns2']:
@@ -422,6 +436,16 @@ def prepDetails(interface, hostname=''):
 
     return details
 
+##
+# Remove duplicate entry from the bridged interface's configuration file.
+#
+def removeBridgedIfaceDetails(details):
+    for key in [ 'PRIMARY', 'PERSISTENT_DHCLIENT', 'DHCLIENTARGS', 'DHCP_HOSTNAME',
+                 'BOOTPROTO', 'IPADDR', 'NETMASK', 'GATEWAY', 'DNS1', 'DNS2' ]:
+        if key in details:
+            del details[key]
+    return details
+
 if __name__ == "__main__":
     import optparse
     import sys