diff --git a/tests/xmlconfig-xml/boot-default-bridge.xml b/tests/xmlconfig-xml/boot-default-bridge.xml index f5d25f78..ed0fe626 100644 --- a/tests/xmlconfig-xml/boot-default-bridge.xml +++ b/tests/xmlconfig-xml/boot-default-bridge.xml @@ -26,11 +26,9 @@ - - diff --git a/virtinst/VirtualNetworkInterface.py b/virtinst/VirtualNetworkInterface.py index ad540e8e..9c7560ca 100644 --- a/virtinst/VirtualNetworkInterface.py +++ b/virtinst/VirtualNetworkInterface.py @@ -20,8 +20,6 @@ import logging import random -import libvirt - from virtinst import util from virtinst.VirtualDevice import VirtualDevice from virtinst.xmlbuilder import XMLBuilder, XMLProperty @@ -144,19 +142,9 @@ class VirtualNetworkInterface(VirtualDevice): VirtualDevice.__init__(self, conn, parsexml, parsexmlnode) - self._network = None - self._bridge = None - self._macaddr = None - self._type = None - self._model = None - self._target_dev = None - self._source_dev = None - self._source_mode = "vepa" - self.virtualport = VirtualPort(conn, parsexml, parsexmlnode) self._XML_SUB_ELEMENTS.append("virtualport") - # Generate _random_mac self._random_mac = None self._default_bridge = None @@ -164,15 +152,15 @@ class VirtualNetworkInterface(VirtualDevice): return self.type = type - self.macaddr = macaddr - self.bridge = bridge - self.source_dev = bridge - self.network = network - self.model = model + if macaddr: + self.macaddr = macaddr + if bridge: + self.bridge = bridge + if network: + self.network = network + if model: + self.model = model - if self.type == self.TYPE_VIRTUAL: - if network is None: - raise ValueError(_("A network name was not provided")) def _generate_default_bridge(self): ret = self._default_bridge @@ -214,123 +202,53 @@ class VirtualNetworkInterface(VirtualDevice): return source = property(get_source, set_source) - def get_type(self): - return self._type - def set_type(self, val): - if val not in self.network_types: - raise ValueError(_("Unknown network type %s") % val) - self._type = val - type = XMLProperty(get_type, set_type, - xpath="./@type") + def setup(self, meter=None): + ignore = meter + if not self.macaddr: + return - def get_macaddr(self): - # Don't generate a random MAC if parsing XML, since it can be slow - if self._macaddr or self._is_parse(): - return self._macaddr + ret, msg = self.is_conflict_net(self.conn, self.macaddr) + if msg is None: + return + if ret is False: + logging.warning(msg) + else: + raise RuntimeError(msg) + + + _XML_ELEMENT_ORDER = ["source", "mac", "target", "model"] + + type = XMLProperty(xpath="./@type") + + def _get_default_mac(self): + if self._is_parse(): + return None if not self._random_mac: self._random_mac = self.generate_mac(self.conn) return self._random_mac - def set_macaddr(self, val): + def _validate_mac(self, val): util.validate_macaddr(val) - self._macaddr = val - macaddr = XMLProperty(get_macaddr, set_macaddr, - xpath="./mac/@address") + return val + macaddr = XMLProperty(xpath="./mac/@address", + set_converter=_validate_mac, + default_cb=_get_default_mac) - def get_network(self): - return self._network - def set_network(self, newnet): - def _is_net_active(netobj): - # Apparently the 'info' command was never hooked up for - # libvirt virNetwork python apis. - if not self.conn: - return True - return self.conn.listNetworks().count(netobj.name()) - - if newnet is not None and self.conn: - try: - net = self.conn.networkLookupByName(newnet) - except libvirt.libvirtError, e: - raise ValueError(_("Virtual network '%s' does not exist: %s") - % (newnet, str(e))) - if not _is_net_active(net): - raise ValueError(_("Virtual network '%s' has not been " - "started.") % newnet) - - self._network = newnet - network = XMLProperty(get_network, set_network, - xpath="./source/@network") - - def get_bridge(self): - if (not self._is_parse() and - not self._bridge and - self.type == self.TYPE_BRIDGE): - return self._generate_default_bridge() - return self._bridge - def set_bridge(self, val): - self._bridge = val - bridge = XMLProperty(get_bridge, set_bridge, - xpath="./source/@bridge") - - def get_model(self): - return self._model - def set_model(self, val): - self._model = val - model = XMLProperty(get_model, set_model, - xpath="./model/@type") - - def get_target_dev(self): - return self._target_dev - def set_target_dev(self, val): - self._target_dev = val - target_dev = XMLProperty(get_target_dev, set_target_dev, - xpath="./target/@dev") - - def get_source_dev(self): - return self._source_dev - def set_source_dev(self, val): - self._source_dev = val - source_dev = XMLProperty(get_source_dev, set_source_dev, - xpath="./source/@dev") - - def get_source_mode(self): - return self._source_mode - def set_source_mode(self, newmode): - self._source_mode = newmode - source_mode = XMLProperty(get_source_mode, set_source_mode, - xpath="./source/@mode") - - def setup(self, meter=None): - if self.macaddr: - ret, msg = self.is_conflict_net(self.conn, self.macaddr) - if msg is not None: - if ret is False: - logging.warning(msg) - else: - raise RuntimeError(msg) - - def _get_xml_config(self): - src_xml = "" - model_xml = "" - target_xml = "" + def _get_default_bridge(self): if self.type == self.TYPE_BRIDGE: - src_xml = " \n" % self.bridge - elif self.type == self.TYPE_VIRTUAL: - src_xml = " \n" % self.network - elif self.type == self.TYPE_ETHERNET and self.source_dev: - src_xml = " \n" % self.source_dev - elif self.type == self.TYPE_DIRECT and self.source_dev: - src_xml = " \n" % (self.source_dev, self.source_mode) + return self._generate_default_bridge() + return None + bridge = XMLProperty(xpath="./source/@bridge", + default_cb=_get_default_bridge) + network = XMLProperty(xpath="./source/@network") + source_dev = XMLProperty(xpath="./source/@dev") - if self.model: - model_xml = " \n" % self.model - if self.target_dev: - target_xml = " \n" % self.target_dev - xml = " \n" % self.type - xml += src_xml - xml += " \n" % self.macaddr - xml += target_xml - xml += model_xml - xml += " " - return xml + def _default_source_mode(self): + if self.type == self.TYPE_DIRECT: + return "vepa" + return None + source_mode = XMLProperty(xpath="./source/@mode", + default_cb=_default_source_mode) + model = XMLProperty(xpath="./model/@type") + target_dev = XMLProperty(xpath="./target/@dev")