Perpatch: Fix bash ansible calls
[csit.git] / resources / libraries / python / QemuUtils.py
index 96b4ebd..b1b6008 100644 (file)
@@ -60,10 +60,24 @@ class QemuUtils:
         self._vhost_id = 0
         self._node = node
         self._arch = Topology.get_node_arch(self._node)
-        dpdk_target = u"arm64-armv8a" if self._arch == u"aarch64" \
-            else u"x86_64-native"
+        self._opt = dict()
+
+        # Architecture specific options
+        if self._arch == u"aarch64":
+            dpdk_target = u"arm64-armv8a"
+            self._opt[u"machine_args"] = \
+                u"virt,accel=kvm,usb=off,mem-merge=off,gic-version=3"
+            self._opt[u"console"] = u"ttyAMA0"
+            self._opt[u"unsafe_iommu"] = u"echo Y > /sys/module/vfio/para" \
+                                         u"meters/enable_unsafe_noiommu_mode"
+        else:
+            dpdk_target = u"x86_64-native"
+            self._opt[u"machine_args"] = u"pc,accel=kvm,usb=off,mem-merge=off"
+            self._opt[u"console"] = u"ttyS0"
+            self._opt[u"unsafe_iommu"] = u""
+
         self._testpmd_path = f"{Constants.QEMU_VM_DPDK}/" \
-            f"{dpdk_target}-linuxapp-gcc/app"
+            f"{dpdk_target}-linux-gcc/app"
         self._vm_info = {
             u"host": node[u"host"],
             u"type": NodeType.VM,
@@ -78,7 +92,6 @@ class QemuUtils:
             self._vm_info[u"host_username"] = node[u"username"]
             self._vm_info[u"host_password"] = node[u"password"]
         # Input Options.
-        self._opt = dict()
         self._opt[u"qemu_id"] = qemu_id
         self._opt[u"mem"] = int(mem)
         self._opt[u"smp"] = int(smp)
@@ -134,11 +147,7 @@ class QemuUtils:
         self._params.add_with_value(u"pidfile", self._temp.get(u"pidfile"))
         self._params.add_with_value(u"cpu", u"host")
 
-        if self._arch == u"aarch64":
-            machine_args = u"virt,accel=kvm,usb=off,mem-merge=off,gic-version=3"
-        else:
-            machine_args = u"pc,accel=kvm,usb=off,mem-merge=off"
-        self._params.add_with_value(u"machine", machine_args)
+        self._params.add_with_value(u"machine", self._opt.get(u"machine_args"))
         self._params.add_with_value(
             u"smp", f"{self._opt.get(u'smp')},sockets=1,"
             f"cores={self._opt.get(u'smp')},threads=1"
@@ -180,7 +189,6 @@ class QemuUtils:
 
     def add_kernelvm_params(self):
         """Set KernelVM QEMU parameters."""
-        console = u"ttyAMA0" if self._arch == u"aarch64" else u"ttyS0"
         self._params.add_with_value(
             u"serial", f"file:{self._temp.get(u'log')}"
         )
@@ -194,7 +202,8 @@ class QemuUtils:
         self._params.add_with_value(u"initrd", f"{self._opt.get(u'initrd')}")
         self._params.add_with_value(
             u"append", f"'ro rootfstype=9p rootflags=trans=virtio "
-            f"root=virtioroot console={console} tsc=reliable hugepages=256 "
+            f"root=virtioroot console={self._opt.get(u'console')} "
+            f"tsc=reliable hugepages=256 "
             f"init={self._temp.get(u'ini')} fastboot'"
         )
 
@@ -236,7 +245,7 @@ class QemuUtils:
         template = f"{Constants.RESOURCES_TPL_VM}/{self._opt.get(u'vnf')}.exec"
         exec_cmd_no_error(self._node, f"rm -f {running}", sudo=True)
 
-        with open(template, "r") as src_file:
+        with open(template, u"rt") as src_file:
             src = Template(src_file.read())
             exec_cmd_no_error(
                 self._node, f"echo '{src.safe_substitute(**kwargs)}' | "
@@ -296,7 +305,7 @@ class QemuUtils:
         init = self._temp.get(u"ini")
         exec_cmd_no_error(self._node, f"rm -f {init}", sudo=True)
 
-        with open(template, "r") as src_file:
+        with open(template, u"rt") as src_file:
             src = Template(src_file.read())
             exec_cmd_no_error(
                 self._node, f"echo '{src.safe_substitute(**kwargs)}' | "
@@ -318,7 +327,8 @@ class QemuUtils:
             self.create_kernelvm_config_testpmd_mac(**kwargs)
         else:
             raise RuntimeError(u"QEMU: Unsupported VNF!")
-        self.create_kernelvm_init(vnf_bin=self._opt[u"vnf_bin"])
+        self.create_kernelvm_init(vnf_bin=self._opt.get(u"vnf_bin"),
+                                  unsafe_iommu=self._opt.get(u"unsafe_iommu"))
 
     def get_qemu_pids(self):
         """Get QEMU CPU pids.
@@ -384,7 +394,7 @@ class QemuUtils:
 
     def qemu_add_vhost_user_if(
             self, socket, server=True, jumbo_frames=False, queue_size=None,
-            queues=1):
+            queues=1, csum=False, gso=False):
         """Add Vhost-user interface.
 
         :param socket: Path of the unix socket.
@@ -392,11 +402,15 @@ class QemuUtils:
         :param jumbo_frames: Set True if jumbo frames are used in the test.
         :param queue_size: Vring queue size.
         :param queues: Number of queues.
+        :param csum: Checksum offloading.
+        :param gso: Generic segmentation offloading.
         :type socket: str
         :type server: bool
         :type jumbo_frames: bool
         :type queue_size: int
         :type queues: int
+        :type csum: bool
+        :type gso: bool
         """
         self._vhost_id += 1
         self._params.add_with_value(
@@ -411,12 +425,13 @@ class QemuUtils:
             f"{self._vhost_id:02x}"
         queue_size = f"rx_queue_size={queue_size},tx_queue_size={queue_size}" \
             if queue_size else u""
-        mbuf = u"on,host_mtu=9200"
         self._params.add_with_value(
             u"device", f"virtio-net-pci,netdev=vhost{self._vhost_id},mac={mac},"
             f"addr={self._vhost_id+5}.0,mq=on,vectors={2 * queues + 2},"
-            f"csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off,"
-            f"mrg_rxbuf={mbuf if jumbo_frames else u'off'},{queue_size}"
+            f"csum={u'on' if csum else u'off'},gso={u'on' if gso else u'off'},"
+            f"guest_tso4=off,guest_tso6=off,guest_ecn=off,"
+            f"mrg_rxbuf={u'on,host_mtu=9200' if jumbo_frames else u'off'},"
+            f"{queue_size}"
         )
 
         # Add interface MAC and socket to the node dict.
@@ -606,7 +621,7 @@ class QemuUtils:
         message = f"QEMU: Start failed on {self._node[u'host']}!"
         try:
             DUTSetup.check_huge_page(
-                self._node, u"/dev/hugepages", self._opt.get(u"mem"))
+                self._node, u"/dev/hugepages", int(self._opt.get(u"mem")))
 
             exec_cmd_no_error(
                 self._node, cmd_opts, timeout=300, sudo=True, message=message