diff options
author | Patrick Vacek <patrickvacek@gmail.com> | 2018-02-28 10:27:01 +0100 |
---|---|---|
committer | Patrick Vacek <patrickvacek@gmail.com> | 2018-02-28 11:03:51 +0100 |
commit | c0d6f4c7949ddfc01977096b985c46c28aa8ed4f (patch) | |
tree | 0465cd998c107e4d830333d86ca97950fb41a814 /lib | |
parent | 91ad494544866512f7cfff0c67cdc02536f4242f (diff) | |
download | meta-updater-c0d6f4c7949ddfc01977096b985c46c28aa8ed4f.tar.gz |
oe-selftest improvements.
* Check successful provisioning with autoprov and grub.
* Refactor provisioning check into an independent function.
* Rename QemuTests to AutoProvTests since that's what it is now.
* Be more explicit about MACHINE.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/oeqa/selftest/cases/updater.py | 111 |
1 files changed, 51 insertions, 60 deletions
diff --git a/lib/oeqa/selftest/cases/updater.py b/lib/oeqa/selftest/cases/updater.py index b544762..fe18981 100644 --- a/lib/oeqa/selftest/cases/updater.py +++ b/lib/oeqa/selftest/cases/updater.py | |||
@@ -134,22 +134,20 @@ class AktualizrToolsTests(OESelftestTestCase): | |||
134 | self.assertTrue(os.path.getsize(ca_path) > 0, "Client certificate at %s is empty." % ca_path) | 134 | self.assertTrue(os.path.getsize(ca_path) > 0, "Client certificate at %s is empty." % ca_path) |
135 | 135 | ||
136 | 136 | ||
137 | class QemuTests(OESelftestTestCase): | 137 | class AutoProvTests(OESelftestTestCase): |
138 | 138 | ||
139 | @classmethod | 139 | def setUpLocal(self): |
140 | def setUpClass(cls): | 140 | self.append_config('MACHINE = "qemux86-64"') |
141 | super(QemuTests, cls).setUpClass() | 141 | self.append_config('SOTA_CLIENT_PROV = " aktualizr-auto-prov "') |
142 | cls.qemu, cls.s = qemu_launch(machine='qemux86-64') | 142 | self.qemu, self.s = qemu_launch(machine='qemux86-64') |
143 | 143 | ||
144 | @classmethod | 144 | def tearDownLocal(self): |
145 | def tearDownClass(cls): | 145 | qemu_terminate(self.s) |
146 | qemu_terminate(cls.s) | ||
147 | super(QemuTests, cls).tearDownClass() | ||
148 | 146 | ||
149 | def qemu_command(self, command): | 147 | def qemu_command(self, command): |
150 | return qemu_send_command(self.qemu.ssh_port, command) | 148 | return qemu_send_command(self.qemu.ssh_port, command) |
151 | 149 | ||
152 | def test_qemu(self): | 150 | def test_provisioning(self): |
153 | print('Checking machine name (hostname) of device:') | 151 | print('Checking machine name (hostname) of device:') |
154 | stdout, stderr, retcode = self.qemu_command('hostname') | 152 | stdout, stderr, retcode = self.qemu_command('hostname') |
155 | self.assertEqual(retcode, 0, "Unable to check hostname. " + | 153 | self.assertEqual(retcode, 0, "Unable to check hostname. " + |
@@ -157,10 +155,10 @@ class QemuTests(OESelftestTestCase): | |||
157 | machine = get_bb_var('MACHINE', 'core-image-minimal') | 155 | machine = get_bb_var('MACHINE', 'core-image-minimal') |
158 | self.assertEqual(stderr, b'', 'Error: ' + stderr.decode()) | 156 | self.assertEqual(stderr, b'', 'Error: ' + stderr.decode()) |
159 | # Strip off line ending. | 157 | # Strip off line ending. |
160 | value_str = stdout.decode()[:-1] | 158 | value = stdout.decode()[:-1] |
161 | self.assertEqual(value_str, machine, | 159 | self.assertEqual(value, machine, |
162 | 'MACHINE does not match hostname: ' + machine + ', ' + value_str) | 160 | 'MACHINE does not match hostname: ' + machine + ', ' + value) |
163 | print(value_str) | 161 | print(value) |
164 | print('Checking output of aktualizr-info:') | 162 | print('Checking output of aktualizr-info:') |
165 | ran_ok = False | 163 | ran_ok = False |
166 | for delay in [0, 1, 2, 5, 10, 15]: | 164 | for delay in [0, 1, 2, 5, 10, 15]: |
@@ -171,15 +169,18 @@ class QemuTests(OESelftestTestCase): | |||
171 | break | 169 | break |
172 | self.assertTrue(ran_ok, 'aktualizr-info failed: ' + stderr.decode() + stdout.decode()) | 170 | self.assertTrue(ran_ok, 'aktualizr-info failed: ' + stderr.decode() + stdout.decode()) |
173 | 171 | ||
172 | verifyProvisioned(self, machine) | ||
173 | |||
174 | 174 | ||
175 | class GrubTests(OESelftestTestCase): | 175 | class GrubTests(OESelftestTestCase): |
176 | 176 | ||
177 | def setUpLocal(self): | 177 | def setUpLocal(self): |
178 | self.append_config('MACHINE = "intel-corei7-64"') | ||
179 | self.append_config('OSTREE_BOOTLOADER = "grub"') | ||
180 | self.append_config('SOTA_CLIENT_PROV = " aktualizr-auto-prov "') | ||
178 | # This is a bit of a hack but I can't see a better option. | 181 | # This is a bit of a hack but I can't see a better option. |
179 | path = os.path.abspath(os.path.dirname(__file__)) | 182 | path = os.path.abspath(os.path.dirname(__file__)) |
180 | metadir = path + "/../../../../../" | 183 | metadir = path + "/../../../../../" |
181 | grub_config = 'OSTREE_BOOTLOADER = "grub"\nMACHINE = "intel-corei7-64"' | ||
182 | self.append_config(grub_config) | ||
183 | self.meta_intel = metadir + "meta-intel" | 184 | self.meta_intel = metadir + "meta-intel" |
184 | self.meta_minnow = metadir + "meta-updater-minnowboard" | 185 | self.meta_minnow = metadir + "meta-updater-minnowboard" |
185 | runCmd('bitbake-layers add-layer "%s"' % self.meta_intel) | 186 | runCmd('bitbake-layers add-layer "%s"' % self.meta_intel) |
@@ -218,10 +219,13 @@ class GrubTests(OESelftestTestCase): | |||
218 | break | 219 | break |
219 | self.assertTrue(ran_ok, 'aktualizr-info failed: ' + stderr.decode() + stdout.decode()) | 220 | self.assertTrue(ran_ok, 'aktualizr-info failed: ' + stderr.decode() + stdout.decode()) |
220 | 221 | ||
222 | verifyProvisioned(self, machine) | ||
223 | |||
221 | 224 | ||
222 | class ImplProvTests(OESelftestTestCase): | 225 | class ImplProvTests(OESelftestTestCase): |
223 | 226 | ||
224 | def setUpLocal(self): | 227 | def setUpLocal(self): |
228 | self.append_config('MACHINE = "qemux86-64"') | ||
225 | self.append_config('SOTA_CLIENT_PROV = " aktualizr-implicit-prov "') | 229 | self.append_config('SOTA_CLIENT_PROV = " aktualizr-implicit-prov "') |
226 | # note: this will build aktualizr-native as a side-effect | 230 | # note: this will build aktualizr-native as a side-effect |
227 | self.qemu, self.s = qemu_launch(machine='qemux86-64') | 231 | self.qemu, self.s = qemu_launch(machine='qemux86-64') |
@@ -240,10 +244,10 @@ class ImplProvTests(OESelftestTestCase): | |||
240 | machine = get_bb_var('MACHINE', 'core-image-minimal') | 244 | machine = get_bb_var('MACHINE', 'core-image-minimal') |
241 | self.assertEqual(stderr, b'', 'Error: ' + stderr.decode()) | 245 | self.assertEqual(stderr, b'', 'Error: ' + stderr.decode()) |
242 | # Strip off line ending. | 246 | # Strip off line ending. |
243 | value_str = stdout.decode()[:-1] | 247 | value = stdout.decode()[:-1] |
244 | self.assertEqual(value_str, machine, | 248 | self.assertEqual(value, machine, |
245 | 'MACHINE does not match hostname: ' + machine + ', ' + value_str) | 249 | 'MACHINE does not match hostname: ' + machine + ', ' + value) |
246 | print(value_str) | 250 | print(value) |
247 | print('Checking output of aktualizr-info:') | 251 | print('Checking output of aktualizr-info:') |
248 | ran_ok = False | 252 | ran_ok = False |
249 | for delay in [0, 1, 2, 5, 10, 15]: | 253 | for delay in [0, 1, 2, 5, 10, 15]: |
@@ -271,29 +275,13 @@ class ImplProvTests(OESelftestTestCase): | |||
271 | akt_native_run(self, 'aktualizr_cert_provider -c {creds} -t root@localhost -p {port} -s -g {config}' | 275 | akt_native_run(self, 'aktualizr_cert_provider -c {creds} -t root@localhost -p {port} -s -g {config}' |
272 | .format(creds=creds, port=self.qemu.ssh_port, config=config)) | 276 | .format(creds=creds, port=self.qemu.ssh_port, config=config)) |
273 | 277 | ||
274 | # Verify that device HAS provisioned. | 278 | verifyProvisioned(self, machine) |
275 | ran_ok = False | ||
276 | for delay in [5, 5, 5, 5, 10]: | ||
277 | sleep(delay) | ||
278 | stdout, stderr, retcode = self.qemu_command('aktualizr-info') | ||
279 | if retcode == 0 and stderr == b'' and stdout.decode().find('Fetched metadata: yes') >= 0: | ||
280 | ran_ok = True | ||
281 | break | ||
282 | self.assertIn(b'Device ID: ', stdout, 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
283 | self.assertIn(b'Primary ecu hardware ID: qemux86-64', stdout, | ||
284 | 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
285 | self.assertIn(b'Fetched metadata: yes', stdout, 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
286 | p = re.compile(r'Device ID: ([a-z0-9-]*)\n') | ||
287 | m = p.search(stdout.decode()) | ||
288 | self.assertTrue(m, 'Device ID could not be read: ' + stderr.decode() + stdout.decode()) | ||
289 | self.assertGreater(m.lastindex, 0, 'Device ID could not be read: ' + stderr.decode() + stdout.decode()) | ||
290 | logger = logging.getLogger("selftest") | ||
291 | logger.info('Device successfully provisioned with ID: ' + m.group(1)) | ||
292 | 279 | ||
293 | 280 | ||
294 | class HsmTests(OESelftestTestCase): | 281 | class HsmTests(OESelftestTestCase): |
295 | 282 | ||
296 | def setUpLocal(self): | 283 | def setUpLocal(self): |
284 | self.append_config('MACHINE = "qemux86-64"') | ||
297 | self.append_config('SOTA_CLIENT_PROV = "aktualizr-hsm-prov"') | 285 | self.append_config('SOTA_CLIENT_PROV = "aktualizr-hsm-prov"') |
298 | self.append_config('SOTA_CLIENT_FEATURES = "hsm"') | 286 | self.append_config('SOTA_CLIENT_FEATURES = "hsm"') |
299 | # note: this will build aktualizr-native as a side-effect | 287 | # note: this will build aktualizr-native as a side-effect |
@@ -313,11 +301,11 @@ class HsmTests(OESelftestTestCase): | |||
313 | machine = get_bb_var('MACHINE', 'core-image-minimal') | 301 | machine = get_bb_var('MACHINE', 'core-image-minimal') |
314 | self.assertEqual(stderr, b'', 'Error: ' + stderr.decode()) | 302 | self.assertEqual(stderr, b'', 'Error: ' + stderr.decode()) |
315 | # Strip off line ending. | 303 | # Strip off line ending. |
316 | value_str = stdout.decode()[:-1] | 304 | value = stdout.decode()[:-1] |
317 | self.assertEqual(value_str, machine, | 305 | self.assertEqual(value, machine, |
318 | 'MACHINE does not match hostname: ' + machine + ', ' + value_str + | 306 | 'MACHINE does not match hostname: ' + machine + ', ' + value + |
319 | '\nIs tianocore ovmf installed?') | 307 | '\nIs tianocore ovmf installed?') |
320 | print(value_str) | 308 | print(value) |
321 | print('Checking output of aktualizr-info:') | 309 | print('Checking output of aktualizr-info:') |
322 | ran_ok = False | 310 | ran_ok = False |
323 | for delay in [0, 1, 2, 5, 10, 15]: | 311 | for delay in [0, 1, 2, 5, 10, 15]: |
@@ -387,24 +375,7 @@ class HsmTests(OESelftestTestCase): | |||
387 | self.assertEqual(p11_m.group(1), hsm_m.group(1), 'Slot number does not match: ' + | 375 | self.assertEqual(p11_m.group(1), hsm_m.group(1), 'Slot number does not match: ' + |
388 | p11_err.decode() + p11_out.decode() + hsm_err.decode() + hsm_out.decode()) | 376 | p11_err.decode() + p11_out.decode() + hsm_err.decode() + hsm_out.decode()) |
389 | 377 | ||
390 | # Verify that device HAS provisioned. | 378 | verifyProvisioned(self, machine) |
391 | ran_ok = False | ||
392 | for delay in [5, 5, 5, 5, 10]: | ||
393 | sleep(delay) | ||
394 | stdout, stderr, retcode = self.qemu_command('aktualizr-info') | ||
395 | if retcode == 0 and stderr == b'' and stdout.decode().find('Fetched metadata: yes') >= 0: | ||
396 | ran_ok = True | ||
397 | break | ||
398 | self.assertIn(b'Device ID: ', stdout, 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
399 | self.assertIn(b'Primary ecu hardware ID: qemux86-64', stdout, | ||
400 | 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
401 | self.assertIn(b'Fetched metadata: yes', stdout, 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
402 | p = re.compile(r'Device ID: ([a-z0-9-]*)\n') | ||
403 | m = p.search(stdout.decode()) | ||
404 | self.assertTrue(m, 'Device ID could not be read: ' + stderr.decode() + stdout.decode()) | ||
405 | self.assertGreater(m.lastindex, 0, 'Device ID could not be read: ' + stderr.decode() + stdout.decode()) | ||
406 | logger = logging.getLogger("selftest") | ||
407 | logger.info('Device successfully provisioned with ID: ' + m.group(1)) | ||
408 | 379 | ||
409 | 380 | ||
410 | def qemu_launch(efi=False, machine=None): | 381 | def qemu_launch(efi=False, machine=None): |
@@ -471,5 +442,25 @@ def akt_native_run(testInst, cmd, **kwargs): | |||
471 | testInst.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output) | 442 | testInst.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output) |
472 | 443 | ||
473 | 444 | ||
445 | def verifyProvisioned(testInst, machine): | ||
446 | # Verify that device HAS provisioned. | ||
447 | ran_ok = False | ||
448 | for delay in [5, 5, 5, 5, 10]: | ||
449 | sleep(delay) | ||
450 | stdout, stderr, retcode = testInst.qemu_command('aktualizr-info') | ||
451 | if retcode == 0 and stderr == b'' and stdout.decode().find('Fetched metadata: yes') >= 0: | ||
452 | ran_ok = True | ||
453 | break | ||
454 | testInst.assertIn(b'Device ID: ', stdout, 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
455 | testInst.assertIn(b'Primary ecu hardware ID: ' + machine.encode(), stdout, | ||
456 | 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
457 | testInst.assertIn(b'Fetched metadata: yes', stdout, 'Provisioning failed: ' + stderr.decode() + stdout.decode()) | ||
458 | p = re.compile(r'Device ID: ([a-z0-9-]*)\n') | ||
459 | m = p.search(stdout.decode()) | ||
460 | testInst.assertTrue(m, 'Device ID could not be read: ' + stderr.decode() + stdout.decode()) | ||
461 | testInst.assertGreater(m.lastindex, 0, 'Device ID could not be read: ' + stderr.decode() + stdout.decode()) | ||
462 | logger = logging.getLogger("selftest") | ||
463 | logger.info('Device successfully provisioned with ID: ' + m.group(1)) | ||
464 | |||
474 | 465 | ||
475 | # vim:set ts=4 sw=4 sts=4 expandtab: | 466 | # vim:set ts=4 sw=4 sts=4 expandtab: |