WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] Add a 1-PIF-per-network limit.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Add a 1-PIF-per-network limit.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 29 Dec 2006 14:20:19 -0800
Delivery-date: Fri, 29 Dec 2006 14:21:48 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Ewan Mellor <ewan@xxxxxxxxxxxxx>
# Date 1167321255 0
# Node ID 615109616bb60c34a60d03d7921212ca6185fe10
# Parent  b175c2f19e0a6017330b0562c80b04a1611e1016
Add a 1-PIF-per-network limit.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
---
 tools/python/xen/xend/XendAPI.py          |   38 ++++++++++++++++++------------
 tools/python/xen/xend/XendDomainInfo.py   |   13 +++++++---
 tools/python/xen/xend/XendError.py        |    7 +++--
 tools/python/xen/xend/XendNode.py         |   24 ++++++++++++++++--
 tools/python/xen/xm/messages/en/xen-xm.po |    5 +++
 5 files changed, 62 insertions(+), 25 deletions(-)

diff -r b175c2f19e0a -r 615109616bb6 tools/python/xen/xend/XendAPI.py
--- a/tools/python/xen/xend/XendAPI.py  Thu Dec 28 15:52:31 2006 +0000
+++ b/tools/python/xen/xend/XendAPI.py  Thu Dec 28 15:54:15 2006 +0000
@@ -540,16 +540,20 @@ class XendAPI:
         return XendNode.instance().pifs[ref]
 
     def PIF_create(self, _, name, network_uuid, host_uuid, mac, mtu, vlan):
-        node = XendNode.instance()
-        if host_uuid != node.uuid:
-            return xen_api_error([HOST_HANDLE_INVALID, host_uuid])
-
-        elif _is_valid_ref(network_uuid, node.is_valid_network):
-            network = node.get_network(network_uuid)
-            return xen_api_success(node.PIF_create(name, mtu, vlan, mac,
-                                                   network))
-        else:
-            return xen_api_error([NETWORK_HANDLE_INVALID, network_uuid])
+        try:
+            node = XendNode.instance()
+            if host_uuid != node.uuid:
+                return xen_api_error([HOST_HANDLE_INVALID, host_uuid])
+
+            elif _is_valid_ref(network_uuid, node.is_valid_network):
+                network = node.get_network(network_uuid)
+                return xen_api_success(node.PIF_create(name, mtu, vlan, mac,
+                                                       network))
+            else:
+                return xen_api_error([NETWORK_HANDLE_INVALID, network_uuid])
+        except NetworkAlreadyConnected, exn:
+            return xen_api_error(['NETWORK_ALREADY_CONNECTED',
+                                  network_uuid, exn.pif_uuid])
 
     def PIF_destroy(self, _, ref):
         return xen_api_success(XendNode.instance().PIF_destroy(ref))
@@ -595,11 +599,15 @@ class XendAPI:
         return xen_api_success(self._get_PIF(ref).set_mtu(name))
 
     def PIF_create_VLAN(self, _, ref, network, vlan):
-        if _is_valid_ref(network, XendNode.instance().is_valid_network):
-            return xen_api_success(XendNode.instance().PIF_create_VLAN(
-                ref, network, vlan))
-        else:
-            return xen_api_error([NETWORK_HANDLE_INVALID, network_uuid])
+        try:
+            if _is_valid_ref(network, XendNode.instance().is_valid_network):
+                return xen_api_success(XendNode.instance().PIF_create_VLAN(
+                    ref, network, vlan))
+            else:
+                return xen_api_error([NETWORK_HANDLE_INVALID, network])
+        except NetworkAlreadyConnected, exn:
+            return xen_api_error(['NETWORK_ALREADY_CONNECTED',
+                                  network, exn.pif_uuid])
 
 
     # Xen API: Class VM
diff -r b175c2f19e0a -r 615109616bb6 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Thu Dec 28 15:52:31 2006 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py   Thu Dec 28 15:54:15 2006 +0000
@@ -1969,9 +1969,16 @@ class XendDomainInfo:
                     config['device'] = ''
 
             if not config.has_key('network'):
-                config['network'] = \
-                    XendNode.instance().bridge_to_network(
-                    config.get('bridge')).uuid
+                try:
+                    config['network'] = \
+                        XendNode.instance().bridge_to_network(
+                        config.get('bridge')).uuid
+                except Exception:
+                    log.exception('bridge_to_network')
+                    # Ignore this for now -- it may happen if the device
+                    # has been specified using the legacy methods, but at
+                    # some point we're going to have to figure out how to
+                    # handle that properly.
 
             config['MTU'] = 1500 # TODO
             config['io_read_kbs'] = 0.0
diff -r b175c2f19e0a -r 615109616bb6 tools/python/xen/xend/XendError.py
--- a/tools/python/xen/xend/XendError.py        Thu Dec 28 15:52:31 2006 +0000
+++ b/tools/python/xen/xend/XendError.py        Thu Dec 28 15:54:15 2006 +0000
@@ -33,14 +33,15 @@ class XendError(Fault):
         return self.value
 
 class VMBadState(XendError):
-    
     def __init__(self, value, expected, actual):
         XendError.__init__(self, value)
         self.expected = expected
         self.actual = actual
 
-    def __str__(self):
-        return self.value
+class NetworkAlreadyConnected(XendError):
+    def __init__(self, pif_uuid):
+        XendError.__init__(self, 'Network already connected')
+        self.pif_uuid = pif_uuid
 
 class VmError(XendError):
     """Vm construction error."""
diff -r b175c2f19e0a -r 615109616bb6 tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Thu Dec 28 15:52:31 2006 +0000
+++ b/tools/python/xen/xend/XendNode.py Thu Dec 28 15:54:15 2006 +0000
@@ -23,7 +23,7 @@ from xen.util import Brctl
 from xen.util import Brctl
 
 from xen.xend import uuid
-from xen.xend.XendError import XendError
+from xen.xend.XendError import XendError, NetworkAlreadyConnected
 from xen.xend.XendRoot import instance as xendroot
 from xen.xend.XendStorageRepository import XendStorageRepository
 from xen.xend.XendLogging import log
@@ -105,8 +105,13 @@ class XendNode:
             for pif_uuid, pif in saved_pifs.items():
                 if pif['network'] in self.networks:
                     network = self.networks[pif['network']]
-                    self.PIF_create(pif['name'], pif['MTU'], pif['VLAN'],
-                                    pif['MAC'], network, False, pif_uuid)
+                    try:
+                        self.PIF_create(pif['name'], pif['MTU'], pif['VLAN'],
+                                        pif['MAC'], network, False, pif_uuid)
+                    except NetworkAlreadyConnected, exn:
+                        log.error('Cannot load saved PIF %s, as network %s ' +
+                                  'is already connected to PIF %s',
+                                  pif_uuid, pif['network'], exn.pif_uuid)
         else:
             for name, mtu, mac in linux_get_phy_ifaces():
                 network = self.networks.values()[0]
@@ -143,6 +148,10 @@ class XendNode:
 
     def PIF_create(self, name, mtu, vlan, mac, network, persist = True,
                    pif_uuid = None):
+        for pif in self.pifs.values():
+            if pif.network == network:
+                raise NetworkAlreadyConnected(pif.uuid)
+
         if pif_uuid is None:
             pif_uuid = uuid.createString()
         self.pifs[pif_uuid] = XendPIF(pif_uuid, name, mtu, vlan, mac, network,
@@ -290,6 +299,15 @@ class XendNode:
         return self.networks[network_ref]
 
     def bridge_to_network(self, bridge):
+        """
+        Determine which network a particular bridge is attached to.
+
+        @param bridge The name of the bridge.  If empty, the default bridge
+        will be used instead (the first one in the list returned by brctl
+        show); this is the behaviour of the vif-bridge script.
+        @return The XendNetwork instance to which this bridge is attached.
+        @raise Exception if the interface is not connected to a network.
+        """
         if not bridge:
             rc, bridge = commands.getstatusoutput(
                 'brctl show | cut -d "\n" -f 2 | cut -f 1')
diff -r b175c2f19e0a -r 615109616bb6 tools/python/xen/xm/messages/en/xen-xm.po
--- a/tools/python/xen/xm/messages/en/xen-xm.po Thu Dec 28 15:52:31 2006 +0000
+++ b/tools/python/xen/xm/messages/en/xen-xm.po Thu Dec 28 15:54:15 2006 +0000
@@ -19,7 +19,7 @@ msgid ""
 msgid ""
 msgstr ""
 "Project-Id-Version: Xen-xm 3.0\n"
-"PO-Revision-Date: 2006-12-25 19:24+0000\n"
+"PO-Revision-Date: 2006-12-28 15:43+0000\n"
 "Last-Translator: Ewan Mellor <ewan@xxxxxxxxxxxxx>\n"
 "Language-Team: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>\n"
 "MIME-Version: 1.0\n"
@@ -65,5 +65,8 @@ msgid "VTPM_HANDLE_INVALID"
 msgid "VTPM_HANDLE_INVALID"
 msgstr "The VTPM handle %(1)s is invalid."
 
+msgid "NETWORK_ALREADY_CONNECTED"
+msgstr "The network you specified already has a PIF attached to it, and so 
another one may not be attached."
+
 msgid "VM_BAD_POWER_STATE"
 msgstr "The VM must be %(2)s to perform the requested operation (it is 
currently %(3)s)."

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Add a 1-PIF-per-network limit., Xen patchbot-unstable <=