Merge ~sylvain-pineau/checkbox-snappy:content-interface-s16 into checkbox-snappy:series16

Proposed by Sylvain Pineau
Status: Merged
Approved by: Sylvain Pineau
Approved revision: 53517361e6bf298d89d0cb190ea793e3f75162ca
Merged at revision: 633b934792d7a847a964a561867493b4b18bad29
Proposed branch: ~sylvain-pineau/checkbox-snappy:content-interface-s16
Merge into: checkbox-snappy:series16
Diff against target: 429 lines (+204/-100)
7 files modified
dev/null (+0/-6)
launchers/checkbox-cli-wrapper (+0/-6)
launchers/configure (+34/-4)
launchers/wrapper_common (+50/-2)
snap/hooks/configure (+30/-2)
snap/plugins/checkbox_provider.py (+67/-0)
snap/snapcraft.yaml (+23/-80)
Reviewer Review Type Date Requested Status
Jonathan Cave (community) Approve
Review via email: mp+365238@code.launchpad.net

Description of the change

Content interface deployment

Tested here: https://trello.com/c/xpXp3eor/854-checkbox-snappy-1611dev-1897

Built using the snapcraft snap

To post a comment you must log in.
Revision history for this message
Jonathan Cave (jocave) wrote :

One question below

review: Needs Information
Revision history for this message
Sylvain Pineau (sylvain-pineau) wrote :

See below, just to be future proof

Revision history for this message
Jonathan Cave (jocave) wrote :

Ok, lets go with that.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/launchers/checkbox-cli-wrapper b/launchers/checkbox-cli-wrapper
2index 739ad9e..4b9f1c9 100755
3--- a/launchers/checkbox-cli-wrapper
4+++ b/launchers/checkbox-cli-wrapper
5@@ -1,11 +1,5 @@
6 #!/bin/bash
7
8-if ! snap list &> /dev/null || ! snap list $SNAP_NAME | grep devmode > /dev/null
9-then
10- echo "$SNAP_NAME must be installed with --devmode to function properly!"
11- exit 1
12-fi
13-
14 . $(dirname "$(realpath $BASH_SOURCE)")/wrapper_common
15
16 cd $HOME
17diff --git a/launchers/checkbox-launcher-wrapper b/launchers/checkbox-launcher-wrapper
18deleted file mode 100755
19index bf193ee..0000000
20--- a/launchers/checkbox-launcher-wrapper
21+++ /dev/null
22@@ -1,6 +0,0 @@
23-#!/bin/bash
24-
25-. $(dirname "$(realpath $BASH_SOURCE)")/wrapper_common
26-
27-cd $HOME
28-exec python3 $(which checkbox-launcher) "$@"
29diff --git a/launchers/configure b/launchers/configure
30index e9b95d1..e6502eb 100755
31--- a/launchers/configure
32+++ b/launchers/configure
33@@ -1,18 +1,48 @@
34 #!/usr/bin/env python3
35-# Copyright 2017 Canonical Ltd.
36+# Copyright 2018-2019 Canonical Ltd.
37 # All rights reserved.
38 #
39 # Written by:
40 # Maciej Kisielewski <maciej.kisielewski@canonical.com>
41+# Sylvain Pineau <sylvain.pineau@canonical.com>
42 import os
43 import re
44 import sys
45
46 sys.path.append(os.path.expandvars("$SNAP/usr/lib/python3/dist-packages"))
47-sys.path.append(os.path.expandvars("$SNAP/lib/python3.5/site-packages"))
48+sitepkgpath = "$SNAP/lib/python{}.{}/site-packages".format(
49+ sys.version_info[0], sys.version_info[1])
50+sys.path.append(os.path.expandvars(sitepkgpath))
51
52-from checkbox_support.snap_utils.config import update_configuration
53-from checkbox_support.snap_utils.config import print_checkbox_conf
54+sys.path.append(os.path.expandvars(
55+ "$SNAP/checkbox-runtime/usr/lib/python3/dist-packages"))
56+runtimepath = "$SNAP/checkbox-runtime/lib/python{}.{}/site-packages".format(
57+ sys.version_info[0], sys.version_info[1])
58+sys.path.append(os.path.expandvars(runtimepath))
59+
60+try:
61+ from checkbox_support.snap_utils.config import update_configuration
62+ from checkbox_support.snap_utils.config import print_checkbox_conf
63+except ImportError:
64+ msg = """
65+checkbox-support not found!
66+You need to connect this snap to the checkbox snap.
67+
68+You can do this with those commands:
69+
70+snap connect $SNAP_NAME:checkbox-runtime checkbox:checkbox-runtime
71+snap connect $SNAP_NAME:provider-resource checkbox:provider-resource
72+snap connect $SNAP_NAME:provider-checkbox checkbox:provider-checkbox
73+snap connect $SNAP_NAME:provider-snappy checkbox:provider-snappy
74+snap connect $SNAP_NAME:provider-ipdt checkbox:provider-ipdt
75+snap connect $SNAP_NAME:provider-docker checkbox:provider-docker
76+snap connect $SNAP_NAME:provider-tpm2 checkbox:provider-tpm2
77+snap connect $SNAP_NAME:provider-sru checkbox:provider-sru
78+snap connect $SNAP_NAME:provider-edgex checkbox:provider-edgex
79+snap connect $SNAP_NAME:provider-engineering-tests checkbox:provider-engineering-tests
80+ """
81+ print(os.path.expandvars(msg), file=sys.stderr)
82+ sys.exit(1)
83
84
85 def main():
86diff --git a/launchers/hw-collection b/launchers/hw-collection
87old mode 100644
88new mode 100755
89diff --git a/launchers/wrapper_common b/launchers/wrapper_common
90index 6a02421..00e7a12 100644
91--- a/launchers/wrapper_common
92+++ b/launchers/wrapper_common
93@@ -12,11 +12,59 @@ case "$SNAP_ARCH" in
94 ;;
95 esac
96
97+################################################
98+# Launcher common exports for any checkbox app #
99+################################################
100+
101+function append_dir() {
102+ local var="$1"
103+ local dir="$2"
104+ if [ -d "$dir" ]; then
105+ eval "export $var=\"\${$var:+\$$var:}\$dir\""
106+ fi
107+}
108+
109+if [ -d $SNAP/checkbox-runtime ]; then
110+ RUNTIME=$SNAP/checkbox-runtime
111+ if [ ! -d $RUNTIME/usr ]; then
112+ echo "You need to connect this snap to the checkbox snap."
113+ echo ""
114+ echo "You can do this with those commands:"
115+ echo "snap install checkbox"
116+ echo "snap connect $SNAP_NAME:checkbox-runtime checkbox:checkbox-runtime"
117+ exit 1
118+ fi
119+fi
120+
121 export LC_ALL=C.UTF-8
122 PERL_VERSION=$(perl -e '$^V=~/^v(\d+\.\d+)/;print $1')
123 export PERL5LIB="$PERL5LIB:$SNAP/usr/lib/$ARCH/perl/$PERL_VERSION:$SNAP/usr/lib/$ARCH/perl5/$PERL_VERSION:$SNAP/usr/share/perl/$PERL_VERSION:$SNAP/usr/share/perl5"
124 export GI_TYPELIB_PATH=$SNAP/usr/lib/girepository-1.0:$SNAP/usr/lib/$ARCH/girepository-1.0
125 export PATH="$PATH:$SNAP/usr/sbin:$SNAP/sbin:/snap/bin"
126-export PYTHONPATH="$SNAP/usr/lib/python3/dist-packages:$PYTHONPATH"
127 export ALSA_CONFIG_PATH=$SNAP/usr/share/alsa/alsa.conf:$SNAP/usr/share/alsa/pcm/default.conf
128-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib/fwts"
129+export PYTHONPATH="$SNAP/usr/lib/python3/dist-packages:$PYTHONPATH"
130+
131+if [ -z "$RUNTIME" ]; then
132+ RUNTIME=$SNAP
133+else
134+ # add general paths not added by snapcraft due to runtime snap
135+ append_dir PERL5LIB $RUNTIME/usr/lib/$ARCH/perl/$PERL_VERSION
136+ append_dir PERL5LIB $RUNTIME/usr/lib/$ARCH/perl5/$PERL_VERSION
137+ append_dir PERL5LIB $RUNTIME/usr/share/perl/$PERL_VERSION
138+ append_dir PERL5LIB $RUNTIME/usr/share/perl5
139+ append_dir LD_LIBRARY_PATH $RUNTIME/lib/$ARCH
140+ append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH
141+ append_dir LD_LIBRARY_PATH $RUNTIME/lib/fwts
142+ append_dir GI_TYPELIB_PATH $RUNTIME/usr/lib/girepository-1.0
143+ append_dir GI_TYPELIB_PATH $RUNTIME/usr/lib/$ARCH/girepository-1.0
144+ append_dir PATH $RUNTIME/bin
145+ append_dir PATH $RUNTIME/usr/bin
146+ append_dir PATH $RUNTIME/sbin
147+ append_dir PATH $RUNTIME/usr/sbin
148+ append_dir ALSA_CONFIG_PATH $RUNTIME/usr/share/alsa/alsa.conf
149+ append_dir ALSA_CONFIG_PATH $RUNTIME/usr/share/alsa/pcm/default.conf
150+ append_dir PYTHONUSERBASE $RUNTIME
151+ append_dir PYTHONHOME $RUNTIME/usr
152+ append_dir PYTHONPATH $RUNTIME/usr/lib/python3/dist-packages
153+ append_dir PYTHONPATH $RUNTIME/lib/python3*/site-packages
154+fi
155diff --git a/snap/hooks/configure b/snap/hooks/configure
156index 0973a72..2808d23 100755
157--- a/snap/hooks/configure
158+++ b/snap/hooks/configure
159@@ -1,9 +1,10 @@
160 #!/usr/bin/env python3
161-# Copyright 2017 Canonical Ltd.
162+# Copyright 2017-2019 Canonical Ltd.
163 # All rights reserved.
164 #
165 # Written by:
166 # Maciej Kisielewski <maciej.kisielewski@canonical.com>
167+# Sylvain Pineau <sylvain.pineau@canonical.com>
168 """
169 This hook reads `config_vars` file from the root of a snap and reenters this
170 configuration using snapd's config facilities and rewrites the file to a
171@@ -37,5 +38,32 @@ sitepkgpath = "$SNAP/lib/python{}.{}/site-packages".format(
172 sys.version_info[0], sys.version_info[1])
173 sys.path.append(os.path.expandvars(sitepkgpath))
174
175-from checkbox_support.snap_utils.config import refresh_configuration
176+sys.path.append(os.path.expandvars(
177+ "$SNAP/checkbox-runtime/usr/lib/python3/dist-packages"))
178+runtimepath = "$SNAP/checkbox-runtime/lib/python{}.{}/site-packages".format(
179+ sys.version_info[0], sys.version_info[1])
180+sys.path.append(os.path.expandvars(runtimepath))
181+
182+try:
183+ from checkbox_support.snap_utils.config import refresh_configuration
184+except ImportError:
185+ msg = """
186+checkbox-support not found!
187+You need to connect this snap to the checkbox snap.
188+
189+You can do this with those commands:
190+
191+snap connect $SNAP_NAME:checkbox-runtime checkbox:checkbox-runtime
192+snap connect $SNAP_NAME:provider-resource checkbox:provider-resource
193+snap connect $SNAP_NAME:provider-checkbox checkbox:provider-checkbox
194+snap connect $SNAP_NAME:provider-snappy checkbox:provider-snappy
195+snap connect $SNAP_NAME:provider-ipdt checkbox:provider-ipdt
196+snap connect $SNAP_NAME:provider-docker checkbox:provider-docker
197+snap connect $SNAP_NAME:provider-tpm2 checkbox:provider-tpm2
198+snap connect $SNAP_NAME:provider-sru checkbox:provider-sru
199+snap connect $SNAP_NAME:provider-edgex checkbox:provider-edgex
200+snap connect $SNAP_NAME:provider-engineering-tests checkbox:provider-engineering-tests
201+ """
202+ print(os.path.expandvars(msg), file=sys.stderr)
203+ sys.exit(0)
204 refresh_configuration()
205diff --git a/snap/plugins/checkbox_provider.py b/snap/plugins/checkbox_provider.py
206new file mode 100644
207index 0000000..eded14b
208--- /dev/null
209+++ b/snap/plugins/checkbox_provider.py
210@@ -0,0 +1,67 @@
211+# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*-
212+#
213+# Copyright (C) 2016-2019 Canonical Ltd
214+#
215+# This program is free software: you can redistribute it and/or modify
216+# it under the terms of the GNU General Public License version 3 as
217+# published by the Free Software Foundation.
218+#
219+# This program is distributed in the hope that it will be useful,
220+# but WITHOUT ANY WARRANTY; without even the implied warranty of
221+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
222+# GNU General Public License for more details.
223+#
224+# You should have received a copy of the GNU General Public License
225+# along with this program. If not, see <http://www.gnu.org/licenses/>.
226+
227+import os
228+
229+from snapcraft.internal import mangling
230+from snapcraft.plugins import plainbox_provider
231+
232+
233+class CheckboxProvider(plainbox_provider.PlainboxProviderPlugin):
234+
235+ def __init__(self, name, options, project):
236+ super().__init__(name, options, project)
237+ self.build_snaps.append("checkbox-provider-tools")
238+ if project.info.base in (None, "core16"):
239+ self.build_snaps.append("checkbox")
240+ if project.info.base == "core18":
241+ self.build_snaps.append("checkbox18")
242+
243+ def build(self):
244+ env = os.environ.copy()
245+ # Ensure the first provider does not attempt to validate against
246+ # providers installed on the build host by initialising PROVIDERPATH
247+ # to empty
248+ env["PROVIDERPATH"] = ""
249+ provider_stage_dir = os.path.join(self.project.stage_dir, "providers")
250+ if os.path.exists(provider_stage_dir):
251+ provider_dirs = [
252+ os.path.join(provider_stage_dir, provider)
253+ for provider in os.listdir(provider_stage_dir)
254+ ]
255+ env["PROVIDERPATH"] = ":".join(provider_dirs)
256+ for snap_name in self.build_snaps:
257+ build_snap_provider_dir = os.path.join(
258+ "/snap", snap_name, "current", "providers")
259+ if os.path.exists(build_snap_provider_dir):
260+ provider_dirs = [
261+ os.path.join(build_snap_provider_dir, provider)
262+ for provider in os.listdir(build_snap_provider_dir)
263+ ]
264+ env["PROVIDERPATH"] = ":".join(provider_dirs)
265+ cmd = "checkbox-provider-tools"
266+ self.run([cmd, "validate"], env=env)
267+ self.run([cmd, "build"])
268+ self.run(
269+ [
270+ cmd,
271+ "install",
272+ "--layout=relocatable",
273+ "--prefix=/providers/{}".format(self.name),
274+ "--root={}".format(self.installdir),
275+ ]
276+ )
277+ mangling.rewrite_python_shebangs(self.installdir)
278diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
279index 745f397..fb95ce5 100644
280--- a/snap/snapcraft.yaml
281+++ b/snap/snapcraft.yaml
282@@ -4,49 +4,47 @@ description: "The provider is a collection of tests to be run on Snappy devices.
283 version: '16.11.dev'
284 grade: stable
285
286-# Don't forget to add a new slot if a new provider part is added in the parts
287-# section below.
288-slots:
289+plugs:
290+ checkbox-runtime:
291+ interface: content
292+ target: $SNAP/checkbox-runtime
293+ default-provider: checkbox
294 provider-resource:
295 interface: content
296- read:
297- - $SNAP/providers/plainbox-provider-resource
298+ target: $SNAP/providers/plainbox-provider-resource
299+ default-provider: checkbox
300 provider-checkbox:
301 interface: content
302- read:
303- - $SNAP/providers/plainbox-provider-checkbox
304+ target: $SNAP/providers/plainbox-provider-checkbox
305+ default-provider: checkbox
306 provider-snappy:
307 interface: content
308- read:
309- - $SNAP/providers/plainbox-provider-snappy
310+ target: $SNAP/providers/plainbox-provider-snappy
311+ default-provider: checkbox
312 provider-ipdt:
313 interface: content
314- read:
315- - $SNAP/providers/plainbox-provider-ipdt
316+ target: $SNAP/providers/plainbox-provider-ipdt
317+ default-provider: checkbox
318 provider-docker:
319 interface: content
320- read:
321- - $SNAP/providers/plainbox-provider-docker
322+ target: $SNAP/providers/plainbox-provider-docker
323+ default-provider: checkbox
324 provider-tpm2:
325 interface: content
326- read:
327- - $SNAP/providers/plainbox-provider-tpm2
328+ target: $SNAP/providers/plainbox-provider-tpm2
329+ default-provider: checkbox
330 provider-engineering-tests:
331 interface: content
332- read:
333- - $SNAP/providers/plainbox-provider-engineering-tests
334+ target: $SNAP/providers/plainbox-provider-engineering-tests
335+ default-provider: checkbox
336 provider-sru:
337 interface: content
338- read:
339- - $SNAP/providers/plainbox-provider-sru
340+ target: $SNAP/providers/plainbox-provider-sru
341+ default-provider: checkbox
342 provider-edgex:
343 interface: content
344- read:
345- - $SNAP/providers/checkbox-provider-edgex
346- checkbox-runtime:
347- interface: content
348- read:
349- - /
350+ target: $SNAP/providers/checkbox-provider-edgex
351+ default-provider: checkbox
352
353 apps:
354 checkbox-cli:
355@@ -69,9 +67,6 @@ apps:
356 test-runner-edgex:
357 command: bin/test-runner-edgex
358 plugs: *standard
359- python3:
360- command: python3
361- plugs: *standard
362 engineering-tests:
363 command: bin/engineering-tests
364 plugs: *standard
365@@ -90,64 +85,12 @@ apps:
366 plugs: *standard
367
368 parts:
369- fwts:
370- source-tag: ""
371- stress-ng:
372- source-tag: ""
373- after: [plainbox-provider-checkbox]
374- checkbox-support-dev:
375- source-tag: ""
376- after: [fwts]
377- checkbox-ng-dev:
378- source-tag: ""
379- plainbox-provider-resource:
380- source-tag: ""
381- after: [checkbox-support-dev, checkbox-ng-dev]
382- plainbox-provider-checkbox:
383- source-tag: ""
384- after: [plainbox-provider-resource]
385- plainbox-provider-snappy:
386- source-tag: ""
387- after: [plainbox-provider-checkbox]
388- plainbox-provider-ipdt:
389- source-tag: ""
390- after: [plainbox-provider-snappy]
391- plainbox-provider-docker:
392- source-tag: ""
393- after: [plainbox-provider-ipdt]
394- plainbox-provider-tpm2:
395- source-tag: ""
396- after: [plainbox-provider-docker]
397- plainbox-provider-sru:
398- source-tag: ""
399- after: [plainbox-provider-tpm2]
400- plainbox-provider-engineering-tests:
401- source-tag: ""
402- after: [plainbox-provider-sru]
403- checkbox-provider-edgex:
404- source-tag: ""
405- after: [plainbox-provider-engineering-tests]
406 launchers:
407 plugin: dump
408 source: launchers/
409 organize:
410 '*': bin/
411- i2c-tools:
412- plugin: nil
413- stage-packages:
414- - i2c-tools
415- prime:
416- - usr/sbin/i2cdetect
417- parts-meta-info:
418- after: [plainbox-provider-engineering-tests]
419 config-variables:
420 plugin: dump
421 source: .
422 stage: [config_vars]
423- # This module is a dependency for the job gpio/gpiomem_loopback_pairs_{model}
424- # in plainbox-provider-snappy only available in pypi and so can't be addded
425- # to stage-packages of the remote part
426- rpi-support-libs:
427- plugin: python
428- python-packages:
429- - RPi.GPIO

Subscribers

People subscribed via source and target branches