summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlbonn <lbonn@users.noreply.github.com>2019-07-19 17:21:35 +0200
committerGitHub <noreply@github.com>2019-07-19 17:21:35 +0200
commit24e941d1296e960ed75206aab01d73d29d91506f (patch)
tree0c7bbfeb588a5c93efd0a9e458273deb078cc365
parent1c049cbaec927971b0425e608b68551a4d2b898b (diff)
parentba1c931dde251637f2718e33532f7e469954470f (diff)
downloadmeta-updater-24e941d1296e960ed75206aab01d73d29d91506f.tar.gz
Ci on thud (#542)
Ci on thud
-rw-r--r--.gitlab-ci.yml91
-rw-r--r--lib/oeqa/selftest/cases/testutils.py38
-rw-r--r--lib/oeqa/selftest/cases/updater_minnowboard.py14
-rw-r--r--lib/oeqa/selftest/cases/updater_native.py1
-rw-r--r--lib/oeqa/selftest/cases/updater_qemux86_64.py107
-rw-r--r--lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py15
-rw-r--r--lib/oeqa/selftest/cases/updater_raspberrypi.py13
-rwxr-xr-xscripts/envsetup.sh2
-rw-r--r--scripts/qemucommand.py9
-rwxr-xr-xscripts/run-qemu-ota1
10 files changed, 181 insertions, 110 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..6ad00ea
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,91 @@
1stages:
2 - docker
3 - checkout
4 - test
5
6variables:
7 BITBAKE_IMAGE: ${CI_REGISTRY_IMAGE}:ci-master-bitbake
8 BITBAKE_CHECKOUT_IMAGE: ${CI_REGISTRY_IMAGE}:ci-master-checkout
9
10include:
11 - project: 'olp/edge/ota/connect/client/meta-updater'
12 ref: 'master'
13 file: 'scripts/ci/gitlab/docker.yml'
14 - project: 'olp/edge/ota/connect/client/meta-updater'
15 ref: 'master'
16 file: 'scripts/ci/gitlab/checkout.yml'
17 - project: 'olp/edge/ota/connect/client/meta-updater'
18 ref: 'master'
19 file: 'scripts/ci/gitlab/tests.yml'
20
21Docker setup:
22 extends: .bb_docker_remote
23
24 stage: docker
25 except:
26 - pushes
27
28Checkout:
29 extends: .bb_checkout
30
31 stage: checkout
32 variables:
33 MANIFEST: thud
34 CURRENT_PROJECT: meta-updater
35 except:
36 - pushes
37
38Build core-image-minimal:
39 extends: .bitbake
40
41 stage: test
42 variables:
43 TEST_BUILD_DIR: 'build-core-image-minimal'
44 BITBAKE_TARGETS: 'core-image-minimal'
45 except:
46 - pushes
47
48Oe-selftest qemux86_64:
49 extends: .oe-selftest
50
51 stage: test
52 variables:
53 TEST_BUILD_DIR: 'build-oe-qemux86_64'
54 OE_SELFTESTS: 'updater_native updater_qemux86_64'
55 except:
56 - pushes
57
58Oe-selftest minnowboard:
59 extends: .oe-selftest
60
61 stage: test
62 variables:
63 TEST_BUILD_DIR: 'build-oe-minnowboard'
64 OE_SELFTESTS: 'updater_minnowboard'
65 except:
66 - pushes
67
68Oe-selftest rpi:
69 extends: .oe-selftest
70
71 stage: test
72 variables:
73 TEST_BUILD_DIR: 'build-oe-rpi'
74 OE_SELFTESTS: 'updater_raspberrypi'
75 except:
76 - pushes
77
78# Not run by default
79
80Ptest qemux86_64:
81 extends: .oe-selftest
82
83 stage: test
84 variables:
85 TEST_BUILD_DIR: 'build-oe-qemux86_64-ptest'
86 OE_SELFTESTS: 'updater_qemux86_64_ptest'
87 except:
88 - pushes
89 only:
90 variables:
91 - $OE_PTEST
diff --git a/lib/oeqa/selftest/cases/testutils.py b/lib/oeqa/selftest/cases/testutils.py
index f8b1904..8d618a6 100644
--- a/lib/oeqa/selftest/cases/testutils.py
+++ b/lib/oeqa/selftest/cases/testutils.py
@@ -1,4 +1,5 @@
1import os 1import os
2import oe.path
2import logging 3import logging
3import re 4import re
4import subprocess 5import subprocess
@@ -33,6 +34,7 @@ def qemu_boot_image(imagename, **kwargs):
33 args.dir = 'tmp/deploy/images' 34 args.dir = 'tmp/deploy/images'
34 args.efi = kwargs.get('efi', False) 35 args.efi = kwargs.get('efi', False)
35 args.machine = kwargs.get('machine', None) 36 args.machine = kwargs.get('machine', None)
37 args.mem = kwargs.get('mem', '128M')
36 qemu_use_kvm = get_bb_var("QEMU_USE_KVM") 38 qemu_use_kvm = get_bb_var("QEMU_USE_KVM")
37 if qemu_use_kvm and \ 39 if qemu_use_kvm and \
38 (qemu_use_kvm == 'True' and 'x86' in args.machine or 40 (qemu_use_kvm == 'True' and 'x86' in args.machine or
@@ -60,7 +62,7 @@ def qemu_bake_image(imagename):
60 bitbake(imagename) 62 bitbake(imagename)
61 63
62 64
63def qemu_send_command(port, command, timeout=60): 65def qemu_send_command(port, command, timeout=120):
64 command = ['ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@localhost -p ' + 66 command = ['ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@localhost -p ' +
65 str(port) + ' "' + command + '"'] 67 str(port) + ' "' + command + '"']
66 s2 = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 68 s2 = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -68,24 +70,30 @@ def qemu_send_command(port, command, timeout=60):
68 return stdout, stderr, s2.returncode 70 return stdout, stderr, s2.returncode
69 71
70 72
73def metadir():
74 # Assume the directory layout for finding other layers. We could also
75 # make assumptions by using 'show-layers', but either way, if the
76 # layers we need aren't where we expect them, we are out of luck.
77 path = os.path.abspath(os.path.dirname(__file__))
78 metadir = path + "/../../../../../"
79
80 return metadir
81
82
71def akt_native_run(testInst, cmd, **kwargs): 83def akt_native_run(testInst, cmd, **kwargs):
72 # run a command supplied by aktualizr-native and checks that: 84 # run a command supplied by aktualizr-native and checks that:
73 # - the executable exists 85 # - the executable exists
74 # - the command runs without error 86 # - the command runs without error
75 # NOTE: the base test class must have built aktualizr-native (in 87 #
76 # setUpClass, for example) 88 # Requirements in base test class (setUpClass for example):
77 bb_vars = get_bb_vars(['SYSROOT_DESTDIR', 'base_prefix', 'libdir', 'bindir'], 89 # bitbake aktualizr-native
78 'aktualizr-native') 90 # bitbake build-sysroots -c build_native_sysroot
79 sysroot = bb_vars['SYSROOT_DESTDIR'] + bb_vars['base_prefix'] 91 #
80 sysrootbin = bb_vars['SYSROOT_DESTDIR'] + bb_vars['bindir'] 92 # (technique found in poky/meta/lib/oeqa/selftest/cases/package.py)
81 libdir = bb_vars['libdir'] 93 bb_vars = get_bb_vars(['STAGING_DIR', 'BUILD_ARCH'])
82 94 sysroot = oe.path.join(bb_vars['STAGING_DIR'], bb_vars['BUILD_ARCH'])
83 program, *_ = cmd.split(' ') 95
84 p = '{}/{}'.format(sysrootbin, program) 96 result = runCmd(cmd, native_sysroot=sysroot, ignore_status=True, **kwargs)
85 testInst.assertTrue(os.path.isfile(p), msg="No {} found ({})".format(program, p))
86 env = dict(os.environ)
87 env['LD_LIBRARY_PATH'] = libdir
88 result = runCmd(cmd, env=env, native_sysroot=sysroot, ignore_status=True, **kwargs)
89 testInst.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output) 97 testInst.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output)
90 98
91 99
diff --git a/lib/oeqa/selftest/cases/updater_minnowboard.py b/lib/oeqa/selftest/cases/updater_minnowboard.py
index 267445b..f4da360 100644
--- a/lib/oeqa/selftest/cases/updater_minnowboard.py
+++ b/lib/oeqa/selftest/cases/updater_minnowboard.py
@@ -1,9 +1,8 @@
1import os
2import re 1import re
3 2
4from oeqa.selftest.case import OESelftestTestCase 3from oeqa.selftest.case import OESelftestTestCase
5from oeqa.utils.commands import runCmd, get_bb_var 4from oeqa.utils.commands import runCmd, get_bb_var
6from testutils import qemu_launch, qemu_send_command, qemu_terminate, verifyProvisioned 5from testutils import metadir, qemu_launch, qemu_send_command, qemu_terminate, verifyProvisioned
7 6
8 7
9class MinnowTests(OESelftestTestCase): 8class MinnowTests(OESelftestTestCase):
@@ -12,25 +11,20 @@ class MinnowTests(OESelftestTestCase):
12 layer_intel = "meta-intel" 11 layer_intel = "meta-intel"
13 layer_minnow = "meta-updater-minnowboard" 12 layer_minnow = "meta-updater-minnowboard"
14 result = runCmd('bitbake-layers show-layers') 13 result = runCmd('bitbake-layers show-layers')
15 # Assume the directory layout for finding other layers. We could also
16 # make assumptions by using 'show-layers', but either way, if the
17 # layers we need aren't where we expect them, we are out of luck.
18 path = os.path.abspath(os.path.dirname(__file__))
19 metadir = path + "/../../../../../"
20 if re.search(layer_intel, result.output) is None: 14 if re.search(layer_intel, result.output) is None:
21 self.meta_intel = metadir + layer_intel 15 self.meta_intel = metadir() + layer_intel
22 runCmd('bitbake-layers add-layer "%s"' % self.meta_intel) 16 runCmd('bitbake-layers add-layer "%s"' % self.meta_intel)
23 else: 17 else:
24 self.meta_intel = None 18 self.meta_intel = None
25 if re.search(layer_minnow, result.output) is None: 19 if re.search(layer_minnow, result.output) is None:
26 self.meta_minnow = metadir + layer_minnow 20 self.meta_minnow = metadir() + layer_minnow
27 runCmd('bitbake-layers add-layer "%s"' % self.meta_minnow) 21 runCmd('bitbake-layers add-layer "%s"' % self.meta_minnow)
28 else: 22 else:
29 self.meta_minnow = None 23 self.meta_minnow = None
30 self.append_config('MACHINE = "intel-corei7-64"') 24 self.append_config('MACHINE = "intel-corei7-64"')
31 self.append_config('OSTREE_BOOTLOADER = "grub"') 25 self.append_config('OSTREE_BOOTLOADER = "grub"')
32 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') 26 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "')
33 self.qemu, self.s = qemu_launch(efi=True, machine='intel-corei7-64') 27 self.qemu, self.s = qemu_launch(efi=True, machine='intel-corei7-64', mem='512M')
34 28
35 def tearDownLocal(self): 29 def tearDownLocal(self):
36 qemu_terminate(self.s) 30 qemu_terminate(self.s)
diff --git a/lib/oeqa/selftest/cases/updater_native.py b/lib/oeqa/selftest/cases/updater_native.py
index 1fc9cb8..d2bf341 100644
--- a/lib/oeqa/selftest/cases/updater_native.py
+++ b/lib/oeqa/selftest/cases/updater_native.py
@@ -14,6 +14,7 @@ class SotaToolsTests(OESelftestTestCase):
14 logger = logging.getLogger("selftest") 14 logger = logging.getLogger("selftest")
15 logger.info('Running bitbake to build aktualizr-native tools') 15 logger.info('Running bitbake to build aktualizr-native tools')
16 bitbake('aktualizr-native') 16 bitbake('aktualizr-native')
17 bitbake('build-sysroots -c build_native_sysroot')
17 18
18 def test_push_help(self): 19 def test_push_help(self):
19 akt_native_run(self, 'garage-push --help') 20 akt_native_run(self, 'garage-push --help')
diff --git a/lib/oeqa/selftest/cases/updater_qemux86_64.py b/lib/oeqa/selftest/cases/updater_qemux86_64.py
index e26a022..80d135f 100644
--- a/lib/oeqa/selftest/cases/updater_qemux86_64.py
+++ b/lib/oeqa/selftest/cases/updater_qemux86_64.py
@@ -2,6 +2,7 @@
2import os 2import os
3import logging 3import logging
4import re 4import re
5import subprocess
5import unittest 6import unittest
6from time import sleep 7from time import sleep
7from uuid import uuid4 8from uuid import uuid4
@@ -9,7 +10,8 @@ from uuid import uuid4
9from oeqa.selftest.case import OESelftestTestCase 10from oeqa.selftest.case import OESelftestTestCase
10from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars 11from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
11from testutils import qemu_launch, qemu_send_command, qemu_terminate, \ 12from testutils import qemu_launch, qemu_send_command, qemu_terminate, \
12 akt_native_run, verifyNotProvisioned, verifyProvisioned, qemu_bake_image, qemu_boot_image 13 metadir, akt_native_run, verifyNotProvisioned, verifyProvisioned, \
14 qemu_bake_image, qemu_boot_image
13 15
14 16
15class GeneralTests(OESelftestTestCase): 17class GeneralTests(OESelftestTestCase):
@@ -17,6 +19,9 @@ class GeneralTests(OESelftestTestCase):
17 logger = logging.getLogger("selftest") 19 logger = logging.getLogger("selftest")
18 logger.info('Running bitbake to build core-image-minimal') 20 logger.info('Running bitbake to build core-image-minimal')
19 self.append_config('SOTA_CLIENT_PROV = "aktualizr-shared-prov"') 21 self.append_config('SOTA_CLIENT_PROV = "aktualizr-shared-prov"')
22
23 # note: this also tests ostreepush/garagesign/garagecheck which are
24 # omitted from other test cases
20 bitbake('core-image-minimal') 25 bitbake('core-image-minimal')
21 credentials = get_bb_var('SOTA_PACKED_CREDENTIALS') 26 credentials = get_bb_var('SOTA_PACKED_CREDENTIALS')
22 # skip the test if the variable SOTA_PACKED_CREDENTIALS is not set 27 # skip the test if the variable SOTA_PACKED_CREDENTIALS is not set
@@ -39,20 +44,18 @@ class AktualizrToolsTests(OESelftestTestCase):
39 super(AktualizrToolsTests, cls).setUpClass() 44 super(AktualizrToolsTests, cls).setUpClass()
40 logger = logging.getLogger("selftest") 45 logger = logging.getLogger("selftest")
41 logger.info('Running bitbake to build aktualizr-native tools') 46 logger.info('Running bitbake to build aktualizr-native tools')
42 bitbake('aktualizr-native') 47 bitbake('aktualizr-native aktualizr-device-prov')
48 bitbake('build-sysroots -c build_native_sysroot')
43 49
44 def test_cert_provider_help(self): 50 def test_cert_provider_help(self):
45 akt_native_run(self, 'aktualizr-cert-provider --help') 51 akt_native_run(self, 'aktualizr-cert-provider --help')
46 52
47 def test_cert_provider_local_output(self): 53 def test_cert_provider_local_output(self):
48 logger = logging.getLogger("selftest")
49 logger.info('Running bitbake to build aktualizr-device-prov')
50 bitbake('aktualizr-device-prov')
51 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS', 'T'], 'aktualizr-native') 54 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS', 'T'], 'aktualizr-native')
52 creds = bb_vars['SOTA_PACKED_CREDENTIALS'] 55 creds = bb_vars['SOTA_PACKED_CREDENTIALS']
53 temp_dir = bb_vars['T'] 56 temp_dir = bb_vars['T']
54 bb_vars_prov = get_bb_vars(['STAGING_DIR_HOST', 'libdir'], 'aktualizr-device-prov') 57 bb_vars_prov = get_bb_vars(['WORKDIR', 'libdir'], 'aktualizr-device-prov')
55 config = bb_vars_prov['STAGING_DIR_HOST'] + bb_vars_prov['libdir'] + '/sota/sota-device-cred.toml' 58 config = bb_vars_prov['WORKDIR'] + '/sysroot-destdir' + bb_vars_prov['libdir'] + '/sota/conf.d/20-sota-device-cred.toml'
56 59
57 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -r -l {temp} -g {config}' 60 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -r -l {temp} -g {config}'
58 .format(creds=creds, temp=temp_dir, config=config)) 61 .format(creds=creds, temp=temp_dir, config=config))
@@ -75,17 +78,13 @@ class SharedCredProvTests(OESelftestTestCase):
75 layer = "meta-updater-qemux86-64" 78 layer = "meta-updater-qemux86-64"
76 result = runCmd('bitbake-layers show-layers') 79 result = runCmd('bitbake-layers show-layers')
77 if re.search(layer, result.output) is None: 80 if re.search(layer, result.output) is None:
78 # Assume the directory layout for finding other layers. We could also 81 self.meta_qemu = metadir() + layer
79 # make assumptions by using 'show-layers', but either way, if the
80 # layers we need aren't where we expect them, we are out of luck.
81 path = os.path.abspath(os.path.dirname(__file__))
82 metadir = path + "/../../../../../"
83 self.meta_qemu = metadir + layer
84 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 82 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
85 else: 83 else:
86 self.meta_qemu = None 84 self.meta_qemu = None
87 self.append_config('MACHINE = "qemux86-64"') 85 self.append_config('MACHINE = "qemux86-64"')
88 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') 86 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "')
87 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
89 self.qemu, self.s = qemu_launch(machine='qemux86-64') 88 self.qemu, self.s = qemu_launch(machine='qemux86-64')
90 89
91 def tearDownLocal(self): 90 def tearDownLocal(self):
@@ -117,18 +116,14 @@ class ManualControlTests(OESelftestTestCase):
117 layer = "meta-updater-qemux86-64" 116 layer = "meta-updater-qemux86-64"
118 result = runCmd('bitbake-layers show-layers') 117 result = runCmd('bitbake-layers show-layers')
119 if re.search(layer, result.output) is None: 118 if re.search(layer, result.output) is None:
120 # Assume the directory layout for finding other layers. We could also 119 self.meta_qemu = metadir() + layer
121 # make assumptions by using 'show-layers', but either way, if the
122 # layers we need aren't where we expect them, we are out of like.
123 path = os.path.abspath(os.path.dirname(__file__))
124 metadir = path + "/../../../../../"
125 self.meta_qemu = metadir + layer
126 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 120 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
127 else: 121 else:
128 self.meta_qemu = None 122 self.meta_qemu = None
129 self.append_config('MACHINE = "qemux86-64"') 123 self.append_config('MACHINE = "qemux86-64"')
130 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') 124 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "')
131 self.append_config('SYSTEMD_AUTO_ENABLE_aktualizr = "disable"') 125 self.append_config('SYSTEMD_AUTO_ENABLE_aktualizr = "disable"')
126 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
132 self.qemu, self.s = qemu_launch(machine='qemux86-64') 127 self.qemu, self.s = qemu_launch(machine='qemux86-64')
133 128
134 def tearDownLocal(self): 129 def tearDownLocal(self):
@@ -161,20 +156,16 @@ class DeviceCredProvTests(OESelftestTestCase):
161 layer = "meta-updater-qemux86-64" 156 layer = "meta-updater-qemux86-64"
162 result = runCmd('bitbake-layers show-layers') 157 result = runCmd('bitbake-layers show-layers')
163 if re.search(layer, result.output) is None: 158 if re.search(layer, result.output) is None:
164 # Assume the directory layout for finding other layers. We could also 159 self.meta_qemu = metadir() + layer
165 # make assumptions by using 'show-layers', but either way, if the
166 # layers we need aren't where we expect them, we are out of luck.
167 path = os.path.abspath(os.path.dirname(__file__))
168 metadir = path + "/../../../../../"
169 self.meta_qemu = metadir + layer
170 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 160 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
171 else: 161 else:
172 self.meta_qemu = None 162 self.meta_qemu = None
173 self.append_config('MACHINE = "qemux86-64"') 163 self.append_config('MACHINE = "qemux86-64"')
174 self.append_config('SOTA_CLIENT_PROV = " aktualizr-device-prov "') 164 self.append_config('SOTA_CLIENT_PROV = " aktualizr-device-prov "')
175 self.append_config('SOTA_DEPLOY_CREDENTIALS = "0"') 165 self.append_config('SOTA_DEPLOY_CREDENTIALS = "0"')
176 runCmd('bitbake -c cleanall aktualizr aktualizr-device-prov') 166 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
177 self.qemu, self.s = qemu_launch(machine='qemux86-64') 167 self.qemu, self.s = qemu_launch(machine='qemux86-64')
168 bitbake('build-sysroots -c build_native_sysroot')
178 169
179 def tearDownLocal(self): 170 def tearDownLocal(self):
180 qemu_terminate(self.s) 171 qemu_terminate(self.s)
@@ -201,8 +192,8 @@ class DeviceCredProvTests(OESelftestTestCase):
201 # Run aktualizr-cert-provider. 192 # Run aktualizr-cert-provider.
202 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS'], 'aktualizr-native') 193 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS'], 'aktualizr-native')
203 creds = bb_vars['SOTA_PACKED_CREDENTIALS'] 194 creds = bb_vars['SOTA_PACKED_CREDENTIALS']
204 bb_vars_prov = get_bb_vars(['STAGING_DIR_HOST', 'libdir'], 'aktualizr-device-prov') 195 bb_vars_prov = get_bb_vars(['WORKDIR', 'libdir'], 'aktualizr-device-prov')
205 config = bb_vars_prov['STAGING_DIR_HOST'] + bb_vars_prov['libdir'] + '/sota/sota-device-cred.toml' 196 config = bb_vars_prov['WORKDIR'] + '/sysroot-destdir' + bb_vars_prov['libdir'] + '/sota/conf.d/20-sota-device-cred.toml'
206 197
207 print('Provisining at root@localhost:%d' % self.qemu.ssh_port) 198 print('Provisining at root@localhost:%d' % self.qemu.ssh_port)
208 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -t root@localhost -p {port} -s -u -r -g {config}' 199 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -t root@localhost -p {port} -s -u -r -g {config}'
@@ -217,12 +208,7 @@ class DeviceCredProvHsmTests(OESelftestTestCase):
217 layer = "meta-updater-qemux86-64" 208 layer = "meta-updater-qemux86-64"
218 result = runCmd('bitbake-layers show-layers') 209 result = runCmd('bitbake-layers show-layers')
219 if re.search(layer, result.output) is None: 210 if re.search(layer, result.output) is None:
220 # Assume the directory layout for finding other layers. We could also 211 self.meta_qemu = metadir() + layer
221 # make assumptions by using 'show-layers', but either way, if the
222 # layers we need aren't where we expect them, we are out of luck.
223 path = os.path.abspath(os.path.dirname(__file__))
224 metadir = path + "/../../../../../"
225 self.meta_qemu = metadir + layer
226 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 212 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
227 else: 213 else:
228 self.meta_qemu = None 214 self.meta_qemu = None
@@ -231,8 +217,9 @@ class DeviceCredProvHsmTests(OESelftestTestCase):
231 self.append_config('SOTA_DEPLOY_CREDENTIALS = "0"') 217 self.append_config('SOTA_DEPLOY_CREDENTIALS = "0"')
232 self.append_config('SOTA_CLIENT_FEATURES = "hsm"') 218 self.append_config('SOTA_CLIENT_FEATURES = "hsm"')
233 self.append_config('IMAGE_INSTALL_append = " softhsm-testtoken"') 219 self.append_config('IMAGE_INSTALL_append = " softhsm-testtoken"')
234 runCmd('bitbake -c cleanall aktualizr aktualizr-device-prov-hsm') 220 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
235 self.qemu, self.s = qemu_launch(machine='qemux86-64') 221 self.qemu, self.s = qemu_launch(machine='qemux86-64')
222 bitbake('build-sysroots -c build_native_sysroot')
236 223
237 def tearDownLocal(self): 224 def tearDownLocal(self):
238 qemu_terminate(self.s) 225 qemu_terminate(self.s)
@@ -269,25 +256,24 @@ class DeviceCredProvHsmTests(OESelftestTestCase):
269 # Run aktualizr-cert-provider. 256 # Run aktualizr-cert-provider.
270 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS'], 'aktualizr-native') 257 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS'], 'aktualizr-native')
271 creds = bb_vars['SOTA_PACKED_CREDENTIALS'] 258 creds = bb_vars['SOTA_PACKED_CREDENTIALS']
272 bb_vars_prov = get_bb_vars(['STAGING_DIR_HOST', 'libdir'], 'aktualizr-device-prov-hsm') 259 bb_vars_prov = get_bb_vars(['WORKDIR', 'libdir'], 'aktualizr-device-prov-hsm')
273 config = bb_vars_prov['STAGING_DIR_HOST'] + bb_vars_prov['libdir'] + '/sota/sota-device-cred-hsm.toml' 260 config = bb_vars_prov['WORKDIR'] + '/sysroot-destdir' + bb_vars_prov['libdir'] + '/sota/conf.d/20-sota-device-cred-hsm.toml'
274 261
275 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -t root@localhost -p {port} -r -s -u -g {config}' 262 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -t root@localhost -p {port} -r -s -u -g {config}'
276 .format(creds=creds, port=self.qemu.ssh_port, config=config)) 263 .format(creds=creds, port=self.qemu.ssh_port, config=config))
277 264
278 # Verify that HSM is able to initialize. 265 # Verify that HSM is able to initialize.
279 ran_ok = False
280 for delay in [5, 5, 5, 5, 10]: 266 for delay in [5, 5, 5, 5, 10]:
281 sleep(delay) 267 sleep(delay)
282 p11_out, p11_err, p11_ret = self.qemu_command(pkcs11_command) 268 p11_out, p11_err, p11_ret = self.qemu_command(pkcs11_command)
283 hsm_out, hsm_err, hsm_ret = self.qemu_command(softhsm2_command) 269 hsm_out, hsm_err, hsm_ret = self.qemu_command(softhsm2_command)
284 if p11_ret == 0 and hsm_ret == 0 and hsm_err == b'': 270 if (p11_ret == 0 and hsm_ret == 0 and hsm_err == b'' and
285 ran_ok = True 271 b'X.509 cert' in p11_out and b'present token' in p11_err):
286 break 272 break
287 self.assertTrue(ran_ok, 'pkcs11-tool or softhsm2-tool failed: ' + p11_err.decode() + 273 else:
288 p11_out.decode() + hsm_err.decode() + hsm_out.decode()) 274 self.fail('pkcs11-tool or softhsm2-tool failed: ' + p11_err.decode() +
289 self.assertIn(b'present token', p11_err, 'pkcs11-tool failed: ' + p11_err.decode() + p11_out.decode()) 275 p11_out.decode() + hsm_err.decode() + hsm_out.decode())
290 self.assertIn(b'X.509 cert', p11_out, 'pkcs11-tool failed: ' + p11_err.decode() + p11_out.decode()) 276
291 self.assertIn(b'Initialized: yes', hsm_out, 'softhsm2-tool failed: ' + 277 self.assertIn(b'Initialized: yes', hsm_out, 'softhsm2-tool failed: ' +
292 hsm_err.decode() + hsm_out.decode()) 278 hsm_err.decode() + hsm_out.decode())
293 self.assertIn(b'User PIN init.: yes', hsm_out, 'softhsm2-tool failed: ' + 279 self.assertIn(b'User PIN init.: yes', hsm_out, 'softhsm2-tool failed: ' +
@@ -328,8 +314,8 @@ class IpSecondaryTests(OESelftestTestCase):
328 self.configure() 314 self.configure()
329 qemu_bake_image(self.imagename) 315 qemu_bake_image(self.imagename)
330 316
331 def send_command(self, cmd): 317 def send_command(self, cmd, timeout=60):
332 stdout, stderr, retcode = qemu_send_command(self.qemu.ssh_port, cmd, timeout=60) 318 stdout, stderr, retcode = qemu_send_command(self.qemu.ssh_port, cmd, timeout=timeout)
333 return str(stdout), str(stderr), retcode 319 return str(stdout), str(stderr), retcode
334 320
335 def __enter__(self): 321 def __enter__(self):
@@ -344,7 +330,7 @@ class IpSecondaryTests(OESelftestTestCase):
344 def wait_till_sshable(self): 330 def wait_till_sshable(self):
345 # qemu_send_command tries to ssh into the qemu VM and blocks until it gets there or timeout happens 331 # qemu_send_command tries to ssh into the qemu VM and blocks until it gets there or timeout happens
346 # so it helps us to block q control flow until the VM is booted and a target binary/daemon is running there 332 # so it helps us to block q control flow until the VM is booted and a target binary/daemon is running there
347 self.stdout, self.stderr, self.retcode = self.send_command(self.binaryname + ' --help') 333 self.stdout, self.stderr, self.retcode = self.send_command(self.binaryname + ' --help', timeout=300)
348 334
349 def was_successfully_booted(self): 335 def was_successfully_booted(self):
350 return self.retcode == 0 336 return self.retcode == 0
@@ -399,16 +385,12 @@ class IpSecondaryTests(OESelftestTestCase):
399 layer = "meta-updater-qemux86-64" 385 layer = "meta-updater-qemux86-64"
400 result = runCmd('bitbake-layers show-layers') 386 result = runCmd('bitbake-layers show-layers')
401 if re.search(layer, result.output) is None: 387 if re.search(layer, result.output) is None:
402 # Assume the directory layout for finding other layers. We could also 388 self.meta_qemu = metadir() + layer
403 # make assumptions by using 'show-layers', but either way, if the
404 # layers we need aren't where we expect them, we are out of luck.
405 path = os.path.abspath(os.path.dirname(__file__))
406 metadir = path + "/../../../../../"
407 self.meta_qemu = metadir + layer
408 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 389 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
409 else: 390 else:
410 self.meta_qemu = None 391 self.meta_qemu = None
411 392
393 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
412 self.primary = IpSecondaryTests.Primary(self) 394 self.primary = IpSecondaryTests.Primary(self)
413 self.secondary = IpSecondaryTests.Secondary(self) 395 self.secondary = IpSecondaryTests.Secondary(self)
414 396
@@ -446,17 +428,13 @@ class ResourceControlTests(OESelftestTestCase):
446 layer = "meta-updater-qemux86-64" 428 layer = "meta-updater-qemux86-64"
447 result = runCmd('bitbake-layers show-layers') 429 result = runCmd('bitbake-layers show-layers')
448 if re.search(layer, result.output) is None: 430 if re.search(layer, result.output) is None:
449 # Assume the directory layout for finding other layers. We could also 431 self.meta_qemu = metadir() + layer
450 # make assumptions by using 'show-layers', but either way, if the
451 # layers we need aren't where we expect them, we are out of luck.
452 path = os.path.abspath(os.path.dirname(__file__))
453 metadir = path + "/../../../../../"
454 self.meta_qemu = metadir + layer
455 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 432 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
456 else: 433 else:
457 self.meta_qemu = None 434 self.meta_qemu = None
458 self.append_config('MACHINE = "qemux86-64"') 435 self.append_config('MACHINE = "qemux86-64"')
459 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') 436 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "')
437 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
460 self.append_config('IMAGE_INSTALL_append += " aktualizr-resource-control "') 438 self.append_config('IMAGE_INSTALL_append += " aktualizr-resource-control "')
461 self.append_config('RESOURCE_CPU_WEIGHT_pn-aktualizr = "1000"') 439 self.append_config('RESOURCE_CPU_WEIGHT_pn-aktualizr = "1000"')
462 self.append_config('RESOURCE_MEMORY_HIGH_pn-aktualizr = "50M"') 440 self.append_config('RESOURCE_MEMORY_HIGH_pn-aktualizr = "50M"')
@@ -476,10 +454,13 @@ class ResourceControlTests(OESelftestTestCase):
476 ran_ok = False 454 ran_ok = False
477 for delay in [5, 5, 5, 5]: 455 for delay in [5, 5, 5, 5]:
478 sleep(delay) 456 sleep(delay)
479 stdout, stderr, retcode = self.qemu_command('systemctl --no-pager show aktualizr') 457 try:
480 if retcode == 0 and b'ExecMainStatus=9' in stdout: 458 stdout, stderr, retcode = self.qemu_command('systemctl --no-pager show aktualizr')
481 ran_ok = True 459 if retcode == 0 and b'ExecMainStatus=9' in stdout:
482 break 460 ran_ok = True
461 break
462 except subprocess.TimeoutExpired:
463 pass
483 self.assertTrue(ran_ok, 'Aktualizr was not killed') 464 self.assertTrue(ran_ok, 'Aktualizr was not killed')
484 465
485 self.assertIn(b'CPUWeight=1000', stdout, 'CPUWeight was not set correctly') 466 self.assertIn(b'CPUWeight=1000', stdout, 'CPUWeight was not set correctly')
diff --git a/lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py b/lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py
index 0f0f491..d20a9f0 100644
--- a/lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py
+++ b/lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py
@@ -1,10 +1,9 @@
1# pylint: disable=C0111,C0325 1# pylint: disable=C0111,C0325
2import os
3import re 2import re
4 3
5from oeqa.selftest.case import OESelftestTestCase 4from oeqa.selftest.case import OESelftestTestCase
6from oeqa.utils.commands import runCmd 5from oeqa.utils.commands import runCmd
7from testutils import qemu_launch, qemu_send_command, qemu_terminate 6from testutils import metadir, qemu_launch, qemu_send_command, qemu_terminate
8 7
9 8
10class PtestTests(OESelftestTestCase): 9class PtestTests(OESelftestTestCase):
@@ -13,12 +12,7 @@ class PtestTests(OESelftestTestCase):
13 layer = "meta-updater-qemux86-64" 12 layer = "meta-updater-qemux86-64"
14 result = runCmd('bitbake-layers show-layers') 13 result = runCmd('bitbake-layers show-layers')
15 if re.search(layer, result.output) is None: 14 if re.search(layer, result.output) is None:
16 # Assume the directory layout for finding other layers. We could also 15 self.meta_qemu = metadir() + layer
17 # make assumptions by using 'show-layers', but either way, if the
18 # layers we need aren't where we expect them, we are out of like.
19 path = os.path.abspath(os.path.dirname(__file__))
20 metadir = path + "/../../../../../"
21 self.meta_qemu = metadir + layer
22 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 16 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
23 else: 17 else:
24 self.meta_qemu = None 18 self.meta_qemu = None
@@ -26,7 +20,8 @@ class PtestTests(OESelftestTestCase):
26 self.append_config('SYSTEMD_AUTO_ENABLE_aktualizr = "disable"') 20 self.append_config('SYSTEMD_AUTO_ENABLE_aktualizr = "disable"')
27 self.append_config('PTEST_ENABLED_pn-aktualizr = "1"') 21 self.append_config('PTEST_ENABLED_pn-aktualizr = "1"')
28 self.append_config('IMAGE_INSTALL_append += "aktualizr-ptest ptest-runner "') 22 self.append_config('IMAGE_INSTALL_append += "aktualizr-ptest ptest-runner "')
29 self.qemu, self.s = qemu_launch(machine='qemux86-64') 23 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
24 self.qemu, self.s = qemu_launch(machine='qemux86-64', mem="768M")
30 25
31 def tearDownLocal(self): 26 def tearDownLocal(self):
32 qemu_terminate(self.s) 27 qemu_terminate(self.s)
@@ -46,7 +41,7 @@ class PtestTests(OESelftestTestCase):
46 if has_failure: 41 if has_failure:
47 print("Full test suite log:") 42 print("Full test suite log:")
48 stdout, _, _ = self.qemu_command('cat /tmp/aktualizr-ptest.log || cat /tmp/aktualizr-ptest.log.tmp', timeout=None) 43 stdout, _, _ = self.qemu_command('cat /tmp/aktualizr-ptest.log || cat /tmp/aktualizr-ptest.log.tmp', timeout=None)
49 print(stdout.decode()) 44 print(stdout.decode(errors='replace'))
50 45
51 self.assertEqual(retcode, 0) 46 self.assertEqual(retcode, 0)
52 self.assertFalse(has_failure) 47 self.assertFalse(has_failure)
diff --git a/lib/oeqa/selftest/cases/updater_raspberrypi.py b/lib/oeqa/selftest/cases/updater_raspberrypi.py
index f6ae903..26d5c4c 100644
--- a/lib/oeqa/selftest/cases/updater_raspberrypi.py
+++ b/lib/oeqa/selftest/cases/updater_raspberrypi.py
@@ -7,6 +7,8 @@ import unittest
7from oeqa.selftest.case import OESelftestTestCase 7from oeqa.selftest.case import OESelftestTestCase
8from oeqa.utils.commands import runCmd, bitbake, get_bb_var 8from oeqa.utils.commands import runCmd, bitbake, get_bb_var
9 9
10from testutils import metadir
11
10 12
11class RpiTests(OESelftestTestCase): 13class RpiTests(OESelftestTestCase):
12 14
@@ -17,23 +19,18 @@ class RpiTests(OESelftestTestCase):
17 layer_rpi = "meta-raspberrypi" 19 layer_rpi = "meta-raspberrypi"
18 layer_upd_rpi = "meta-updater-raspberrypi" 20 layer_upd_rpi = "meta-updater-raspberrypi"
19 result = runCmd('bitbake-layers show-layers') 21 result = runCmd('bitbake-layers show-layers')
20 # Assume the directory layout for finding other layers. We could also
21 # make assumptions by using 'show-layers', but either way, if the
22 # layers we need aren't where we expect them, we are out of luck.
23 path = os.path.abspath(os.path.dirname(__file__))
24 metadir = path + "/../../../../../"
25 if re.search(layer_python, result.output) is None: 22 if re.search(layer_python, result.output) is None:
26 self.meta_python = metadir + layer_python 23 self.meta_python = metadir() + layer_python
27 runCmd('bitbake-layers add-layer "%s"' % self.meta_python) 24 runCmd('bitbake-layers add-layer "%s"' % self.meta_python)
28 else: 25 else:
29 self.meta_python = None 26 self.meta_python = None
30 if re.search(layer_rpi, result.output) is None: 27 if re.search(layer_rpi, result.output) is None:
31 self.meta_rpi = metadir + layer_rpi 28 self.meta_rpi = metadir() + layer_rpi
32 runCmd('bitbake-layers add-layer "%s"' % self.meta_rpi) 29 runCmd('bitbake-layers add-layer "%s"' % self.meta_rpi)
33 else: 30 else:
34 self.meta_rpi = None 31 self.meta_rpi = None
35 if re.search(layer_upd_rpi, result.output) is None: 32 if re.search(layer_upd_rpi, result.output) is None:
36 self.meta_upd_rpi = metadir + layer_upd_rpi 33 self.meta_upd_rpi = metadir() + layer_upd_rpi
37 runCmd('bitbake-layers add-layer "%s"' % self.meta_upd_rpi) 34 runCmd('bitbake-layers add-layer "%s"' % self.meta_upd_rpi)
38 else: 35 else:
39 self.meta_upd_rpi = None 36 self.meta_upd_rpi = None
diff --git a/scripts/envsetup.sh b/scripts/envsetup.sh
index ff78681..e912824 100755
--- a/scripts/envsetup.sh
+++ b/scripts/envsetup.sh
@@ -21,7 +21,7 @@ if [[ $SOURCED -ne 1 ]]; then
21 exit 1 21 exit 1
22fi 22fi
23 23
24METADIR="${SOURCEDIR}/../.." 24METADIR=${METADIR:-${SOURCEDIR}/../..}
25 25
26if [[ ! -f "${BUILDDIR}/conf/local.conf" ]]; then 26if [[ ! -f "${BUILDDIR}/conf/local.conf" ]]; then
27 source "$METADIR/poky/oe-init-build-env" "$BUILDDIR" 27 source "$METADIR/poky/oe-init-build-env" "$BUILDDIR"
diff --git a/scripts/qemucommand.py b/scripts/qemucommand.py
index 1049d7c..3045b45 100644
--- a/scripts/qemucommand.py
+++ b/scripts/qemucommand.py
@@ -2,7 +2,7 @@ from os.path import exists, join, realpath, abspath
2from os import listdir 2from os import listdir
3import random 3import random
4import socket 4import socket
5from subprocess import check_output, CalledProcessError 5from subprocess import check_output
6 6
7EXTENSIONS = { 7EXTENSIONS = {
8 'intel-corei7-64': 'wic', 8 'intel-corei7-64': 'wic',
@@ -68,6 +68,10 @@ class QemuCommand(object):
68 self.mac_address = random_mac() 68 self.mac_address = random_mac()
69 self.serial_port = find_local_port(8990) 69 self.serial_port = find_local_port(8990)
70 self.ssh_port = find_local_port(2222) 70 self.ssh_port = find_local_port(2222)
71 if args.mem:
72 self.mem = args.mem
73 else:
74 self.mem = "1G"
71 if args.kvm is None: 75 if args.kvm is None:
72 # Autodetect KVM using 'kvm-ok' 76 # Autodetect KVM using 'kvm-ok'
73 try: 77 try:
@@ -95,7 +99,7 @@ class QemuCommand(object):
95 cmdline += ["-drive", "file=%s,if=ide,format=raw,snapshot=on" % self.image] 99 cmdline += ["-drive", "file=%s,if=ide,format=raw,snapshot=on" % self.image]
96 cmdline += [ 100 cmdline += [
97 "-serial", "tcp:127.0.0.1:%d,server,nowait" % self.serial_port, 101 "-serial", "tcp:127.0.0.1:%d,server,nowait" % self.serial_port,
98 "-m", "1G", 102 "-m", self.mem,
99 "-usb", 103 "-usb",
100 "-object", "rng-random,id=rng0,filename=/dev/urandom", 104 "-object", "rng-random,id=rng0,filename=/dev/urandom",
101 "-device", "virtio-rng-pci,rng=rng0", 105 "-device", "virtio-rng-pci,rng=rng0",
@@ -131,4 +135,3 @@ class QemuCommand(object):
131 "-f", "qcow2", 135 "-f", "qcow2",
132 self.overlay] 136 self.overlay]
133 return cmdline 137 return cmdline
134
diff --git a/scripts/run-qemu-ota b/scripts/run-qemu-ota
index b2f55e9..de63297 100755
--- a/scripts/run-qemu-ota
+++ b/scripts/run-qemu-ota
@@ -26,6 +26,7 @@ def main():
26 dest='kvm', action='store_true', default=None) 26 dest='kvm', action='store_true', default=None)
27 kvm_group.add_argument('--no-kvm', help='Disable KVM in QEMU', 27 kvm_group.add_argument('--no-kvm', help='Disable KVM in QEMU',
28 dest='kvm', action='store_false') 28 dest='kvm', action='store_false')
29 parser.add_argument('--mem', default=None, help="Amount of memory the machine boots with")
29 parser.add_argument('--no-gui', help='Disable GUI', action='store_true') 30 parser.add_argument('--no-gui', help='Disable GUI', action='store_true')
30 parser.add_argument('--gdb', help='Export gdbserver port 2159 from the image', action='store_true') 31 parser.add_argument('--gdb', help='Export gdbserver port 2159 from the image', action='store_true')
31 parser.add_argument('--pcap', default=None, help='Dump all network traffic') 32 parser.add_argument('--pcap', default=None, help='Dump all network traffic')