Thanks for the cleanup, I looked over all the changes and will attempt to modify my typing accordingly. I see this patch was already applied to next branch as e4cc793ae15dfd4d72ec1e49a0c4bda259667708 Thanks cleber.
On 07/16/2012 06:22 PM, Cleber Rosa wrote: > No behavior changes whatsoever, just minor style adjustments. > > Signed-off-by: Cleber Rosa<[email protected]> > --- > client/virt/virt_utils.py | 98 > ++++++++++++++++++++++++++++++++++++++++----- > client/virt/virt_vm.py | 9 +++-- > 2 files changed, 92 insertions(+), 15 deletions(-) > > diff --git a/client/virt/virt_utils.py b/client/virt/virt_utils.py > index 1c4d90d..847f026 100644 > --- a/client/virt/virt_utils.py > +++ b/client/virt/virt_utils.py > @@ -150,6 +150,7 @@ class HwAddrGetError(NetError): > def __str__(self): > return "Can not get mac of interface %s" % self.ifname > > + > class PropCanKeyError(KeyError, AttributeError): > def __init__(self, key, slots): > self.key = key > @@ -158,20 +159,24 @@ class PropCanKeyError(KeyError, AttributeError): > return "Unsupported key name %s (supported keys: %s)" % ( > str(self.key), str(self.slots)) > > + > class PropCanValueError(PropCanKeyError): > def __str__(self): > return "Instance contains None value for valid key '%s'" % ( > str(self.key)) > > + > class VMNetError(NetError): > def __str__(self): > return ("VMNet instance items must be dict-like and contain " > "a 'nic_name' mapping") > > + > class DbNoLockError(NetError): > def __str__(self): > return "Attempt made to access database with improper locking" > > + > class Env(UserDict.IterableUserDict): > """ > A dict-like object containing global objects used by tests. > @@ -346,6 +351,7 @@ class Params(UserDict.IterableUserDict): > new_dict[new_key] = self[key] > return new_dict > > + > # subclassed dict wouldn't honor __slots__ on python 2.4 when __slots__ gets > # overridden by a subclass. This class also changes behavior of dict > # WRT to None value being the same as non-existant "key". > @@ -355,6 +361,7 @@ class PropCan(object): > > raise: KeyError if requested container-like index isn't in set > (__slots__) > """ > + > __slots__ = [] > > def __init__(self, properties={}): > @@ -367,6 +374,7 @@ class PropCan(object): > value = properties.get(propertea, None) > self[propertea] = value > > + > def __getattribute__(self, propertea): > try: > value = super(PropCan, self).__getattribute__(propertea) > @@ -377,24 +385,28 @@ class PropCan(object): > else: > raise PropCanValueError(propertea, self.__slots__) > > + > def __getitem__(self, propertea): > try: > return getattr(self, propertea) > except AttributeError: > raise PropCanKeyError(propertea, self.__slots__) > > + > def __setitem__(self, propertea, value): > try: > setattr(self, propertea, value) > except AttributeError: > raise PropCanKeyError(propertea, self.__slots__) > > + > def __delitem__(self, propertea): > try: > delattr(self, propertea) > except AttributeError: > raise PropCanKeyError(propertea, self.__slots__) > > + > def __len__(self): > length = 0 > for propertea in self.__slots__: > @@ -402,6 +414,7 @@ class PropCan(object): > length += 1 > return length > > + > def __contains__(self, propertea): > try: > value = getattr(self, propertea) > @@ -410,6 +423,7 @@ class PropCan(object): > if value: > return True > > + > def keys(self): > keylist = [] > for propertea in self.__slots__: > @@ -417,9 +431,11 @@ class PropCan(object): > keylist.append(propertea) > return keylist > > + > def has_key(self, propertea): > return self.__contains__(propertea) > > + > def set_if_none(self, propertea, value): > """ > Set the value of propertea, only if it's not set or None > @@ -427,6 +443,7 @@ class PropCan(object): > if propertea not in self.keys(): > self[propertea] = value > > + > def get(self, propertea, default=None): > """ > Mimics get method on python dictionaries > @@ -436,14 +453,17 @@ class PropCan(object): > else: > return default > > + > def update(self, **otherdict): > for propertea in self.__slots__: > if otherdict.has_key(propertea): > self[propertea] = otherdict[propertea] > > + > def __repr__(self): > return self.__str__() > > + > def __str__(self): > """ > Guarantee return of string format dictionary representation > @@ -466,32 +486,40 @@ class PropCan(object): > continue > return str(d) > > + > # Legacy functions related to MAC/IP addresses should make noise > def _open_mac_pool(lock_mode): > raise RuntimeError("Please update your code to use the VirtNet class") > > + > def _close_mac_pool(pool, lock_file): > raise RuntimeError("Please update your code to use the VirtNet class") > > + > def _generate_mac_address_prefix(mac_pool): > raise RuntimeError("Please update your code to use the VirtNet class") > > + > def generate_mac_address(vm_instance, nic_index): > raise RuntimeError("Please update your code to use " > "VirtNet.generate_mac_address()") > > + > def free_mac_address(vm_instance, nic_index): > raise RuntimeError("Please update your code to use " > "VirtNet.free_mac_address()") > > + > def set_mac_address(vm_instance, nic_index, mac): > raise RuntimeError("Please update your code to use " > "VirtNet.set_mac_address()") > > + > class VirtIface(PropCan): > """ > Networking information for single guest interface and host connection. > """ > + > __slots__ = ['nic_name', 'mac', 'nic_model', 'ip', 'nettype', 'netdst'] > # Make sure first byte generated is always zero and it follows > # the class definition. This helps provide more predictable > @@ -505,9 +533,11 @@ class VirtIface(PropCan): > state[key] = self[key] > return state > > + > def __setstate__(self, state): > self.__init__(state) > > + > @classmethod > def name_is_valid(cls, nic_name): > """ > @@ -520,6 +550,7 @@ class VirtIface(PropCan): > except PropCanKeyError: #unset name > return False > > + > @classmethod > def mac_is_valid(cls, mac): > try: > @@ -528,6 +559,7 @@ class VirtIface(PropCan): > return False > return True # Though may be less than 6 bytes > > + > @classmethod > def mac_str_to_int_list(cls, mac): > """ > @@ -560,6 +592,7 @@ class VirtIface(PropCan): > str(mac))) > return mac > > + > @classmethod > def int_list_to_mac_str(cls, mac_bytes): > """ > @@ -574,6 +607,7 @@ class VirtIface(PropCan): > mac_bytes[byte_index] = "%x" % mac > return mac_bytes > > + > @classmethod > def generate_bytes(cls): > """ > @@ -584,6 +618,7 @@ class VirtIface(PropCan): > cls.LASTBYTE = 0 > yield cls.LASTBYTE > > + > @classmethod > def complete_mac_address(cls, mac): > """ > @@ -600,7 +635,6 @@ class VirtIface(PropCan): > return cls.complete_mac_address(cls.int_list_to_mac_str(mac)) > > > - > class LibvirtIface(VirtIface): > """ > Networking information specific to libvirt > @@ -608,7 +642,6 @@ class LibvirtIface(VirtIface): > __slots__ = VirtIface.__slots__ + [] > > > - > class KVMIface(VirtIface): > """ > Networking information specific to KVM > @@ -618,6 +651,7 @@ class KVMIface(VirtIface): > 'romfile', 'nic_extra_params', > 'netdev_extra_params'] > > + > class VMNet(list): > """ > Collection of networking information. > @@ -645,17 +679,21 @@ class VMNet(list): > else: > raise VMNetError > > + > def __getstate__(self): > return [nic for nic in self] > > + > def __setstate__(self, state): > VMNet.__init__(self, self.container_class, state) > > + > def __getitem__(self, index_or_name): > if isinstance(index_or_name, str): > index_or_name = self.nic_name_index(index_or_name) > return super(VMNet, self).__getitem__(index_or_name) > > + > def __setitem__(self, index_or_name, value): > if not isinstance(value, dict): > raise VMNetError > @@ -671,7 +709,7 @@ class VMNet(list): > > def subclass_pre_init(self, params, vm_name): > """ > - Subclasses must establish style before calling VMNet. __init__() > + Subclasses must establish style before calling VMNet. __init__() > """ > #TODO: Get rid of this function. it's main purpose is to provide > # a shared way to setup style (container_class) from params+vm_name > @@ -687,6 +725,7 @@ class VMNet(list): > self.driver_type).items(): > setattr(self, key, value) > > + > def process_mac(self, value): > """ > Strips 'mac' key from value if it's not valid > @@ -708,12 +747,14 @@ class VMNet(list): > self.__class__.DISCARD_WARNINGS)) > self.__class__.DISCARD_WARNINGS -= 1 > > + > def mac_list(self): > """ > Return a list of all mac addresses used by defined interfaces > """ > return [nic.mac for nic in self if hasattr(nic, 'mac')] > > + > def append(self, value): > newone = self.container_class(value) > newone_name = newone['nic_name'] > @@ -724,6 +765,7 @@ class VMNet(list): > else: > raise VMNetError > > + > def nic_name_index(self, name): > """ > Return the index number for name, or raise KeyError > @@ -737,6 +779,7 @@ class VMNet(list): > raise IndexError("Can't find nic named '%s' among '%s'" % > (name, nic_name_list)) > > + > def nic_name_list(self): > """ > Obtain list of nic names from lookup of contents 'nic_name' key. > @@ -747,6 +790,7 @@ class VMNet(list): > namelist.append(item['nic_name']) > return namelist > > + > def nic_lookup(self, prop_name, prop_value): > """ > Return the first index with prop_name key matching prop_value or > None > @@ -757,6 +801,7 @@ class VMNet(list): > return nic_index > return None > > + > # TODO: Subclass VMNet into KVM/Libvirt variants and > # pull them, along with ParmasNet and maybe DbNet based on > # Style definitions. i.e. libvirt doesn't need DbNet at all, > @@ -795,16 +840,19 @@ class VMNetStyle(dict): > def __new__(cls, vm_type, driver_type): > return cls.get_style(vm_type, driver_type) > > + > @classmethod > def get_vm_type_map(cls, vm_type): > return cls.VMNet_Style_Map.get(vm_type, > cls.VMNet_Style_Map['default']) > > + > @classmethod > def get_driver_type_map(cls, vm_type_map, driver_type): > return vm_type_map.get(driver_type, > vm_type_map['default']) > > + > @classmethod > def get_style(cls, vm_type, driver_type): > style = cls.get_driver_type_map( cls.get_vm_type_map(vm_type), > @@ -823,7 +871,6 @@ class ParamsNet(VMNet): > # attr: mac, ip, model, nettype, netdst, etc. > <attr> = value > <attr>_<nic name> = value > - > """ > > # __init__ must not presume clean state, it should behave > @@ -854,8 +901,11 @@ class ParamsNet(VMNet): > result_list.append(nic_dict) > VMNet.__init__(self, self.container_class, result_list) > > + > def mac_index(self): > - """Generator over mac addresses found in params""" > + """ > + Generator over mac addresses found in params > + """ > for nic_name in self.params.get('nics'): > nic_obj_params = self.params.object_params(nic_name) > mac = nic_obj_params.get('mac') > @@ -864,8 +914,11 @@ class ParamsNet(VMNet): > else: > continue > > + > def reset_mac(self, index_or_name): > - """Reset to mac from params if defined and valid, or undefine.""" > + """ > + Reset to mac from params if defined and valid, or undefine. > + """ > nic = self[index_or_name] > nic_name = nic.nic_name > nic_params = self.params.object_params(nic_name) > @@ -877,8 +930,11 @@ class ParamsNet(VMNet): > new_mac = None > nic.mac = new_mac > > + > def reset_ip(self, index_or_name): > - """Reset to ip from params if defined and valid, or undefine.""" > + """ > + Reset to ip from params if defined and valid, or undefine. > + """ > nic = self[index_or_name] > nic_name = nic.nic_name > nic_params = self.params.object_params(nic_name) > @@ -890,13 +946,13 @@ class ParamsNet(VMNet): > new_ip = None > nic.ip = new_ip > > + > class DbNet(VMNet): > """ > Networking information from database > > Database specification- > database values are python string-formatted lists of > dictionaries > - > """ > > _INITIALIZED = False > @@ -931,11 +987,13 @@ class DbNet(VMNet): > if entry: > VMNet.__init__(self, self.container_class, entry) > > + > def __setitem__(self, index, value): > super(DbNet, self).__setitem__(index, value) > if self._INITIALIZED: > self.update_db() > > + > def __getitem__(self, index_or_name): > # container class attributes are read-only, hook > # update_db here is only alternative > @@ -943,6 +1001,7 @@ class DbNet(VMNet): > self.update_db() > return super(DbNet, self).__getitem__(index_or_name) > > + > def __delitem__(self, index_or_name): > if isinstance(index_or_name, str): > index_or_name = self.nic_name_index(index_or_name) > @@ -950,11 +1009,13 @@ class DbNet(VMNet): > if self._INITIALIZED: > self.update_db() > > + > def append(self, value): > super(DbNet, self).append(value) > if self._INITIALIZED: > self.update_db() > > + > def lock_db(self): > if not hasattr(self, 'lock'): > self.lock = lock_file(self.db_lockfile) > @@ -965,6 +1026,7 @@ class DbNet(VMNet): > else: > raise DbNoLockError > > + > def unlock_db(self): > if hasattr(self, 'db'): > self.db.close() > @@ -977,6 +1039,7 @@ class DbNet(VMNet): > else: > raise DbNoLockError > > + > def db_entry(self, db_key=None): > """ > Returns a python list of dictionaries from locked DB string-format > entry > @@ -1005,8 +1068,11 @@ class DbNet(VMNet): > result.append(result_dict) > return result > > + > def save_to_db(self, db_key=None): > - """Writes string representation out to database""" > + """ > + Writes string representation out to database > + """ > if db_key == None: > db_key = self.db_key > data = str(self) > @@ -1023,11 +1089,13 @@ class DbNet(VMNet): > except KeyError: > pass > > + > def update_db(self): > self.lock_db() > self.save_to_db() > self.unlock_db() > > + > def mac_index(self): > """Generator of mac addresses found in database""" > try: > @@ -1042,12 +1110,10 @@ class DbNet(VMNet): > raise DbNoLockError > > > - > class VirtNet(DbNet, ParamsNet): > """ > Persistent collection of VM's networking information. > """ > - > # __init__ must not presume clean state, it should behave > # assuming there is existing properties/data on the instance > # and take steps to preserve or update it as appropriate. > @@ -1073,6 +1139,7 @@ class VirtNet(DbNet, ParamsNet): > # signal runtime content handling to methods > self._INITIALIZED = True > > + > # Delegating get/setstate() details more to ancestor classes > # doesn't play well with multi-inheritence. While possibly > # more difficult to maintain, hard-coding important property > @@ -1088,6 +1155,7 @@ class VirtNet(DbNet, ParamsNet): > state[style_attr] = getattr(self, style_attr) > return state > > + > def __setstate__(self, state): > self._INITIALIZED = False # prevent db updates during unpickling > for key in state.keys(): > @@ -1097,6 +1165,7 @@ class VirtNet(DbNet, ParamsNet): > VMNet.__setstate__(self, state.pop('container_items')) > self._INITIALIZED = True > > + > def mac_index(self): > """ > Generator for all allocated mac addresses (requires db lock) > @@ -1106,6 +1175,7 @@ class VirtNet(DbNet, ParamsNet): > for mac in ParamsNet.mac_index(self): > yield mac > > + > def generate_mac_address(self, nic_index_or_name, attempts=1024): > """ > Set& return valid mac address for nic_index_or_name or raise > NetError > @@ -1140,6 +1210,7 @@ class VirtNet(DbNet, ParamsNet): > self.vm_name, > self.db_key)) > > + > def free_mac_address(self, nic_index_or_name): > """ > Remove the mac value from nic_index_or_name and cache unless static > @@ -1152,6 +1223,7 @@ class VirtNet(DbNet, ParamsNet): > self.reset_mac(nic_index_or_name) > self.update_db() > > + > def set_mac_address(self, nic_index_or_name, mac): > """ > Set a MAC address to value specified > @@ -1166,6 +1238,7 @@ class VirtNet(DbNet, ParamsNet): > nic.mac = mac.lower() > self.update_db() > > + > def get_mac_address(self, nic_index_or_name): > """ > Return a MAC address for nic_index_or_name > @@ -1175,6 +1248,7 @@ class VirtNet(DbNet, ParamsNet): > """ > return self[nic_index_or_name].mac.lower() > > + > def generate_ifname(self, nic_index_or_name): > """ > Return and set network interface name > @@ -1186,6 +1260,7 @@ class VirtNet(DbNet, ParamsNet): > self[nic_index_or_name].ifname = (prefix + postfix)[-11:] > return self[nic_index_or_name].ifname # forces update_db > > + > def verify_ip_address_ownership(ip, macs, timeout=10.0): > """ > Use arping and the ARP cache to make sure a given IP address belongs to > one > @@ -1420,6 +1495,7 @@ def generate_random_string(length): > length -= 1 > return str > > + > def generate_random_id(): > """ > Return a random string suitable for use as a qemu id. > diff --git a/client/virt/virt_vm.py b/client/virt/virt_vm.py > index b5d0c4c..754d1a5 100644 > --- a/client/virt/virt_vm.py > +++ b/client/virt/virt_vm.py > @@ -381,12 +381,13 @@ class BaseVM(object): > # Direct reference to self.virtnet makes pylint complain > # note: virtnet.__init__() supports being called anytime > getattr(self, 'virtnet').__init__(self.params, > - self.name, > - self.instance) > + self.name, > + self.instance) > else: # Create new > self.virtnet = virt_utils.VirtNet(self.params, > - self.name, > - self.instance) > + self.name, > + self.instance) > + > > def _generate_unique_id(self): > """ -- Chris Evich, RHCA, RHCE, RHCDS, RHCSS Quality Assurance Engineer e-mail: cevich + `@' + redhat.com o: 1-888-RED-HAT1 x44214 _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
