[PATCH] Create common function to generate interface guest XML

And use it on vmtemplate.py and model/vmifaces.py to make sure in both cases the same XML structure will be used. Signed-off-by: Aline Manera <alinefm@linux.vnet.ibm.com> --- src/kimchi/model/vmifaces.py | 19 +++++----------- src/kimchi/vmtemplate.py | 29 ++++++------------------ src/kimchi/xmlutils/interface.py | 49 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 35 deletions(-) create mode 100644 src/kimchi/xmlutils/interface.py diff --git a/src/kimchi/model/vmifaces.py b/src/kimchi/model/vmifaces.py index 721bf14..87ada6d 100644 --- a/src/kimchi/model/vmifaces.py +++ b/src/kimchi/model/vmifaces.py @@ -21,10 +21,10 @@ import random import libvirt from lxml import etree, objectify -from lxml.builder import E from kimchi.exception import InvalidOperation, InvalidParameter, NotFoundError from kimchi.model.vms import DOM_STATE_MAP, VMModel +from kimchi.xmlutils.interface import get_iface_xml class VMIfacesModel(object): @@ -53,22 +53,15 @@ class VMIfacesModel(object): for iface in self.get_vmifaces(vm, self.conn)) while True: - mac = VMIfacesModel.random_mac() - if mac not in macs: + params['mac'] = VMIfacesModel.random_mac() + if params['mac'] not in macs: break - children = [E.mac(address=mac)] - ("network" in params.keys() and - children.append(E.source(network=params['network']))) - ("model" in params.keys() and - children.append(E.model(type=params['model']))) - attrib = {"type": params["type"]} - - xml = etree.tostring(E.interface(*children, **attrib)) - + os_distro, os_version = VMModel.vm_get_os_metadata(dom) + xml = get_iface_xml(params, conn.getInfo()[0], os_distro, os_version) dom.attachDeviceFlags(xml, libvirt.VIR_DOMAIN_AFFECT_CURRENT) - return mac + return params['mac'] @staticmethod def get_vmifaces(vm, conn): diff --git a/src/kimchi/vmtemplate.py b/src/kimchi/vmtemplate.py index 4e5806f..25f1994 100644 --- a/src/kimchi/vmtemplate.py +++ b/src/kimchi/vmtemplate.py @@ -23,7 +23,6 @@ import time import urlparse import uuid -from distutils.version import LooseVersion from lxml import etree from lxml.builder import E @@ -33,6 +32,7 @@ from kimchi.imageinfo import probe_image, probe_img_info from kimchi.isoinfo import IsoImage from kimchi.utils import check_url_path, pool_name_from_uri from kimchi.xmlutils.disk import get_disk_xml +from kimchi.xmlutils.interface import get_iface_xml from kimchi.xmlutils.qemucmdline import get_qemucmdline_xml @@ -239,30 +239,15 @@ class VMTemplate(object): ret.append(info) return ret - def _disable_vhost(self): - # Hack to disable vhost feature in Ubuntu LE and SLES LE (PPC) - driver = "" - if self.info['arch'] == 'ppc64' and \ - ((self.info['os_distro'] == 'ubuntu' and LooseVersion( - self.info['os_version']) >= LooseVersion('14.04')) or - (self.info['os_distro'] == 'sles' and LooseVersion( - self.info['os_version']) >= LooseVersion('12'))): - driver = " <driver name='qemu'/>\n " - return driver - def _get_networks_xml(self): - network = """ - <interface type='network'> - <source network='%(network)s'/> - <model type='%(nic_model)s'/> - %(driver)s</interface> - """ networks = "" - net_info = {"nic_model": self.info['nic_model'], - "driver": self._disable_vhost()} + params = {'type': 'network', + 'model': self.info['nic_model']} for nw in self.info['networks']: - net_info['network'] = nw - networks += network % net_info + params['network'] = nw + networks += get_iface_xml(params, self.info['arch'], + self.info['os_distro'], + self.info['os_version']) return networks def _get_input_output_xml(self): diff --git a/src/kimchi/xmlutils/interface.py b/src/kimchi/xmlutils/interface.py new file mode 100644 index 0000000..c76131a --- /dev/null +++ b/src/kimchi/xmlutils/interface.py @@ -0,0 +1,49 @@ +# +# Project Kimchi +# +# Copyright IBM, Corp. 2014 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import lxml.etree as ET + +from distutils.version import LooseVersion +from lxml.builder import E + + +def get_iface_xml(params, arch=None, os_distro=None, os_version=None): + """ + <interface type='network'> + <source network='default'/> + <model type='virtio'/> + </interface> + """ + interface = E.interface(type=params['type']) + interface.append(E.source(network=params['network'])) + interface.append(E.model(type=params['model'])) + + mac = params.get('mac', None) + if mac is not None: + interface.append(E.mac(address=mac)) + + # Hack to disable vhost feature in Ubuntu LE and SLES LE (PPC) + if arch == 'ppc64' and \ + ((os_distro == 'ubuntu' and + LooseVersion(os_version) >= LooseVersion('14.04')) or + (os_distro == 'sles' and + LooseVersion(os_version >= LooseVersion('12')))): + interface.append(E.driver(name='qemu')) + + return ET.tostring(interface, encoding='utf-8', pretty_print=True) -- 1.9.3

Reviewed-by: Daniel Barboza <danielhb@linux.vnet.ibm.com> On 11/04/2014 02:39 PM, Aline Manera wrote:
And use it on vmtemplate.py and model/vmifaces.py to make sure in both cases the same XML structure will be used.
Signed-off-by: Aline Manera <alinefm@linux.vnet.ibm.com> --- src/kimchi/model/vmifaces.py | 19 +++++----------- src/kimchi/vmtemplate.py | 29 ++++++------------------ src/kimchi/xmlutils/interface.py | 49 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 35 deletions(-) create mode 100644 src/kimchi/xmlutils/interface.py
diff --git a/src/kimchi/model/vmifaces.py b/src/kimchi/model/vmifaces.py index 721bf14..87ada6d 100644 --- a/src/kimchi/model/vmifaces.py +++ b/src/kimchi/model/vmifaces.py @@ -21,10 +21,10 @@ import random
import libvirt from lxml import etree, objectify -from lxml.builder import E
from kimchi.exception import InvalidOperation, InvalidParameter, NotFoundError from kimchi.model.vms import DOM_STATE_MAP, VMModel +from kimchi.xmlutils.interface import get_iface_xml
class VMIfacesModel(object): @@ -53,22 +53,15 @@ class VMIfacesModel(object): for iface in self.get_vmifaces(vm, self.conn))
while True: - mac = VMIfacesModel.random_mac() - if mac not in macs: + params['mac'] = VMIfacesModel.random_mac() + if params['mac'] not in macs: break
- children = [E.mac(address=mac)] - ("network" in params.keys() and - children.append(E.source(network=params['network']))) - ("model" in params.keys() and - children.append(E.model(type=params['model']))) - attrib = {"type": params["type"]} - - xml = etree.tostring(E.interface(*children, **attrib)) - + os_distro, os_version = VMModel.vm_get_os_metadata(dom) + xml = get_iface_xml(params, conn.getInfo()[0], os_distro, os_version) dom.attachDeviceFlags(xml, libvirt.VIR_DOMAIN_AFFECT_CURRENT)
- return mac + return params['mac']
@staticmethod def get_vmifaces(vm, conn): diff --git a/src/kimchi/vmtemplate.py b/src/kimchi/vmtemplate.py index 4e5806f..25f1994 100644 --- a/src/kimchi/vmtemplate.py +++ b/src/kimchi/vmtemplate.py @@ -23,7 +23,6 @@ import time import urlparse import uuid
-from distutils.version import LooseVersion from lxml import etree from lxml.builder import E
@@ -33,6 +32,7 @@ from kimchi.imageinfo import probe_image, probe_img_info from kimchi.isoinfo import IsoImage from kimchi.utils import check_url_path, pool_name_from_uri from kimchi.xmlutils.disk import get_disk_xml +from kimchi.xmlutils.interface import get_iface_xml from kimchi.xmlutils.qemucmdline import get_qemucmdline_xml
@@ -239,30 +239,15 @@ class VMTemplate(object): ret.append(info) return ret
- def _disable_vhost(self): - # Hack to disable vhost feature in Ubuntu LE and SLES LE (PPC) - driver = "" - if self.info['arch'] == 'ppc64' and \ - ((self.info['os_distro'] == 'ubuntu' and LooseVersion( - self.info['os_version']) >= LooseVersion('14.04')) or - (self.info['os_distro'] == 'sles' and LooseVersion( - self.info['os_version']) >= LooseVersion('12'))): - driver = " <driver name='qemu'/>\n " - return driver - def _get_networks_xml(self): - network = """ - <interface type='network'> - <source network='%(network)s'/> - <model type='%(nic_model)s'/> - %(driver)s</interface> - """ networks = "" - net_info = {"nic_model": self.info['nic_model'], - "driver": self._disable_vhost()} + params = {'type': 'network', + 'model': self.info['nic_model']} for nw in self.info['networks']: - net_info['network'] = nw - networks += network % net_info + params['network'] = nw + networks += get_iface_xml(params, self.info['arch'], + self.info['os_distro'], + self.info['os_version']) return networks
def _get_input_output_xml(self): diff --git a/src/kimchi/xmlutils/interface.py b/src/kimchi/xmlutils/interface.py new file mode 100644 index 0000000..c76131a --- /dev/null +++ b/src/kimchi/xmlutils/interface.py @@ -0,0 +1,49 @@ +# +# Project Kimchi +# +# Copyright IBM, Corp. 2014 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import lxml.etree as ET + +from distutils.version import LooseVersion +from lxml.builder import E + + +def get_iface_xml(params, arch=None, os_distro=None, os_version=None): + """ + <interface type='network'> + <source network='default'/> + <model type='virtio'/> + </interface> + """ + interface = E.interface(type=params['type']) + interface.append(E.source(network=params['network'])) + interface.append(E.model(type=params['model'])) + + mac = params.get('mac', None) + if mac is not None: + interface.append(E.mac(address=mac)) + + # Hack to disable vhost feature in Ubuntu LE and SLES LE (PPC) + if arch == 'ppc64' and \ + ((os_distro == 'ubuntu' and + LooseVersion(os_version) >= LooseVersion('14.04')) or + (os_distro == 'sles' and + LooseVersion(os_version >= LooseVersion('12')))): + interface.append(E.driver(name='qemu')) + + return ET.tostring(interface, encoding='utf-8', pretty_print=True)
participants (2)
-
Aline Manera
-
Daniel H Barboza