diff options
| -rw-r--r-- | meta/lib/oeqa/utils/qemurunner.py | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index 59c9934377..4de3c64d7d 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py | |||
| @@ -14,8 +14,7 @@ import socket | |||
| 14 | import select | 14 | import select |
| 15 | 15 | ||
| 16 | import logging | 16 | import logging |
| 17 | logger = logging.getLogger("QemuRunner") | 17 | logger = logging.getLogger("BitBake.QemuRunner") |
| 18 | logger.setLevel(logging.DEBUG - 2) | ||
| 19 | 18 | ||
| 20 | class QemuRunner: | 19 | class QemuRunner: |
| 21 | 20 | ||
| @@ -51,11 +50,11 @@ class QemuRunner: | |||
| 51 | self.server_socket.bind(("127.0.0.1",0)) | 50 | self.server_socket.bind(("127.0.0.1",0)) |
| 52 | self.server_socket.listen(2) | 51 | self.server_socket.listen(2) |
| 53 | self.serverport = self.server_socket.getsockname()[1] | 52 | self.serverport = self.server_socket.getsockname()[1] |
| 54 | logging.info("Created listening socket for qemu serial console on: 127.0.0.1:%s" % self.serverport) | 53 | logger.info("Created listening socket for qemu serial console on: 127.0.0.1:%s" % self.serverport) |
| 55 | return True | 54 | return True |
| 56 | except socket.error, msg: | 55 | except socket.error, msg: |
| 57 | self.server_socket.close() | 56 | self.server_socket.close() |
| 58 | logging.error("Failed to create listening socket: %s" % msg[1]) | 57 | logger.error("Failed to create listening socket: %s" % msg[1]) |
| 59 | return False | 58 | return False |
| 60 | 59 | ||
| 61 | 60 | ||
| @@ -68,18 +67,18 @@ class QemuRunner: | |||
| 68 | if self.display: | 67 | if self.display: |
| 69 | os.environ["DISPLAY"] = self.display | 68 | os.environ["DISPLAY"] = self.display |
| 70 | else: | 69 | else: |
| 71 | logging.error("To start qemu I need a X desktop, please set DISPLAY correctly (e.g. DISPLAY=:1)") | 70 | logger.error("To start qemu I need a X desktop, please set DISPLAY correctly (e.g. DISPLAY=:1)") |
| 72 | return False | 71 | return False |
| 73 | if not os.path.exists(self.rootfs): | 72 | if not os.path.exists(self.rootfs): |
| 74 | logging.error("Invalid rootfs %s" % self.rootfs) | 73 | logger.error("Invalid rootfs %s" % self.rootfs) |
| 75 | return False | 74 | return False |
| 76 | if not os.path.exists(self.tmpdir): | 75 | if not os.path.exists(self.tmpdir): |
| 77 | logging.error("Invalid TMPDIR path %s" % self.tmpdir) | 76 | logger.error("Invalid TMPDIR path %s" % self.tmpdir) |
| 78 | return False | 77 | return False |
| 79 | else: | 78 | else: |
| 80 | os.environ["OE_TMPDIR"] = self.tmpdir | 79 | os.environ["OE_TMPDIR"] = self.tmpdir |
| 81 | if not os.path.exists(self.deploy_dir_image): | 80 | if not os.path.exists(self.deploy_dir_image): |
| 82 | logging.error("Invalid DEPLOY_DIR_IMAGE path %s" % self.deploy_dir_image) | 81 | logger.error("Invalid DEPLOY_DIR_IMAGE path %s" % self.deploy_dir_image) |
| 83 | return False | 82 | return False |
| 84 | else: | 83 | else: |
| 85 | os.environ["DEPLOY_DIR_IMAGE"] = self.deploy_dir_image | 84 | os.environ["DEPLOY_DIR_IMAGE"] = self.deploy_dir_image |
| @@ -97,28 +96,28 @@ class QemuRunner: | |||
| 97 | launch_cmd = 'runqemu %s %s %s' % (self.machine, self.rootfs, self.qemuparams) | 96 | launch_cmd = 'runqemu %s %s %s' % (self.machine, self.rootfs, self.qemuparams) |
| 98 | self.runqemu = subprocess.Popen(launch_cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,preexec_fn=os.setpgrp) | 97 | self.runqemu = subprocess.Popen(launch_cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,preexec_fn=os.setpgrp) |
| 99 | 98 | ||
| 100 | logging.info("runqemu started, pid is %s" % self.runqemu.pid) | 99 | logger.info("runqemu started, pid is %s" % self.runqemu.pid) |
| 101 | logging.info("waiting at most %s seconds for qemu pid" % self.runqemutime) | 100 | logger.info("waiting at most %s seconds for qemu pid" % self.runqemutime) |
| 102 | endtime = time.time() + self.runqemutime | 101 | endtime = time.time() + self.runqemutime |
| 103 | while not self.is_alive() and time.time() < endtime: | 102 | while not self.is_alive() and time.time() < endtime: |
| 104 | time.sleep(1) | 103 | time.sleep(1) |
| 105 | 104 | ||
| 106 | if self.is_alive(): | 105 | if self.is_alive(): |
| 107 | logging.info("qemu started - qemu procces pid is %s" % self.qemupid) | 106 | logger.info("qemu started - qemu procces pid is %s" % self.qemupid) |
| 108 | cmdline = '' | 107 | cmdline = '' |
| 109 | with open('/proc/%s/cmdline' % self.qemupid) as p: | 108 | with open('/proc/%s/cmdline' % self.qemupid) as p: |
| 110 | cmdline = p.read() | 109 | cmdline = p.read() |
| 111 | ips = re.findall("((?:[0-9]{1,3}\.){3}[0-9]{1,3})", cmdline.split("ip=")[1]) | 110 | ips = re.findall("((?:[0-9]{1,3}\.){3}[0-9]{1,3})", cmdline.split("ip=")[1]) |
| 112 | if not ips or len(ips) != 3: | 111 | if not ips or len(ips) != 3: |
| 113 | logging.info("Couldn't get ip from qemu process arguments! Here is the qemu command line used: %s" % cmdline) | 112 | logger.info("Couldn't get ip from qemu process arguments! Here is the qemu command line used: %s" % cmdline) |
| 114 | self.stop() | 113 | self.stop() |
| 115 | return False | 114 | return False |
| 116 | else: | 115 | else: |
| 117 | self.ip = ips[0] | 116 | self.ip = ips[0] |
| 118 | self.server_ip = ips[1] | 117 | self.server_ip = ips[1] |
| 119 | logging.info("Target IP: %s" % self.ip) | 118 | logger.info("Target IP: %s" % self.ip) |
| 120 | logging.info("Server IP: %s" % self.server_ip) | 119 | logger.info("Server IP: %s" % self.server_ip) |
| 121 | logging.info("Waiting at most %d seconds for login banner" % self.boottime) | 120 | logger.info("Waiting at most %d seconds for login banner" % self.boottime) |
| 122 | endtime = time.time() + self.boottime | 121 | endtime = time.time() + self.boottime |
| 123 | socklist = [self.server_socket] | 122 | socklist = [self.server_socket] |
| 124 | reachedlogin = False | 123 | reachedlogin = False |
| @@ -131,7 +130,7 @@ class QemuRunner: | |||
| 131 | self.qemusock.setblocking(0) | 130 | self.qemusock.setblocking(0) |
| 132 | socklist.append(self.qemusock) | 131 | socklist.append(self.qemusock) |
| 133 | socklist.remove(self.server_socket) | 132 | socklist.remove(self.server_socket) |
| 134 | logging.info("Connection from %s:%s" % addr) | 133 | logger.info("Connection from %s:%s" % addr) |
| 135 | else: | 134 | else: |
| 136 | data = sock.recv(1024) | 135 | data = sock.recv(1024) |
| 137 | if data: | 136 | if data: |
| @@ -140,24 +139,24 @@ class QemuRunner: | |||
| 140 | if re.search(".* login:", self.bootlog): | 139 | if re.search(".* login:", self.bootlog): |
| 141 | stopread = True | 140 | stopread = True |
| 142 | reachedlogin = True | 141 | reachedlogin = True |
| 143 | logging.info("Reached login banner") | 142 | logger.info("Reached login banner") |
| 144 | else: | 143 | else: |
| 145 | socklist.remove(sock) | 144 | socklist.remove(sock) |
| 146 | sock.close() | 145 | sock.close() |
| 147 | stopread = True | 146 | stopread = True |
| 148 | 147 | ||
| 149 | if not reachedlogin: | 148 | if not reachedlogin: |
| 150 | logging.info("Target didn't reached login boot in %d seconds" % self.boottime) | 149 | logger.info("Target didn't reached login boot in %d seconds" % self.boottime) |
| 151 | lines = "\n".join(self.bootlog.splitlines()[-5:]) | 150 | lines = "\n".join(self.bootlog.splitlines()[-5:]) |
| 152 | logging.info("Last 5 lines of text:\n%s" % lines) | 151 | logger.info("Last 5 lines of text:\n%s" % lines) |
| 153 | logging.info("Check full boot log: %s" % self.logfile) | 152 | logger.info("Check full boot log: %s" % self.logfile) |
| 154 | self.stop() | 153 | self.stop() |
| 155 | return False | 154 | return False |
| 156 | else: | 155 | else: |
| 157 | logging.info("Qemu pid didn't appeared in %s seconds" % self.runqemutime) | 156 | logger.info("Qemu pid didn't appeared in %s seconds" % self.runqemutime) |
| 158 | output = self.runqemu.stdout | 157 | output = self.runqemu.stdout |
| 159 | self.stop() | 158 | self.stop() |
| 160 | logging.info("Output from runqemu:\n%s" % output.read()) | 159 | logger.info("Output from runqemu:\n%s" % output.read()) |
| 161 | return False | 160 | return False |
| 162 | 161 | ||
| 163 | return self.is_alive() | 162 | return self.is_alive() |
| @@ -165,13 +164,13 @@ class QemuRunner: | |||
| 165 | def stop(self): | 164 | def stop(self): |
| 166 | 165 | ||
| 167 | if self.runqemu: | 166 | if self.runqemu: |
| 168 | logging.info("Sending SIGTERM to runqemu") | 167 | logger.info("Sending SIGTERM to runqemu") |
| 169 | os.killpg(self.runqemu.pid, signal.SIGTERM) | 168 | os.killpg(self.runqemu.pid, signal.SIGTERM) |
| 170 | endtime = time.time() + self.runqemutime | 169 | endtime = time.time() + self.runqemutime |
| 171 | while self.runqemu.poll() is None and time.time() < endtime: | 170 | while self.runqemu.poll() is None and time.time() < endtime: |
| 172 | time.sleep(1) | 171 | time.sleep(1) |
| 173 | if self.runqemu.poll() is None: | 172 | if self.runqemu.poll() is None: |
| 174 | logging.info("Sending SIGKILL to runqemu") | 173 | logger.info("Sending SIGKILL to runqemu") |
| 175 | os.killpg(self.runqemu.pid, signal.SIGKILL) | 174 | os.killpg(self.runqemu.pid, signal.SIGKILL) |
| 176 | self.runqemu = None | 175 | self.runqemu = None |
| 177 | if self.server_socket: | 176 | if self.server_socket: |
| @@ -181,7 +180,7 @@ class QemuRunner: | |||
| 181 | self.ip = None | 180 | self.ip = None |
| 182 | 181 | ||
| 183 | def restart(self, qemuparams = None): | 182 | def restart(self, qemuparams = None): |
| 184 | logging.info("Restarting qemu process") | 183 | logger.info("Restarting qemu process") |
| 185 | if self.runqemu.poll() is None: | 184 | if self.runqemu.poll() is None: |
| 186 | self.stop() | 185 | self.stop() |
| 187 | if self.start(qemuparams): | 186 | if self.start(qemuparams): |
