and refactor various bits to move towards supporting multiple datapath backends.
- Move ifup() and ifdown() into the "IP Network Devices" section.
- Drop unused function interface_up().
- Add netdev_up() and netdev_down(). These are effectively the same as
ifup() and ifdown() but allow us to begin separating out control of
devices which carry an IP address from those which are purely
"datapath" which in turn should allow us to abstract away more of
the differences between Linux Bridging and Vswitch.
- Add pif_datapath() which returns the datapath (AKA bridge) name or
None if the PIF is bridgeless. Replaces uses of pif_is_bridged()
when what we really mean is to check if the ipdev needs some
additional devices to be configured to be useful.
- All callers of bring_down_bridge() now pass destroy=True so rename
to destroy_bridge().
- inline delbr() into destroy_bridge since it is the only caller.
- All callers of destroy_bridge() call pif_is_bridged() first so push
that up into the new function.
- Call to destroy_bridge() in action_up() is preceeded by a
bring_down_interface() which will do the same so remove.
- destroy_bridge() is only called from bring_down_interface() so make
it a nested function.
- There are no more callers of bring_up_bridge(), remove it.
- vconfig_rem() only has a single caller in bring_down_interface(),
make a nested, name it destroy_vlan() for parity with
destroy_bridge().
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
diff -r 5b618319717e -r 5883cee5ce9f scripts/interface-reconfigure
--- a/scripts/interface-reconfigure Fri Dec 18 14:16:32 2009 +0000
+++ b/scripts/interface-reconfigure Fri Dec 18 14:16:32 2009 +0000
@@ -225,41 +225,6 @@
os.unlink(self.__newpath)
self.__state = self.__STATE['COMMITTED']
-
-def interface_up(i):
- operstate = os.path.join("/sys/class/net",i,"operstate")
- if not os.path.exists(operstate):
- log("No operstate for interface %s, assuming down" % i)
- return 0
-
- f = open(operstate)
- state = f.read().strip()
- f.close()
-
- # bridges confusingly return "unknown" when they are up
- return state in ["up", "unknown"]
-
-def ifdown(interface):
- if not netdev_exists(interface):
- log("ifdown: interface %s does not exist, ignoring" % interface)
- return
- run_command(["/sbin/ifdown", interface])
-
-def ifup(interface):
- run_command(["/sbin/ifup", interface])
-
-
-def delbr(bridge):
- if not netdev_exists(bridge):
- log("delbr: bridge %s does not exist, ignoring" % bridge)
- return
- run_command(["/usr/sbin/brctl", "delbr", bridge])
-
-def vconfig_rem(vlan):
- if not netdev_exists(vlan):
- log("vconfig del: vlan %s does not exist, ignoring" % vlan)
- return
- run_command(["/sbin/vconfig", "rem", vlan])
def open_pif_ifcfg(pif):
pifrec = db.get_pif_record(pif)
@@ -687,6 +652,20 @@
else:
return pifrec['device']
+def netdev_down(netdev):
+ """Bring down a bare network device"""
+ if not netdev_exists(netdev):
+ log("netdev: down: device %s does not exist, ignoring" % netdev)
+ return
+ run_command(["/sbin/ifdown", netdev])
+
+def netdev_up(netdev, mtu=None):
+ """Bring up a bare network device"""
+ #if not netdev_exists(netdev):
+ # raise Error("netdev: up: device %s does not exist" % netdev)
+
+ run_command(["/sbin/ifup", netdev])
+
#
# IP Network Devices -- network devices with IP configuration
#
@@ -702,6 +681,17 @@
else:
# TODO: sanity check that nwrec['bridgeless'] == 'true'
return pif_netdev_name(pif)
+
+def ifdown(netdev):
+ """Bring down a network interface"""
+ if not netdev_exists(netdev):
+ log("ifdown: device %s does not exist, ignoring" % netdev)
+ return
+ run_command(["/sbin/ifdown", netdev])
+
+def ifup(netdev):
+ """Bring up a network interface"""
+ run_command(["/sbin/ifup", netdev])
#
# Bridges
@@ -957,7 +947,7 @@
"""
pifrec = db.get_pif_record(pif)
- oc = pifrec['other_config']
+
f = open_pif_ifcfg(pif)
if pifrec['MAC'] != "":
@@ -990,6 +980,7 @@
}
# override defaults with values from other-config whose keys being with
"bond-"
+ oc = pifrec['other_config']
overrides = filter(lambda (key,val): key.startswith("bond-"), oc.items())
overrides = map(lambda (key,val): (key[5:], val), overrides)
bond_options.update(overrides)
@@ -1087,19 +1078,6 @@
return f
-def bring_down_bridge(bridge, destroy=False):
- """Bring down the bridge associated with a PIF."""
- log("Bring bridge %s down" % bridge)
- ifdown(bridge)
- if destroy:
- log("Destroy bridge %s" % bridge)
- delbr(bridge)
-
-def bring_up_bridge(bridge):
- """Bring up the bridge associated with a PIF."""
- log("Bring bridge %s up" % bridge)
- ifup(bridge)
-
def bring_down_interface(pif, destroy=False):
"""Bring down the interface associated with PIF.
@@ -1107,16 +1085,34 @@
which are bond slaves of this one. This is because they will be
required when the bond is brought up."""
+ def destroy_bridge(pif):
+ """Bring down the bridge associated with a PIF."""
+ if not pif_is_bridged(pif):
+ return
+ bridge = pif_bridge_name(pif)
+ if not netdev_exists(bridge):
+ log("destroy_bridge: bridge %s does not exist, ignoring" % bridge)
+ return
+ log("Destroy bridge %s" % bridge)
+ netdev_down(bridge)
+ run_command(["/usr/sbin/brctl", "delbr", bridge])
+
+ def destroy_vlan(pif):
+ vlan = pif_netdev_name(pif)
+ if not netdev_exists(vlan):
+ log("vconfig del: vlan %s does not exist, ignoring" % vlan)
+ return
+ log("Destroy vlan device %s" % vlan)
+ run_command(["/sbin/vconfig", "rem", vlan])
+
if pif_is_vlan(pif):
interface = pif_netdev_name(pif)
log("bring_down_interface: %s is a VLAN" % interface)
- ifdown(interface)
+ netdev_down(interface)
if destroy:
- log("Destroy vlan device %s" % interface)
- vconfig_rem(interface)
- if pif_is_bridged(pif):
- bring_down_bridge(pif_bridge_name(pif), destroy=True)
+ destroy_vlan(pif)
+ destroy_bridge(pif)
else:
return
@@ -1152,21 +1148,19 @@
log("leave bond slave %s up (currently attached)" %
slave_interface)
continue
log("bring down bond slave %s" % slave_interface)
- ifdown(slave_interface)
+ netdev_down(slave_interface)
# Also destroy the bridge associated with the slave, since
# it will carry the MAC address and possibly an IP address
# leading to confusion.
- if pif_is_bridged(slave):
- bring_down_bridge(pif_bridge_name(slave), destroy=True)
+ destroy_bridge(slave)
interface = pif_netdev_name(pif)
log("Bring interface %s down" % interface)
- ifdown(interface)
+ netdev_down(interface)
if destroy:
destroy_bond_device(pif)
- if pif_is_bridged(pif):
- bring_down_bridge(pif_bridge_name(pif), destroy=True)
+ destroy_bridge(pif)
def interface_is_up(pif):
try:
@@ -1194,7 +1188,7 @@
create_bond_device(pif)
log("Bring interface %s up" % interface)
- ifup(interface)
+ netdev_up(interface)
#
# IP device configuration
@@ -1391,38 +1385,57 @@
return f
#
+# Datapath Configuration
+#
+
+def pif_datapath(pif):
+ """Return the datapath PIF associated with PIF.
+The datapath name is the bridge name.
+For a VLAN PIF, the datapath name is the bridge name for the PIF's VLAN slave.
+"""
+ pifrec = db.get_pif_record(pif)
+ nwrec = db.get_network_record(pifrec['network'])
+ if not nwrec['bridge']:
+ return None
+ else:
+ return pif
+
+
+#
# Toplevel actions
#
def action_up(pif):
pifrec = db.get_pif_record(pif)
+ ipdev = pif_ipdev_name(pif)
+ dp = pif_datapath(pif)
+
f = ipdev_configure_network(pif)
- if pif_is_bridged(pif):
- pf = configure_pif(pif)
+ if dp:
+ pf = configure_pif(dp)
f.attach_child(pf)
f.close()
+
# if there is a bridge using this pif then bring it down
- if pif_is_bridged(pif):
- bring_down_bridge(pif_bridge_name(pif))
+ ifdown(ipdev)
# Bring down any VLAN masters so that we can reconfigure the slave.
vlan_masters = pif_get_vlan_masters(pif)
for master in vlan_masters:
name = pif_netdev_name(master)
- log("action_up: bring down %s" % (name))
- ifdown(name)
+ log("action_up: bring down vlan master %s" % (name))
+ netdev_down(name)
# interface-reconfigure is never explicitly called to down a bond master.
# However, when we are called to up a slave it is implicit that we are
destroying the master.
bond_masters = pif_get_bond_masters(pif)
for master in bond_masters:
+ log("action_up: bring down bond master %s" % (pif_netdev_name(master)))
# bring down master
bring_down_interface(master, destroy=True)
- if pif_is_bridged(master):
- bring_down_bridge(pif_bridge_name(master), destroy=True)
# No masters left - now its safe to reconfigure the slave.
bring_down_interface(pif)
@@ -1430,9 +1443,10 @@
try:
f.apply()
- bring_up_interface(pif)
- if pif_is_bridged(pif):
- bring_up_bridge(pif_bridge_name(pif))
+ if dp:
+ bring_up_interface(pif)
+
+ ifup(ipdev)
# Update /etc/issue (which contains the IP address of the management
interface)
os.system("/sbin/update-issue")
@@ -1441,7 +1455,7 @@
for master in [v for v in vlan_masters if
db.get_pif_record(v)['currently_attached']]:
name = pif_netdev_name(master)
log("action_up: bring up %s" % (name))
- ifup(name)
+ netdev_up(name)
f.commit()
except Error, e:
@@ -1450,12 +1464,19 @@
raise
def action_down(pif):
- bring_down_interface(pif, destroy=True)
+ ipdev = pif_ipdev_name(pif)
+ dp = pif_datapath(pif)
+
+ ifdown(ipdev)
+
+ if dp:
+ bring_down_interface(dp, destroy=True)
def action_rewrite(pif):
+ dp = pif_datapath(pif)
f = ipdev_configure_network(pif)
- if pif_is_bridged(pif):
- pf = configure_pif(pif)
+ if dp:
+ pf = configure_pif(dp)
f.attach_child(pf)
f.close()
try:
_______________________________________________
xen-api mailing list
xen-api@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/mailman/listinfo/xen-api
|