xref: /freebsd/libexec/nuageinit/tests/nuageinit.sh (revision c27f7d6b9cf6d4ab01cb3d0972726c14e0aca146)
1#-
2# Copyright (c) 2022 Baptiste Daroussin <bapt@FreeBSD.org>
3#
4# SPDX-License-Identifier: BSD-2-Clause
5#
6
7export NUAGE_FAKE_ROOTDIR="$PWD"
8
9atf_test_case args
10atf_test_case nocloud
11atf_test_case nocloud_userdata_script
12atf_test_case nocloud_user_data_script
13atf_test_case nocloud_userdata_cloudconfig_users
14atf_test_case nocloud_network
15atf_test_case config2
16atf_test_case config2_pubkeys
17atf_test_case config2_pubkeys_user_data
18atf_test_case config2_pubkeys_meta_data
19atf_test_case config2_network
20atf_test_case config2_network_static_v4
21atf_test_case config2_ssh_keys
22atf_test_case nocloud_userdata_cloudconfig_ssh_pwauth
23atf_test_case nocloud_userdata_cloudconfig_chpasswd
24atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
25atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
26
27args_body()
28{
29	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit
30	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla
31	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla meh plop
32	atf_check -s exit:1 -e inline:"nuageinit: Unknown cloud init type: meh\n" /usr/libexec/nuageinit bla meh
33}
34
35nocloud_body()
36{
37	mkdir -p media/nuageinit
38	atf_check -s exit:1 -e match:"nuageinit: error parsing nocloud.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit/ nocloud
39	printf "instance-id: iid-local01\nlocal-hostname: cloudimg\n" > "${PWD}"/media/nuageinit/meta-data
40	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
41	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
42	cat > media/nuageinit/meta-data << EOF
43instance-id: iid-local01
44hostname: myhost
45EOF
46	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
47	atf_check -o inline:"hostname=\"myhost\"\n" cat etc/rc.conf.d/hostname
48}
49
50nocloud_userdata_script_body()
51{
52	mkdir -p media/nuageinit
53	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
54	printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user-data
55	chmod 755 "${PWD}"/media/nuageinit/user-data
56	atf_check -s exit:0 -o inline:"yeah\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
57}
58
59nocloud_user_data_script_body()
60{
61	mkdir -p media/nuageinit
62	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
63	printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user_data
64	chmod 755 "${PWD}"/media/nuageinit/user_data
65	atf_check -s exit:0 -o inline:"yeah\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
66}
67
68nocloud_userdata_cloudconfig_users_head()
69{
70	atf_set "require.user" root
71}
72nocloud_userdata_cloudconfig_users_body()
73{
74	mkdir -p media/nuageinit
75	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
76	mkdir -p etc
77	cat > etc/master.passwd << EOF
78root:*:0:0::0:0:Charlie &:/root:/bin/sh
79sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
80EOF
81	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
82	cat > etc/group << EOF
83wheel:*:0:root
84users:*:1:
85EOF
86	cat > media/nuageinit/user-data << 'EOF'
87#cloud-config
88groups:
89  - admingroup: [root,sys]
90  - cloud-users
91users:
92  - default
93  - name: foobar
94    gecos: Foo B. Bar
95    primary_group: foobar
96    groups: users
97    passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
98EOF
99	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
100	cat > expectedgroup << EOF
101wheel:*:0:root,freebsd
102users:*:1:foobar
103admingroup:*:1001:root,sys
104cloud-users:*:1002:
105freebsd:*:1003:
106foobar:*:1004:
107EOF
108	cat > expectedpasswd << 'EOF'
109root:*:0:0::0:0:Charlie &:/root:/bin/sh
110sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
111freebsd:freebsd:1001:1003::0:0:FreeBSD User:/home/freebsd:/bin/sh
112foobar:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1002:1004::0:0:Foo B. Bar:/home/foobar:/bin/sh
113EOF
114	sed -i "" "s/freebsd:.*:1001/freebsd:freebsd:1001/" "${PWD}"/etc/master.passwd
115	atf_check -o file:expectedpasswd cat "${PWD}"/etc/master.passwd
116	atf_check -o file:expectedgroup cat "${PWD}"/etc/group
117}
118
119nocloud_network_head()
120{
121	atf_set "require.user" root
122}
123nocloud_network_body()
124{
125	mkdir -p media/nuageinit
126	mkdir -p etc
127	cat > etc/master.passwd << EOF
128root:*:0:0::0:0:Charlie &:/root:/bin/sh
129sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
130EOF
131	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
132	cat > etc/group << EOF
133wheel:*:0:root
134users:*:1:
135EOF
136	mynetworks=$(ifconfig -l ether)
137	if [ -z "$mynetworks" ]; then
138		atf_skip "a network interface is needed"
139	fi
140	set -- $mynetworks
141	myiface=$1
142	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
143	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
144	cat > media/nuageinit/user-data << EOF
145#cloud-config
146network:
147  version: 2
148  ethernets:
149    # opaque ID for physical interfaces, only referred to by other stanzas
150    id0:
151      match:
152        macaddress: "$myaddr"
153      addresses:
154        - 192.0.2.2/24
155        - 2001:db8::2/64
156      gateway4: 192.0.2.1
157      gateway6: 2001:db8::1
158EOF
159	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
160	cat > network << EOF
161ifconfig_${myiface}="inet 192.0.2.2/24"
162ifconfig_${myiface}_ipv6="inet6 2001:db8::2/64"
163ipv6_network_interfaces="${myiface}"
164ipv6_default_interface="${myiface}"
165EOF
166	cat > routing << EOF
167defaultrouter="192.0.2.1"
168ipv6_defaultrouter="2001:db8::1"
169ipv6_route_${myiface}="2001:db8::1 -prefixlen 128 -interface ${myiface}"
170EOF
171	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
172	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
173}
174
175config2_body()
176{
177	mkdir -p media/nuageinit
178	atf_check -s exit:1 -e match:"nuageinit: error parsing config-2 meta_data.json:.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
179	printf "{}" > media/nuageinit/meta_data.json
180	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
181	cat > media/nuageinit/meta_data.json << EOF
182{
183    "hostname": "cloudimg"
184}
185EOF
186	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
187	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
188}
189
190config2_pubkeys_head()
191{
192	atf_set "require.user" root
193}
194config2_pubkeys_body()
195{
196	mkdir -p media/nuageinit
197	touch media/nuageinit/meta_data.json
198	cat > media/nuageinit/user-data << EOF
199#cloud-config
200ssh_authorized_keys:
201  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
202EOF
203	mkdir -p etc
204	cat > etc/master.passwd << EOF
205root:*:0:0::0:0:Charlie &:/root:/bin/sh
206sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
207EOF
208	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
209	cat > etc/group << EOF
210wheel:*:0:root
211users:*:1:
212EOF
213	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
214	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
215}
216
217config2_pubkeys_user_data_head()
218{
219	atf_set "require.user" root
220}
221config2_pubkeys_user_data_body()
222{
223	mkdir -p media/nuageinit
224	touch media/nuageinit/meta_data.json
225	cat > media/nuageinit/user_data << EOF
226#cloud-config
227ssh_authorized_keys:
228  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
229EOF
230	mkdir -p etc
231	cat > etc/master.passwd << EOF
232root:*:0:0::0:0:Charlie &:/root:/bin/sh
233sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
234EOF
235	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
236	cat > etc/group << EOF
237wheel:*:0:root
238users:*:1:
239EOF
240	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
241	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
242}
243
244config2_pubkeys_meta_data_body()
245{
246	here=$(pwd)
247	export NUAGE_FAKE_ROOTDIR=$(pwd)
248	if [ $(id -u) -ne 0 ]; then
249		atf_skip "root required"
250	fi
251	mkdir -p media/nuageinit
252	cat > media/nuageinit/meta_data.json << EOF
253{
254    "uuid": "uuid_for_this_instance",
255    "admin_pass": "a_generated_password",
256    "public_keys": {
257        "tdb": "ssh-ed25519 my_key_id tdb@host"
258    },
259    "keys": [
260        {
261            "name": "tdb",
262            "type": "ssh",
263            "data": "ssh-ed25519 my_key_id tdb@host"
264        }
265    ],
266    "hostname": "freebsd-14-test.novalocal",
267    "name": "freebsd-14-test",
268    "launch_index": 0,
269    "availability_zone": "nova",
270    "random_seed": "long_random_seed",
271    "project_id": "my_project_id",
272    "devices": [],
273    "dedicated_cpus": []
274}
275EOF
276	mkdir -p etc
277	cat > etc/master.passwd << EOF
278root:*:0:0::0:0:Charlie &:/root:/bin/csh
279sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
280EOF
281	pwd_mkdb -d etc ${here}/etc/master.passwd
282	cat > etc/group << EOF
283wheel:*:0:root
284users:*:1:
285EOF
286	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
287	atf_check -o inline:"ssh-ed25519 my_key_id tdb@host\n" cat home/freebsd/.ssh/authorized_keys
288}
289
290config2_network_body()
291{
292	mkdir -p media/nuageinit
293	printf "{}" > media/nuageinit/meta_data.json
294	mynetworks=$(ifconfig -l ether)
295	if [ -z "$mynetworks" ]; then
296		atf_skip "a network interface is needed"
297	fi
298	set -- $mynetworks
299	myiface=$1
300	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
301cat > media/nuageinit/network_data.json << EOF
302{
303    "links": [
304        {
305            "ethernet_mac_address": "$myaddr",
306            "id": "iface0",
307            "mtu": null
308        }
309    ],
310    "networks": [
311        {
312            "id": "network0",
313            "link": "iface0",
314            "type": "ipv4_dhcp"
315        },
316        { // IPv6
317            "id": "private-ipv4",
318            "type": "ipv6",
319            "link": "iface0",
320            // supports condensed IPv6 with CIDR netmask
321            "ip_address": "2001:db8::3257:9652/64",
322            "gateway": "fd00::1",
323            "routes": [
324                {
325                    "network": "::",
326                    "netmask": "::",
327                    "gateway": "fd00::1"
328                },
329                {
330                    "network": "::",
331                    "netmask": "ffff:ffff:ffff::",
332                    "gateway": "fd00::1:1"
333                }
334            ],
335            "network_id": "da5bb487-5193-4a65-a3df-4a0055a8c0d8"
336        }
337    ]
338}
339EOF
340	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
341	cat > network << EOF
342ifconfig_${myiface}="DHCP"
343ifconfig_${myiface}_ipv6="inet6 2001:db8::3257:9652/64"
344ipv6_network_interfaces="${myiface}"
345ipv6_default_interface="${myiface}"
346EOF
347	cat > routing << EOF
348ipv6_defaultrouter="fd00::1"
349ipv6_route_${myiface}="fd00::1 -prefixlen 128 -interface ${myiface}"
350ipv6_static_routes="${myiface}"
351EOF
352	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
353	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
354}
355
356config2_network_static_v4_body()
357{
358	mkdir -p media/nuageinit
359	printf "{}" > media/nuageinit/meta_data.json
360	mynetworks=$(ifconfig -l ether)
361	if [ -z "$mynetworks" ]; then
362		atf_skip "a network interface is needed"
363	fi
364	set -- $mynetworks
365	myiface=$1
366	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
367cat > media/nuageinit/network_data.json << EOF
368{
369    "links": [
370        {
371            "ethernet_mac_address": "$myaddr",
372            "id": "iface0",
373            "mtu": null
374        }
375    ],
376    "networks": [
377        {
378            "id": "network0",
379            "link": "iface0",
380            "type": "ipv4",
381            "ip_address": "10.184.0.244",
382            "netmask": "255.255.240.0",
383            "routes": [
384                {
385                    "network": "10.0.0.0",
386                    "netmask": "255.0.0.0",
387                    "gateway": "11.0.0.1"
388                },
389                {
390                    "network": "0.0.0.0",
391                    "netmask": "0.0.0.0",
392                    "gateway": "23.253.157.1"
393                }
394            ]
395        }
396    ]
397}
398EOF
399	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
400	cat > network << EOF
401ifconfig_${myiface}="inet 10.184.0.244 netmask 255.255.240.0"
402EOF
403	cat > routing << EOF
404route_cloudinit1_${myiface}="-net 10.0.0.0 11.0.0.1 255.0.0.0"
405defaultrouter="23.253.157.1"
406static_routes="cloudinit1_${myiface}"
407EOF
408	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
409	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
410}
411
412config2_ssh_keys_head()
413{
414	atf_set "require.user" root
415}
416config2_ssh_keys_body()
417{
418	here=$(pwd)
419	export NUAGE_FAKE_ROOTDIR=$(pwd)
420	mkdir -p media/nuageinit
421	touch media/nuageinit/meta_data.json
422	cat > media/nuageinit/user-data << EOF
423#cloud-config
424ssh_keys:
425  rsa_private: |
426    -----BEGIN RSA PRIVATE KEY-----
427    MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
428    ...
429    -----END RSA PRIVATE KEY-----
430  rsa_public: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...
431  ed25519_private: |
432    -----BEGIN OPENSSH PRIVATE KEY-----
433    blabla
434    ...
435    -----END OPENSSH PRIVATE KEY-----
436  ed25519_public: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+
437EOF
438	mkdir -p etc/ssh
439	cat > etc/master.passwd << EOF
440root:*:0:0::0:0:Charlie &:/root:/bin/csh
441sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
442EOF
443	pwd_mkdb -d etc ${here}/etc/master.passwd
444	cat > etc/group << EOF
445wheel:*:0:root
446users:*:1:
447EOF
448	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
449	_expected="-----BEGIN RSA PRIVATE KEY-----
450MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
451...
452-----END RSA PRIVATE KEY-----
453"
454	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key
455	_expected="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...\n"
456	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key.pub
457	_expected="-----BEGIN OPENSSH PRIVATE KEY-----
458blabla
459...
460-----END OPENSSH PRIVATE KEY-----\n"
461	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key
462	_expected="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+\n"
463	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key.pub
464}
465
466
467nocloud_userdata_cloudconfig_ssh_pwauth_head()
468{
469	atf_set "require.user" root
470}
471nocloud_userdata_cloudconfig_ssh_pwauth_body()
472{
473	mkdir -p etc
474	cat > etc/master.passwd << EOF
475root:*:0:0::0:0:Charlie &:/root:/bin/sh
476sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
477EOF
478	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
479	cat > etc/group << EOF
480wheel:*:0:root
481users:*:1:
482EOF
483	mkdir -p media/nuageinit
484	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
485	cat > media/nuageinit/user-data << 'EOF'
486#cloud-config
487ssh_pwauth: true
488EOF
489	mkdir -p etc/ssh/
490	touch etc/ssh/sshd_config
491
492	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
493	atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
494
495	# Same value we don't touch anything
496	printf "   PasswordAuthentication yes # I want password\n" > etc/ssh/sshd_config
497	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
498	atf_check -o inline:"   PasswordAuthentication yes # I want password\n" cat etc/ssh/sshd_config
499
500	printf "   PasswordAuthentication no # Should change\n" > etc/ssh/sshd_config
501	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
502	atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
503
504	cat > media/nuageinit/user-data << 'EOF'
505#cloud-config
506ssh_pwauth: false
507EOF
508
509	printf "   PasswordAuthentication no # no passwords\n" > etc/ssh/sshd_config
510	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
511	atf_check -o inline:"   PasswordAuthentication no # no passwords\n" cat etc/ssh/sshd_config
512
513	printf "   PasswordAuthentication yes # Should change\n" > etc/ssh/sshd_config
514	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
515	atf_check -o inline:"PasswordAuthentication no\n" cat etc/ssh/sshd_config
516}
517
518nocloud_userdata_cloudconfig_chpasswd_head()
519{
520	atf_set "require.user" root
521}
522nocloud_userdata_cloudconfig_chpasswd_body()
523{
524	mkdir -p etc
525	cat > etc/master.passwd << EOF
526root:*:0:0::0:0:Charlie &:/root:/bin/sh
527sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
528user:*:1:0::0:0:Sys:/home/sys:/bin/sh
529EOF
530	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
531	cat > etc/group << EOF
532wheel:*:0:root
533users:*:1:
534EOF
535	mkdir -p media/nuageinit
536	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
537	cat > media/nuageinit/user-data << 'EOF'
538#cloud-config
539chpasswd:
540  expire: true
541  users:
542  - { user: "sys", password: RANDOM }
543EOF
544
545	atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'name'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
546	# nothing modified
547	atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
548
549	cat > media/nuageinit/user-data << 'EOF'
550#cloud-config
551chpasswd:
552  expire: true
553  users:
554  - { name: "sys", pwd: RANDOM }
555EOF
556	atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'password'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
557	# nothing modified
558	atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
559
560	cat > media/nuageinit/user-data << 'EOF'
561#cloud-config
562chpasswd:
563  expire: false
564  users:
565  - { name: "sys", password: RANDOM }
566EOF
567	# not empty because the password is printed to stdout
568	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
569	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
570
571	cat > media/nuageinit/user-data << 'EOF'
572#cloud-config
573chpasswd:
574  expire: true
575  users:
576  - { name: "sys", password: RANDOM }
577EOF
578	# not empty because the password is printed to stdout
579	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
580	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
581
582	cat > media/nuageinit/user-data << 'EOF'
583#cloud-config
584chpasswd:
585  expire: true
586  users:
587  - { name: "user", password: "$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/" }
588EOF
589	# not empty because the password is printed to stdout
590	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
591	atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::1:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user
592}
593
594
595nocloud_userdata_cloudconfig_chpasswd_list_string_head()
596{
597	atf_set "require.user" root
598}
599nocloud_userdata_cloudconfig_chpasswd_list_string_body()
600{
601	mkdir -p etc
602	cat > etc/master.passwd << EOF
603root:*:0:0::0:0:Charlie &:/root:/bin/sh
604sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
605user:*:1:0::0:0:Sys:/home/sys:/bin/sh
606EOF
607	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
608	cat > etc/group << EOF
609wheel:*:0:root
610users:*:1:
611EOF
612	mkdir -p media/nuageinit
613	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
614	cat > media/nuageinit/user-data << 'EOF'
615#cloud-config
616chpasswd:
617  expire: true
618  list: |
619     sys:RANDOM
620EOF
621
622	atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
623	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
624
625	cat > media/nuageinit/user-data << 'EOF'
626#cloud-config
627chpasswd:
628  expire: false
629  list: |
630     sys:plop
631     user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
632     root:R
633EOF
634
635	atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
636	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
637	atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::0:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user
638	atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
639}
640
641nocloud_userdata_cloudconfig_chpasswd_list_list_head()
642{
643	atf_set "require.user" root
644}
645nocloud_userdata_cloudconfig_chpasswd_list_list_body()
646{
647	mkdir -p etc
648	cat > etc/master.passwd << EOF
649root:*:0:0::0:0:Charlie &:/root:/bin/sh
650sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
651user:*:1:0::0:0:Sys:/home/sys:/bin/sh
652EOF
653	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
654	cat > etc/group << EOF
655wheel:*:0:root
656users:*:1:
657EOF
658	mkdir -p media/nuageinit
659	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
660	cat > media/nuageinit/user-data << 'EOF'
661#cloud-config
662chpasswd:
663  expire: true
664  list:
665  - sys:RANDOM
666EOF
667
668	atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
669	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
670
671	cat > media/nuageinit/user-data << 'EOF'
672#cloud-config
673chpasswd:
674  expire: false
675  list:
676  - sys:plop
677  - user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
678  - root:R
679EOF
680
681	atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
682	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
683	atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::0:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user
684	atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
685}
686
687atf_init_test_cases()
688{
689	atf_add_test_case args
690	atf_add_test_case nocloud
691	atf_add_test_case nocloud_userdata_script
692	atf_add_test_case nocloud_user_data_script
693	atf_add_test_case nocloud_userdata_cloudconfig_users
694	atf_add_test_case nocloud_network
695	atf_add_test_case config2
696	atf_add_test_case config2_pubkeys
697	atf_add_test_case config2_pubkeys_user_data
698	atf_add_test_case config2_pubkeys_meta_data
699	atf_add_test_case config2_network
700	atf_add_test_case config2_network_static_v4
701	atf_add_test_case config2_ssh_keys
702	atf_add_test_case nocloud_userdata_cloudconfig_ssh_pwauth
703	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd
704	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
705	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
706}
707