diff options
Diffstat (limited to 'meta/lib')
-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): |