CSIT-547: Add x520 L2BD perf test with 2 VMs per DUT
[csit.git] / resources / libraries / python / QemuUtils.py
index 2123e42..675f074 100644 (file)
@@ -27,12 +27,13 @@ class QemuUtils(object):
     """QEMU utilities."""
 
     __QEMU_BIN = '/usr/bin/qemu-system-x86_64'
-    # QEMU Machine Protocol socket
-    __QMP_SOCK = '/tmp/qmp.sock'
-    # QEMU Guest Agent socket
-    __QGA_SOCK = '/tmp/qga.sock'
 
-    def __init__(self):
+    def __init__(self, qemu_id=1):
+        self._qemu_id = qemu_id
+        # QEMU Machine Protocol socket
+        self._qmp_sock = '/tmp/qmp{0}.sock'.format(self._qemu_id)
+        # QEMU Guest Agent socket
+        self._qga_sock = '/tmp/qga{0}.sock'.format(self._qemu_id)
         self._qemu_opt = {}
         # Default 1 CPU.
         self._qemu_opt['smp'] = '-smp 1,sockets=1,cores=1,threads=1'
@@ -40,7 +41,8 @@ class QemuUtils(object):
         # management interface.
         self._qemu_opt['options'] = '-cpu host -daemonize -enable-kvm ' \
             '-machine pc,accel=kvm,usb=off,mem-merge=off ' \
-            '-net nic,macaddr=52:54:00:00:02:01 -balloon none'
+            '-net nic,macaddr=52:54:00:00:00:{0:02x} -balloon none'\
+            .format(self._qemu_id)
         self._qemu_opt['ssh_fwd_port'] = 10022
         # Default serial console port
         self._qemu_opt['serial_port'] = 4556
@@ -55,7 +57,7 @@ class QemuUtils(object):
         # VM node info dict
         self._vm_info = {
             'type': NodeType.VM,
-            'port': 10022,
+            'port': self._qemu_opt['ssh_fwd_port'],
             'username': 'cisco',
             'password': 'cisco',
             'interfaces': {},
@@ -65,7 +67,7 @@ class QemuUtils(object):
         self._vhost_id = 0
         self._ssh = None
         self._node = None
-        self._socks = [self.__QMP_SOCK, self.__QGA_SOCK]
+        self._socks = [self._qmp_sock, self._qga_sock]
 
     def qemu_set_smp(self, cpus, cores, threads, sockets):
         """Set SMP option for QEMU
@@ -182,7 +184,7 @@ class QemuUtils(object):
         :param socket: Path of the unix socket.
         :param server: If True the socket shall be a listening socket.
         :param mac: Vhost-user interface MAC address (optional, otherwise is
-            used autogenerated MAC 52:54:00:00:04:xx).
+            used auto-generated MAC 52:54:00:00:xx:yy).
         :type socket: str
         :type server: bool
         :type mac: str
@@ -198,10 +200,12 @@ class QemuUtils(object):
         netdev = ' -netdev vhost-user,id=vhost{0},chardev=char{0},'\
             'queues={1}'.format(self._vhost_id, self._qemu_opt['queues'])
         self._qemu_opt['options'] += netdev
-        # If MAC is not specified use autogenerated 52:54:00:00:04:<vhost_id>
-        # e.g. vhost1 MAC is 52:54:00:00:04:01
+        # If MAC is not specified use auto-generated MAC address based on
+        # template 52:54:00:00:<qemu_id>:<vhost_id>, e.g. vhost1 MAC of QEMU
+        #  with ID 1 is 52:54:00:00:01:01
         if mac is None:
-            mac = '52:54:00:00:04:{0:02x}'.format(self._vhost_id)
+            mac = '52:54:00:00:{0:02x}:{1:02x}'.\
+                format(self._qemu_id, self._vhost_id)
         extend_options = 'mq=on,csum=off,gso=off,guest_tso4=off,'\
             'guest_tso6=off,guest_ecn=off,mrg_rxbuf=off'
         # Create Virtio network device.
@@ -229,7 +233,7 @@ class QemuUtils(object):
         # To enter command mode, the qmp_capabilities command must be issued.
         qmp_cmd = 'echo "{ \\"execute\\": \\"qmp_capabilities\\" }' \
                   '{ \\"execute\\": \\"' + cmd + \
-                  '\\" }" | sudo -S socat - UNIX-CONNECT:' + self.__QMP_SOCK
+                  '\\" }" | sudo -S socat - UNIX-CONNECT:' + self._qmp_sock
 
         (ret_code, stdout, stderr) = self._ssh.exec_command(qmp_cmd)
         if int(ret_code) != 0:
@@ -248,7 +252,7 @@ class QemuUtils(object):
         """Flush the QGA parser state
         """
         qga_cmd = '(printf "\xFF"; sleep 1) | sudo -S socat - UNIX-CONNECT:' + \
-                  self.__QGA_SOCK
+                  self._qga_sock
         #TODO: probably need something else
         (ret_code, stdout, stderr) = self._ssh.exec_command(qga_cmd)
         if int(ret_code) != 0:
@@ -272,7 +276,7 @@ class QemuUtils(object):
         qga_cmd = '(echo "{ \\"execute\\": \\"' + \
                   cmd + \
                   '\\" }"; sleep 1) | sudo -S socat - UNIX-CONNECT:' + \
-                  self.__QGA_SOCK
+                  self._qga_sock
         (ret_code, stdout, stderr) = self._ssh.exec_command(qga_cmd)
         if int(ret_code) != 0:
             logger.debug('QGA execute failed {0}'.format(stderr))
@@ -495,22 +499,22 @@ class QemuUtils(object):
             'share=on -m {0} -numa node,memdev=mem'.format(
                 self._qemu_opt.get('mem_size'), self._qemu_opt.get('huge_mnt'))
 
-        # By default check only if hugepages are availbale.
+        # By default check only if hugepages are available.
         # If 'huge_allocate' is set to true try to allocate as well.
         self._huge_page_check(allocate=self._qemu_opt.get('huge_allocate'))
 
         # Disk option
-        drive = '-drive file={},format=raw,cache=none,if=virtio'.format(
+        drive = '-drive file={0},format=raw,cache=none,if=virtio'.format(
             self._qemu_opt.get('disk_image'))
         # Setup QMP via unix socket
-        qmp = '-qmp unix:{0},server,nowait'.format(self.__QMP_SOCK)
+        qmp = '-qmp unix:{0},server,nowait'.format(self._qmp_sock)
         # Setup serial console
         serial = '-chardev socket,host=127.0.0.1,port={0},id=gnc0,server,' \
             'nowait -device isa-serial,chardev=gnc0'.format(
                 self._qemu_opt.get('serial_port'))
         # Setup QGA via chardev (unix socket) and isa-serial channel
-        qga = '-chardev socket,path=/tmp/qga.sock,server,nowait,id=qga0 ' \
-            '-device isa-serial,chardev=qga0'
+        qga = '-chardev socket,path={0},server,nowait,id=qga0 ' \
+            '-device isa-serial,chardev=qga0'.format(self._qga_sock)
         # Graphic setup
         graphic = '-monitor none -display none -vga none'