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] New XendNetwork and XendPIF classes, for

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] New XendNetwork and XendPIF classes, for implementing the Xen-API network and
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 25 Dec 2006 10:55:08 -0800
Delivery-date: Mon, 25 Dec 2006 10:55:51 -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 1167058056 0
# Node ID 362233086f6618b54615b6ec4cd39837973d4ba1
# Parent  ae3f3dd40df45bbaf4619679023ba354ac470bc2
New XendNetwork and XendPIF classes, for implementing the Xen-API network and
PIF classes.

By Alastair Tse <atse@xxxxxxxxxxxxx>.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
---
 tools/python/xen/xend/XendNetwork.py |  119 ++++++++++++++++++++++++++
 tools/python/xen/xend/XendPIF.py     |  157 +++++++++++++++++++++++++++++++++++
 2 files changed, 276 insertions(+)

diff -r ae3f3dd40df4 -r 362233086f66 tools/python/xen/xend/XendNetwork.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/xend/XendNetwork.py      Mon Dec 25 14:47:36 2006 +0000
@@ -0,0 +1,119 @@
+#============================================================================
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#============================================================================
+# Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
+# Copyright (c) 2006 Xensource Inc.
+#============================================================================
+
+import os
+import commands
+import re
+import struct
+import socket
+
+from xen.xend.XendRoot import instance as xendroot
+
+IP_ROUTE_RE = r'^default via ([\d\.]+) dev (\w+)'
+
+def linux_get_default_network():
+    """Returns the network details of the host."""
+
+    ip_cmd = '/sbin/ip route'
+    rc, output = commands.getstatusoutput(ip_cmd)
+    default_route = None
+    default_dev = None
+    default_netmask = None
+    if rc == 0:
+        # find default route/device
+        for line in output.split('\n'):
+            is_default = re.search(IP_ROUTE_RE, line)
+            if is_default:
+                default_route = is_default.group(1)
+                default_dev = is_default.group(2)
+
+        # find network address and network mask
+        if default_dev:
+            dev_re = r'^([\d\.]+)/(\d+) dev %s' % default_dev
+            for line in output.split('\n'):
+                is_dev = re.search(dev_re, line)
+                if is_dev:
+                    # convert integer netmask to string representation
+                    netmask = 0xffffffff ^ (2**(32-int(is_dev.group(2))) - 1)
+                    packed = struct.pack('!I', netmask)
+                    default_netmask = socket.inet_ntoa(packed)
+
+    return (default_route, default_netmask)
+
+
+class XendNetwork:
+    def __init__(self, uuid, name, description, gateway, netmask):
+        self.uuid = uuid
+        self.name_label = name 
+        self.name_description = description
+        self.default_gateway = gateway
+        self.default_netmask = netmask
+        self.vifs = {}
+        self.pifs = {}
+
+    def get_name_label(self):
+        return self.name_label
+
+    def set_name_label(self, new_name):
+        self.name_label = new_name
+
+    def get_name_description(self):
+        return self.name_description
+
+    def set_name_description(self, new_desc):
+        self.name_description = new_desc
+
+    def get_default_gateway(self):
+        return self.default_gateway
+
+    def set_default_gateway(self, new_gateway):
+        if re.search('^\d+\.\d+\.\d+\.\d+$', new_gateway):
+            self.default_gateway = new_gateway
+
+    def get_default_netmask(self):
+        return self.default_netmask
+
+    def set_default_netmask(self, new_netmask):
+        if re.search('^\d+\.\d+\.\d+\.\d+$', new_netmask):
+            self.default_netmask = new_netmask
+
+    def add_pif(self, pif):
+        self.pifs[pif.get_uuid()] = pif
+
+    def remove_pif(self, pif_uuid):
+        if pif_uuid in self.pifs:
+            del self.pifs[pif_uuid]
+
+    def add_vif(self, vif):
+        self.vifs[vif.get_uuid()] = vif
+
+    def remove_vif(self, vif_uuid):
+        if vif_uuid in self.vifs:
+            del self.vifs[vif_uuid]
+        
+    def get_record(self):
+        return {
+            'uuid': self.uuid,
+            'name_label': self.name_label,
+            'name_description': self.name_description,
+            'default_gateway': self.default_gateway,
+            'default_netmask': self.default_netmask,
+            'VIFs': self.vifs.keys(),
+            'PIFs': self.pifs.keys()
+        }
+           
diff -r ae3f3dd40df4 -r 362233086f66 tools/python/xen/xend/XendPIF.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/xend/XendPIF.py  Mon Dec 25 14:47:36 2006 +0000
@@ -0,0 +1,157 @@
+#============================================================================
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#============================================================================
+# Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
+# Copyright (c) 2006 Xensource Inc.
+#============================================================================
+
+import os
+import commands
+import re
+import socket
+
+from xen.xend.XendRoot import instance as xendroot
+from xen.xend.XendLogging import log
+
+MAC_RE = ':'.join(['[0-9a-f]{2}'] * 6)
+IP_IFACE_RE = r'^\d+: (\w+):.*mtu (\d+) .* link/\w+ ([0-9a-f:]+)'
+
+def linux_phy_to_virt(pif_name):
+    return 'eth' + re.sub(r'^[a-z]+', '', pif_name)
+
+def linux_get_phy_ifaces():
+    """Returns a list of physical interfaces.
+
+    Identifies PIFs as those that have a interface name starting with 'p'
+    and have the fake 'fe:ff:ff:ff:ff:ff' MAC address.
+
+    See /etc/xen/scripts/network-bridge for how the devices are renamed.
+
+    @rtype: array of 3-element tuple (name, mtu, mac)
+    """
+    
+    ip_cmd = '/sbin/ip -o link show'
+    rc, output = commands.getstatusoutput(ip_cmd)
+    ifaces = {}
+    phy_ifaces = []
+    if rc == 0:
+        # parse all interfaces into (name, mtu, mac)
+        for line in output.split('\n'):
+            has_if = re.search(IP_IFACE_RE, line)
+            if has_if:
+                ifaces[has_if.group(1)] = has_if.groups()
+                
+        # resolve pifs' mac addresses
+        for name, mtu, mac in ifaces.values():
+            if name[0] == 'p' and mac == 'fe:ff:ff:ff:ff:ff':
+                bridged_ifname = linux_phy_to_virt(name)
+                bridged_if = ifaces.get(bridged_ifname)
+                if bridged_if:
+                    bridged_mac = bridged_if[2]
+                phy_ifaces.append((name, int(mtu), bridged_mac))
+                
+    return phy_ifaces
+
+def linux_set_mac(iface, mac):
+    if not re.search(MAC_RE, mac):
+        return False
+
+    ip_mac_cmd = '/sbin/ip link set %s addr %s' % \
+                 (linux_phy_to_virt(iface), mac)
+    rc, output = commands.getstatusoutput(ip_mac_cmd)
+    if rc == 0:
+        return True
+
+    return False
+
+def linux_set_mtu(iface, mtu):
+    try:
+        ip_mtu_cmd = '/sbin/ip link set %s mtu %d' % \
+                     (linux_phy_to_virt(iface), int(mtu))
+        rc, output = commands.getstatusoutput(ip_mtu_cmd)
+        if rc == 0:
+            return True
+        return False
+    except ValueError:
+        return False
+
+def same_dir_rename(old_path, new_path):
+    """Ensure that the old_path and new_path refer to files in the same
+    directory."""
+    old_abs = os.path.normpath(old_path)
+    new_abs = os.path.normpath(new_path)
+    if os.path.dirname(old_abs) == os.path.dirname(new_abs):
+        os.rename(old_abs, new_abs)
+    else:
+        log.warning("Unable to ensure name is new name is safe: %s" % new_abs)
+    
+
+class XendPIF:
+    """Representation of a Physical Network Interface."""
+    
+    def __init__(self, uuid, name, mtu, mac):
+        self.uuid = uuid
+        self.name = name
+        self.mac = mac
+        self.mtu = mtu
+        self.vlan = ''
+        self.network = None
+
+    def set_name(self, new_name):
+        self.name = new_name
+            
+    def get_name(self):
+        return self.name
+
+    def get_uuid(self):
+        return self.uuid
+
+    def get_mac(self):
+        return self.mac
+
+    def get_vlan(self):
+        return self.vlan
+
+    def set_mac(self, new_mac):
+        success = linux_set_mac(new_mac)
+        if success:
+            self.mac = new_mac
+        return success
+
+    def set_mtu(self, new_mtu):
+        success = linux_set_mtu(new_mtu)
+        if success:
+            self.mtu = new_mtu
+        return success
+
+    def get_io_read_kbs(self):
+        return 0.0
+
+    def get_io_write_kbs(self):
+        return 0.0
+
+    def get_record(self):
+        if self.network:
+            network_uuid = self.network.get_uuid()
+        else:
+            network_uuid = None
+
+        return {'name': self.name,
+                'MAC': self.mac,
+                'MTU': self.mtu,
+                'VLAN': self.vlan,
+                'network': network_uuid,
+                'io_read_kbs': self.get_io_read_kbs(),
+                'io_write_kbs': self.get_io_write_kbs()}
+                

_______________________________________________
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] New XendNetwork and XendPIF classes, for implementing the Xen-API network and, Xen patchbot-unstable <=