
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> criterias are: 1. if there are interfaces already attached to a vm, use the same model 2. if "vmifaces" element in metatdata, get the model from metatdata 3. if "OS" element in metatdata, get the model from "OS" metatdata Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/model/vmifaces.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/kimchi/model/vmifaces.py b/src/kimchi/model/vmifaces.py index 30e5373..da9721b 100644 --- a/src/kimchi/model/vmifaces.py +++ b/src/kimchi/model/vmifaces.py @@ -23,6 +23,7 @@ import libvirt from lxml import etree, objectify from lxml.builder import E +from kimchi import osinfo from kimchi.exception import InvalidOperation, InvalidParameter, NotFoundError from kimchi.model.utils import get_vm_metadata_element from kimchi.model.utils import set_vm_metadata_element @@ -45,6 +46,28 @@ class VMIfacesModel(object): vmiface = objectify.fromstring(iface_xml) return vmiface.attrib.get("model") + def _choose_model(self, vm): + # first find a model from the exist iface of vm + for iface in VMIfacesModel.get_vmifaces(vm, self.conn): + if iface.find("model") is not None: + return iface.model.get('type') + + dom = VMModel.get_vm(vm, self.conn) + # then get model from vmiface metadata + model = self._vm_get_iface_metadata(dom) + if model is not None: + return model + + # at last from OS metadata + distro, version = VMModel.vm_get_os_metadata(dom) + if distro is not None: + entry = osinfo.lookup(distro, version) + VMIfaceModel.vm_updata_iface_metadata( + dom, {"model": entry['nic_model']}) + return entry['nic_model'] + + return None + def create(self, vm, params): def randomMAC(): mac = [0x52, 0x54, 0x00, @@ -76,8 +99,12 @@ class VMIfacesModel(object): 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']))) + + model = params.get("model") + if "network" in params and model is None: + model = self._choose_model(vm) + model is not None and children.append(E.model({"type": model})) + attrib = {"type": params["type"]} xml = etree.tostring(E.interface(*children, **attrib)) -- 1.9.0