def test_generate_exact_intel_vmx_intel_vmx(self, vcpu=2, model='Penryn'): _xml = """ <cpu match="exact"> <model>{model}</model> <topology cores="1" sockets="{vcpu}" threads="1"/> <feature policy="require" name="vmx"/> </cpu> """.format( vcpu=vcpu, model=model ) host = ET.fromstring( """ <cpu> <arch>x86_64</arch> <model>Westmere</model> <vendor>Intel</vendor> <feature name='vmx'/> </cpu> """ ) empty_cpu = cpu.CPU(spec={}, host_cpu=None) self.assertXmlEquivalentOutputs( ET.tostring( empty_cpu.generate_exact( model=model, vcpu_num=vcpu, host_cpu=host ) ), _xml )
def test_generate_exact_unknown_vendor(self, vcpu=2, model='Westmere'): _xml = """ <cpu match="exact"> <model>{model}</model> <topology cores="1" sockets="{vcpu}" threads="1"/> </cpu> """.format( vcpu=vcpu, model=model ) host = ET.fromstring( """ <cpu> <arch>ppc64</arch> <model>Power6</model> <vendor>IBM</vendor> </cpu> """ ) empty_cpu = cpu.CPU(spec={}, host_cpu=None) self.assertXmlEquivalentOutputs( ET.tostring( empty_cpu.generate_exact( model=model, vcpu_num=vcpu, host_cpu=host ) ), _xml )
def test_generate_host_passthrough(self): _xml = """ <cpu mode="host-passthrough"> <topology sockets="{0}" cores="1" threads="1"/>{1} </cpu> """ empty_cpu = cpu.CPU(spec={'memory': 2048}, host_cpu=None) vcpu_num = 1 self.assertXmlEquivalentOutputs( ET.tostring(empty_cpu.generate_host_passthrough(vcpu_num)), _xml.format(vcpu_num, '')) _numa2 = """ <numa> <cell cpus="0" id="0" memory="1023" unit="MiB"/> <cell cpus="1" id="1" memory="1023" unit="MiB"/> </numa> """ empty_cpu = cpu.CPU(spec={'memory': 2047}, host_cpu=None) vcpu_num = 2 self.assertXmlEquivalentOutputs( ET.tostring(empty_cpu.generate_host_passthrough(vcpu_num)), _xml.format(vcpu_num, _numa2)) _numa3 = """ <numa> <cell cpus="0" id="0" memory="682" unit="MiB"/> <cell cpus="1" id="1" memory="682" unit="MiB"/> <cell cpus="2" id="2" memory="682" unit="MiB"/> </numa> """ vcpu_num = 3 self.assertXmlEquivalentOutputs( ET.tostring(empty_cpu.generate_host_passthrough(vcpu_num)), _xml.format(vcpu_num, _numa3)) _numa8 = """ <numa> <cell cpus="0-3" id="0" memory="2048" unit="MiB"/> <cell cpus="4-7" id="1" memory="2048" unit="MiB"/> </numa> """ empty_cpu = cpu.CPU(spec={'memory': 4096}, host_cpu=None) vcpu_num = 8 self.assertXmlEquivalentOutputs( ET.tostring(empty_cpu.generate_host_passthrough(vcpu_num)), _xml.format(vcpu_num, _numa8))
def test_init_custom_and_model_not_allowed(self): spec = { 'cpu_custom': 'custom', 'cpu_model': 'DummyModel', 'memory': 2048 } with pytest.raises(LagoInitException): cpu.CPU(spec=spec, host_cpu=self.get_host_cpu())
def test_init_default(self): spec = {} _xml = """ <cpu mode="host-passthrough"> <topology sockets="2" cores="1" threads="1"/> </cpu> """ def_cpu = cpu.CPU(spec=spec, host_cpu=self.get_host_cpu()) self.assertXmlEquivalentOutputs(ET.tostring(def_cpu.cpu_xml), _xml)
def test_generate_host_passthrough(self): _xml = """ <cpu mode="host-passthrough"> <topology sockets="{0}" cores="1" threads="1"/> </cpu> """ empty_cpu = cpu.CPU(spec={}, host_cpu=None) for vcpu_num in [1, 9, 11, 120]: self.assertXmlEquivalentOutputs( ET.tostring(empty_cpu.generate_host_passthrough(vcpu_num)), _xml.format(vcpu_num))
def test_init_default(self): spec = {'memory': 2048} _xml = """ <cpu mode="host-passthrough"> <topology sockets="2" cores="1" threads="1"/> <numa> <cell cpus="0" id="0" memory="1024" unit="MiB"/> <cell cpus="1" id="1" memory="1024" unit="MiB"/> </numa> </cpu> """ def_cpu = cpu.CPU(spec=spec, host_cpu=self.get_host_cpu()) self.assertXmlEquivalentOutputs(ET.tostring(def_cpu.cpu_xml), _xml)
def test_generate_topology(self): _xml = """ <topology sockets="{vcpu_num}" cores="{cores}" threads="{threads}" /> """ combs = [{ 'vcpu_num': tup[0], 'cores': tup[1], 'threads': tup[2] } for tup in permutations(range(1, 4), 3)] empty_cpu = cpu.CPU(spec={'memory': 2048}, host_cpu=None) for comb in combs: self.assertXmlEquivalentOutputs( ET.tostring(empty_cpu.generate_topology(**comb)), _xml.format(**comb))
def __init__(self, vm): super(LocalLibvirtVMProvider, self).__init__(vm) libvirt_url = config.get('libvirt_url') self.libvirt_con = libvirt_utils.get_libvirt_connection( name=self.vm.virt_env.uuid + libvirt_url, libvirt_url=libvirt_url, ) caps_raw_xml = self.libvirt_con.getCapabilities() self._caps = ET.fromstring(caps_raw_xml) host_cpu = self._caps.xpath('host/cpu')[0] self._cpu = cpu.CPU(spec=self.vm._spec, host_cpu=host_cpu) # TO-DO: found a nicer way to expose these attributes to the VM self.vm.cpu_model = self.cpu_model self.vm.cpu_vendor = self.cpu_vendor
def __init__(self, vm): super().__init__(vm) self._has_guestfs = 'lago.guestfs_tools' in sys.modules libvirt_url = config.get('libvirt_url') self.libvirt_con = libvirt_utils.get_libvirt_connection( name=self.vm.virt_env.uuid + libvirt_url, libvirt_url=libvirt_url, ) self._libvirt_ver = self.libvirt_con.getLibVersion() caps_raw_xml = self.libvirt_con.getCapabilities() self._caps = ET.fromstring(caps_raw_xml) host_cpu = self._caps.xpath('host/cpu')[0] self._cpu = cpu.CPU(spec=self.vm._spec, host_cpu=host_cpu) # TO-DO: found a nicer way to expose these attributes to the VM self.vm.cpu_model = self.cpu_model self.vm.cpu_vendor = self.cpu_vendor
def test_generate_exact_vendor_mismatch(self, vcpu=2, model='Opteron_G2'): _xml = """ <cpu match="exact"> <model>{model}</model> <topology cores="1" sockets="{vcpu}" threads="1"/> </cpu> """.format(vcpu=vcpu, model=model) host = ET.fromstring(""" <cpu> <arch>x86_64</arch> <model>Westmere</model> <vendor>Intel</vendor> </cpu> """) empty_cpu = cpu.CPU(spec={'memory': 2048}, host_cpu=None) self.assertXmlEquivalentOutputs( ET.tostring( empty_cpu.generate_exact(model=model, vcpu_num=vcpu, host_cpu=host)), _xml)
def cpu(self): if self._cpu is None: host_cpu = self.caps.xpath('host/cpu')[0] self._cpu = cpu.CPU(spec=self.vm._spec, host_cpu=host_cpu) return self._cpu