Merge lp:~blake-rouse/maas/fix-xenial-poweroff into lp:~maas-committers/maas/trunk
- fix-xenial-poweroff
- Merge into trunk
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Blake Rouse | ||||
Approved revision: | no longer in the source branch. | ||||
Merged at revision: | 4567 | ||||
Proposed branch: | lp:~blake-rouse/maas/fix-xenial-poweroff | ||||
Merge into: | lp:~maas-committers/maas/trunk | ||||
Diff against target: |
403 lines (+70/-153) 10 files modified
contrib/preseeds_v2/enlist_userdata (+7/-31) etc/maas/templates/commissioning-user-data/user_data.template (+0/-36) etc/maas/templates/commissioning-user-data/user_data_disk_erasing.template (+0/-36) etc/maas/templates/commissioning-user-data/user_data_poweroff.template (+2/-39) src/maasserver/compose_preseed.py (+21/-3) src/maasserver/tests/test_compose_preseed.py (+22/-0) src/maasserver/websockets/protocol.py (+4/-2) src/metadataserver/models/commissioningscript.py (+3/-0) src/metadataserver/models/tests/ip_addr_results.txt (+11/-5) src/metadataserver/user_data/tests/test_poweroff.py (+0/-1) |
||||
To merge this branch: | bzr merge lp:~blake-rouse/maas/fix-xenial-poweroff | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mike Pontillo (community) | Approve | ||
Review via email:
|
Commit message
Fix enlistment to work with Xenial. Fix commissioning on Xenial to ignore lxcbr0. Fix websocket protocol to work for sendError and sendNotify.
Description of the change
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Blake Rouse (blake-rouse) wrote : | # |
Yes this was tested with trusty. Disk erasing works on Trusty as well, who knows why Xenial does not work. I can't figure it out.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
MAAS Lander (maas-lander) wrote : | # |
The attempt to merge lp:~blake-rouse/maas/fix-xenial-poweroff into lp:maas failed. Below is the output from the failed tests.
Hit:1 http://
Get:2 http://
Hit:3 http://
Hit:4 http://
Hit:5 http://
Get:6 http://
Get:7 http://
Get:8 http://
Fetched 9,888 kB in 3s (2,590 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following packages were automatically installed and are no longer required:
libc-ares-dev libc-ares2 libisl13 libv8-3.14-dev libv8-3.14.5
linux-
linux-
linux-
Use 'sudo apt autoremove' to remove them.
The following packages will be upgraded:
bind9 bind9-host bind9utils dnsutils libbind9-90 libdns-export100 libdns100
libirs-export91 libisc-export95 libisc95 libisccc90 libisccfg-export90
libisccfg90 liblwres90
14 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,060 kB of archives.
After this operation, 4,096 B disk space will be freed.
Get:1 http://
Get:2 http://
Get:3 http://
Get:4 http://
Get:5 http://
Get:6 http://
Get:7 http://
Get:8 http://
Get:9 http://
Get:10 http://
Get:11 http://
Get:12 http://
Preview Diff
1 | === modified file 'contrib/preseeds_v2/enlist_userdata' | |||
2 | --- contrib/preseeds_v2/enlist_userdata 2015-11-12 13:45:09 +0000 | |||
3 | +++ contrib/preseeds_v2/enlist_userdata 2015-12-17 20:47:32 +0000 | |||
4 | @@ -25,6 +25,12 @@ | |||
5 | 25 | primary: "http://ports.ubuntu.com/ubuntu-ports" | 25 | primary: "http://ports.ubuntu.com/ubuntu-ports" |
6 | 26 | security: "http://ports.ubuntu.com/ubuntu-ports" | 26 | security: "http://ports.ubuntu.com/ubuntu-ports" |
7 | 27 | 27 | ||
8 | 28 | power_state: | ||
9 | 29 | delay: now | ||
10 | 30 | mode: poweroff | ||
11 | 31 | timeout: 1800 | ||
12 | 32 | condition: test ! -e /tmp/block-poweroff | ||
13 | 33 | |||
14 | 28 | misc_bucket: | 34 | misc_bucket: |
15 | 29 | - &maas_enlist | | 35 | - &maas_enlist | |
16 | 30 | #### IPMI setup ###### | 36 | #### IPMI setup ###### |
17 | @@ -149,40 +155,12 @@ | |||
18 | 149 | echo "sleeping 60 seconds then poweroff" | 155 | echo "sleeping 60 seconds then poweroff" |
19 | 150 | echo | 156 | echo |
20 | 151 | echo "login with '$user:$pass' to debug and disable poweroff" | 157 | echo "login with '$user:$pass' to debug and disable poweroff" |
22 | 152 | echo | 158 | echo |
23 | 153 | cat /tmp/enlist.out | 159 | cat /tmp/enlist.out |
24 | 154 | echo ============================================= | 160 | echo ============================================= |
25 | 155 | sleep 60 | 161 | sleep 60 |
26 | 156 | [ -e $bfile ] && exit 0 | 162 | [ -e $bfile ] && exit 0 |
27 | 157 | fi | 163 | fi |
28 | 158 | - &write_poweroff_job | | ||
29 | 159 | cat >/etc/init/maas-poweroff.conf <<EOF | ||
30 | 160 | description "poweroff when maas task is done" | ||
31 | 161 | start on stopped cloud-final | ||
32 | 162 | console output | ||
33 | 163 | task | ||
34 | 164 | script | ||
35 | 165 | [ ! -e /tmp/block-poweroff ] || exit 0 | ||
36 | 166 | poweroff | ||
37 | 167 | end script | ||
38 | 168 | EOF | ||
39 | 169 | # reload required due to lack of inotify in overlayfs (LP: #882147) | ||
40 | 170 | initctl reload-configuration | ||
41 | 171 | - &write_systemd_poweroff_job | | ||
42 | 172 | cat >/lib/systemd/system/maas-poweroff.service <<EOF | ||
43 | 173 | [Unit] | ||
44 | 174 | Description=Poweroff when maas task is done | ||
45 | 175 | Wants=cloud-final.service | ||
46 | 176 | After=cloud-final.service | ||
47 | 177 | ConditionPathExists=!/tmp/block-poweroff | ||
48 | 178 | |||
49 | 179 | [Service] | ||
50 | 180 | ExecStart=/sbin/poweroff | ||
51 | 181 | EOF | ||
52 | 182 | # reload required due to lack of inotify in overlayfs (LP: #882147) | ||
53 | 183 | if [ -d /run/systemd/system ]; then | ||
54 | 184 | systemctl daemon-reload | ||
55 | 185 | fi | ||
56 | 186 | 164 | ||
57 | 187 | 165 | ||
58 | 188 | 166 | ||
59 | @@ -190,5 +168,3 @@ | |||
60 | 190 | output: {all: '| tee -a /var/log/cloud-init-output.log'} | 168 | output: {all: '| tee -a /var/log/cloud-init-output.log'} |
61 | 191 | runcmd: | 169 | runcmd: |
62 | 192 | - [ sh, -c, *maas_enlist ] | 170 | - [ sh, -c, *maas_enlist ] |
63 | 193 | - [ sh, -c, *write_poweroff_job ] | ||
64 | 194 | - [ sh, -c, *write_systemd_poweroff_job ] | ||
65 | 195 | 171 | ||
66 | === modified file 'etc/maas/templates/commissioning-user-data/user_data.template' | |||
67 | --- etc/maas/templates/commissioning-user-data/user_data.template 2015-12-16 23:51:21 +0000 | |||
68 | +++ etc/maas/templates/commissioning-user-data/user_data.template 2015-12-17 20:47:32 +0000 | |||
69 | @@ -110,36 +110,6 @@ | |||
70 | 110 | exit 1 | 110 | exit 1 |
71 | 111 | } | 111 | } |
72 | 112 | 112 | ||
73 | 113 | write_upstart_poweroff_job() { | ||
74 | 114 | cat >/etc/init/maas-poweroff.conf <<EOF | ||
75 | 115 | description "poweroff when maas task is done" | ||
76 | 116 | start on stopped cloud-final | ||
77 | 117 | console output | ||
78 | 118 | task | ||
79 | 119 | script | ||
80 | 120 | [ ! -e /tmp/block-poweroff ] || exit 0 | ||
81 | 121 | poweroff | ||
82 | 122 | end script | ||
83 | 123 | EOF | ||
84 | 124 | # reload required due to lack of inotify in overlayfs (LP: #882147) | ||
85 | 125 | initctl reload-configuration | ||
86 | 126 | } | ||
87 | 127 | |||
88 | 128 | write_systemd_poweroff_job() { | ||
89 | 129 | cat >/lib/systemd/system/maas-poweroff.service <<EOF | ||
90 | 130 | [Unit] | ||
91 | 131 | Description=Poweroff when maas task is done | ||
92 | 132 | Wants=cloud-final.service | ||
93 | 133 | After=cloud-final.service | ||
94 | 134 | ConditionPathExists=!/tmp/block-poweroff | ||
95 | 135 | |||
96 | 136 | [Service] | ||
97 | 137 | ExecStart=/sbin/poweroff | ||
98 | 138 | EOF | ||
99 | 139 | # reload required due to lack of inotify in overlayfs (LP: #882147) | ||
100 | 140 | systemctl daemon-reload | ||
101 | 141 | } | ||
102 | 142 | |||
103 | 143 | write_block_poweroff() { | 113 | write_block_poweroff() { |
104 | 144 | touch /tmp/block-poweroff | 114 | touch /tmp/block-poweroff |
105 | 145 | } | 115 | } |
106 | @@ -149,12 +119,6 @@ | |||
107 | 149 | write_block_poweroff | 119 | write_block_poweroff |
108 | 150 | {{endif}} | 120 | {{endif}} |
109 | 151 | 121 | ||
110 | 152 | if [ -d /run/systemd/system ]; then | ||
111 | 153 | write_systemd_poweroff_job | ||
112 | 154 | else | ||
113 | 155 | write_upstart_poweroff_job | ||
114 | 156 | fi | ||
115 | 157 | |||
116 | 158 | # Install tools and load modules. | 122 | # Install tools and load modules. |
117 | 159 | aptget update | 123 | aptget update |
118 | 160 | aptget install python3-yaml python3-oauthlib freeipmi-tools openipmi ipmitool | 124 | aptget install python3-yaml python3-oauthlib freeipmi-tools openipmi ipmitool |
119 | 161 | 125 | ||
120 | === modified file 'etc/maas/templates/commissioning-user-data/user_data_disk_erasing.template' | |||
121 | --- etc/maas/templates/commissioning-user-data/user_data_disk_erasing.template 2015-12-16 23:51:21 +0000 | |||
122 | +++ etc/maas/templates/commissioning-user-data/user_data_disk_erasing.template 2015-12-17 20:47:32 +0000 | |||
123 | @@ -73,36 +73,6 @@ | |||
124 | 73 | exit 1 | 73 | exit 1 |
125 | 74 | } | 74 | } |
126 | 75 | 75 | ||
127 | 76 | write_upstart_poweroff_job() { | ||
128 | 77 | cat >/etc/init/maas-poweroff.conf <<EOF | ||
129 | 78 | description "poweroff when maas task is done" | ||
130 | 79 | start on stopped cloud-final | ||
131 | 80 | console output | ||
132 | 81 | task | ||
133 | 82 | script | ||
134 | 83 | [ ! -e /tmp/block-poweroff ] || exit 0 | ||
135 | 84 | poweroff | ||
136 | 85 | end script | ||
137 | 86 | EOF | ||
138 | 87 | # reload required due to lack of inotify in overlayfs (LP: #882147) | ||
139 | 88 | initctl reload-configuration | ||
140 | 89 | } | ||
141 | 90 | |||
142 | 91 | write_systemd_poweroff_job() { | ||
143 | 92 | cat >/lib/systemd/system/maas-poweroff.service <<EOF | ||
144 | 93 | [Unit] | ||
145 | 94 | Description=Poweroff when maas task is done | ||
146 | 95 | Wants=cloud-final.service | ||
147 | 96 | After=cloud-final.service | ||
148 | 97 | ConditionPathExists=!/tmp/block-poweroff | ||
149 | 98 | |||
150 | 99 | [Service] | ||
151 | 100 | ExecStart=/sbin/poweroff | ||
152 | 101 | EOF | ||
153 | 102 | # reload required due to lack of inotify in overlayfs (LP: #882147) | ||
154 | 103 | systemctl daemon-reload | ||
155 | 104 | } | ||
156 | 105 | |||
157 | 106 | erase_disks() { | 76 | erase_disks() { |
158 | 107 | for disk in `lsblk -d -n -oKNAME,TYPE,RO | grep '^\w*\s*disk\s*0' | awk {'print $1'}` | 77 | for disk in `lsblk -d -n -oKNAME,TYPE,RO | grep '^\w*\s*disk\s*0' | awk {'print $1'}` |
159 | 108 | do | 78 | do |
160 | @@ -113,12 +83,6 @@ | |||
161 | 113 | } | 83 | } |
162 | 114 | 84 | ||
163 | 115 | main() { | 85 | main() { |
164 | 116 | if [ -d /run/systemd/system ]; then | ||
165 | 117 | write_systemd_poweroff_job | ||
166 | 118 | else | ||
167 | 119 | write_upstart_poweroff_job | ||
168 | 120 | fi | ||
169 | 121 | |||
170 | 122 | # Install tools and load modules. | 86 | # Install tools and load modules. |
171 | 123 | aptget update | 87 | aptget update |
172 | 124 | aptget install python3-yaml python3-oauthlib | 88 | aptget install python3-yaml python3-oauthlib |
173 | 125 | 89 | ||
174 | === modified file 'etc/maas/templates/commissioning-user-data/user_data_poweroff.template' | |||
175 | --- etc/maas/templates/commissioning-user-data/user_data_poweroff.template 2015-12-16 23:51:21 +0000 | |||
176 | +++ etc/maas/templates/commissioning-user-data/user_data_poweroff.template 2015-12-17 20:47:32 +0000 | |||
177 | @@ -1,46 +1,9 @@ | |||
178 | 1 | #!/bin/sh | 1 | #!/bin/sh |
179 | 2 | 2 | ||
180 | 3 | #### script setup ###### | ||
181 | 4 | PATH="$BIN_D:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" | ||
182 | 5 | |||
183 | 6 | write_upstart_poweroff_job() { | ||
184 | 7 | cat >/etc/init/maas-poweroff.conf <<EOF | ||
185 | 8 | description "Power-off when MAAS task is done" | ||
186 | 9 | start on stopped cloud-final | ||
187 | 10 | console output | ||
188 | 11 | task | ||
189 | 12 | script | ||
190 | 13 | [ ! -e /tmp/block-poweroff ] || exit 0 | ||
191 | 14 | /sbin/poweroff | ||
192 | 15 | end script | ||
193 | 16 | EOF | ||
194 | 17 | # reload required due to lack of inotify in overlayfs (LP: #882147) | ||
195 | 18 | initctl reload-configuration | ||
196 | 19 | } | ||
197 | 20 | |||
198 | 21 | write_systemd_poweroff_job() { | ||
199 | 22 | cat >/lib/systemd/system/maas-poweroff.service <<EOF | ||
200 | 23 | [Unit] | ||
201 | 24 | Description=Poweroff when maas task is done | ||
202 | 25 | Wants=cloud-final.service | ||
203 | 26 | After=cloud-final.service | ||
204 | 27 | ConditionPathExists=!/tmp/block-poweroff | ||
205 | 28 | |||
206 | 29 | [Service] | ||
207 | 30 | ExecStart=/sbin/poweroff | ||
208 | 31 | EOF | ||
209 | 32 | # reload required due to lack of inotify in overlayfs (LP: #882147) | ||
210 | 33 | systemctl daemon-reload | ||
211 | 34 | } | ||
212 | 35 | |||
213 | 36 | main() { | 3 | main() { |
214 | 37 | if [ -d /run/systemd/system ]; then | ||
215 | 38 | write_systemd_poweroff_job | ||
216 | 39 | else | ||
217 | 40 | write_upstart_poweroff_job | ||
218 | 41 | fi | ||
219 | 42 | |||
220 | 43 | echo "Powering node off." | 4 | echo "Powering node off." |
221 | 5 | |||
222 | 6 | # Cloud-init will handle powering off the node. Nothing to do. | ||
223 | 44 | } | 7 | } |
224 | 45 | 8 | ||
225 | 46 | main | 9 | main |
226 | 47 | 10 | ||
227 | === modified file 'src/maasserver/compose_preseed.py' | |||
228 | --- src/maasserver/compose_preseed.py 2015-12-01 18:12:59 +0000 | |||
229 | +++ src/maasserver/compose_preseed.py 2015-12-17 20:47:32 +0000 | |||
230 | @@ -7,10 +7,14 @@ | |||
231 | 7 | 'compose_preseed', | 7 | 'compose_preseed', |
232 | 8 | ] | 8 | ] |
233 | 9 | 9 | ||
234 | 10 | from datetime import timedelta | ||
235 | 10 | from urllib.parse import urlencode | 11 | from urllib.parse import urlencode |
236 | 11 | 12 | ||
237 | 12 | from maasserver.clusterrpc.osystems import get_preseed_data | 13 | from maasserver.clusterrpc.osystems import get_preseed_data |
239 | 13 | from maasserver.enum import PRESEED_TYPE | 14 | from maasserver.enum import ( |
240 | 15 | NODE_STATUS, | ||
241 | 16 | PRESEED_TYPE, | ||
242 | 17 | ) | ||
243 | 14 | from maasserver.models.config import Config | 18 | from maasserver.models.config import Config |
244 | 15 | from maasserver.server_address import get_maas_facing_server_host | 19 | from maasserver.server_address import get_maas_facing_server_host |
245 | 16 | from maasserver.utils import absolute_reverse | 20 | from maasserver.utils import absolute_reverse |
246 | @@ -139,8 +143,13 @@ | |||
247 | 139 | """Compose the preseed value for a Commissioning node.""" | 143 | """Compose the preseed value for a Commissioning node.""" |
248 | 140 | apt_proxy = get_apt_proxy_for_node(node) | 144 | apt_proxy = get_apt_proxy_for_node(node) |
249 | 141 | metadata_url = absolute_reverse('metadata', base_url=base_url) | 145 | metadata_url = absolute_reverse('metadata', base_url=base_url) |
250 | 146 | poweroff_timeout = timedelta(hours=1).total_seconds() # 1 hour | ||
251 | 147 | if node.status == NODE_STATUS.DISK_ERASING: | ||
252 | 148 | poweroff_timeout = timedelta(days=7).total_seconds() # 1 week | ||
253 | 142 | return _compose_cloud_init_preseed( | 149 | return _compose_cloud_init_preseed( |
255 | 143 | node, token, metadata_url, base_url=base_url, apt_proxy=apt_proxy) | 150 | node, token, metadata_url, base_url=base_url, apt_proxy=apt_proxy, |
256 | 151 | poweroff=True, poweroff_timeout=int(poweroff_timeout), | ||
257 | 152 | poweroff_condition="test ! -e /tmp/block-poweroff") | ||
258 | 144 | 153 | ||
259 | 145 | 154 | ||
260 | 146 | def compose_curtin_preseed(node, token, base_url=''): | 155 | def compose_curtin_preseed(node, token, base_url=''): |
261 | @@ -152,7 +161,8 @@ | |||
262 | 152 | 161 | ||
263 | 153 | 162 | ||
264 | 154 | def _compose_cloud_init_preseed( | 163 | def _compose_cloud_init_preseed( |
266 | 155 | node, token, metadata_url, base_url, apt_proxy=None): | 164 | node, token, metadata_url, base_url, apt_proxy=None, |
267 | 165 | poweroff=False, poweroff_timeout=3600, poweroff_condition=None): | ||
268 | 156 | cloud_config = { | 166 | cloud_config = { |
269 | 157 | 'datasource': { | 167 | 'datasource': { |
270 | 158 | 'MAAS': { | 168 | 'MAAS': { |
271 | @@ -179,6 +189,14 @@ | |||
272 | 179 | cloud_config.update(get_system_info()) | 189 | cloud_config.update(get_system_info()) |
273 | 180 | if apt_proxy: | 190 | if apt_proxy: |
274 | 181 | cloud_config['apt_proxy'] = apt_proxy | 191 | cloud_config['apt_proxy'] = apt_proxy |
275 | 192 | if poweroff: | ||
276 | 193 | cloud_config['power_state'] = { | ||
277 | 194 | 'delay': 'now', | ||
278 | 195 | 'mode': 'poweroff', | ||
279 | 196 | 'timeout': poweroff_timeout, | ||
280 | 197 | } | ||
281 | 198 | if poweroff_condition is not None: | ||
282 | 199 | cloud_config['power_state']['condition'] = poweroff_condition | ||
283 | 182 | return "#cloud-config\n%s" % yaml.safe_dump(cloud_config) | 200 | return "#cloud-config\n%s" % yaml.safe_dump(cloud_config) |
284 | 183 | 201 | ||
285 | 184 | 202 | ||
286 | 185 | 203 | ||
287 | === modified file 'src/maasserver/tests/test_compose_preseed.py' | |||
288 | --- src/maasserver/tests/test_compose_preseed.py 2015-12-01 18:12:59 +0000 | |||
289 | +++ src/maasserver/tests/test_compose_preseed.py 2015-12-17 20:47:32 +0000 | |||
290 | @@ -132,6 +132,28 @@ | |||
291 | 132 | absolute_reverse('metadata-status', args=[node.system_id]), | 132 | absolute_reverse('metadata-status', args=[node.system_id]), |
292 | 133 | preseed['reporting']['maas']['endpoint']) | 133 | preseed['reporting']['maas']['endpoint']) |
293 | 134 | 134 | ||
294 | 135 | def test_compose_preseed_for_commissioning_includes_poweroff(self): | ||
295 | 136 | node = factory.make_Node(status=NODE_STATUS.COMMISSIONING) | ||
296 | 137 | preseed = yaml.safe_load( | ||
297 | 138 | compose_preseed(PRESEED_TYPE.COMMISSIONING, node)) | ||
298 | 139 | self.assertEquals({ | ||
299 | 140 | 'delay': 'now', | ||
300 | 141 | 'mode': 'poweroff', | ||
301 | 142 | 'timeout': 3600, | ||
302 | 143 | 'condition': 'test ! -e /tmp/block-poweroff', | ||
303 | 144 | }, preseed['power_state']) | ||
304 | 145 | |||
305 | 146 | def test_compose_preseed_for_disk_erasing_includes_poweroff(self): | ||
306 | 147 | node = factory.make_Node(status=NODE_STATUS.DISK_ERASING) | ||
307 | 148 | preseed = yaml.safe_load( | ||
308 | 149 | compose_preseed(PRESEED_TYPE.COMMISSIONING, node)) | ||
309 | 150 | self.assertEquals({ | ||
310 | 151 | 'delay': 'now', | ||
311 | 152 | 'mode': 'poweroff', | ||
312 | 153 | 'timeout': 604800, | ||
313 | 154 | 'condition': 'test ! -e /tmp/block-poweroff', | ||
314 | 155 | }, preseed['power_state']) | ||
315 | 156 | |||
316 | 135 | def test_compose_preseed_includes_node_oauth_token(self): | 157 | def test_compose_preseed_includes_node_oauth_token(self): |
317 | 136 | node = factory.make_Node(status=NODE_STATUS.READY) | 158 | node = factory.make_Node(status=NODE_STATUS.READY) |
318 | 137 | node.nodegroup.accept() | 159 | node.nodegroup.accept() |
319 | 138 | 160 | ||
320 | === modified file 'src/maasserver/websockets/protocol.py' | |||
321 | --- src/maasserver/websockets/protocol.py 2015-12-15 22:44:22 +0000 | |||
322 | +++ src/maasserver/websockets/protocol.py 2015-12-17 20:47:32 +0000 | |||
323 | @@ -324,7 +324,8 @@ | |||
324 | 324 | "rtype": RESPONSE_TYPE.ERROR, | 324 | "rtype": RESPONSE_TYPE.ERROR, |
325 | 325 | "error": error, | 325 | "error": error, |
326 | 326 | } | 326 | } |
328 | 327 | self.transport.write(json.dumps(error_msg).encode("utf-8")) | 327 | self.transport.write( |
329 | 328 | json.dumps(error_msg, default=self._json_encode).encode("ascii")) | ||
330 | 328 | return None | 329 | return None |
331 | 329 | 330 | ||
332 | 330 | def sendNotify(self, name, action, data): | 331 | def sendNotify(self, name, action, data): |
333 | @@ -335,7 +336,8 @@ | |||
334 | 335 | "action": action, | 336 | "action": action, |
335 | 336 | "data": data, | 337 | "data": data, |
336 | 337 | } | 338 | } |
338 | 338 | self.transport.write(json.dumps(notify_msg).encode("utf-8")) | 339 | self.transport.write( |
339 | 340 | json.dumps(notify_msg, default=self._json_encode).encode("ascii")) | ||
340 | 339 | 341 | ||
341 | 340 | def buildHandler(self, handler_class): | 342 | def buildHandler(self, handler_class): |
342 | 341 | """Return an initialised instance of `handler_class`.""" | 343 | """Return an initialised instance of `handler_class`.""" |
343 | 342 | 344 | ||
344 | === modified file 'src/metadataserver/models/commissioningscript.py' | |||
345 | --- src/metadataserver/models/commissioningscript.py 2015-12-16 18:07:33 +0000 | |||
346 | +++ src/metadataserver/models/commissioningscript.py 2015-12-17 20:47:32 +0000 | |||
347 | @@ -178,6 +178,9 @@ | |||
348 | 178 | # Ignore loopback interfaces. | 178 | # Ignore loopback interfaces. |
349 | 179 | if link_mac is None: | 179 | if link_mac is None: |
350 | 180 | continue | 180 | continue |
351 | 181 | # Ignore lxcbr0 which is created by default on Xenial+. | ||
352 | 182 | elif link['name'] == 'lxcbr0': | ||
353 | 183 | continue | ||
354 | 181 | else: | 184 | else: |
355 | 182 | ifname = link['name'] | 185 | ifname = link['name'] |
356 | 183 | try: | 186 | try: |
357 | 184 | 187 | ||
358 | === modified file 'src/metadataserver/models/tests/ip_addr_results.txt' | |||
359 | --- src/metadataserver/models/tests/ip_addr_results.txt 2015-07-16 08:30:38 +0000 | |||
360 | +++ src/metadataserver/models/tests/ip_addr_results.txt 2015-12-17 20:47:32 +0000 | |||
361 | @@ -2,21 +2,27 @@ | |||
362 | 2 | link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 | 2 | link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 |
363 | 3 | inet 127.0.0.1/8 scope host lo | 3 | inet 127.0.0.1/8 scope host lo |
364 | 4 | valid_lft forever preferred_lft forever | 4 | valid_lft forever preferred_lft forever |
366 | 5 | inet6 ::1/128 scope host | 5 | inet6 ::1/128 scope host |
367 | 6 | valid_lft forever preferred_lft forever | 6 | valid_lft forever preferred_lft forever |
368 | 7 | 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 | 7 | 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 |
369 | 8 | link/ether 00:00:00:00:00:01 brd ff:ff:ff:ff:ff:ff | 8 | link/ether 00:00:00:00:00:01 brd ff:ff:ff:ff:ff:ff |
370 | 9 | inet 192.168.0.3/24 brd 192.168.0.255 scope global eth0 | 9 | inet 192.168.0.3/24 brd 192.168.0.255 scope global eth0 |
371 | 10 | valid_lft forever preferred_lft forever | 10 | valid_lft forever preferred_lft forever |
375 | 11 | inet6 fe80::3e97:efe:fe0e:56dc/64 scope link | 11 | inet6 fe80::3e97:efe:fe0e:56dc/64 scope link |
376 | 12 | valid_lft forever preferred_lft forever | 12 | valid_lft forever preferred_lft forever |
377 | 13 | inet6 2001:db8:a::123/64 scope link | 13 | inet6 2001:db8:a::123/64 scope link |
378 | 14 | valid_lft forever preferred_lft forever | 14 | valid_lft forever preferred_lft forever |
379 | 15 | 3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000 | 15 | 3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000 |
380 | 16 | link/ether 00:00:00:00:00:02 brd ff:ff:ff:ff:ff:ff | 16 | link/ether 00:00:00:00:00:02 brd ff:ff:ff:ff:ff:ff |
381 | 17 | inet 172.17.42.1/16 scope global eth1 | 17 | inet 172.17.42.1/16 scope global eth1 |
382 | 18 | valid_lft forever preferred_lft forever | 18 | valid_lft forever preferred_lft forever |
384 | 19 | 3: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000 | 19 | 4: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000 |
385 | 20 | link/ether 00:00:00:00:00:03 brd ff:ff:ff:ff:ff:ff | 20 | link/ether 00:00:00:00:00:03 brd ff:ff:ff:ff:ff:ff |
386 | 21 | inet 172.17.12.1/16 scope global eth2 | 21 | inet 172.17.12.1/16 scope global eth2 |
387 | 22 | valid_lft forever preferred_lft forever | 22 | valid_lft forever preferred_lft forever |
388 | 23 | 5: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 | ||
389 | 24 | link/ether 00:00:00:00:00:04 brd ff:ff:ff:ff:ff:ff | ||
390 | 25 | inet 10.0.3.1/24 scope global lxcbr0 | ||
391 | 26 | valid_lft forever preferred_lft forever | ||
392 | 27 | inet6 fe80::e477:64ff:fec5:25a3/64 scope link | ||
393 | 28 | valid_lft forever preferred_lft forever | ||
394 | 23 | 29 | ||
395 | === modified file 'src/metadataserver/user_data/tests/test_poweroff.py' | |||
396 | --- src/metadataserver/user_data/tests/test_poweroff.py 2015-12-02 23:30:15 +0000 | |||
397 | +++ src/metadataserver/user_data/tests/test_poweroff.py 2015-12-17 20:47:32 +0000 | |||
398 | @@ -43,5 +43,4 @@ | |||
399 | 43 | self.assertThat( | 43 | self.assertThat( |
400 | 44 | base64.b64decode(user_data_script.get_payload()), ContainsAll({ | 44 | base64.b64decode(user_data_script.get_payload()), ContainsAll({ |
401 | 45 | b'Powering node off', | 45 | b'Powering node off', |
402 | 46 | b'poweroff', | ||
403 | 47 | })) | 46 | })) |
Elegant. Looks good, assuming you also tested on trusty.