Merge lp:~blake-rouse/maas/fix-xenial-poweroff into lp:~maas-committers/maas/trunk

Proposed by Blake Rouse
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
Reviewer Review Type Date Requested Status
Mike Pontillo (community) Approve
Review via email: mp+280914@code.launchpad.net

Commit message

Fix enlistment to work with Xenial. Fix commissioning on Xenial to ignore lxcbr0. Fix websocket protocol to work for sendError and sendNotify.

To post a comment you must log in.
Revision history for this message
Mike Pontillo (mpontillo) wrote :

 Elegant. Looks good, assuming you also tested on trusty.

review: Approve
Revision history for this message
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.

Revision history for this message
MAAS Lander (maas-lander) wrote :
Download full text (1.0 MiB)

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://security.ubuntu.com/ubuntu xenial-security InRelease
Get:2 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial InRelease [227 kB]
Hit:3 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial-updates InRelease
Hit:4 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial-backports InRelease
Hit:5 http://ppa.launchpad.net/maas-maintainers/experimental3/ubuntu xenial InRelease
Get:6 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main Sources [1,121 kB]
Get:7 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 Packages [1,462 kB]
Get:8 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages [7,078 kB]
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-headers-4.3.0-1 linux-headers-4.3.0-1-generic
  linux-image-4.2.0-18-generic linux-image-4.3.0-1-generic
  linux-image-extra-4.3.0-1-generic python-twisted-lore
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://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 libisc-export95 amd64 1:9.9.5.dfsg-12.1 [120 kB]
Get:2 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 libdns-export100 amd64 1:9.9.5.dfsg-12.1 [427 kB]
Get:3 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 libisccfg-export90 amd64 1:9.9.5.dfsg-12.1 [19.9 kB]
Get:4 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 libirs-export91 amd64 1:9.9.5.dfsg-12.1 [17.2 kB]
Get:5 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 bind9-host amd64 1:9.9.5.dfsg-12.1 [46.2 kB]
Get:6 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 dnsutils amd64 1:9.9.5.dfsg-12.1 [96.2 kB]
Get:7 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 bind9 amd64 1:9.9.5.dfsg-12.1 [287 kB]
Get:8 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 libisc95 amd64 1:9.9.5.dfsg-12.1 [147 kB]
Get:9 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 libisccc90 amd64 1:9.9.5.dfsg-12.1 [15.5 kB]
Get:10 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 libisccfg90 amd64 1:9.9.5.dfsg-12.1 [36.2 kB]
Get:11 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 liblwres90 amd64 1:9.9.5.dfsg-12.1 [32.5 kB]
Get:12 http://prodstack-zone-1.clouds.archive.ubuntu.com/ubunt...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'contrib/preseeds_v2/enlist_userdata'
--- contrib/preseeds_v2/enlist_userdata 2015-11-12 13:45:09 +0000
+++ contrib/preseeds_v2/enlist_userdata 2015-12-17 20:47:32 +0000
@@ -25,6 +25,12 @@
25 primary: "http://ports.ubuntu.com/ubuntu-ports"25 primary: "http://ports.ubuntu.com/ubuntu-ports"
26 security: "http://ports.ubuntu.com/ubuntu-ports"26 security: "http://ports.ubuntu.com/ubuntu-ports"
2727
28power_state:
29 delay: now
30 mode: poweroff
31 timeout: 1800
32 condition: test ! -e /tmp/block-poweroff
33
28misc_bucket:34misc_bucket:
29 - &maas_enlist |35 - &maas_enlist |
30 #### IPMI setup ######36 #### IPMI setup ######
@@ -149,40 +155,12 @@
149 echo "sleeping 60 seconds then poweroff"155 echo "sleeping 60 seconds then poweroff"
150 echo156 echo
151 echo "login with '$user:$pass' to debug and disable poweroff"157 echo "login with '$user:$pass' to debug and disable poweroff"
152 echo 158 echo
153 cat /tmp/enlist.out159 cat /tmp/enlist.out
154 echo =============================================160 echo =============================================
155 sleep 60161 sleep 60
156 [ -e $bfile ] && exit 0162 [ -e $bfile ] && exit 0
157 fi163 fi
158 - &write_poweroff_job |
159 cat >/etc/init/maas-poweroff.conf <<EOF
160 description "poweroff when maas task is done"
161 start on stopped cloud-final
162 console output
163 task
164 script
165 [ ! -e /tmp/block-poweroff ] || exit 0
166 poweroff
167 end script
168 EOF
169 # reload required due to lack of inotify in overlayfs (LP: #882147)
170 initctl reload-configuration
171 - &write_systemd_poweroff_job |
172 cat >/lib/systemd/system/maas-poweroff.service <<EOF
173 [Unit]
174 Description=Poweroff when maas task is done
175 Wants=cloud-final.service
176 After=cloud-final.service
177 ConditionPathExists=!/tmp/block-poweroff
178
179 [Service]
180 ExecStart=/sbin/poweroff
181 EOF
182 # reload required due to lack of inotify in overlayfs (LP: #882147)
183 if [ -d /run/systemd/system ]; then
184 systemctl daemon-reload
185 fi
186164
187165
188166
@@ -190,5 +168,3 @@
190output: {all: '| tee -a /var/log/cloud-init-output.log'}168output: {all: '| tee -a /var/log/cloud-init-output.log'}
191runcmd:169runcmd:
192 - [ sh, -c, *maas_enlist ]170 - [ sh, -c, *maas_enlist ]
193 - [ sh, -c, *write_poweroff_job ]
194 - [ sh, -c, *write_systemd_poweroff_job ]
195171
=== modified file 'etc/maas/templates/commissioning-user-data/user_data.template'
--- etc/maas/templates/commissioning-user-data/user_data.template 2015-12-16 23:51:21 +0000
+++ etc/maas/templates/commissioning-user-data/user_data.template 2015-12-17 20:47:32 +0000
@@ -110,36 +110,6 @@
110 exit 1110 exit 1
111}111}
112112
113write_upstart_poweroff_job() {
114 cat >/etc/init/maas-poweroff.conf <<EOF
115 description "poweroff when maas task is done"
116 start on stopped cloud-final
117 console output
118 task
119 script
120 [ ! -e /tmp/block-poweroff ] || exit 0
121 poweroff
122 end script
123EOF
124 # reload required due to lack of inotify in overlayfs (LP: #882147)
125 initctl reload-configuration
126}
127
128write_systemd_poweroff_job() {
129 cat >/lib/systemd/system/maas-poweroff.service <<EOF
130 [Unit]
131 Description=Poweroff when maas task is done
132 Wants=cloud-final.service
133 After=cloud-final.service
134 ConditionPathExists=!/tmp/block-poweroff
135
136 [Service]
137 ExecStart=/sbin/poweroff
138EOF
139 # reload required due to lack of inotify in overlayfs (LP: #882147)
140 systemctl daemon-reload
141}
142
143write_block_poweroff() {113write_block_poweroff() {
144 touch /tmp/block-poweroff114 touch /tmp/block-poweroff
145}115}
@@ -149,12 +119,6 @@
149 write_block_poweroff119 write_block_poweroff
150 {{endif}}120 {{endif}}
151121
152 if [ -d /run/systemd/system ]; then
153 write_systemd_poweroff_job
154 else
155 write_upstart_poweroff_job
156 fi
157
158 # Install tools and load modules.122 # Install tools and load modules.
159 aptget update123 aptget update
160 aptget install python3-yaml python3-oauthlib freeipmi-tools openipmi ipmitool124 aptget install python3-yaml python3-oauthlib freeipmi-tools openipmi ipmitool
161125
=== modified file 'etc/maas/templates/commissioning-user-data/user_data_disk_erasing.template'
--- etc/maas/templates/commissioning-user-data/user_data_disk_erasing.template 2015-12-16 23:51:21 +0000
+++ etc/maas/templates/commissioning-user-data/user_data_disk_erasing.template 2015-12-17 20:47:32 +0000
@@ -73,36 +73,6 @@
73 exit 173 exit 1
74}74}
7575
76write_upstart_poweroff_job() {
77 cat >/etc/init/maas-poweroff.conf <<EOF
78 description "poweroff when maas task is done"
79 start on stopped cloud-final
80 console output
81 task
82 script
83 [ ! -e /tmp/block-poweroff ] || exit 0
84 poweroff
85 end script
86EOF
87 # reload required due to lack of inotify in overlayfs (LP: #882147)
88 initctl reload-configuration
89}
90
91write_systemd_poweroff_job() {
92 cat >/lib/systemd/system/maas-poweroff.service <<EOF
93 [Unit]
94 Description=Poweroff when maas task is done
95 Wants=cloud-final.service
96 After=cloud-final.service
97 ConditionPathExists=!/tmp/block-poweroff
98
99 [Service]
100 ExecStart=/sbin/poweroff
101EOF
102 # reload required due to lack of inotify in overlayfs (LP: #882147)
103 systemctl daemon-reload
104}
105
106erase_disks() {76erase_disks() {
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'}`
108 do78 do
@@ -113,12 +83,6 @@
113}83}
11484
115main() {85main() {
116 if [ -d /run/systemd/system ]; then
117 write_systemd_poweroff_job
118 else
119 write_upstart_poweroff_job
120 fi
121
122 # Install tools and load modules.86 # Install tools and load modules.
123 aptget update87 aptget update
124 aptget install python3-yaml python3-oauthlib88 aptget install python3-yaml python3-oauthlib
12589
=== modified file 'etc/maas/templates/commissioning-user-data/user_data_poweroff.template'
--- etc/maas/templates/commissioning-user-data/user_data_poweroff.template 2015-12-16 23:51:21 +0000
+++ etc/maas/templates/commissioning-user-data/user_data_poweroff.template 2015-12-17 20:47:32 +0000
@@ -1,46 +1,9 @@
1#!/bin/sh1#!/bin/sh
22
3#### script setup ######
4PATH="$BIN_D:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
5
6write_upstart_poweroff_job() {
7 cat >/etc/init/maas-poweroff.conf <<EOF
8 description "Power-off when MAAS task is done"
9 start on stopped cloud-final
10 console output
11 task
12 script
13 [ ! -e /tmp/block-poweroff ] || exit 0
14 /sbin/poweroff
15 end script
16EOF
17 # reload required due to lack of inotify in overlayfs (LP: #882147)
18 initctl reload-configuration
19}
20
21write_systemd_poweroff_job() {
22 cat >/lib/systemd/system/maas-poweroff.service <<EOF
23 [Unit]
24 Description=Poweroff when maas task is done
25 Wants=cloud-final.service
26 After=cloud-final.service
27 ConditionPathExists=!/tmp/block-poweroff
28
29 [Service]
30 ExecStart=/sbin/poweroff
31EOF
32 # reload required due to lack of inotify in overlayfs (LP: #882147)
33 systemctl daemon-reload
34}
35
36main() {3main() {
37 if [ -d /run/systemd/system ]; then
38 write_systemd_poweroff_job
39 else
40 write_upstart_poweroff_job
41 fi
42
43 echo "Powering node off."4 echo "Powering node off."
5
6 # Cloud-init will handle powering off the node. Nothing to do.
44}7}
458
46main9main
4710
=== modified file 'src/maasserver/compose_preseed.py'
--- src/maasserver/compose_preseed.py 2015-12-01 18:12:59 +0000
+++ src/maasserver/compose_preseed.py 2015-12-17 20:47:32 +0000
@@ -7,10 +7,14 @@
7 'compose_preseed',7 'compose_preseed',
8 ]8 ]
99
10from datetime import timedelta
10from urllib.parse import urlencode11from urllib.parse import urlencode
1112
12from maasserver.clusterrpc.osystems import get_preseed_data13from maasserver.clusterrpc.osystems import get_preseed_data
13from maasserver.enum import PRESEED_TYPE14from maasserver.enum import (
15 NODE_STATUS,
16 PRESEED_TYPE,
17)
14from maasserver.models.config import Config18from maasserver.models.config import Config
15from maasserver.server_address import get_maas_facing_server_host19from maasserver.server_address import get_maas_facing_server_host
16from maasserver.utils import absolute_reverse20from maasserver.utils import absolute_reverse
@@ -139,8 +143,13 @@
139 """Compose the preseed value for a Commissioning node."""143 """Compose the preseed value for a Commissioning node."""
140 apt_proxy = get_apt_proxy_for_node(node)144 apt_proxy = get_apt_proxy_for_node(node)
141 metadata_url = absolute_reverse('metadata', base_url=base_url)145 metadata_url = absolute_reverse('metadata', base_url=base_url)
146 poweroff_timeout = timedelta(hours=1).total_seconds() # 1 hour
147 if node.status == NODE_STATUS.DISK_ERASING:
148 poweroff_timeout = timedelta(days=7).total_seconds() # 1 week
142 return _compose_cloud_init_preseed(149 return _compose_cloud_init_preseed(
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,
151 poweroff=True, poweroff_timeout=int(poweroff_timeout),
152 poweroff_condition="test ! -e /tmp/block-poweroff")
144153
145154
146def compose_curtin_preseed(node, token, base_url=''):155def compose_curtin_preseed(node, token, base_url=''):
@@ -152,7 +161,8 @@
152161
153162
154def _compose_cloud_init_preseed(163def _compose_cloud_init_preseed(
155 node, token, metadata_url, base_url, apt_proxy=None):164 node, token, metadata_url, base_url, apt_proxy=None,
165 poweroff=False, poweroff_timeout=3600, poweroff_condition=None):
156 cloud_config = {166 cloud_config = {
157 'datasource': {167 'datasource': {
158 'MAAS': {168 'MAAS': {
@@ -179,6 +189,14 @@
179 cloud_config.update(get_system_info())189 cloud_config.update(get_system_info())
180 if apt_proxy:190 if apt_proxy:
181 cloud_config['apt_proxy'] = apt_proxy191 cloud_config['apt_proxy'] = apt_proxy
192 if poweroff:
193 cloud_config['power_state'] = {
194 'delay': 'now',
195 'mode': 'poweroff',
196 'timeout': poweroff_timeout,
197 }
198 if poweroff_condition is not None:
199 cloud_config['power_state']['condition'] = poweroff_condition
182 return "#cloud-config\n%s" % yaml.safe_dump(cloud_config)200 return "#cloud-config\n%s" % yaml.safe_dump(cloud_config)
183201
184202
185203
=== modified file 'src/maasserver/tests/test_compose_preseed.py'
--- src/maasserver/tests/test_compose_preseed.py 2015-12-01 18:12:59 +0000
+++ src/maasserver/tests/test_compose_preseed.py 2015-12-17 20:47:32 +0000
@@ -132,6 +132,28 @@
132 absolute_reverse('metadata-status', args=[node.system_id]),132 absolute_reverse('metadata-status', args=[node.system_id]),
133 preseed['reporting']['maas']['endpoint'])133 preseed['reporting']['maas']['endpoint'])
134134
135 def test_compose_preseed_for_commissioning_includes_poweroff(self):
136 node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
137 preseed = yaml.safe_load(
138 compose_preseed(PRESEED_TYPE.COMMISSIONING, node))
139 self.assertEquals({
140 'delay': 'now',
141 'mode': 'poweroff',
142 'timeout': 3600,
143 'condition': 'test ! -e /tmp/block-poweroff',
144 }, preseed['power_state'])
145
146 def test_compose_preseed_for_disk_erasing_includes_poweroff(self):
147 node = factory.make_Node(status=NODE_STATUS.DISK_ERASING)
148 preseed = yaml.safe_load(
149 compose_preseed(PRESEED_TYPE.COMMISSIONING, node))
150 self.assertEquals({
151 'delay': 'now',
152 'mode': 'poweroff',
153 'timeout': 604800,
154 'condition': 'test ! -e /tmp/block-poweroff',
155 }, preseed['power_state'])
156
135 def test_compose_preseed_includes_node_oauth_token(self):157 def test_compose_preseed_includes_node_oauth_token(self):
136 node = factory.make_Node(status=NODE_STATUS.READY)158 node = factory.make_Node(status=NODE_STATUS.READY)
137 node.nodegroup.accept()159 node.nodegroup.accept()
138160
=== modified file 'src/maasserver/websockets/protocol.py'
--- src/maasserver/websockets/protocol.py 2015-12-15 22:44:22 +0000
+++ src/maasserver/websockets/protocol.py 2015-12-17 20:47:32 +0000
@@ -324,7 +324,8 @@
324 "rtype": RESPONSE_TYPE.ERROR,324 "rtype": RESPONSE_TYPE.ERROR,
325 "error": error,325 "error": error,
326 }326 }
327 self.transport.write(json.dumps(error_msg).encode("utf-8"))327 self.transport.write(
328 json.dumps(error_msg, default=self._json_encode).encode("ascii"))
328 return None329 return None
329330
330 def sendNotify(self, name, action, data):331 def sendNotify(self, name, action, data):
@@ -335,7 +336,8 @@
335 "action": action,336 "action": action,
336 "data": data,337 "data": data,
337 }338 }
338 self.transport.write(json.dumps(notify_msg).encode("utf-8"))339 self.transport.write(
340 json.dumps(notify_msg, default=self._json_encode).encode("ascii"))
339341
340 def buildHandler(self, handler_class):342 def buildHandler(self, handler_class):
341 """Return an initialised instance of `handler_class`."""343 """Return an initialised instance of `handler_class`."""
342344
=== modified file 'src/metadataserver/models/commissioningscript.py'
--- src/metadataserver/models/commissioningscript.py 2015-12-16 18:07:33 +0000
+++ src/metadataserver/models/commissioningscript.py 2015-12-17 20:47:32 +0000
@@ -178,6 +178,9 @@
178 # Ignore loopback interfaces.178 # Ignore loopback interfaces.
179 if link_mac is None:179 if link_mac is None:
180 continue180 continue
181 # Ignore lxcbr0 which is created by default on Xenial+.
182 elif link['name'] == 'lxcbr0':
183 continue
181 else:184 else:
182 ifname = link['name']185 ifname = link['name']
183 try:186 try:
184187
=== modified file 'src/metadataserver/models/tests/ip_addr_results.txt'
--- src/metadataserver/models/tests/ip_addr_results.txt 2015-07-16 08:30:38 +0000
+++ src/metadataserver/models/tests/ip_addr_results.txt 2015-12-17 20:47:32 +0000
@@ -2,21 +2,27 @@
2 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3 inet 127.0.0.1/8 scope host lo3 inet 127.0.0.1/8 scope host lo
4 valid_lft forever preferred_lft forever4 valid_lft forever preferred_lft forever
5 inet6 ::1/128 scope host 5 inet6 ::1/128 scope host
6 valid_lft forever preferred_lft forever6 valid_lft forever preferred_lft forever
72: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 100072: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
8 link/ether 00:00:00:00:00:01 brd ff:ff:ff:ff:ff:ff8 link/ether 00:00:00:00:00:01 brd ff:ff:ff:ff:ff:ff
9 inet 192.168.0.3/24 brd 192.168.0.255 scope global eth09 inet 192.168.0.3/24 brd 192.168.0.255 scope global eth0
10 valid_lft forever preferred_lft forever10 valid_lft forever preferred_lft forever
11 inet6 fe80::3e97:efe:fe0e:56dc/64 scope link 11 inet6 fe80::3e97:efe:fe0e:56dc/64 scope link
12 valid_lft forever preferred_lft forever 12 valid_lft forever preferred_lft forever
13 inet6 2001:db8:a::123/64 scope link 13 inet6 2001:db8:a::123/64 scope link
14 valid_lft forever preferred_lft forever14 valid_lft forever preferred_lft forever
153: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000153: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
16 link/ether 00:00:00:00:00:02 brd ff:ff:ff:ff:ff:ff16 link/ether 00:00:00:00:00:02 brd ff:ff:ff:ff:ff:ff
17 inet 172.17.42.1/16 scope global eth117 inet 172.17.42.1/16 scope global eth1
18 valid_lft forever preferred_lft forever18 valid_lft forever preferred_lft forever
193: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000194: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
20 link/ether 00:00:00:00:00:03 brd ff:ff:ff:ff:ff:ff20 link/ether 00:00:00:00:00:03 brd ff:ff:ff:ff:ff:ff
21 inet 172.17.12.1/16 scope global eth221 inet 172.17.12.1/16 scope global eth2
22 valid_lft forever preferred_lft forever22 valid_lft forever preferred_lft forever
235: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
24 link/ether 00:00:00:00:00:04 brd ff:ff:ff:ff:ff:ff
25 inet 10.0.3.1/24 scope global lxcbr0
26 valid_lft forever preferred_lft forever
27 inet6 fe80::e477:64ff:fec5:25a3/64 scope link
28 valid_lft forever preferred_lft forever
2329
=== modified file 'src/metadataserver/user_data/tests/test_poweroff.py'
--- src/metadataserver/user_data/tests/test_poweroff.py 2015-12-02 23:30:15 +0000
+++ src/metadataserver/user_data/tests/test_poweroff.py 2015-12-17 20:47:32 +0000
@@ -43,5 +43,4 @@
43 self.assertThat(43 self.assertThat(
44 base64.b64decode(user_data_script.get_payload()), ContainsAll({44 base64.b64decode(user_data_script.get_payload()), ContainsAll({
45 b'Powering node off',45 b'Powering node off',
46 b'poweroff',
47 }))46 }))