summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/utils/qemurunner.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oeqa/utils/qemurunner.py')
-rw-r--r--meta/lib/oeqa/utils/qemurunner.py74
1 files changed, 37 insertions, 37 deletions
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py
index aa2600b827..32148871ff 100644
--- a/meta/lib/oeqa/utils/qemurunner.py
+++ b/meta/lib/oeqa/utils/qemurunner.py
@@ -68,7 +68,7 @@ class QemuRunner:
68 sock.bind(("127.0.0.1",0)) 68 sock.bind(("127.0.0.1",0))
69 sock.listen(2) 69 sock.listen(2)
70 port = sock.getsockname()[1] 70 port = sock.getsockname()[1]
71 self.logger.info("Created listening socket for qemu serial console on: 127.0.0.1:%s" % port) 71 self.logger.debug("Created listening socket for qemu serial console on: 127.0.0.1:%s" % port)
72 return (sock, port) 72 return (sock, port)
73 73
74 except socket.error: 74 except socket.error:
@@ -95,8 +95,8 @@ class QemuRunner:
95 def handleSIGCHLD(self, signum, frame): 95 def handleSIGCHLD(self, signum, frame):
96 if self.runqemu and self.runqemu.poll(): 96 if self.runqemu and self.runqemu.poll():
97 if self.runqemu.returncode: 97 if self.runqemu.returncode:
98 self.logger.info('runqemu exited with code %d' % self.runqemu.returncode) 98 self.logger.debug('runqemu exited with code %d' % self.runqemu.returncode)
99 self.logger.info("Output from runqemu:\n%s" % self.getOutput(self.runqemu.stdout)) 99 self.logger.debug("Output from runqemu:\n%s" % self.getOutput(self.runqemu.stdout))
100 self.stop() 100 self.stop()
101 self._dump_host() 101 self._dump_host()
102 raise SystemExit 102 raise SystemExit
@@ -125,10 +125,10 @@ class QemuRunner:
125 if not launch_cmd: 125 if not launch_cmd:
126 launch_cmd = 'runqemu %s %s ' % ('snapshot' if discard_writes else '', runqemuparams) 126 launch_cmd = 'runqemu %s %s ' % ('snapshot' if discard_writes else '', runqemuparams)
127 if self.use_kvm: 127 if self.use_kvm:
128 self.logger.info('Using kvm for runqemu') 128 self.logger.debug('Using kvm for runqemu')
129 launch_cmd += ' kvm' 129 launch_cmd += ' kvm'
130 else: 130 else:
131 self.logger.info('Not using kvm for runqemu') 131 self.logger.debug('Not using kvm for runqemu')
132 if not self.display: 132 if not self.display:
133 launch_cmd += ' nographic' 133 launch_cmd += ' nographic'
134 launch_cmd += ' %s %s' % (self.machine, self.rootfs) 134 launch_cmd += ' %s %s' % (self.machine, self.rootfs)
@@ -160,7 +160,7 @@ class QemuRunner:
160 self.origchldhandler = signal.getsignal(signal.SIGCHLD) 160 self.origchldhandler = signal.getsignal(signal.SIGCHLD)
161 signal.signal(signal.SIGCHLD, self.handleSIGCHLD) 161 signal.signal(signal.SIGCHLD, self.handleSIGCHLD)
162 162
163 self.logger.info('launchcmd=%s'%(launch_cmd)) 163 self.logger.debug('launchcmd=%s'%(launch_cmd))
164 164
165 # FIXME: We pass in stdin=subprocess.PIPE here to work around stty 165 # FIXME: We pass in stdin=subprocess.PIPE here to work around stty
166 # blocking at the end of the runqemu script when using this within 166 # blocking at the end of the runqemu script when using this within
@@ -195,17 +195,17 @@ class QemuRunner:
195 os.killpg(os.getpgid(self.runqemu.pid), signal.SIGTERM) 195 os.killpg(os.getpgid(self.runqemu.pid), signal.SIGTERM)
196 sys.exit(0) 196 sys.exit(0)
197 197
198 self.logger.info("runqemu started, pid is %s" % self.runqemu.pid) 198 self.logger.debug("runqemu started, pid is %s" % self.runqemu.pid)
199 self.logger.info("waiting at most %s seconds for qemu pid" % self.runqemutime) 199 self.logger.debug("waiting at most %s seconds for qemu pid" % self.runqemutime)
200 endtime = time.time() + self.runqemutime 200 endtime = time.time() + self.runqemutime
201 while not self.is_alive() and time.time() < endtime: 201 while not self.is_alive() and time.time() < endtime:
202 if self.runqemu.poll(): 202 if self.runqemu.poll():
203 if self.runqemu.returncode: 203 if self.runqemu.returncode:
204 # No point waiting any longer 204 # No point waiting any longer
205 self.logger.info('runqemu exited with code %d' % self.runqemu.returncode) 205 self.logger.debug('runqemu exited with code %d' % self.runqemu.returncode)
206 self._dump_host() 206 self._dump_host()
207 self.stop() 207 self.stop()
208 self.logger.info("Output from runqemu:\n%s" % self.getOutput(output)) 208 self.logger.debug("Output from runqemu:\n%s" % self.getOutput(output))
209 return False 209 return False
210 time.sleep(0.5) 210 time.sleep(0.5)
211 211
@@ -214,7 +214,7 @@ class QemuRunner:
214 # Dump all processes to help us to figure out what is going on... 214 # Dump all processes to help us to figure out what is going on...
215 ps = subprocess.Popen(['ps', 'axww', '-o', 'pid,ppid,command '], stdout=subprocess.PIPE).communicate()[0] 215 ps = subprocess.Popen(['ps', 'axww', '-o', 'pid,ppid,command '], stdout=subprocess.PIPE).communicate()[0]
216 processes = ps.decode("utf-8") 216 processes = ps.decode("utf-8")
217 self.logger.info("Running processes:\n%s" % processes) 217 self.logger.debug("Running processes:\n%s" % processes)
218 self._dump_host() 218 self._dump_host()
219 self.stop() 219 self.stop()
220 op = self.getOutput(output) 220 op = self.getOutput(output)
@@ -227,7 +227,7 @@ class QemuRunner:
227 # We are alive: qemu is running 227 # We are alive: qemu is running
228 out = self.getOutput(output) 228 out = self.getOutput(output)
229 netconf = False # network configuration is not required by default 229 netconf = False # network configuration is not required by default
230 self.logger.info("qemu started in %s seconds - qemu procces pid is %s" % (time.time() - (endtime - self.runqemutime), self.qemupid)) 230 self.logger.debug("qemu started in %s seconds - qemu procces pid is %s" % (time.time() - (endtime - self.runqemutime), self.qemupid))
231 if get_ip: 231 if get_ip:
232 cmdline = '' 232 cmdline = ''
233 with open('/proc/%s/cmdline' % self.qemupid) as p: 233 with open('/proc/%s/cmdline' % self.qemupid) as p:
@@ -239,7 +239,7 @@ class QemuRunner:
239 ips = re.findall("((?:[0-9]{1,3}\.){3}[0-9]{1,3})", cmdline.split("ip=")[1]) 239 ips = re.findall("((?:[0-9]{1,3}\.){3}[0-9]{1,3})", cmdline.split("ip=")[1])
240 self.ip = ips[0] 240 self.ip = ips[0]
241 self.server_ip = ips[1] 241 self.server_ip = ips[1]
242 self.logger.info("qemu cmdline used:\n{}".format(cmdline)) 242 self.logger.debug("qemu cmdline used:\n{}".format(cmdline))
243 except (IndexError, ValueError): 243 except (IndexError, ValueError):
244 # Try to get network configuration from runqemu output 244 # Try to get network configuration from runqemu output
245 match = re.match('.*Network configuration: ([0-9.]+)::([0-9.]+):([0-9.]+)$.*', 245 match = re.match('.*Network configuration: ([0-9.]+)::([0-9.]+):([0-9.]+)$.*',
@@ -258,8 +258,8 @@ class QemuRunner:
258 self.stop() 258 self.stop()
259 return False 259 return False
260 260
261 self.logger.info("Target IP: %s" % self.ip) 261 self.logger.debug("Target IP: %s" % self.ip)
262 self.logger.info("Server IP: %s" % self.server_ip) 262 self.logger.debug("Server IP: %s" % self.server_ip)
263 263
264 self.thread = LoggingThread(self.log, threadsock, self.logger) 264 self.thread = LoggingThread(self.log, threadsock, self.logger)
265 self.thread.start() 265 self.thread.start()
@@ -270,8 +270,8 @@ class QemuRunner:
270 self.stop_thread() 270 self.stop_thread()
271 return False 271 return False
272 272
273 self.logger.info("Output from runqemu:\n%s", out) 273 self.logger.debug("Output from runqemu:\n%s", out)
274 self.logger.info("Waiting at most %d seconds for login banner" % self.boottime) 274 self.logger.debug("Waiting at most %d seconds for login banner" % self.boottime)
275 endtime = time.time() + self.boottime 275 endtime = time.time() + self.boottime
276 socklist = [self.server_socket] 276 socklist = [self.server_socket]
277 reachedlogin = False 277 reachedlogin = False
@@ -290,7 +290,7 @@ class QemuRunner:
290 qemusock.setblocking(0) 290 qemusock.setblocking(0)
291 socklist.append(qemusock) 291 socklist.append(qemusock)
292 socklist.remove(self.server_socket) 292 socklist.remove(self.server_socket)
293 self.logger.info("Connection from %s:%s" % addr) 293 self.logger.debug("Connection from %s:%s" % addr)
294 else: 294 else:
295 data = data + sock.recv(1024) 295 data = data + sock.recv(1024)
296 if data: 296 if data:
@@ -302,7 +302,7 @@ class QemuRunner:
302 self.server_socket = qemusock 302 self.server_socket = qemusock
303 stopread = True 303 stopread = True
304 reachedlogin = True 304 reachedlogin = True
305 self.logger.info("Reached login banner") 305 self.logger.debug("Reached login banner")
306 except UnicodeDecodeError: 306 except UnicodeDecodeError:
307 continue 307 continue
308 else: 308 else:
@@ -312,12 +312,12 @@ class QemuRunner:
312 312
313 313
314 if not reachedlogin: 314 if not reachedlogin:
315 self.logger.info("Target didn't reached login boot in %d seconds" % self.boottime) 315 self.logger.debug("Target didn't reached login boot in %d seconds" % self.boottime)
316 tail = lambda l: "\n".join(l.splitlines()[-25:]) 316 tail = lambda l: "\n".join(l.splitlines()[-25:])
317 # in case bootlog is empty, use tail qemu log store at self.msg 317 # in case bootlog is empty, use tail qemu log store at self.msg
318 lines = tail(bootlog if bootlog else self.msg) 318 lines = tail(bootlog if bootlog else self.msg)
319 self.logger.info("Last 25 lines of text:\n%s" % lines) 319 self.logger.debug("Last 25 lines of text:\n%s" % lines)
320 self.logger.info("Check full boot log: %s" % self.logfile) 320 self.logger.debug("Check full boot log: %s" % self.logfile)
321 self._dump_host() 321 self._dump_host()
322 self.stop() 322 self.stop()
323 return False 323 return False
@@ -327,20 +327,20 @@ class QemuRunner:
327 (status, output) = self.run_serial("root\n", raw=True) 327 (status, output) = self.run_serial("root\n", raw=True)
328 if re.search("root@[a-zA-Z0-9\-]+:~#", output): 328 if re.search("root@[a-zA-Z0-9\-]+:~#", output):
329 self.logged = True 329 self.logged = True
330 self.logger.info("Logged as root in serial console") 330 self.logger.debug("Logged as root in serial console")
331 if netconf: 331 if netconf:
332 # configure guest networking 332 # configure guest networking
333 cmd = "ifconfig eth0 %s netmask %s up\n" % (self.ip, self.netmask) 333 cmd = "ifconfig eth0 %s netmask %s up\n" % (self.ip, self.netmask)
334 output = self.run_serial(cmd, raw=True)[1] 334 output = self.run_serial(cmd, raw=True)[1]
335 if re.search("root@[a-zA-Z0-9\-]+:~#", output): 335 if re.search("root@[a-zA-Z0-9\-]+:~#", output):
336 self.logger.info("configured ip address %s", self.ip) 336 self.logger.debug("configured ip address %s", self.ip)
337 else: 337 else:
338 self.logger.info("Couldn't configure guest networking") 338 self.logger.debug("Couldn't configure guest networking")
339 else: 339 else:
340 self.logger.info("Couldn't login into serial console" 340 self.logger.debug("Couldn't login into serial console"
341 " as root using blank password") 341 " as root using blank password")
342 except: 342 except:
343 self.logger.info("Serial console failed while trying to login") 343 self.logger.debug("Serial console failed while trying to login")
344 return True 344 return True
345 345
346 def stop(self): 346 def stop(self):
@@ -351,7 +351,7 @@ class QemuRunner:
351 if self.runqemu: 351 if self.runqemu:
352 if hasattr(self, "monitorpid"): 352 if hasattr(self, "monitorpid"):
353 os.kill(self.monitorpid, signal.SIGKILL) 353 os.kill(self.monitorpid, signal.SIGKILL)
354 self.logger.info("Sending SIGTERM to runqemu") 354 self.logger.debug("Sending SIGTERM to runqemu")
355 try: 355 try:
356 os.killpg(os.getpgid(self.runqemu.pid), signal.SIGTERM) 356 os.killpg(os.getpgid(self.runqemu.pid), signal.SIGTERM)
357 except OSError as e: 357 except OSError as e:
@@ -361,7 +361,7 @@ class QemuRunner:
361 while self.runqemu.poll() is None and time.time() < endtime: 361 while self.runqemu.poll() is None and time.time() < endtime:
362 time.sleep(1) 362 time.sleep(1)
363 if self.runqemu.poll() is None: 363 if self.runqemu.poll() is None:
364 self.logger.info("Sending SIGKILL to runqemu") 364 self.logger.debug("Sending SIGKILL to runqemu")
365 os.killpg(os.getpgid(self.runqemu.pid), signal.SIGKILL) 365 os.killpg(os.getpgid(self.runqemu.pid), signal.SIGKILL)
366 self.runqemu = None 366 self.runqemu = None
367 if hasattr(self, 'server_socket') and self.server_socket: 367 if hasattr(self, 'server_socket') and self.server_socket:
@@ -387,7 +387,7 @@ class QemuRunner:
387 self.thread.join() 387 self.thread.join()
388 388
389 def restart(self, qemuparams = None): 389 def restart(self, qemuparams = None):
390 self.logger.info("Restarting qemu process") 390 self.logger.debug("Restarting qemu process")
391 if self.runqemu.poll() is None: 391 if self.runqemu.poll() is None:
392 self.stop() 392 self.stop()
393 if self.start(qemuparams): 393 if self.start(qemuparams):
@@ -485,17 +485,17 @@ class LoggingThread(threading.Thread):
485 self.teardown() 485 self.teardown()
486 486
487 def run(self): 487 def run(self):
488 self.logger.info("Starting logging thread") 488 self.logger.debug("Starting logging thread")
489 self.readpipe, self.writepipe = os.pipe() 489 self.readpipe, self.writepipe = os.pipe()
490 threading.Thread.run(self) 490 threading.Thread.run(self)
491 491
492 def stop(self): 492 def stop(self):
493 self.logger.info("Stopping logging thread") 493 self.logger.debug("Stopping logging thread")
494 if self.running: 494 if self.running:
495 os.write(self.writepipe, bytes("stop", "utf-8")) 495 os.write(self.writepipe, bytes("stop", "utf-8"))
496 496
497 def teardown(self): 497 def teardown(self):
498 self.logger.info("Tearing down logging thread") 498 self.logger.debug("Tearing down logging thread")
499 self.close_socket(self.serversock) 499 self.close_socket(self.serversock)
500 500
501 if self.readsock is not None: 501 if self.readsock is not None:
@@ -513,7 +513,7 @@ class LoggingThread(threading.Thread):
513 513
514 breakout = False 514 breakout = False
515 self.running = True 515 self.running = True
516 self.logger.info("Starting thread event loop") 516 self.logger.debug("Starting thread event loop")
517 while not breakout: 517 while not breakout:
518 events = poll.poll() 518 events = poll.poll()
519 for event in events: 519 for event in events:
@@ -523,19 +523,19 @@ class LoggingThread(threading.Thread):
523 523
524 # Event to stop the thread 524 # Event to stop the thread
525 if self.readpipe == event[0]: 525 if self.readpipe == event[0]:
526 self.logger.info("Stop event received") 526 self.logger.debug("Stop event received")
527 breakout = True 527 breakout = True
528 break 528 break
529 529
530 # A connection request was received 530 # A connection request was received
531 elif self.serversock.fileno() == event[0]: 531 elif self.serversock.fileno() == event[0]:
532 self.logger.info("Connection request received") 532 self.logger.debug("Connection request received")
533 self.readsock, _ = self.serversock.accept() 533 self.readsock, _ = self.serversock.accept()
534 self.readsock.setblocking(0) 534 self.readsock.setblocking(0)
535 poll.unregister(self.serversock.fileno()) 535 poll.unregister(self.serversock.fileno())
536 poll.register(self.readsock.fileno(), event_read_mask) 536 poll.register(self.readsock.fileno(), event_read_mask)
537 537
538 self.logger.info("Setting connection established event") 538 self.logger.debug("Setting connection established event")
539 self.connection_established.set() 539 self.connection_established.set()
540 540
541 # Actual data to be logged 541 # Actual data to be logged