summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml98
-rw-r--r--README.adoc2
-rw-r--r--classes/image_types_ostree.bbclass8
-rw-r--r--classes/sota.bbclass5
-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.py11
-rw-r--r--recipes-sota/aktualizr/aktualizr_git.bb16
-rw-r--r--recipes-support/libp11/libp11_git.bb40
-rw-r--r--recipes-support/softhsm-testtoken/softhsm-testtoken.bb2
-rw-r--r--scripts/ci/Dockerfile.bitbake32
-rw-r--r--scripts/ci/Dockerfile.checkout13
-rw-r--r--scripts/ci/Jenkinsfile.bleeding87
-rw-r--r--scripts/ci/Jenkinsfile.bleeding-selftest91
-rw-r--r--scripts/ci/README.adoc14
-rwxr-xr-xscripts/ci/build.sh3
-rwxr-xr-xscripts/ci/checkout-oe.sh76
-rwxr-xr-xscripts/ci/configure.sh23
-rwxr-xr-xscripts/ci/docker/setup_kvm.sh14
-rw-r--r--scripts/ci/gitlab/checkout.yml16
-rw-r--r--scripts/ci/gitlab/docker.yml37
-rw-r--r--scripts/ci/gitlab/tests.yml36
-rwxr-xr-xscripts/ci/oe-selftest.sh10
-rwxr-xr-xscripts/envsetup.sh2
-rw-r--r--scripts/qemucommand.py9
-rwxr-xr-xscripts/run-qemu-ota1
29 files changed, 446 insertions, 375 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..4b22e20
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,98 @@
1stages:
2 - docker
3 - checkout
4 - test
5
6variables:
7 BITBAKE_IMAGE: ${CI_REGISTRY_IMAGE}:ci-${CI_COMMIT_REF_SLUG}-bitbake
8 BITBAKE_CHECKOUT_IMAGE: ${CI_REGISTRY_IMAGE}:ci-${CI_COMMIT_REF_SLUG}-checkout
9
10include:
11 - local: "scripts/ci/gitlab/docker.yml"
12 - local: "scripts/ci/gitlab/checkout.yml"
13 - local: "scripts/ci/gitlab/tests.yml"
14
15Docker setup:
16 extends: .bb_docker_local
17
18 stage: docker
19 variables:
20 BITBKAE_IMAGE_MASTER: ${CI_REGISTRY_IMAGE}:ci-master-bitbake
21 BITBAKE_CHECKOUT_IMAGE_MASTER: ${CI_REGISTRY_IMAGE}:ci-master-checkout
22 except:
23 - pushes
24
25Checkout:
26 extends: .bb_checkout
27
28 stage: checkout
29 variables:
30 MANIFEST: master
31 CURRENT_PROJECT: meta-updater
32 except:
33 - pushes
34
35Build core-image-minimal:
36 extends: .bitbake
37
38 stage: test
39 variables:
40 TEST_BUILD_DIR: 'build-core-image-minimal'
41 BITBAKE_TARGETS: 'core-image-minimal'
42 artifacts:
43 name: "core-image-minimal_$CI_COMMIT_REF_SLUG"
44 paths:
45 - $TEST_BUILD_DIR/tmp/deploy/images/*/core-image-minimal*
46 except:
47 - pushes
48
49Oe-selftest qemux86_64:
50 extends: .oe-selftest
51
52 stage: test
53 variables:
54 TEST_BUILD_DIR: 'build-oe-qemux86_64'
55 OE_SELFTESTS: 'updater_native updater_qemux86_64'
56 except:
57 - pushes
58
59# Not run by default, triggered on nightlies
60
61Oe-selftest minnowboard:
62 extends: .oe-selftest
63
64 stage: test
65 variables:
66 TEST_BUILD_DIR: 'build-oe-minnowboard'
67 OE_SELFTESTS: 'updater_minnowboard'
68 except:
69 - pushes
70 only:
71 variables:
72 - $OE_MINNOWBOARD
73
74Oe-selftest rpi:
75 extends: .oe-selftest
76
77 stage: test
78 variables:
79 TEST_BUILD_DIR: 'build-oe-rpi'
80 OE_SELFTESTS: 'updater_raspberrypi'
81 except:
82 - pushes
83 only:
84 variables:
85 - $OE_RPI
86
87Ptest qemux86_64:
88 extends: .oe-selftest
89
90 stage: test
91 variables:
92 TEST_BUILD_DIR: 'build-oe-qemux86_64-ptest'
93 OE_SELFTESTS: 'updater_qemux86_64_ptest'
94 except:
95 - pushes
96 only:
97 variables:
98 - $OE_PTEST
diff --git a/README.adoc b/README.adoc
index 1f9d863..b047f91 100644
--- a/README.adoc
+++ b/README.adoc
@@ -104,7 +104,7 @@ Your images will also need network connectivity to be able to reach an actual OT
104* `SOTA_DEPLOY_CREDENTIALS` - when set to '1' (default value), deploys credentials to the built image. Override it in `local.conf` to built a generic image that can be provisioned manually after the build. 104* `SOTA_DEPLOY_CREDENTIALS` - when set to '1' (default value), deploys credentials to the built image. Override it in `local.conf` to built a generic image that can be provisioned manually after the build.
105* `SOTA_CLIENT_PROV` - which provisioning method to use. Valid options are `aktualizr-shared-prov`, `aktualizr-device-prov`, and `aktualizr-device-prov-hsm`. For more information on these provisioning methods, see the https://docs.ota.here.com/client-config/client-provisioning-methods.html[OTA Connect documentation]. The default is `aktualizr-shared-prov`. This can also be set to an empty string to avoid using a provisioning recipe. 105* `SOTA_CLIENT_PROV` - which provisioning method to use. Valid options are `aktualizr-shared-prov`, `aktualizr-device-prov`, and `aktualizr-device-prov-hsm`. For more information on these provisioning methods, see the https://docs.ota.here.com/client-config/client-provisioning-methods.html[OTA Connect documentation]. The default is `aktualizr-shared-prov`. This can also be set to an empty string to avoid using a provisioning recipe.
106* `SOTA_CLIENT_FEATURES` - extensions to aktualizr. The only valid options are `hsm` (to build with HSM support) and `secondary-network` (to set up a simulated 'in-vehicle' network with support for a primary node with a DHCP server and a secondary node with a DHCP client). 106* `SOTA_CLIENT_FEATURES` - extensions to aktualizr. The only valid options are `hsm` (to build with HSM support) and `secondary-network` (to set up a simulated 'in-vehicle' network with support for a primary node with a DHCP server and a secondary node with a DHCP client).
107* `SOTA_SECONDARY_CONFIG_DIR` - a directory containing JSON configuration files for virtual secondaries on the host. These will be installed into `/etc/sota/ecus` on the device and automatically provided to aktualizr. 107* `SOTA_SECONDARY_CONFIG` - a file containing JSON configuration for secondaries. It will be installed into `/etc/sota/ecus` on the device and automatically provided to aktualizr. See link:https://github.com/advancedtelematic/aktualizr/blob/master/docs/posix-secondaries-bitbaking.adoc[here] for more details.
108* `SOTA_HARDWARE_ID` - a custom hardware ID that will be written to the aktualizr config. Defaults to MACHINE if not set. 108* `SOTA_HARDWARE_ID` - a custom hardware ID that will be written to the aktualizr config. Defaults to MACHINE if not set.
109* `SOTA_MAIN_DTB` - base device tree to use with the kernel. Used together with FIT images. You can change it, and the device tree will also be changed after the update. 109* `SOTA_MAIN_DTB` - base device tree to use with the kernel. Used together with FIT images. You can change it, and the device tree will also be changed after the update.
110* `SOTA_DT_OVERLAYS` - whitespace-separated list of used device tree overlays for FIT image. This list is OSTree-updateable as well. 110* `SOTA_DT_OVERLAYS` - whitespace-separated list of used device tree overlays for FIT image. This list is OSTree-updateable as well.
diff --git a/classes/image_types_ostree.bbclass b/classes/image_types_ostree.bbclass
index b1c53ff..a9a8174 100644
--- a/classes/image_types_ostree.bbclass
+++ b/classes/image_types_ostree.bbclass
@@ -7,6 +7,8 @@ OSTREE_COMMIT_SUBJECT ??= "Commit-id: ${IMAGE_NAME}"
7OSTREE_COMMIT_BODY ??= "" 7OSTREE_COMMIT_BODY ??= ""
8OSTREE_UPDATE_SUMMARY ??= "0" 8OSTREE_UPDATE_SUMMARY ??= "0"
9OSTREE_DEPLOY_DEVICETREE ??= "0" 9OSTREE_DEPLOY_DEVICETREE ??= "0"
10OSTREE_BRANCHNAME ?= "${SOTA_HARDWARE_ID}"
11GARAGE_TARGET_NAME ?= "${OSTREE_BRANCHNAME}"
10 12
11BUILD_OSTREE_TARBALL ??= "1" 13BUILD_OSTREE_TARBALL ??= "1"
12 14
@@ -254,6 +256,12 @@ IMAGE_CMD_garagesign () {
254 ${target_url} \ 256 ${target_url} \
255 --sha256 ${ostree_target_hash} \ 257 --sha256 ${ostree_target_hash} \
256 --hardwareids ${SOTA_HARDWARE_ID} 258 --hardwareids ${SOTA_HARDWARE_ID}
259 if [ -n "${GARAGE_CUSTOMIZE_TARGET}" ]; then
260 bbplain "Running command(${GARAGE_CUSTOMIZE_TARGET}) to customize target"
261 ${GARAGE_CUSTOMIZE_TARGET} \
262 ${GARAGE_SIGN_REPO}/tufrepo/roles/unsigned/targets.json \
263 ${GARAGE_TARGET_NAME}-${target_version}
264 fi
257 garage-sign targets sign --repo tufrepo \ 265 garage-sign targets sign --repo tufrepo \
258 --home-dir ${GARAGE_SIGN_REPO} \ 266 --home-dir ${GARAGE_SIGN_REPO} \
259 --key-name=targets 267 --key-name=targets
diff --git a/classes/sota.bbclass b/classes/sota.bbclass
index bf27b6d..1a9d68b 100644
--- a/classes/sota.bbclass
+++ b/classes/sota.bbclass
@@ -39,7 +39,6 @@ INITRAMFS_FSTYPES ?= "${@oe.utils.ifelse(d.getVar('OSTREE_BOOTLOADER') == 'u-boo
39 39
40# Please redefine OSTREE_REPO in order to have a persistent OSTree repo 40# Please redefine OSTREE_REPO in order to have a persistent OSTree repo
41export OSTREE_REPO ?= "${DEPLOY_DIR_IMAGE}/ostree_repo" 41export OSTREE_REPO ?= "${DEPLOY_DIR_IMAGE}/ostree_repo"
42export OSTREE_BRANCHNAME ?= "${SOTA_HARDWARE_ID}"
43export OSTREE_OSNAME ?= "poky" 42export OSTREE_OSNAME ?= "poky"
44export OSTREE_BOOTLOADER ??= 'u-boot' 43export OSTREE_BOOTLOADER ??= 'u-boot'
45export OSTREE_BOOT_PARTITION ??= "/boot" 44export OSTREE_BOOT_PARTITION ??= "/boot"
@@ -48,9 +47,9 @@ INITRAMFS_IMAGE ?= "initramfs-ostree-image"
48 47
49GARAGE_SIGN_REPO ?= "${DEPLOY_DIR_IMAGE}/garage_sign_repo" 48GARAGE_SIGN_REPO ?= "${DEPLOY_DIR_IMAGE}/garage_sign_repo"
50GARAGE_SIGN_KEYNAME ?= "garage-key" 49GARAGE_SIGN_KEYNAME ?= "garage-key"
51GARAGE_TARGET_NAME ?= "${OSTREE_BRANCHNAME}"
52GARAGE_TARGET_VERSION ?= "" 50GARAGE_TARGET_VERSION ?= ""
53GARAGE_TARGET_URL ?= "" 51GARAGE_TARGET_URL ?= ""
52GARAGE_CUSTOMIZE_TARGET ?= ""
54 53
55SOTA_MACHINE ??="none" 54SOTA_MACHINE ??="none"
56SOTA_MACHINE_rpi ?= "raspberrypi" 55SOTA_MACHINE_rpi ?= "raspberrypi"
@@ -61,6 +60,6 @@ SOTA_MACHINE_qemux86-64 ?= "qemux86-64"
61SOTA_MACHINE_am335x-evm ?= "am335x-evm-wifi" 60SOTA_MACHINE_am335x-evm ?= "am335x-evm-wifi"
62 61
63SOTA_OVERRIDES_BLACKLIST = "ostree ota" 62SOTA_OVERRIDES_BLACKLIST = "ostree ota"
64SOTA_REQUIRED_VARIABLES = "OSTREE_REPO OSTREE_BRANCHNAME OSTREE_OSNAME OSTREE_BOOTLOADER OSTREE_BOOT_PARTITION GARAGE_SIGN_REPO GARAGE_TARGET_NAME" 63SOTA_REQUIRED_VARIABLES = "OSTREE_REPO OSTREE_OSNAME OSTREE_BOOTLOADER OSTREE_BOOT_PARTITION GARAGE_SIGN_REPO"
65 64
66inherit sota_sanity sota_${SOTA_MACHINE} image_repo_manifest 65inherit sota_sanity sota_${SOTA_MACHINE} image_repo_manifest
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 7223e9e..2b4726c 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 e976100..8efc941 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
@@ -16,18 +18,13 @@ class RpiTests(OESelftestTestCase):
16 layer_rpi = "meta-raspberrypi" 18 layer_rpi = "meta-raspberrypi"
17 layer_upd_rpi = "meta-updater-raspberrypi" 19 layer_upd_rpi = "meta-updater-raspberrypi"
18 result = runCmd('bitbake-layers show-layers') 20 result = runCmd('bitbake-layers show-layers')
19 # Assume the directory layout for finding other layers. We could also
20 # make assumptions by using 'show-layers', but either way, if the
21 # layers we need aren't where we expect them, we are out of luck.
22 path = os.path.abspath(os.path.dirname(__file__))
23 metadir = path + "/../../../../../"
24 if re.search(layer_rpi, result.output) is None: 21 if re.search(layer_rpi, result.output) is None:
25 self.meta_rpi = metadir + layer_rpi 22 self.meta_rpi = metadir() + layer_rpi
26 runCmd('bitbake-layers add-layer "%s"' % self.meta_rpi) 23 runCmd('bitbake-layers add-layer "%s"' % self.meta_rpi)
27 else: 24 else:
28 self.meta_rpi = None 25 self.meta_rpi = None
29 if re.search(layer_upd_rpi, result.output) is None: 26 if re.search(layer_upd_rpi, result.output) is None:
30 self.meta_upd_rpi = metadir + layer_upd_rpi 27 self.meta_upd_rpi = metadir() + layer_upd_rpi
31 runCmd('bitbake-layers add-layer "%s"' % self.meta_upd_rpi) 28 runCmd('bitbake-layers add-layer "%s"' % self.meta_upd_rpi)
32 else: 29 else:
33 self.meta_upd_rpi = None 30 self.meta_upd_rpi = None
diff --git a/recipes-sota/aktualizr/aktualizr_git.bb b/recipes-sota/aktualizr/aktualizr_git.bb
index 75d5bd9..e9efa35 100644
--- a/recipes-sota/aktualizr/aktualizr_git.bb
+++ b/recipes-sota/aktualizr/aktualizr_git.bb
@@ -6,11 +6,11 @@ LICENSE = "MPL-2.0"
6LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=9741c346eef56131163e13b9db1241b3" 6LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=9741c346eef56131163e13b9db1241b3"
7 7
8DEPENDS = "boost curl openssl libarchive libsodium sqlite3 asn1c-native" 8DEPENDS = "boost curl openssl libarchive libsodium sqlite3 asn1c-native"
9DEPENDS_append = "${@bb.utils.contains('PTEST_ENABLED', '1', ' coreutils-native ostree-native aktualizr-native ', '', d)}" 9DEPENDS_append = "${@bb.utils.contains('PTEST_ENABLED', '1', ' coreutils-native net-tools-native ostree-native aktualizr-native ', '', d)}"
10RDEPENDS_${PN}_class-target = "aktualizr-configs lshw" 10RDEPENDS_${PN}_class-target = "aktualizr-configs lshw"
11RDEPENDS_${PN}-host-tools = "aktualizr aktualizr-repo aktualizr-cert-provider ${@bb.utils.contains('PACKAGECONFIG', 'sota-tools', 'garage-deploy garage-push', '', d)}" 11RDEPENDS_${PN}-host-tools = "aktualizr aktualizr-repo aktualizr-cert-provider ${@bb.utils.contains('PACKAGECONFIG', 'sota-tools', 'garage-deploy garage-push', '', d)}"
12 12
13RDEPENDS_${PN}-ptest += "bash cmake curl python3-misc python3-modules openssl-bin sqlite3 valgrind" 13RDEPENDS_${PN}-ptest += "bash cmake curl net-tools python3-misc python3-modules openssl-bin sqlite3 valgrind"
14 14
15PV = "1.0+git${SRCPV}" 15PV = "1.0+git${SRCPV}"
16PR = "7" 16PR = "7"
@@ -31,7 +31,7 @@ SRC_URI = " \
31SRC_URI[md5sum] = "e104ccd4f32e52571a5fc0e5042db050" 31SRC_URI[md5sum] = "e104ccd4f32e52571a5fc0e5042db050"
32SRC_URI[sha256sum] = "c590be1a57523bfe097af82279eda5c97cf40ae47fb27162cf33c469702c8a9b" 32SRC_URI[sha256sum] = "c590be1a57523bfe097af82279eda5c97cf40ae47fb27162cf33c469702c8a9b"
33 33
34SRCREV = "fce5854ff10e7efd52d69bbaf68dc2af990d5746" 34SRCREV = "17c3713fb3085fe5459ac0e8244a2047d55cb7ec"
35BRANCH ?= "master" 35BRANCH ?= "master"
36 36
37S = "${WORKDIR}/git" 37S = "${WORKDIR}/git"
@@ -106,16 +106,6 @@ do_install_append () {
106 printf "[provision]\nprimary_ecu_hardware_id = ${SOTA_HARDWARE_ID}\n" > ${D}${libdir}/sota/conf.d/40-hardware-id.toml 106 printf "[provision]\nprimary_ecu_hardware_id = ${SOTA_HARDWARE_ID}\n" > ${D}${libdir}/sota/conf.d/40-hardware-id.toml
107 fi 107 fi
108 108
109 if [ -n "${SOTA_SECONDARY_CONFIG_DIR}" ]; then
110 if [ -d "${SOTA_SECONDARY_CONFIG_DIR}" ]; then
111 install -m 0700 -d ${D}${sysconfdir}/sota/ecus
112 install -m 0644 "${SOTA_SECONDARY_CONFIG_DIR}"/* ${D}${sysconfdir}/sota/ecus/
113 printf "[uptane]\nsecondary_configs_dir = /etc/sota/ecus/\n" > ${D}${libdir}/sota/conf.d/30-secondary-configs-dir.toml
114 else
115 bbwarn "SOTA_SECONDARY_CONFIG_DIR is set to an invalid directory (${SOTA_SECONDARY_CONFIG_DIR})"
116 fi
117 fi
118
119 install -m 0755 -d ${D}${systemd_unitdir}/system 109 install -m 0755 -d ${D}${systemd_unitdir}/system
120 aktualizr_service=${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'serialcan', '${WORKDIR}/aktualizr-serialcan.service', '${WORKDIR}/aktualizr.service', d)} 110 aktualizr_service=${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'serialcan', '${WORKDIR}/aktualizr-serialcan.service', '${WORKDIR}/aktualizr.service', d)}
121 install -m 0644 ${aktualizr_service} ${D}${systemd_unitdir}/system/aktualizr.service 111 install -m 0644 ${aktualizr_service} ${D}${systemd_unitdir}/system/aktualizr.service
diff --git a/recipes-support/libp11/libp11_git.bb b/recipes-support/libp11/libp11_git.bb
deleted file mode 100644
index bedcdc8..0000000
--- a/recipes-support/libp11/libp11_git.bb
+++ /dev/null
@@ -1,40 +0,0 @@
1SUMMARY = "Library for using PKCS"
2DESCRIPTION = "\
3Libp11 is a library implementing a small layer on top of PKCS \
4make using PKCS"
5HOMEPAGE = "http://www.opensc-project.org/libp11"
6SECTION = "Development/Libraries"
7LICENSE = "LGPLv2+"
8LIC_FILES_CHKSUM = "file://COPYING;md5=fad9b3332be894bab9bc501572864b29"
9DEPENDS = "libtool openssl"
10RDEPENDS_${PN} += " opensc"
11
12SRC_URI = "git://github.com/OpenSC/libp11.git"
13SRCREV = "57ca68ff67efa08e3be1f26dec6d23bf5bb977f2"
14
15PV = "0.4.9+git${SRCPV}"
16
17S = "${WORKDIR}/git"
18
19inherit autotools pkgconfig
20
21# Currently, Makefile dependencies are incorrectly defined which causes build errors
22# if the number of jobs is high
23# See https://github.com/OpenSC/libp11/issues/94
24PARALLEL_MAKE = ""
25EXTRA_OECONF = "--disable-static"
26
27do_install_append () {
28 rm -rf ${D}${libdir}/*.la
29 rm -rf ${D}${docdir}/${BPN}
30}
31
32FILES_${PN} = "${libdir}/engines*/pkcs11.so \
33 ${libdir}/engines*/libpkcs11${SOLIBS} \
34 ${libdir}/libp11${SOLIBS}"
35
36FILES_${PN}-dev = " \
37 ${libdir}/engines*/libpkcs11${SOLIBSDEV} \
38 ${libdir}/libp11${SOLIBSDEV} \
39 ${libdir}/pkgconfig/libp11.pc \
40 /usr/include"
diff --git a/recipes-support/softhsm-testtoken/softhsm-testtoken.bb b/recipes-support/softhsm-testtoken/softhsm-testtoken.bb
index 58b521c..68514b2 100644
--- a/recipes-support/softhsm-testtoken/softhsm-testtoken.bb
+++ b/recipes-support/softhsm-testtoken/softhsm-testtoken.bb
@@ -4,7 +4,7 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda
4 4
5inherit systemd 5inherit systemd
6 6
7RDEPENDS_${PN} = "softhsm libp11 openssl-bin" 7RDEPENDS_${PN} = "softhsm libp11 opensc openssl-bin"
8DEPENDS_append = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', ' systemd', '', d)}" 8DEPENDS_append = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', ' systemd', '', d)}"
9 9
10 10
diff --git a/scripts/ci/Dockerfile.bitbake b/scripts/ci/Dockerfile.bitbake
index c91f94c..51eaa57 100644
--- a/scripts/ci/Dockerfile.bitbake
+++ b/scripts/ci/Dockerfile.bitbake
@@ -1,15 +1,17 @@
1FROM debian:stable 1FROM debian:stretch
2LABEL Description="Image for bitbaking" 2LABEL Description="Image for bitbaking"
3 3
4RUN sed -i 's#deb http://deb.debian.org/debian stable main#deb http://deb.debian.org/debian stable main contrib#g' /etc/apt/sources.list 4RUN sed -i 's#deb http://deb.debian.org/debian stretch main#deb http://deb.debian.org/debian stretch main contrib#g' /etc/apt/sources.list
5RUN sed -i 's#deb http://deb.debian.org/debian stable-updates main#deb http://deb.debian.org/debian stable-updates main contrib#g' /etc/apt/sources.list 5RUN sed -i 's#deb http://deb.debian.org/debian stretch-updates main#deb http://deb.debian.org/debian stretch-updates main contrib#g' /etc/apt/sources.list
6RUN apt-get update -q && apt-get install -qy \ 6RUN apt-get update -q && apt-get install --no-install-suggests --no-install-recommends -qy \
7 awscli \
7 build-essential \ 8 build-essential \
8 bzip2 \ 9 bzip2 \
9 chrpath \ 10 chrpath \
10 cpio \ 11 cpio \
11 default-jre \ 12 default-jre \
12 diffstat \ 13 diffstat \
14 file \
13 gawk \ 15 gawk \
14 gcc-multilib \ 16 gcc-multilib \
15 git-core \ 17 git-core \
@@ -17,26 +19,40 @@ RUN apt-get update -q && apt-get install -qy \
17 iproute \ 19 iproute \
18 libpython-dev \ 20 libpython-dev \
19 libsdl1.2-dev \ 21 libsdl1.2-dev \
22 libvirt-clients \
23 libvirt-daemon-system \
20 locales \ 24 locales \
21 ovmf \ 25 ovmf \
26 openssh-client \
22 procps \ 27 procps \
23 python \ 28 python \
24 python3 \ 29 python3 \
25 python3-pexpect \ 30 python3-pexpect \
26 qemu \ 31 qemu-kvm \
27 socat \ 32 socat \
33 sudo \
28 texinfo \ 34 texinfo \
29 unzip \ 35 unzip \
30 wget \ 36 wget \
31 xterm \ 37 xterm \
32 xz-utils 38 xz-utils
33 39
34ARG uid=1000 40ARG uid=4321
35ARG gid=1000 41ARG gid=4321
36RUN groupadd -g $gid bitbake 42RUN groupadd -g $gid bitbake
37RUN useradd -m -u $uid -g $gid bitbake 43RUN useradd -m -u $uid -g $gid -s /bin/bash bitbake
38 44
39RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen 45RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
40ENV LC_ALL="en_US.UTF-8" 46ENV LC_ALL="en_US.UTF-8"
41ENV LANG="en_US.UTF-8" 47ENV LANG="en_US.UTF-8"
42ENV LANGUAGE="en_US.UTF-8" 48ENV LANGUAGE="en_US.UTF-8"
49
50# script to mirror kvm group id with host
51RUN echo "bitbake ALL=NOPASSWD: /usr/local/bin/setup_kvm.sh" >> /etc/sudoers
52COPY ./docker/setup_kvm.sh /usr/local/bin/setup_kvm.sh
53
54# other ci scripts
55RUN mkdir /scripts
56COPY configure.sh build.sh oe-selftest.sh /scripts/
57
58USER "bitbake"
diff --git a/scripts/ci/Dockerfile.checkout b/scripts/ci/Dockerfile.checkout
new file mode 100644
index 0000000..5210c6b
--- /dev/null
+++ b/scripts/ci/Dockerfile.checkout
@@ -0,0 +1,13 @@
1FROM debian:stretch-slim
2LABEL Description="Image for checking out updater-repo"
3
4RUN sed -i 's#deb http://deb.debian.org/debian stretch main#deb http://deb.debian.org/debian stretch main contrib#g' /etc/apt/sources.list
5RUN sed -i 's#deb http://deb.debian.org/debian stretch-updates main#deb http://deb.debian.org/debian stretch-updates main contrib#g' /etc/apt/sources.list
6RUN apt-get update -q && apt-get install -qy \
7 git \
8 repo \
9 xmlstarlet
10
11# checkout script
12RUN mkdir /scripts
13COPY checkout-oe.sh /scripts/
diff --git a/scripts/ci/Jenkinsfile.bleeding b/scripts/ci/Jenkinsfile.bleeding
deleted file mode 100644
index 6d340fd..0000000
--- a/scripts/ci/Jenkinsfile.bleeding
+++ /dev/null
@@ -1,87 +0,0 @@
1// This CI setup checks out aktualizr, meta-updater and updater-repo and builds
2// master branches whenever a change is pushed to any of these
3
4// define these for docker image creation
5node {
6 // might cause some problems:
7 // https://stackoverflow.com/questions/44805076/setting-build-args-for-dockerfile-agent-using-a-jenkins-declarative-pipeline
8 JENKINS_UID = sh(returnStdout: true, script: 'id -u').trim()
9 JENKINS_GID = sh(returnStdout: true, script: 'id -g').trim()
10}
11
12pipeline {
13 agent any
14 environment {
15 TEST_AKTUALIZR_REMOTE = 'aktualizr'
16 TEST_AKTUALIZR_DIR = 'aktualizr'
17 TEST_AKTUALIZR_BRANCH = 'master'
18 TEST_BITBAKE_COMMON_DIR = "/opt/jenkins/bitbake-common"
19 }
20 stages {
21 stage('checkout') {
22 steps {
23
24 checkout([$class: 'GitSCM',
25 userRemoteConfigs: [
26 [url: 'https://github.com/advancedtelematic/aktualizr', name: 'aktualizr']
27 ],
28 branches: [[name: 'refs/heads/master']],
29 extensions: [
30 [$class: 'DisableRemotePoll'],
31 [$class: 'PruneStaleBranch'],
32 [$class: 'RelativeTargetDirectory',
33 relativeTargetDir: 'aktualizr'
34 ]
35 ],
36 ])
37
38 checkout([$class: 'RepoScm',
39 manifestRepositoryUrl: 'https://github.com/advancedtelematic/updater-repo',
40 manifestBranch: null,
41 manifestFile: 'master.xml',
42 manifestGroup: null,
43 mirrorDir: null,
44 jobs: 0,
45 depth: 0,
46 localManifest: null,
47 destinationDir: 'updater-repo',
48 repoUrl: null,
49 currentBranch: false,
50 resetFirst: true,
51 quiet: false,
52 trace: false,
53 showAllChanges: false,
54 ])
55
56 // ignore bitbake build directories in docker
57 sh 'echo \'build*\' > .dockerignore'
58
59 // override meta-updater commit with currently tested branch
60 sh '''
61 META_UPDATER_COMMIT=$(git rev-parse HEAD)
62 cd updater-repo/meta-updater
63 git checkout $META_UPDATER_COMMIT
64 '''
65 }
66 }
67 stage('build-core-image-minimal') {
68 agent {
69 dockerfile {
70 filename 'scripts/ci/Dockerfile.bitbake'
71 args '-v /opt/jenkins/bitbake-common:/opt/jenkins/bitbake-common'
72 additionalBuildArgs "--build-arg uid=${JENKINS_UID} --build-arg gid=${JENKINS_GID}"
73 reuseNode true
74 }
75 }
76 environment {
77 TEST_AKTUALIZR_CREDENTIALS = credentials('garage-credentials')
78 }
79 steps {
80 sh 'scripts/ci/configure.sh'
81
82 sh 'scripts/ci/build.sh core-image-minimal'
83 }
84 }
85 }
86}
87// vim: set ft=groovy tabstop=2 shiftwidth=2 expandtab:
diff --git a/scripts/ci/Jenkinsfile.bleeding-selftest b/scripts/ci/Jenkinsfile.bleeding-selftest
deleted file mode 100644
index 8c2d1de..0000000
--- a/scripts/ci/Jenkinsfile.bleeding-selftest
+++ /dev/null
@@ -1,91 +0,0 @@
1// This CI setup checks out aktualizr, meta-updater and updater-repo and builds
2// master branches whenever a change is pushed to any of these
3
4// define these for docker image creation
5node {
6 // might cause some problems:
7 // https://stackoverflow.com/questions/44805076/setting-build-args-for-dockerfile-agent-using-a-jenkins-declarative-pipeline
8 JENKINS_UID = sh(returnStdout: true, script: 'id -u').trim()
9 JENKINS_GID = sh(returnStdout: true, script: 'id -g').trim()
10}
11
12pipeline {
13 agent {
14 node { label 'bitbake' }
15 }
16 environment {
17 TEST_AKTUALIZR_REMOTE = 'aktualizr'
18 TEST_AKTUALIZR_DIR = 'aktualizr'
19 TEST_AKTUALIZR_BRANCH = 'master'
20 TEST_BITBAKE_COMMON_DIR = "/opt/jenkins/bitbake-common"
21 }
22 stages {
23 stage('checkout') {
24 steps {
25
26 checkout([$class: 'GitSCM',
27 userRemoteConfigs: [
28 [url: 'https://github.com/advancedtelematic/aktualizr', name: 'aktualizr']
29 ],
30 branches: [[name: 'refs/heads/master']],
31 extensions: [
32 [$class: 'DisableRemotePoll'],
33 [$class: 'PruneStaleBranch'],
34 [$class: 'RelativeTargetDirectory',
35 relativeTargetDir: 'aktualizr'
36 ]
37 ],
38 ])
39
40 checkout([$class: 'RepoScm',
41 manifestRepositoryUrl: 'https://github.com/advancedtelematic/updater-repo',
42 manifestBranch: null,
43 manifestFile: 'master.xml',
44 manifestGroup: null,
45 mirrorDir: null,
46 jobs: 0,
47 depth: 0,
48 localManifest: null,
49 destinationDir: 'updater-repo',
50 repoUrl: null,
51 currentBranch: false,
52 resetFirst: true,
53 quiet: false,
54 trace: false,
55 showAllChanges: false,
56 ])
57
58 // ignore bitbake build directories in docker
59 sh 'echo \'build*\' > .dockerignore'
60
61 // override meta-updater commit with currently tested branch
62 sh '''
63 META_UPDATER_COMMIT=$(git rev-parse HEAD)
64 cd updater-repo/meta-updater
65 git checkout $META_UPDATER_COMMIT
66 '''
67 }
68 }
69 stage('build-core-image-minimal+oe-selftest') {
70 agent {
71 dockerfile {
72 filename 'scripts/ci/Dockerfile.bitbake'
73 args '-v /opt/jenkins/bitbake-common:/opt/jenkins/bitbake-common'
74 additionalBuildArgs "--build-arg uid=${JENKINS_UID} --build-arg gid=${JENKINS_GID}"
75 reuseNode true
76 }
77 }
78 environment {
79 TEST_AKTUALIZR_CREDENTIALS = credentials('garage-credentials')
80 }
81 steps {
82 sh 'scripts/ci/configure.sh'
83
84 sh 'scripts/ci/build.sh core-image-minimal'
85
86 sh 'scripts/ci/oe-selftest.sh'
87 }
88 }
89 }
90}
91// vim: set ft=groovy tabstop=2 shiftwidth=2 expandtab:
diff --git a/scripts/ci/README.adoc b/scripts/ci/README.adoc
deleted file mode 100644
index 222982b..0000000
--- a/scripts/ci/README.adoc
+++ /dev/null
@@ -1,14 +0,0 @@
1= Jenkins setup for running meta-updater CI
2
3As bitbake is quite resource-hungry, there are some special steps that are
4needed to run Jenkins CI tasks:
5
6- docker should be installed and the `jenkins` unix user should belong to
7 the `docker` group
8- `/opt/jenkins` should exist and have `jenkins:jenkins` permissions, it
9 will be mapped as a volume on the same location in the docker build
10 container
11
12Note that for nodes running Jenkins slaves as a docker container, the
13`/opt/jenkins` directory must exist on the host system as well, with
14permissions matching the user and groupd ids in Jenkins' docker
diff --git a/scripts/ci/build.sh b/scripts/ci/build.sh
index 6235428..9fbae98 100755
--- a/scripts/ci/build.sh
+++ b/scripts/ci/build.sh
@@ -12,7 +12,10 @@ IMAGE_NAME=${1:-core-image-minimal}
12( 12(
13set +euo pipefail 13set +euo pipefail
14set +x 14set +x
15METADIR=$(realpath "$TEST_REPO_DIR")
16export METADIR
15. "${TEST_REPO_DIR}/meta-updater/scripts/envsetup.sh" "${TEST_MACHINE}" "${TEST_BUILD_DIR}" 17. "${TEST_REPO_DIR}/meta-updater/scripts/envsetup.sh" "${TEST_MACHINE}" "${TEST_BUILD_DIR}"
16 18
19set -x
17bitbake "${IMAGE_NAME}" 20bitbake "${IMAGE_NAME}"
18) 21)
diff --git a/scripts/ci/checkout-oe.sh b/scripts/ci/checkout-oe.sh
new file mode 100755
index 0000000..fdc0e48
--- /dev/null
+++ b/scripts/ci/checkout-oe.sh
@@ -0,0 +1,76 @@
1#!/usr/bin/env bash
2
3set -euo pipefail
4
5set -x
6
7REMOTE_SOURCE=${REMOTE_SOURCE:-https://github.com/advancedtelematic}
8MANIFEST=${MANIFEST:-master}
9CURRENT_PROJECT=${CURRENT_PROJECT:-}
10
11# list of projects to pin to one version in the format:
12# "project:rev;project2:rev2..."
13PIN_LIST=${PIN_LIST:-}
14
15#CURRENT_REV=$(git rev-parse HEAD)
16LOCAL_REPO=$PWD
17
18mkdir -p updater-repo
19
20cd updater-repo
21
22if [ -d .repo/manifests ]; then
23 git -C .repo/manifests reset --hard
24fi
25
26repo init -m "${MANIFEST}.xml" -u "$REMOTE_SOURCE/updater-repo"
27
28# patch manifest:
29# - add a new "ats" remote that points to "$REMOTE_SOURCE"
30# - change projects that contain "advancedtelematic" to use the ats remote
31MANIFEST_FILE=".repo/manifests/${MANIFEST}.xml"
32xmlstarlet ed --omit-decl -L \
33 -s "/manifest" -t elem -n "remote" -v "" \
34 -i "/manifest/remote[last()]" -t attr -n "name" -v "ats" \
35 -i "/manifest/remote[last()]" -t attr -n "fetch" -v "$REMOTE_SOURCE" \
36 -d "/manifest/project[contains(@name, 'advancedtelematic')]/@remote" \
37 -i "/manifest/project[contains(@name, 'advancedtelematic')]" -t attr -n "remote" -v "ats" \
38 "$MANIFEST_FILE"
39
40# hack: sed on `advancedtelematic/` names, to remove this unwanted prefix
41sed -i 's#name="advancedtelematic/#name="#g' "$MANIFEST_FILE"
42
43# pin projects from the list
44(
45IFS=";"
46for pin in $PIN_LIST; do
47 IFS=":"
48 read -r project rev <<< "$pin"
49 xmlstarlet ed --omit-decl -L \
50 -d "/manifest/project[@name=\"$project\"]/@revision" \
51 -i "/manifest/project[@name=\"$project\"]/@revision" -t attr -n "revision" -v "$rev" \
52 -i "/manifest/project[@name=\"$project\"]" -t attr -n "revision" -v "$rev" \
53 "$MANIFEST_FILE"
54 IFS=";"
55done
56)
57
58# Remove the current project from the manifest if we have it checked out
59if [ -n "$CURRENT_PROJECT" ]; then
60 xmlstarlet ed --omit-decl -L \
61 -d "/manifest/project[@name=\"$CURRENT_PROJECT\"]" \
62 "$MANIFEST_FILE"
63fi
64
65repo manifest
66
67repo forall -c 'git reset --hard ; git clean -fdx'
68
69repo sync -d --force-sync
70
71if [ -n "$CURRENT_PROJECT" ]; then
72 rm -f "$CURRENT_PROJECT"
73 ln -s "$LOCAL_REPO" "$CURRENT_PROJECT"
74fi
75
76repo manifest -r
diff --git a/scripts/ci/configure.sh b/scripts/ci/configure.sh
index 960a0cc..67563ed 100755
--- a/scripts/ci/configure.sh
+++ b/scripts/ci/configure.sh
@@ -8,9 +8,13 @@ TEST_BUILD_DIR=${TEST_BUILD_DIR:-build}
8TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo} 8TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo}
9TEST_BITBAKE_COMMON_DIR=${TEST_BITBAKE_COMMON_DIR:-} 9TEST_BITBAKE_COMMON_DIR=${TEST_BITBAKE_COMMON_DIR:-}
10 10
11TEST_AKTUALIZR_DIR=${TEST_AKTUALIZR_DIR:-.} 11TEST_AKTUALIZR_REMOTE=${TEST_AKTUALIZR_REMOTE:-}
12TEST_AKTUALIZR_BRANCH=${TEST_AKTUALIZR_BRANCH:-master} 12if [ -n "$TEST_AKTUALIZR_REMOTE" ]; then
13TEST_AKTUALIZR_REV=${TEST_AKTUALIZR_REV:-$(GIT_DIR="$TEST_AKTUALIZR_DIR/.git" git rev-parse "$TEST_AKTUALIZR_REMOTE/$TEST_AKTUALIZR_BRANCH")} 13 TEST_AKTUALIZR_DIR=${TEST_AKTUALIZR_DIR:-.}
14 TEST_AKTUALIZR_BRANCH=${TEST_AKTUALIZR_BRANCH:-master}
15 TEST_AKTUALIZR_REV=${TEST_AKTUALIZR_REV:-$(GIT_DIR="$TEST_AKTUALIZR_DIR/.git" git rev-parse "$TEST_AKTUALIZR_REMOTE/$TEST_AKTUALIZR_BRANCH")}
16fi
17
14TEST_AKTUALIZR_CREDENTIALS=${TEST_AKTUALIZR_CREDENTIALS:-} 18TEST_AKTUALIZR_CREDENTIALS=${TEST_AKTUALIZR_CREDENTIALS:-}
15 19
16# move existing conf directory to backup, before generating a new one 20# move existing conf directory to backup, before generating a new one
@@ -21,6 +25,8 @@ mv "$TEST_BUILD_DIR/conf" "$TEST_BUILD_DIR/conf.old" || true
21set +euo pipefail 25set +euo pipefail
22set +x 26set +x
23echo ">> Running envsetup.sh" 27echo ">> Running envsetup.sh"
28METADIR=$(realpath "$TEST_REPO_DIR")
29export METADIR
24. "$TEST_REPO_DIR/meta-updater/scripts/envsetup.sh" "$TEST_MACHINE" "$TEST_BUILD_DIR" 30. "$TEST_REPO_DIR/meta-updater/scripts/envsetup.sh" "$TEST_MACHINE" "$TEST_BUILD_DIR"
25) 31)
26 32
@@ -31,19 +37,19 @@ SITE_CONF="$TEST_BUILD_DIR/conf/site.conf"
31echo ">> Set common bitbake config options" 37echo ">> Set common bitbake config options"
32cat << EOF > "$SITE_CONF" 38cat << EOF > "$SITE_CONF"
33SANITY_TESTED_DISTROS = "" 39SANITY_TESTED_DISTROS = ""
34SSTATE_MIRRORS ?= "file://.* https://bitbake-cache.atsgarage.com/PATH;downloadfilename=PATH"
35IMAGE_FEATURES += "ssh-server-openssh" 40IMAGE_FEATURES += "ssh-server-openssh"
36 41
37EOF 42EOF
38 43
39echo ">> Set aktualizr branch in bitbake's config" 44if [ -n "$TEST_AKTUALIZR_REMOTE" ]; then
40cat << EOF >> "$SITE_CONF" 45 echo ">> Set aktualizr branch in bitbake's config"
46 cat << EOF >> "$SITE_CONF"
41SRCREV_pn-aktualizr = "$TEST_AKTUALIZR_REV" 47SRCREV_pn-aktualizr = "$TEST_AKTUALIZR_REV"
42SRCREV_pn-aktualizr-native = "\${SRCREV_pn-aktualizr}" 48SRCREV_pn-aktualizr-native = "\${SRCREV_pn-aktualizr}"
43BRANCH_pn-aktualizr = "$TEST_AKTUALIZR_BRANCH" 49BRANCH_pn-aktualizr = "$TEST_AKTUALIZR_BRANCH"
44BRANCH_pn-aktualizr-native = "\${BRANCH_pn-aktualizr}" 50BRANCH_pn-aktualizr-native = "\${BRANCH_pn-aktualizr}"
45
46EOF 51EOF
52fi
47 53
48if [[ -n $TEST_AKTUALIZR_CREDENTIALS ]]; then 54if [[ -n $TEST_AKTUALIZR_CREDENTIALS ]]; then
49 echo ">> Set aktualizr credentials" 55 echo ">> Set aktualizr credentials"
@@ -63,3 +69,6 @@ SSTATE_DIR = "$SSTATE_DIR"
63DL_DIR = "$DL_DIR" 69DL_DIR = "$DL_DIR"
64EOF 70EOF
65fi 71fi
72
73echo -e ">> Final configuration (site.conf):\n"
74cat "$SITE_CONF"
diff --git a/scripts/ci/docker/setup_kvm.sh b/scripts/ci/docker/setup_kvm.sh
new file mode 100755
index 0000000..1ffbbf5
--- /dev/null
+++ b/scripts/ci/docker/setup_kvm.sh
@@ -0,0 +1,14 @@
1#!/usr/bin/env bash
2
3# This script makes the gid of the 'kvm' group to match the group
4# owner of '/dev/kvm'
5#
6# These two are not guaranteed to match when a docker image starts
7# with access to '/dev/kvm' that comes from the host
8
9set -euo pipefail
10
11kvm_gid=$(stat -c "%g" /dev/kvm)
12groupmod -g "$kvm_gid" kvm
13usermod -a -G kvm bitbake
14ln -s /bin/true /usr/bin/kvm-ok
diff --git a/scripts/ci/gitlab/checkout.yml b/scripts/ci/gitlab/checkout.yml
new file mode 100644
index 0000000..28c9177
--- /dev/null
+++ b/scripts/ci/gitlab/checkout.yml
@@ -0,0 +1,16 @@
1.bb_checkout:
2 # parameters:
3 # - MANIFEST
4 # - REMOTE_SOURCE
5 # - CURRENT_PROJECT (will be symlinked instead of pulled)
6
7 image: $BITBAKE_CHECKOUT_IMAGE
8 cache:
9 paths:
10 - updater-repo
11 artifacts:
12 expire_in: "1 day"
13 paths:
14 - updater-repo
15 script:
16 - /scripts/checkout-oe.sh
diff --git a/scripts/ci/gitlab/docker.yml b/scripts/ci/gitlab/docker.yml
new file mode 100644
index 0000000..5b81d77
--- /dev/null
+++ b/scripts/ci/gitlab/docker.yml
@@ -0,0 +1,37 @@
1.bb_docker_local:
2 # intended to be run on meta-updater's master branch which contains the
3 # reference docker files
4 # parameters:
5 # - BITBAKE_IMAGE
6 # - BITBAKE_CHECKOUT_IMAGE
7 # - BITBKAE_IMAGE_MASTER
8 # - BITBAKE_CHECKOUT_IMAGE_MASTER
9 image: docker:18
10 stage: docker
11 services:
12 - docker:18-dind
13 before_script:
14 - docker login -u gitlab-ci-token -p "$CI_JOB_TOKEN" "$CI_REGISTRY"
15 script:
16 - docker pull "$BITBAKE_IMAGE" || docker pull "$BITBKAE_IMAGE_MASTER" || true
17 - docker build --pull --cache-from "$BITBKAE_IMAGE_MASTER" --cache-from "$BITBAKE_IMAGE" -f ./scripts/ci/Dockerfile.bitbake -t "$BITBAKE_IMAGE" ./scripts/ci
18 - docker push "$BITBAKE_IMAGE"
19
20 - docker pull "$BITBAKE_CHECKOUT_IMAGE" || docker pull "$BITBAKE_CHECKOUT_IMAGE_MASTER" || true
21 - docker build --pull --cache-from "$BITBAKE_CHECKOUT_IMAGE_MASTER" --cache-from "$BITBAKE_CHECKOUT_IMAGE" -f ./scripts/ci/Dockerfile.checkout -t "$BITBAKE_CHECKOUT_IMAGE" ./scripts/ci
22 - docker push "$BITBAKE_CHECKOUT_IMAGE"
23
24.bb_docker_remote:
25 # intended to be run on other branches and repos: just pulls the last master image
26 # parameters:
27 # - BITBAKE_IMAGE
28 # - BITBAKE_CHECKOUT_IMAGE
29 image: docker:18
30 stage: docker
31 services:
32 - docker:18-dind
33 before_script:
34 - docker login -u gitlab-ci-token -p "$CI_JOB_TOKEN" "$CI_REGISTRY"
35 script:
36 - docker pull "$BITBAKE_IMAGE"
37 - docker pull "$BITBAKE_CHECKOUT_IMAGE"
diff --git a/scripts/ci/gitlab/tests.yml b/scripts/ci/gitlab/tests.yml
new file mode 100644
index 0000000..4bd5844
--- /dev/null
+++ b/scripts/ci/gitlab/tests.yml
@@ -0,0 +1,36 @@
1.bitbake:
2 # parameters:
3 # - TEST_BUILD_DIR
4 # - TEST_MACHINE (defaults to qemux86-64)
5 # - BITBAKE_TARGETS
6 image: $BITBAKE_IMAGE
7 dependencies:
8 - Checkout
9 tags:
10 - bitbake
11 script:
12 - /scripts/configure.sh
13 - /scripts/build.sh $BITBAKE_TARGETS
14
15.oe-selftest:
16 # parameters:
17 # - TEST_BUILD_DIR
18 # - TEST_MACHINE (defaults to qemux86-64)
19 # - OE_SELFTESTS
20 image: $BITBAKE_IMAGE
21 dependencies:
22 - Checkout
23 tags:
24 - bitbake
25 variables:
26 TEST_AKTUALIZR_CREDENTIALS: $CI_PROJECT_DIR/credentials.zip
27 before_script:
28 - aws s3 cp s3://ota-gitlab-ci/hereotaconnect_prod.zip credentials.zip
29 - sudo /usr/local/bin/setup_kvm.sh
30 script:
31 - |
32 # sg is needed after adding bitbake to the kvm group (see setup_kvm.sh)
33 sg kvm << EOS
34 /scripts/configure.sh
35 /scripts/oe-selftest.sh $OE_SELFTESTS
36 EOS
diff --git a/scripts/ci/oe-selftest.sh b/scripts/ci/oe-selftest.sh
index 3124cce..178e7c1 100755
--- a/scripts/ci/oe-selftest.sh
+++ b/scripts/ci/oe-selftest.sh
@@ -12,7 +12,15 @@ TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo}
12( 12(
13set +euo pipefail 13set +euo pipefail
14set +x 14set +x
15METADIR=$(realpath "$TEST_REPO_DIR")
16export METADIR
15. "${TEST_REPO_DIR}/meta-updater/scripts/envsetup.sh" "${TEST_MACHINE}" "${TEST_BUILD_DIR}" 17. "${TEST_REPO_DIR}/meta-updater/scripts/envsetup.sh" "${TEST_MACHINE}" "${TEST_BUILD_DIR}"
16 18
17oe-selftest -r updater 19set -x
20
21# work poky around bug on sumo and thud
22# see https://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=d3a94e5b9b3c107cf54d5639071cc6609c002f67
23mkdir -p "tmp/log"
24
25oe-selftest -r "$@"
18) 26)
diff --git a/scripts/envsetup.sh b/scripts/envsetup.sh
index 6103cf6..5827bc2 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')