[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [XEND] Fix up PIF class, make it work



# HG changeset patch
# User Tom Wilkie <tom.wilkie@xxxxxxxxx>
# Date 1177674557 -3600
# Node ID 55d7745bd37778afd4c1883aab8a57823826412b
# Parent  6049b33d10e169d83c4f215106eadfb69597f22e
[XEND] Fix up PIF class, make it work

signed-off-by: Tom Wilkie <tom.wilkie@xxxxxxxxx>
---
 tools/python/xen/xend/XendPIF.py |   86 ++++++++++++++++++++++++++++-----------
 1 files changed, 63 insertions(+), 23 deletions(-)

diff -r 6049b33d10e1 -r 55d7745bd377 tools/python/xen/xend/XendPIF.py
--- a/tools/python/xen/xend/XendPIF.py  Fri Apr 27 11:03:47 2007 +0100
+++ b/tools/python/xen/xend/XendPIF.py  Fri Apr 27 12:49:17 2007 +0100
@@ -93,7 +93,22 @@ def _create_VLAN(dev, vlan):
 def _create_VLAN(dev, vlan):
     rc, _ = commands.getstatusoutput('vconfig add %s %d' %
                                      (dev, vlan))
-    return rc == 0   
+    if rc != 0:
+        return False
+
+    rc, _ = commands.getstatusoutput('ifconfig %s.%d up' %
+                                     (dev, vlan))
+    return rc == 0
+
+def _destroy_VLAN(dev, vlan):
+    rc, _ = commands.getstatusoutput('ifconfig %s.%d down' %
+                                     (dev, vlan))
+    if rc != 0:
+        return False
+                                     
+    rc, _ = commands.getstatusoutput('vconfig rem %s.%d' %
+                                     (dev, vlan))
+    return rc == 0
 
 class XendPIF(XendBase):
     """Representation of a Physical Network Interface."""
@@ -105,13 +120,13 @@ class XendPIF(XendBase):
         attrRO = ['network',
                   'host',
                   'metrics',
-                  'device']
+                  'device',
+                  'VLAN']
         return XendBase.getAttrRO() + attrRO
     
     def getAttrRW(self):
         attrRW = ['MAC',
-                  'MTU',
-                  'VLAN']
+                  'MTU']
         return XendBase.getAttrRW() + attrRW
 
     def getAttrInst(self):
@@ -124,7 +139,8 @@ class XendPIF(XendBase):
 
     def getMethods(self):
         methods = ['plug',
-                   'unplug']
+                   'unplug',
+                   'destroy']
         return XendBase.getMethods() + methods
 
     def getFuncs(self):
@@ -189,12 +205,13 @@ class XendPIF(XendBase):
         ifs = [dev for dev, _1, _2 in linux_get_phy_ifaces()]
         if pif.get_VLAN() == -1:
             if pif.get_device() not in ifs:
-                del pif
-                del metrics
+                pif.destroy()
+                metrics.destroy()
                 return None
         else:
             if pif.get_interface_name() not in ifs:
                 _create_VLAN(pif.get_device(), pif.get_VLAN())
+                pif.plug()
 
         return pif_uuid
 
@@ -218,12 +235,12 @@ class XendPIF(XendBase):
             raise DeviceExistsError("%s.%d" % (device, vlan))
 
         # Check network ref is valid
-        from xen.xend import XendNode
-        network_uuids = XendNode.instance().networks
-        if network_uuid in network_uuids:
-            raise InvalidHandleError("Network", network_ref)
+        from XendNetwork import XendNetwork
+        if network_uuid not in XendNetwork.get_all():
+            raise InvalidHandleError("Network", network_uuid)
 
         # Check host_ref is this host
+        import XendNode
         if host_ref != XendNode.instance().get_uuid():
             raise InvalidHandleError("Host", host_ref)
 
@@ -239,20 +256,18 @@ class XendPIF(XendBase):
             "device":  device,
             "MAC":     '',
             "MTU":     '',
-            "network": network_ref,
+            "network": network_uuid,
             "VLAN":    vlan
             }
 
         # Create instances
         metrics = XendPIFMetrics(metrics_uuid, pif_uuid)
         pif = XendPIF(record, pif_uuid, metrics_uuid)
-        
-        # Add it to list of PIFs
-        XendNode.instance().pifs.append(pif_ref)        
-
-        # Add it to network
-        network.add_pif(pif_ref)
-
+
+        # Not sure if they should be created plugged or not...
+        pif.plug()
+
+        XendNode.instance().save_PIFs()
         return pif_uuid
 
     create_phy  = classmethod(create_phy)
@@ -269,6 +284,7 @@ class XendPIF(XendBase):
                                    "network")
         bridge_name = network.get_name_label()
 
+        from xen.util import Brctl
         Brctl.vif_bridge_add({
             "bridge": bridge_name,
             "vif":    self.get_interface_name()
@@ -276,7 +292,30 @@ class XendPIF(XendBase):
 
     def unplug(self):
         """Unplug the PIF from the network"""
-        pass
+        network = XendAPIStore.get(self.network,
+                                   "network")
+        bridge_name = network.get_name_label()
+
+        from xen.util import Brctl
+        Brctl.vif_bridge_rem({
+            "bridge": bridge_name,
+            "vif":    self.get_interface_name()
+            })
+
+    def destroy(self):
+        # Figure out if this is a physical device
+        if self.get_interface_name() == \
+           self.get_device():
+            raise PIFIsPhysical(self.get_uuid())
+
+        self.unplug()
+
+        if _destroy_VLAN(self.get_device(), self.get_VLAN()):
+            XendBase.destroy(self)
+            import XendNode
+            XendNode.instance().save_PIFs()
+        else:
+            raise NetworkError("Unable to delete VLAN", self.get_uuid())
 
     def get_interface_name(self):
         if self.get_VLAN() == -1:
@@ -310,6 +349,8 @@ class XendPIF(XendBase):
         success = linux_set_mac(self.device, new_mac)
         if success:
             self.MAC = new_mac
+            import XendNode
+            XendNode.instance().save_PIFs()
         return success
 
     def get_MTU(self):
@@ -319,10 +360,9 @@ class XendPIF(XendBase):
         success = linux_set_mtu(self.device, new_mtu)
         if success:
             self.MTU = new_mtu
+            import XendNode
+            XendNode.instance().save_PIFs()
         return success
 
     def get_VLAN(self):
         return self.VLAN
-
-    def set_VLAN(self, VLAN):
-        pass

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.