[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] New XendNetwork and XendPIF classes, for implementing the Xen-API network and
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |