Merge ~aittner/charms/+source/scalebot-autopkgtest:add-autopkgtest-charm into ~ce-hyperscale/charms/+source/scalebot-autopkgtest:master

Proposed by Alexandre Erwin Ittner
Status: Merged
Approved by: Andrew Cloke
Approved revision: 8daa3eeeb36d8df75d373a333d88d367cf691e7f
Merged at revision: 8daa3eeeb36d8df75d373a333d88d367cf691e7f
Proposed branch: ~aittner/charms/+source/scalebot-autopkgtest:add-autopkgtest-charm
Merge into: ~ce-hyperscale/charms/+source/scalebot-autopkgtest:master
Diff against target: 538 lines (+490/-0)
8 files modified
README.md (+82/-0)
actions.yaml (+7/-0)
actions/run-test (+31/-0)
config.yaml (+1/-0)
icon.svg (+292/-0)
layer.yaml (+5/-0)
metadata.yaml (+18/-0)
reactive/autopkgtest.py (+54/-0)
Reviewer Review Type Date Requested Status
dann frazier Approve
Review via email: mp+374850@code.launchpad.net
To post a comment you must log in.
Revision history for this message
dann frazier (dannf) wrote :

This looks awesome, thanks Alexandre!

A few comments inline - and one nit about the name, this charm isn't really glued to scalebot at all AFAICT, so I'd suggest we just call it autopkgtest or similar.

Revision history for this message
dann frazier (dannf) wrote :

Nice! I added a couple of very minor comments from check tools - incorporate as you see fit. I followed the steps in your README and it worked perfectly (on lakitu w/ lxd cloud). +1.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/README.md b/README.md
0new file mode 1006440new file mode 100644
index 0000000..aa2aa31
--- /dev/null
+++ b/README.md
@@ -0,0 +1,82 @@
1# Overview
2
3This charm is a thin automation layer to run DEP8 tests in a target environment.
4
5This charm will deploy a basic environment to run DEP8 tests (with autopkgtest) on the target MAAS-provisioned machine, VM or container. Packages will be build and run in the target itself to improve test coverage.
6
7Basic idea is to reuse the tests already available in the Debian packages to validate new hardware configurations and run these tests in existing infrastructure while using Juju to abstract the nature of the target environment. It will not matter, for the charm, if the test is running in a VM or in bare metal, but the intention is run them on metal to minimize the interference of virtualization providers on test results.
8
9The test run directly on the target environment using the "null" autopkgtest virtualization provider and it is assumed the environment is "disposable", i.e. it will released or recreated once the tests are finished.
10
11
12
13# Usage
14
15This charm is intended to be deployed and used through test automation but, in development enviroments, the deployment procedure is:
16
17- Install the charm with
18```$ juju deploy cs:~ce-hyperscale/autopkgtest testbed1```.
19Notice that this example assumes a testbed named "testbed1".
20
21- Run a test with the Juju action ``run-test``, passing the Debian package name in argument ``pkgname``:
22
23 $ juju run-action testbed1/0 run-test pkgname=nginx
24 Action queued with id: d13d1822-724f-4719-8ed1-35dd0d124474
25
26- Use the action-id to check if the execution is already finished:
27
28 $ juju show-action-status d13d1822-724f-4719-8ed1-35dd0d124474
29 actions:
30 - action: run-test
31 completed at: n/a
32 id: d13d1822-724f-4719-8ed1-35dd0d124474
33 status: running
34 unit: testbed1/0
35
36- Use ``juju debug-log`` to see the outputs of the test (stdout and stderr) in realtime;
37
38- Once the test is finished, grab the output with:
39
40 $ juju show-action-output d13d1822-724f-4719-8ed1-35dd0d124474
41 results:
42 output-file: /tmp/test-nginx-kz6TT/output.txt
43 retcode: "0"
44 summary-file: /tmp/test-nginx-kz6TT/summary.txt
45 status: completed
46 timing:
47 completed: 2019-10-22 21:54:33 +0000 UTC
48 enqueued: 2019-10-22 21:48:01 +0000 UTC
49 started: 2019-10-22 21:48:06 +0000 UTC
50
51Optionally, run the action with the "--wait" command line switch. This spares the user from polling the test state, but blocks the Juju client process.
52
53
54## Interpreting outputs
55
56The exit code returned by ``autopkgtest`` will be saved in variable ``retcode`` (see autpkgtest manpage for more information on it meaning). This only happens if ``autopkgtest`` gets a chance to run and won't be created if the test script fails before this step.
57
58Variables ``summary`` and ``output`` will have paths to files containing the summary of the test results and a copy of stdout and stderr of the test execution. Use ``juju ssh`` to see their contents or copy them to the host machine.
59
60 $ juju ssh testbed1/0 cat /tmp/test-nginx-kz6TT/summary.txt
61 light-simple PASS
62 core-simple PASS
63 lua PASS
64 full-simple PASS
65 extras-simple PASS
66 full-module-deps PASS
67 light-module-deps PASS
68 core-module-deps PASS
69 extras-module-deps PASS
70 Connection to 10.214.19.195 closed.
71
72Notice that file output.txt can be pretty large.
73
74
75
76
77# Known Limitations and Issues
78
79- Some tests may refuse to run in containers;
80
81- Autopkgtest has a protection against running tests that can break the testbed (restriction ``breaks-testbed``). It does not matter for us as the target will be recreated anyway, but these tests will require patching to force them to run.
82
diff --git a/actions.yaml b/actions.yaml
0new file mode 10064483new file mode 100644
index 0000000..a77ee65
--- /dev/null
+++ b/actions.yaml
@@ -0,0 +1,7 @@
1run-test:
2 description: Run autopkgtest for a single package.
3 params:
4 pkgname:
5 type: string
6 description: Name of the Debian package to test.
7 required: [pkgname]
diff --git a/actions/run-test b/actions/run-test
0new file mode 1007558new file mode 100755
index 0000000..1ee6857
--- /dev/null
+++ b/actions/run-test
@@ -0,0 +1,31 @@
1#!/bin/sh
2
3set -e
4
5PKGNAME=$(action-get pkgname)
6BASEDIR=$(mktemp -d /tmp/test-$PKGNAME-XXXXX)
7
8OUTFILE=$BASEDIR/output.txt
9action-set output-file="$OUTFILE"
10
11SUMMARY=$BASEDIR/summary.txt
12action-set summary-file="$SUMMARY"
13
14touch $OUTFILE $SUMMARY
15chmod a+r $OUTFILE $SUMMARY
16chmod a+x $BASEDIR
17
18mkdir $BASEDIR/tmp
19cd $BASEDIR/tmp
20
21{
22 echo "===== AUTOPKGTEST CHARM TEST STARTING: $PKGNAME ====="
23 set +e
24 autopkgtest --summary-file=$SUMMARY -B $PKGNAME -- null
25 TESTRC=$?
26 action-set retcode="$TESTRC"
27 echo "===== AUTOPKGTEST CHARM TEST FINISHED: $PKGNAME ====="
28} 2>&1 | tee $OUTFILE
29
30rm -rf $BASEDIR/tmp
31exit $TESTRC
diff --git a/config.yaml b/config.yaml
0new file mode 10064432new file mode 100644
index 0000000..7e66e9c
--- /dev/null
+++ b/config.yaml
@@ -0,0 +1 @@
1options: { }
diff --git a/icon.svg b/icon.svg
0new file mode 1006442new file mode 100644
index 0000000..559154b
--- /dev/null
+++ b/icon.svg
@@ -0,0 +1,292 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:xlink="http://www.w3.org/1999/xlink"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="96"
14 height="96"
15 id="svg6517"
16 version="1.1"
17 inkscape:version="0.92.3 (2405546, 2018-03-11)"
18 sodipodi:docname="icon.svg">
19 <defs
20 id="defs6519">
21 <linearGradient
22 inkscape:collect="always"
23 xlink:href="#Background"
24 id="linearGradient6461"
25 gradientUnits="userSpaceOnUse"
26 x1="0"
27 y1="970.29498"
28 x2="144"
29 y2="970.29498"
30 gradientTransform="matrix(0,-0.66666669,0.6660448,0,-866.25992,731.29077)" />
31 <linearGradient
32 id="Background">
33 <stop
34 id="stop4178"
35 offset="0"
36 style="stop-color:#b8b8b8;stop-opacity:1" />
37 <stop
38 id="stop4180"
39 offset="1"
40 style="stop-color:#c9c9c9;stop-opacity:1" />
41 </linearGradient>
42 <filter
43 style="color-interpolation-filters:sRGB;"
44 inkscape:label="Inner Shadow"
45 id="filter1121">
46 <feFlood
47 flood-opacity="0.59999999999999998"
48 flood-color="rgb(0,0,0)"
49 result="flood"
50 id="feFlood1123" />
51 <feComposite
52 in="flood"
53 in2="SourceGraphic"
54 operator="out"
55 result="composite1"
56 id="feComposite1125" />
57 <feGaussianBlur
58 in="composite1"
59 stdDeviation="1"
60 result="blur"
61 id="feGaussianBlur1127" />
62 <feOffset
63 dx="0"
64 dy="2"
65 result="offset"
66 id="feOffset1129" />
67 <feComposite
68 in="offset"
69 in2="SourceGraphic"
70 operator="atop"
71 result="composite2"
72 id="feComposite1131" />
73 </filter>
74 <filter
75 style="color-interpolation-filters:sRGB;"
76 inkscape:label="Drop Shadow"
77 id="filter950">
78 <feFlood
79 flood-opacity="0.25"
80 flood-color="rgb(0,0,0)"
81 result="flood"
82 id="feFlood952" />
83 <feComposite
84 in="flood"
85 in2="SourceGraphic"
86 operator="in"
87 result="composite1"
88 id="feComposite954" />
89 <feGaussianBlur
90 in="composite1"
91 stdDeviation="1"
92 result="blur"
93 id="feGaussianBlur956" />
94 <feOffset
95 dx="0"
96 dy="1"
97 result="offset"
98 id="feOffset958" />
99 <feComposite
100 in="SourceGraphic"
101 in2="offset"
102 operator="over"
103 result="composite2"
104 id="feComposite960" />
105 </filter>
106 <clipPath
107 clipPathUnits="userSpaceOnUse"
108 id="clipPath873">
109 <g
110 transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
111 id="g875"
112 inkscape:label="Layer 1"
113 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
114 <path
115 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
116 d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
117 id="path877"
118 inkscape:connector-curvature="0"
119 sodipodi:nodetypes="sssssssss" />
120 </g>
121 </clipPath>
122 <filter
123 inkscape:collect="always"
124 id="filter891"
125 inkscape:label="Badge Shadow">
126 <feGaussianBlur
127 inkscape:collect="always"
128 stdDeviation="0.71999962"
129 id="feGaussianBlur893" />
130 </filter>
131 </defs>
132 <sodipodi:namedview
133 id="base"
134 pagecolor="#ffffff"
135 bordercolor="#666666"
136 borderopacity="1.0"
137 inkscape:pageopacity="0.0"
138 inkscape:pageshadow="2"
139 inkscape:zoom="1.0186341"
140 inkscape:cx="176.12112"
141 inkscape:cy="-118.41312"
142 inkscape:document-units="px"
143 inkscape:current-layer="text150"
144 showgrid="true"
145 fit-margin-top="0"
146 fit-margin-left="0"
147 fit-margin-right="0"
148 fit-margin-bottom="0"
149 inkscape:window-width="1920"
150 inkscape:window-height="1016"
151 inkscape:window-x="0"
152 inkscape:window-y="27"
153 inkscape:window-maximized="1"
154 showborder="true"
155 showguides="true"
156 inkscape:guide-bbox="true"
157 inkscape:showpageshadow="false">
158 <inkscape:grid
159 type="xygrid"
160 id="grid821" />
161 <sodipodi:guide
162 orientation="1,0"
163 position="16,48"
164 id="guide823"
165 inkscape:locked="false" />
166 <sodipodi:guide
167 orientation="0,1"
168 position="64,80"
169 id="guide825"
170 inkscape:locked="false" />
171 <sodipodi:guide
172 orientation="1,0"
173 position="80,40"
174 id="guide827"
175 inkscape:locked="false" />
176 <sodipodi:guide
177 orientation="0,1"
178 position="64,16"
179 id="guide829"
180 inkscape:locked="false" />
181 </sodipodi:namedview>
182 <metadata
183 id="metadata6522">
184 <rdf:RDF>
185 <cc:Work
186 rdf:about="">
187 <dc:format>image/svg+xml</dc:format>
188 <dc:type
189 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
190 <dc:title />
191 </cc:Work>
192 </rdf:RDF>
193 </metadata>
194 <g
195 inkscape:label="BACKGROUND"
196 inkscape:groupmode="layer"
197 id="layer1"
198 transform="translate(268,-635.29076)"
199 style="display:inline">
200 <path
201 style="fill:url(#linearGradient6461);fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
202 d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 C -264.11215,731.29077 -268,727.39888 -268,700.15563 Z"
203 id="path6455"
204 inkscape:connector-curvature="0"
205 sodipodi:nodetypes="sssssssss" />
206 <g
207 aria-label="8"
208 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:74.66666412px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
209 id="text150">
210 <path
211 d="m -229.41907,679.75616 q -5.10937,-2.15625 -7.45312,-5.90625 -2.29688,-3.79687 -2.29688,-8.29687 0,-7.6875 5.34375,-12.70313 5.39063,-5.01562 15.28125,-5.01562 9.79688,0 15.1875,5.01562 5.4375,5.01563 5.4375,12.70313 0,4.78125 -2.48437,8.53125 -2.48438,3.70312 -6.98438,5.67187 5.71875,2.29688 8.67188,6.70313 3,4.40625 3,10.17187 0,9.51563 -6.09375,15.46875 -6.04688,5.95313 -16.125,5.95313 -9.375,0 -15.60938,-4.92188 -7.35937,-5.8125 -7.35937,-15.9375 0,-5.57812 2.76562,-10.21875 2.76563,-4.6875 8.71875,-7.21875 z m 2.71875,-13.26562 q 0,3.9375 2.20313,6.14062 2.25,2.20313 5.95312,2.20313 3.75,0 6,-2.20313 2.25,-2.25 2.25,-6.1875 0,-3.70312 -2.25,-5.90625 -2.20312,-2.25 -5.85937,-2.25 -3.79688,0 -6.04688,2.25 -2.25,2.25 -2.25,5.95313 z m -1.21875,29.4375 q 0,5.4375 2.76563,8.48437 2.8125,3.04688 6.98437,3.04688 4.07813,0 6.75,-2.90625 2.67188,-2.95313 2.67188,-8.48438 0,-4.82812 -2.71875,-7.73437 -2.71875,-2.95313 -6.89063,-2.95313 -4.82812,0 -7.21875,3.32813 -2.34375,3.32812 -2.34375,7.21875 z"
212 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:96px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#ff0000;stroke:#000000;stroke-width:0.60000002;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
213 id="path959" />
214 </g>
215 </g>
216 <g
217 inkscape:groupmode="layer"
218 id="layer3"
219 inkscape:label="PLACE YOUR PICTOGRAM HERE"
220 style="display:inline" />
221 <g
222 inkscape:groupmode="layer"
223 id="layer2"
224 inkscape:label="BADGE"
225 style="display:none"
226 sodipodi:insensitive="true">
227 <g
228 style="display:inline"
229 transform="translate(-340.00001,-581)"
230 id="g4394"
231 clip-path="none">
232 <g
233 id="g855">
234 <g
235 inkscape:groupmode="maskhelper"
236 id="g870"
237 clip-path="url(#clipPath873)"
238 style="opacity:0.6;filter:url(#filter891)">
239 <path
240 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
241 d="m 264,552.36218 a 12,12 0 0 1 -12,12 12,12 0 0 1 -12,-12 12,12 0 0 1 12,-12 12,12 0 0 1 12,12 z"
242 sodipodi:ry="12"
243 sodipodi:rx="12"
244 sodipodi:cy="552.36218"
245 sodipodi:cx="252"
246 id="path844"
247 style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
248 sodipodi:type="arc" />
249 </g>
250 <g
251 id="g862">
252 <path
253 sodipodi:type="arc"
254 style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
255 id="path4398"
256 sodipodi:cx="252"
257 sodipodi:cy="552.36218"
258 sodipodi:rx="12"
259 sodipodi:ry="12"
260 d="m 264,552.36218 a 12,12 0 0 1 -12,12 12,12 0 0 1 -12,-12 12,12 0 0 1 12,-12 12,12 0 0 1 12,12 z"
261 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
262 <path
263 transform="matrix(1.25,0,0,1.25,33,-100.45273)"
264 d="m 264,552.36218 a 12,12 0 0 1 -12,12 12,12 0 0 1 -12,-12 12,12 0 0 1 12,-12 12,12 0 0 1 12,12 z"
265 sodipodi:ry="12"
266 sodipodi:rx="12"
267 sodipodi:cy="552.36218"
268 sodipodi:cx="252"
269 id="path4400"
270 style="color:#000000;fill:#dd4814;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
271 sodipodi:type="arc" />
272 <path
273 sodipodi:type="star"
274 style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
275 id="path4459"
276 sodipodi:sides="5"
277 sodipodi:cx="666.19574"
278 sodipodi:cy="589.50385"
279 sodipodi:r1="7.2431178"
280 sodipodi:r2="4.3458705"
281 sodipodi:arg1="1.0471976"
282 sodipodi:arg2="1.6755161"
283 inkscape:flatsided="false"
284 inkscape:rounded="0.1"
285 inkscape:randomized="0"
286 d="m 669.8173,595.77657 c -0.39132,0.22593 -3.62645,-1.90343 -4.07583,-1.95066 -0.44938,-0.0472 -4.05653,1.36297 -4.39232,1.06062 -0.3358,-0.30235 0.68963,-4.03715 0.59569,-4.47913 -0.0939,-0.44198 -2.5498,-3.43681 -2.36602,-3.8496 0.18379,-0.41279 4.05267,-0.59166 4.44398,-0.81759 0.39132,-0.22593 2.48067,-3.48704 2.93005,-3.4398 0.44938,0.0472 1.81505,3.67147 2.15084,3.97382 0.3358,0.30236 4.08294,1.2817 4.17689,1.72369 0.0939,0.44198 -2.9309,2.86076 -3.11469,3.27355 -0.18379,0.41279 0.0427,4.27917 -0.34859,4.5051 z"
287 transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
288 </g>
289 </g>
290 </g>
291 </g>
292</svg>
diff --git a/layer.yaml b/layer.yaml
0new file mode 100644293new file mode 100644
index 0000000..6581470
--- /dev/null
+++ b/layer.yaml
@@ -0,0 +1,5 @@
1includes: ['layer:basic'] # if you use any interfaces, add them here
2
3options:
4 basic:
5 packages: ['autopkgtest', 'dpkg-dev']
diff --git a/metadata.yaml b/metadata.yaml
0new file mode 1006446new file mode 100644
index 0000000..11dde37
--- /dev/null
+++ b/metadata.yaml
@@ -0,0 +1,18 @@
1name: autopkgtest
2summary: Run DEP8 tests on Juju infrastructure
3maintainer: Canonical Server and Hardware Enablement Team <canonical-hyperscale-team@lists.canonical.com>
4description: |
5 This charm will deploy a basic environment to run DEP8 tests (with
6 autopkgtest) on the target machine, VM or container. Basic idea is to
7 reuse the tests already available in the packages and run them, using
8 Juju to automate target selection and deployment. It is assumed the
9 target environment is "disposable", i.e. it will released or recreated
10 once the tests are finished.
11
12series:
13 - xenial
14 - bionic
15 - eoan
16tags:
17 - ops
18 - misc
diff --git a/reactive/autopkgtest.py b/reactive/autopkgtest.py
0new file mode 10064419new file mode 100644
index 0000000..beb31b8
--- /dev/null
+++ b/reactive/autopkgtest.py
@@ -0,0 +1,54 @@
1import os
2import subprocess
3
4from charmhelpers.core.hookenv import log, status_set
5from charms.reactive import (hook, when, when_not, when_any, set_flag,
6 set_state, remove_state)
7
8APT_SOURCE_FNAME = "/etc/apt/sources.list.d/charm-autopkgtest.list"
9
10
11def apt_update():
12 subprocess.run(["apt-get", "-y", "update"], check=True)
13
14
15def get_release_codename():
16 with os.popen("lsb_release -cs") as fp:
17 return fp.read().strip()
18
19
20def add_apt_sources():
21 """Add an APT source list with the required packages.
22
23 This may duplicate some existing entries, but apt seems to handle
24 this situation pretty well.
25 """
26
27 codename = get_release_codename()
28 channels = "main universe restricted"
29 with open(APT_SOURCE_FNAME, "w") as fp:
30 fp.write("deb-src http://archive.ubuntu.com/ubuntu %s %s\n"
31 % (codename, channels))
32 fp.write("deb-src http://security.ubuntu.com/ubuntu %s-security %s\n"
33 % (codename, channels))
34 apt_update()
35
36
37def remove_apt_sources():
38 try:
39 os.unlink(APT_SOURCE_FNAME)
40 except FileNotFoundError:
41 # Ignore non-existing files.
42 pass
43 apt_update()
44
45
46@when_not('autopkgtest.ready')
47def autopkgtest_ready():
48 try:
49 add_apt_sources()
50 except subprocess.CalledProcessError:
51 status_set('blocked', "Failed to install dependencies")
52 else:
53 status_set('active', 'ready')
54 set_flag('autopkgtest.ready')

Subscribers

People subscribed via source and target branches