xref: /freebsd/libexec/nuageinit/tests/nuageinit.sh (revision 797dad91ff468a9bd6cd5d4f720eb4bbac1f454a)
1#-
2# Copyright (c) 2022-2025 Baptiste Daroussin <bapt@FreeBSD.org>
3# Copyright (c) 2025 Jesús Daniel Colmenares Oviedo <dtxdf@FreeBSD.org>
4#
5# SPDX-License-Identifier: BSD-2-Clause
6#
7
8export NUAGE_FAKE_ROOTDIR="$PWD"
9
10atf_test_case args
11atf_test_case nocloud
12atf_test_case nocloud_userdata_script
13atf_test_case nocloud_user_data_script
14atf_test_case nocloud_userdata_cloudconfig_users
15atf_test_case nocloud_network
16atf_test_case config2
17atf_test_case config2_pubkeys
18atf_test_case config2_pubkeys_user_data
19atf_test_case config2_pubkeys_meta_data
20atf_test_case config2_network
21atf_test_case config2_network_static_v4
22atf_test_case config2_network_dns
23atf_test_case config2_ssh_keys
24atf_test_case nocloud_userdata_cloudconfig_ssh_pwauth
25atf_test_case nocloud_userdata_cloudconfig_chpasswd
26atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
27atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
28atf_test_case config2_userdata_runcmd
29atf_test_case config2_userdata_packages
30atf_test_case config2_userdata_update_packages
31atf_test_case config2_userdata_upgrade_packages
32atf_test_case config2_userdata_shebang
33atf_test_case config2_userdata_ssh_deletekeys
34atf_test_case config2_userdata_disable_root
35atf_test_case config2_userdata_bootcmd
36atf_test_case config2_userdata_manage_etc_hosts
37atf_test_case config2_userdata_mounts
38atf_test_case config2_userdata_fqdn_and_hostname
39atf_test_case config2_userdata_write_files
40
41setup_test_adduser()
42{
43	here=$(pwd)
44	export NUAGE_FAKE_ROOTDIR=$(pwd)
45	mkdir -p etc/ssh
46	cat > etc/master.passwd << EOF
47root:*:0:0::0:0:Charlie &:/root:/bin/csh
48sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
49EOF
50	pwd_mkdb -d etc ${here}/etc/master.passwd
51	cat > etc/group << EOF
52wheel:*:0:root
53users:*:1:
54EOF
55}
56
57args_body()
58{
59	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit
60	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla
61	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla meh plop
62	atf_check -s exit:1 -e inline:"nuageinit: Unknown cloud init type: meh\n" /usr/libexec/nuageinit bla meh
63}
64
65nocloud_body()
66{
67	mkdir -p media/nuageinit
68	setup_test_adduser
69	atf_check -s exit:1 -e match:"nuageinit: error parsing nocloud.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit/ nocloud
70	printf "instance-id: iid-local01\nlocal-hostname: cloudimg\n" > "${PWD}"/media/nuageinit/meta-data
71	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
72	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
73	cat > media/nuageinit/meta-data << EOF
74instance-id: iid-local01
75hostname: myhost
76EOF
77	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
78	atf_check -o inline:"hostname=\"myhost\"\n" cat etc/rc.conf.d/hostname
79}
80
81nocloud_userdata_script_body()
82{
83	mkdir -p media/nuageinit
84	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
85	# ensure this is an invalid when parsed with the yaml parser
86	printf "#!/bin/sh\n: ${test:-yes}\necho $test\n" > "${PWD}"/media/nuageinit/user-data
87	chmod 644 "${PWD}"/media/nuageinit/user-data
88	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
89	atf_check test -x var/cache/nuageinit/user_data
90	atf_check -o inline:"#!/bin/sh\n: ${test:-yes}\necho $test\n" cat var/cache/nuageinit/user_data
91}
92
93nocloud_user_data_script_body()
94{
95	mkdir -p media/nuageinit
96	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
97	printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user_data
98	chmod 755 "${PWD}"/media/nuageinit/user_data
99	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
100	atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data
101}
102
103nocloud_userdata_cloudconfig_users_head()
104{
105	atf_set "require.user" root
106}
107nocloud_userdata_cloudconfig_users_body()
108{
109	mkdir -p media/nuageinit
110	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
111	mkdir -p etc
112	cat > etc/master.passwd << EOF
113root:*:0:0::0:0:Charlie &:/root:/bin/sh
114sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
115EOF
116	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
117	cat > etc/group << EOF
118wheel:*:0:root
119users:*:1:
120EOF
121	cat > media/nuageinit/user-data << 'EOF'
122#cloud-config
123groups:
124  - admingroup: [root,sys]
125  - cloud-users
126users:
127  - default
128  - name: foobar
129    gecos: Foo B. Bar
130    primary_group: foobar
131    sudo: ALL=(ALL) NOPASSWD:ALL
132    doas: permit persist %u as root
133    groups: users
134    passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
135  - name: bla
136    sudo:
137    - "ALL=(ALL) NOPASSWD:/usr/sbin/pw"
138    - "ALL=(ALL) ALL"
139    doas:
140    - "deny %u as foobar"
141    - "permit persist %u as root cmd whoami"
142EOF
143	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
144	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
145	cat > expectedgroup << EOF
146wheel:*:0:root,freebsd
147users:*:1:foobar
148admingroup:*:1001:root,sys
149cloud-users:*:1002:
150freebsd:*:1003:
151foobar:*:1004:
152bla:*:1005:
153EOF
154	cat > expectedpasswd << 'EOF'
155root:*:0:0::0:0:Charlie &:/root:/bin/sh
156sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
157freebsd:freebsd:1001:1003::0:0:FreeBSD User:/home/freebsd:/bin/sh
158foobar:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1002:1004::0:0:Foo B. Bar:/home/foobar:/bin/sh
159bla::1003:1005::0:0:bla User:/home/bla:/bin/sh
160EOF
161	sed -i "" "s/freebsd:.*:1001/freebsd:freebsd:1001/" "${PWD}"/etc/master.passwd
162	atf_check -o file:expectedpasswd cat "${PWD}"/etc/master.passwd
163	atf_check -o file:expectedgroup cat "${PWD}"/etc/group
164	localbase=`sysctl -ni user.localbase 2> /dev/null`
165	if [ -z "${localbase}" ]; then
166		# fallback
167		localbase="/usr/local"
168	fi
169	atf_check -o inline:"foobar ALL=(ALL) NOPASSWD:ALL\nbla ALL=(ALL) NOPASSWD:/usr/sbin/pw\nbla ALL=(ALL) ALL\n" cat "${PWD}/${localbase}/etc/sudoers.d/90-nuageinit-users"
170	atf_check -o inline:"permit persist foobar as root\ndeny bla as foobar\npermit persist bla as root cmd whoami\n" cat "${PWD}/${localbase}/etc/doas.conf"
171}
172
173nocloud_network_head()
174{
175	atf_set "require.user" root
176}
177nocloud_network_body()
178{
179	mkdir -p media/nuageinit
180	mkdir -p etc
181	cat > etc/master.passwd << EOF
182root:*:0:0::0:0:Charlie &:/root:/bin/sh
183sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
184EOF
185	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
186	cat > etc/group << EOF
187wheel:*:0:root
188users:*:1:
189EOF
190	mynetworks=$(ifconfig -l ether)
191	if [ -z "$mynetworks" ]; then
192		atf_skip "a network interface is needed"
193	fi
194	set -- $mynetworks
195	myiface=$1
196	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
197	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
198	cat > media/nuageinit/user-data << EOF
199#cloud-config
200network:
201  version: 2
202  ethernets:
203    # opaque ID for physical interfaces, only referred to by other stanzas
204    id0:
205      match:
206        macaddress: "$myaddr"
207      addresses:
208        - 192.0.2.2/24
209        - 2001:db8::2/64
210      gateway4: 192.0.2.1
211      gateway6: 2001:db8::1
212EOF
213	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
214	cat > network << EOF
215ifconfig_${myiface}="inet 192.0.2.2/24"
216ifconfig_${myiface}_ipv6="inet6 2001:db8::2/64"
217ipv6_network_interfaces="${myiface}"
218ipv6_default_interface="${myiface}"
219EOF
220	cat > routing << EOF
221defaultrouter="192.0.2.1"
222ipv6_defaultrouter="2001:db8::1"
223ipv6_route_${myiface}="2001:db8::1 -prefixlen 128 -interface ${myiface}"
224EOF
225	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
226	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
227}
228
229config2_body()
230{
231	mkdir -p media/nuageinit
232	setup_test_adduser
233	atf_check -s exit:1 -e match:"nuageinit: error parsing config-2 meta_data.json:.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
234	printf "{}" > media/nuageinit/meta_data.json
235	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
236	cat > media/nuageinit/meta_data.json << EOF
237{
238    "hostname": "cloudimg"
239}
240EOF
241	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
242	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
243}
244
245config2_pubkeys_head()
246{
247	atf_set "require.user" root
248}
249config2_pubkeys_body()
250{
251	mkdir -p media/nuageinit
252	touch media/nuageinit/meta_data.json
253	cat > media/nuageinit/user-data << EOF
254#cloud-config
255ssh_authorized_keys:
256  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
257EOF
258	mkdir -p etc
259	cat > etc/master.passwd << EOF
260root:*:0:0::0:0:Charlie &:/root:/bin/sh
261sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
262EOF
263	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
264	cat > etc/group << EOF
265wheel:*:0:root
266users:*:1:
267EOF
268	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
269	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
270}
271
272config2_pubkeys_user_data_head()
273{
274	atf_set "require.user" root
275}
276config2_pubkeys_user_data_body()
277{
278	mkdir -p media/nuageinit
279	touch media/nuageinit/meta_data.json
280	cat > media/nuageinit/user_data << EOF
281#cloud-config
282ssh_authorized_keys:
283  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
284EOF
285	mkdir -p etc
286	cat > etc/master.passwd << EOF
287root:*:0:0::0:0:Charlie &:/root:/bin/sh
288sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
289EOF
290	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
291	cat > etc/group << EOF
292wheel:*:0:root
293users:*:1:
294EOF
295	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
296	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
297}
298
299config2_pubkeys_meta_data_body()
300{
301	here=$(pwd)
302	export NUAGE_FAKE_ROOTDIR=$(pwd)
303	if [ $(id -u) -ne 0 ]; then
304		atf_skip "root required"
305	fi
306	mkdir -p media/nuageinit
307	cat > media/nuageinit/meta_data.json << EOF
308{
309    "uuid": "uuid_for_this_instance",
310    "admin_pass": "a_generated_password",
311    "public_keys": {
312        "tdb": "ssh-ed25519 my_key_id tdb@host"
313    },
314    "keys": [
315        {
316            "name": "tdb",
317            "type": "ssh",
318            "data": "ssh-ed25519 my_key_id tdb@host"
319        }
320    ],
321    "hostname": "freebsd-14-test.novalocal",
322    "name": "freebsd-14-test",
323    "launch_index": 0,
324    "availability_zone": "nova",
325    "random_seed": "long_random_seed",
326    "project_id": "my_project_id",
327    "devices": [],
328    "dedicated_cpus": []
329}
330EOF
331	mkdir -p etc
332	cat > etc/master.passwd << EOF
333root:*:0:0::0:0:Charlie &:/root:/bin/csh
334sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
335EOF
336	pwd_mkdb -d etc ${here}/etc/master.passwd
337	cat > etc/group << EOF
338wheel:*:0:root
339users:*:1:
340EOF
341	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
342	atf_check -o inline:"ssh-ed25519 my_key_id tdb@host\n" cat home/freebsd/.ssh/authorized_keys
343}
344
345config2_network_body()
346{
347	mkdir -p media/nuageinit
348	setup_test_adduser
349	printf "{}" > media/nuageinit/meta_data.json
350	mynetworks=$(ifconfig -l ether)
351	if [ -z "$mynetworks" ]; then
352		atf_skip "a network interface is needed"
353	fi
354	set -- $mynetworks
355	myiface=$1
356	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
357cat > media/nuageinit/network_data.json << EOF
358{
359    "links": [
360        {
361            "ethernet_mac_address": "$myaddr",
362            "id": "iface0",
363            "mtu": null
364        }
365    ],
366    "networks": [
367        {
368            "id": "network0",
369            "link": "iface0",
370            "type": "ipv4_dhcp"
371        },
372        { // IPv6
373            "id": "private-ipv4",
374            "type": "ipv6",
375            "link": "iface0",
376            // supports condensed IPv6 with CIDR netmask
377            "ip_address": "2001:db8::3257:9652/64",
378            "gateway": "fd00::1",
379            "routes": [
380                {
381                    "network": "::",
382                    "netmask": "::",
383                    "gateway": "fd00::1"
384                },
385                {
386                    "network": "::",
387                    "netmask": "ffff:ffff:ffff::",
388                    "gateway": "fd00::1:1"
389                }
390            ],
391            "network_id": "da5bb487-5193-4a65-a3df-4a0055a8c0d8"
392        }
393    ]
394}
395EOF
396	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
397	cat > network << EOF
398ifconfig_${myiface}="DHCP"
399ifconfig_${myiface}_ipv6="inet6 2001:db8::3257:9652/64"
400ipv6_network_interfaces="${myiface}"
401ipv6_default_interface="${myiface}"
402EOF
403	cat > routing << EOF
404ipv6_defaultrouter="fd00::1"
405ipv6_route_${myiface}="fd00::1 -prefixlen 128 -interface ${myiface}"
406ipv6_static_routes="${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_network_static_v4_body()
413{
414	mkdir -p media/nuageinit
415	setup_test_adduser
416	printf "{}" > media/nuageinit/meta_data.json
417	mynetworks=$(ifconfig -l ether)
418	if [ -z "$mynetworks" ]; then
419		atf_skip "a network interface is needed"
420	fi
421	set -- $mynetworks
422	myiface=$1
423	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
424cat > media/nuageinit/network_data.json << EOF
425{
426    "links": [
427        {
428            "ethernet_mac_address": "$myaddr",
429            "id": "iface0",
430            "mtu": null
431        }
432    ],
433    "networks": [
434        {
435            "id": "network0",
436            "link": "iface0",
437            "type": "ipv4",
438            "ip_address": "10.184.0.244",
439            "netmask": "255.255.240.0",
440            "routes": [
441                {
442                    "network": "10.0.0.0",
443                    "netmask": "255.0.0.0",
444                    "gateway": "11.0.0.1"
445                },
446                {
447                    "network": "0.0.0.0",
448                    "netmask": "0.0.0.0",
449                    "gateway": "23.253.157.1"
450                }
451            ]
452        }
453    ]
454}
455EOF
456	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
457	cat > network << EOF
458ifconfig_${myiface}="inet 10.184.0.244 netmask 255.255.240.0"
459EOF
460	cat > routing << EOF
461route_cloudinit1_${myiface}="-net 10.0.0.0 11.0.0.1 255.0.0.0"
462defaultrouter="23.253.157.1"
463static_routes="cloudinit1_${myiface}"
464EOF
465	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
466	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
467}
468
469config2_network_dns_body()
470{
471	mkdir -p media/nuageinit
472	setup_test_adduser
473	printf "{}" > media/nuageinit/meta_data.json
474	mynetworks=$(ifconfig -l ether)
475	if [ -z "$mynetworks" ]; then
476		atf_skip "a network interface is needed"
477	fi
478	set -- $mynetworks
479	myiface=$1
480	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
481cat > media/nuageinit/network_data.json << EOF
482{
483    "links": [
484        {
485            "ethernet_mac_address": "$myaddr",
486            "id": "iface0",
487            "mtu": null
488        }
489    ],
490    "networks": [
491        {
492            "id": "network0",
493            "link": "iface0",
494            "type": "ipv4_dhcp"
495        }
496    ],
497    "services": [
498        {
499            "type": "dns",
500            "address": "9.9.9.9"
501        },
502        {
503            "type": "dns",
504            "address": "149.112.112.112"
505        }
506    ]
507}
508EOF
509	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
510	atf_check -o inline:'name_servers="9.9.9.9 149.112.112.112"\n' \
511		cat "${PWD}"/etc/resolvconf.conf
512}
513
514config2_ssh_keys_head()
515{
516	atf_set "require.user" root
517}
518config2_ssh_keys_body()
519{
520	here=$(pwd)
521	export NUAGE_FAKE_ROOTDIR=$(pwd)
522	mkdir -p media/nuageinit
523	touch media/nuageinit/meta_data.json
524	cat > media/nuageinit/user-data << EOF
525#cloud-config
526ssh_keys:
527  rsa_private: |
528    -----BEGIN RSA PRIVATE KEY-----
529    MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
530    ...
531    -----END RSA PRIVATE KEY-----
532  rsa_public: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...
533  ed25519_private: |
534    -----BEGIN OPENSSH PRIVATE KEY-----
535    blabla
536    ...
537    -----END OPENSSH PRIVATE KEY-----
538  ed25519_public: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+
539EOF
540	mkdir -p etc/ssh
541	cat > etc/master.passwd << EOF
542root:*:0:0::0:0:Charlie &:/root:/bin/csh
543sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
544EOF
545	pwd_mkdb -d etc ${here}/etc/master.passwd
546	cat > etc/group << EOF
547wheel:*:0:root
548users:*:1:
549EOF
550	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
551	_expected="-----BEGIN RSA PRIVATE KEY-----
552MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
553...
554-----END RSA PRIVATE KEY-----
555
556"
557	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key
558	_expected="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...\n"
559	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key.pub
560	_expected="-----BEGIN OPENSSH PRIVATE KEY-----
561blabla
562...
563-----END OPENSSH PRIVATE KEY-----
564
565"
566	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key
567	_expected="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+\n"
568	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key.pub
569}
570
571
572nocloud_userdata_cloudconfig_ssh_pwauth_head()
573{
574	atf_set "require.user" root
575}
576nocloud_userdata_cloudconfig_ssh_pwauth_body()
577{
578	mkdir -p etc
579	cat > etc/master.passwd << EOF
580root:*:0:0::0:0:Charlie &:/root:/bin/sh
581sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
582EOF
583	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
584	cat > etc/group << EOF
585wheel:*:0:root
586users:*:1:
587EOF
588	mkdir -p media/nuageinit
589	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
590	cat > media/nuageinit/user-data << 'EOF'
591#cloud-config
592ssh_pwauth: true
593EOF
594	mkdir -p etc/ssh/
595	touch etc/ssh/sshd_config
596
597	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
598	atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
599
600	# Same value we don't touch anything
601	printf "   PasswordAuthentication yes # I want password\n" > etc/ssh/sshd_config
602	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
603	atf_check -o inline:"   PasswordAuthentication yes # I want password\n" cat etc/ssh/sshd_config
604
605	printf "   PasswordAuthentication no # Should change\n" > etc/ssh/sshd_config
606	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
607	atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
608
609	cat > media/nuageinit/user-data << 'EOF'
610#cloud-config
611ssh_pwauth: false
612EOF
613
614	printf "   PasswordAuthentication no # no passwords\n" > etc/ssh/sshd_config
615	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
616	atf_check -o inline:"   PasswordAuthentication no # no passwords\n" cat etc/ssh/sshd_config
617
618	printf "   PasswordAuthentication yes # Should change\n" > etc/ssh/sshd_config
619	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
620	atf_check -o inline:"PasswordAuthentication no\n" cat etc/ssh/sshd_config
621}
622
623nocloud_userdata_cloudconfig_chpasswd_head()
624{
625	atf_set "require.user" root
626}
627nocloud_userdata_cloudconfig_chpasswd_body()
628{
629	mkdir -p etc
630	cat > etc/master.passwd << EOF
631root:*:0:0::0:0:Charlie &:/root:/bin/sh
632sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
633user:*:1:0::0:0:Sys:/home/sys:/bin/sh
634EOF
635	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
636	cat > etc/group << EOF
637wheel:*:0:root
638users:*:1:
639EOF
640	mkdir -p media/nuageinit
641	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
642	cat > media/nuageinit/user-data << 'EOF'
643#cloud-config
644chpasswd:
645  expire: true
646  users:
647  - { user: "sys", password: RANDOM }
648EOF
649
650	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
651	atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'name'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
652	# nothing modified
653	atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
654
655	cat > media/nuageinit/user-data << 'EOF'
656#cloud-config
657chpasswd:
658  expire: true
659  users:
660  - { name: "sys", pwd: RANDOM }
661EOF
662	atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'password'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
663	# nothing modified
664	atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
665
666	cat > media/nuageinit/user-data << 'EOF'
667#cloud-config
668chpasswd:
669  expire: false
670  users:
671  - { name: "sys", password: RANDOM }
672EOF
673	# not empty because the password is printed to stdout
674	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
675	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
676
677	cat > media/nuageinit/user-data << 'EOF'
678#cloud-config
679chpasswd:
680  expire: true
681  users:
682  - { name: "sys", password: RANDOM }
683EOF
684	# not empty because the password is printed to stdout
685	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
686	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
687
688	cat > media/nuageinit/user-data << 'EOF'
689#cloud-config
690chpasswd:
691  expire: true
692  users:
693  - { name: "user", password: "$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/" }
694EOF
695	# not empty because the password is printed to stdout
696	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
697	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
698}
699
700
701nocloud_userdata_cloudconfig_chpasswd_list_string_head()
702{
703	atf_set "require.user" root
704}
705nocloud_userdata_cloudconfig_chpasswd_list_string_body()
706{
707	mkdir -p etc
708	cat > etc/master.passwd << EOF
709root:*:0:0::0:0:Charlie &:/root:/bin/sh
710sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
711user:*:1:0::0:0:Sys:/home/sys:/bin/sh
712EOF
713	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
714	cat > etc/group << EOF
715wheel:*:0:root
716users:*:1:
717EOF
718	mkdir -p media/nuageinit
719	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
720	cat > media/nuageinit/user-data << 'EOF'
721#cloud-config
722chpasswd:
723  expire: true
724  list: |
725     sys:RANDOM
726EOF
727
728	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
729	atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
730	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
731
732	cat > media/nuageinit/user-data << 'EOF'
733#cloud-config
734chpasswd:
735  expire: false
736  list: |
737     sys:plop
738     user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
739     root:R
740EOF
741
742	atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
743	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
744	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
745	atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
746}
747
748nocloud_userdata_cloudconfig_chpasswd_list_list_head()
749{
750	atf_set "require.user" root
751}
752nocloud_userdata_cloudconfig_chpasswd_list_list_body()
753{
754	mkdir -p etc
755	cat > etc/master.passwd << EOF
756root:*:0:0::0:0:Charlie &:/root:/bin/sh
757sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
758user:*:1:0::0:0:Sys:/home/sys:/bin/sh
759EOF
760	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
761	cat > etc/group << EOF
762wheel:*:0:root
763users:*:1:
764EOF
765	mkdir -p media/nuageinit
766	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
767	cat > media/nuageinit/user-data << 'EOF'
768#cloud-config
769chpasswd:
770  expire: true
771  list:
772  - sys:RANDOM
773EOF
774
775	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
776	atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
777	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
778
779	cat > media/nuageinit/user-data << 'EOF'
780#cloud-config
781chpasswd:
782  expire: false
783  list:
784  - sys:plop
785  - user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
786  - root:R
787EOF
788
789	atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
790	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
791	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
792	atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
793}
794
795config2_userdata_runcmd_head()
796{
797	atf_set "require.user" root
798}
799config2_userdata_runcmd_body()
800{
801	mkdir -p media/nuageinit
802	setup_test_adduser
803	printf "{}" > media/nuageinit/meta_data.json
804	cat > media/nuageinit/user_data << 'EOF'
805#cloud-config
806runcmd:
807EOF
808	chmod 755 "${PWD}"/media/nuageinit/user_data
809	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
810	cat > media/nuageinit/user_data << 'EOF'
811#cloud-config
812runcmd:
813  - plop
814EOF
815	chmod 755 "${PWD}"/media/nuageinit/user_data
816	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
817	test -f var/cache/nuageinit/runcmds || atf_fail "File not created"
818	test -x var/cache/nuageinit/runcmds || atf_fail "Missing execution permission"
819	atf_check -o inline:"#!/bin/sh\nplop\n" cat var/cache/nuageinit/runcmds
820
821	cat > media/nuageinit/user_data << 'EOF'
822#cloud-config
823runcmd:
824  - echo "yeah!"
825  - uname -s
826EOF
827	chmod 755 "${PWD}"/media/nuageinit/user_data
828	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
829	atf_check -o inline:"#!/bin/sh\necho \"yeah!\"\nuname -s\n" cat var/cache/nuageinit/runcmds
830}
831
832config2_userdata_packages_head()
833{
834	atf_set "require.user" root
835}
836
837config2_userdata_packages_body()
838{
839	mkdir -p media/nuageinit
840	setup_test_adduser
841	export NUAGE_RUN_TESTS=1
842	printf "{}" > media/nuageinit/meta_data.json
843	cat > media/nuageinit/user_data << 'EOF'
844#cloud-config
845packages:
846EOF
847	chmod 755 "${PWD}"/media/nuageinit/user_data
848	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
849	cat > media/nuageinit/user_data << 'EOF'
850#cloud-config
851packages:
852  - yeah/plop
853EOF
854	chmod 755 "${PWD}"/media/nuageinit/user_data
855	atf_check -s exit:0 -o inline:"pkg install -y 'yeah/plop'\npkg info -q 'yeah/plop'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
856
857	cat > media/nuageinit/user_data << 'EOF'
858#cloud-config
859packages:
860  - curl
861EOF
862	chmod 755 "${PWD}"/media/nuageinit/user_data
863	atf_check -o inline:"pkg install -y 'curl'\npkg info -q 'curl'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
864
865	cat > media/nuageinit/user_data << 'EOF'
866#cloud-config
867packages:
868  - curl
869  - meh: bla
870EOF
871	chmod 755 "${PWD}"/media/nuageinit/user_data
872	atf_check -o inline:"pkg install -y 'curl'\npkg info -q 'curl'\n" -e inline:"nuageinit: Invalid type: table for packages entry number 2\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
873}
874
875config2_userdata_update_packages_body()
876{
877	mkdir -p media/nuageinit
878	setup_test_adduser
879	export NUAGE_RUN_TESTS=1
880	printf "{}" > media/nuageinit/meta_data.json
881	cat > media/nuageinit/user_data << 'EOF'
882#cloud-config
883package_update: true
884EOF
885	chmod 755 "${PWD}"/media/nuageinit/user_data
886	atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg update\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
887}
888
889config2_userdata_upgrade_packages_body()
890{
891	mkdir -p media/nuageinit
892	setup_test_adduser
893	export NUAGE_RUN_TESTS=1
894	printf "{}" > media/nuageinit/meta_data.json
895	cat > media/nuageinit/user_data << 'EOF'
896#cloud-config
897package_upgrade: true
898EOF
899	chmod 755 "${PWD}"/media/nuageinit/user_data
900	atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg upgrade\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
901}
902
903config2_userdata_shebang_body()
904{
905	mkdir -p media/nuageinit
906	setup_test_adduser
907	printf "{}" > media/nuageinit/meta_data.json
908	cat > media/nuageinit/user_data <<EOF
909#!/we/dont/care
910anything
911EOF
912	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
913	test -f var/cache/nuageinit/user_data || atf_fail "File not created"
914	test -x var/cache/nuageinit/user_data || atf_fail "Missing execution permission"
915	atf_check -o inline:"#!/we/dont/care\nanything\n" cat var/cache/nuageinit/user_data
916	cat > media/nuageinit/user_data <<EOF
917/we/dont/care
918EOF
919	rm var/cache/nuageinit/user_data
920	if [ -f var/cache/nuageinit/user_data ]; then
921		atf_fail "File should not have been created"
922	fi
923}
924
925config2_userdata_write_files_body()
926{
927	mkdir -p media/nuageinit
928	setup_test_adduser
929	printf "{}" > media/nuageinit/meta_data.json
930	cat > media/nuageinit/user_data <<EOF
931#cloud-config
932write_files:
933- content: "plop"
934  path: /file1
935- path: /emptyfile
936- content: !!binary |
937    YmxhCg==
938  path: /file_base64
939  encoding: b64
940  permissions: '0755'
941  owner: nobody
942- content: "bob"
943  path: "/foo"
944  defer: true
945EOF
946	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
947	atf_check -o inline:"plop" cat file1
948	atf_check -o inline:"" cat emptyfile
949	atf_check -o inline:"bla\n" cat file_base64
950	test -f foo && atf_fail "foo creation should have been deferred"
951	atf_check -o match:"^-rwxr-xr-x.*nobody" ls -l file_base64
952	rm file1 emptyfile file_base64
953	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
954	test -f file1 -o -f emptyfile -o -f file_base64 && atf_fail "defer not working properly"
955	atf_check -o inline:"bob" cat foo
956}
957
958config2_userdata_ssh_deletekeys_head()
959{
960	atf_set "require.user" root
961}
962config2_userdata_ssh_deletekeys_body()
963{
964	mkdir -p media/nuageinit
965	setup_test_adduser
966	printf "{}" > media/nuageinit/meta_data.json
967	cat > media/nuageinit/user_data <<EOF
968#cloud-config
969ssh_deletekeys: true
970EOF
971	mkdir -p etc/ssh
972	touch etc/ssh/ssh_host_rsa_key
973	touch etc/ssh/ssh_host_rsa_key.pub
974	touch etc/ssh/ssh_host_ed25519_key
975	touch etc/ssh/ssh_host_ed25519_key.pub
976	touch etc/ssh/ssh_host_ecdsa_key
977	touch etc/ssh/ssh_host_ecdsa_key.pub
978	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
979	test -f etc/ssh/ssh_host_rsa_key && atf_fail "ssh_host_rsa_key not deleted"
980	test -f etc/ssh/ssh_host_rsa_key.pub && atf_fail "ssh_host_rsa_key.pub not deleted"
981	test -f etc/ssh/ssh_host_ed25519_key && atf_fail "ssh_host_ed25519_key not deleted"
982	test -f etc/ssh/ssh_host_ed25519_key.pub && atf_fail "ssh_host_ed25519_key.pub not deleted"
983	test -f etc/ssh/ssh_host_ecdsa_key && atf_fail "ssh_host_ecdsa_key not deleted"
984	test -f etc/ssh/ssh_host_ecdsa_key.pub && atf_fail "ssh_host_ecdsa_key.pub not deleted"
985	true
986}
987
988config2_userdata_disable_root_head()
989{
990	atf_set "require.user" root
991}
992config2_userdata_disable_root_body()
993{
994	mkdir -p media/nuageinit
995	setup_test_adduser
996	printf "{}" > media/nuageinit/meta_data.json
997	cat > media/nuageinit/user_data <<EOF
998#cloud-config
999disable_root: true
1000EOF
1001	mkdir -p etc/ssh
1002	touch etc/ssh/sshd_config
1003	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1004	atf_check -o inline:"PermitRootLogin no\n" cat etc/ssh/sshd_config
1005	cat > media/nuageinit/user_data <<EOF
1006#cloud-config
1007disable_root: true
1008disable_root_opts: "without-password"
1009EOF
1010	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1011	atf_check -o inline:"PermitRootLogin without-password\n" cat etc/ssh/sshd_config
1012	cat > media/nuageinit/user_data <<EOF
1013#cloud-config
1014disable_root: true
1015disable_root_opts:
1016  - "prohibit-password"
1017EOF
1018	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1019	atf_check -o inline:"PermitRootLogin prohibit-password\n" cat etc/ssh/sshd_config
1020	cat > media/nuageinit/user_data <<EOF
1021#cloud-config
1022disable_root: false
1023EOF
1024	echo "PermitRootLogin yes" > etc/ssh/sshd_config
1025	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1026	atf_check -o inline:"PermitRootLogin yes\n" cat etc/ssh/sshd_config
1027}
1028
1029config2_userdata_bootcmd_head()
1030{
1031	atf_set "require.user" root
1032}
1033config2_userdata_bootcmd_body()
1034{
1035	mkdir -p media/nuageinit
1036	setup_test_adduser
1037	printf "{}" > media/nuageinit/meta_data.json
1038	cat > media/nuageinit/user_data <<EOF
1039#cloud-config
1040bootcmd:
1041  - kldload if_bridge
1042EOF
1043	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1044	test -f var/cache/nuageinit/bootcmds || atf_fail "bootcmds file not created"
1045	atf_check -o inline:"#!/bin/sh\nkldload if_bridge\n" cat var/cache/nuageinit/bootcmds
1046	cat > media/nuageinit/user_data <<EOF
1047#cloud-config
1048bootcmd:
1049  - sysctl net.inet.ip.forwarding=1
1050  - kldload if_bridge
1051EOF
1052	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1053	atf_check -o inline:"#!/bin/sh\nsysctl net.inet.ip.forwarding=1\nkldload if_bridge\n" cat var/cache/nuageinit/bootcmds
1054	# Test 3: empty list (clean up from previous tests first)
1055	rm -f var/cache/nuageinit/bootcmds
1056	cat > media/nuageinit/user_data <<EOF
1057#cloud-config
1058bootcmd: []
1059EOF
1060	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1061	test -f var/cache/nuageinit/bootcmds && atf_fail "bootcmds should not have been created for empty list"
1062	true
1063}
1064
1065config2_userdata_manage_etc_hosts_head()
1066{
1067	atf_set "require.user" root
1068}
1069config2_userdata_manage_etc_hosts_body()
1070{
1071	mkdir -p media/nuageinit
1072	setup_test_adduser
1073	printf "{}" > media/nuageinit/meta_data.json
1074	# Test 1: manage_etc_hosts adds hostname when /etc/hosts does not exist
1075	cat > media/nuageinit/user_data <<EOF
1076#cloud-config
1077hostname: mycloud
1078EOF
1079	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1080	atf_check -o inline:"::1\t\tlocalhost mycloud\n127.0.0.1\t\tlocalhost mycloud\n" cat etc/hosts
1081	# Test 2: manage_etc_hosts appends hostname to existing localhost lines
1082	cat > etc/hosts <<EOF
1083::1		localhost
1084127.0.0.1		localhost
1085EOF
1086	cat > media/nuageinit/user_data <<EOF
1087#cloud-config
1088hostname: myvm
1089EOF
1090	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1091	atf_check -o inline:"::1\t\tlocalhost myvm\n127.0.0.1\t\tlocalhost myvm\n" cat etc/hosts
1092	# Test 3: hostname already present in /etc/hosts, no change
1093	cat > etc/hosts <<EOF
1094::1		localhost myvm
1095127.0.0.1		localhost myvm
1096EOF
1097	cat > media/nuageinit/user_data <<EOF
1098#cloud-config
1099hostname: myvm
1100EOF
1101	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1102	atf_check -o inline:"::1\t\tlocalhost myvm\n127.0.0.1\t\tlocalhost myvm\n" cat etc/hosts
1103	# Test 4: manage_etc_hosts: false disables the behaviour
1104	cat > etc/hosts <<EOF
1105::1		localhost
1106127.0.0.1		localhost
1107EOF
1108	cat > media/nuageinit/user_data <<EOF
1109#cloud-config
1110hostname: nope
1111manage_etc_hosts: false
1112EOF
1113	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1114	atf_check -o inline:"::1\t\tlocalhost\n127.0.0.1\t\tlocalhost\n" cat etc/hosts
1115}
1116
1117config2_userdata_mounts_head()
1118{
1119	atf_set "require.user" root
1120}
1121config2_userdata_mounts_body()
1122{
1123	mkdir -p media/nuageinit
1124	setup_test_adduser
1125	printf "{}" > media/nuageinit/meta_data.json
1126	cat > media/nuageinit/user_data <<EOF
1127#cloud-config
1128mounts:
1129  - [ /dev/ada1p1, /mnt/data, ufs, rw, 0, 2 ]
1130  - device: tmpfs
1131    mountpoint: /mnt/tmp
1132    fstype: tmpfs
1133    options: "size=256M"
1134EOF
1135	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1136	atf_check -o match:"/dev/ada1p1.*/mnt/data.*ufs.*rw.*0.*2" cat etc/fstab
1137	atf_check -o match:"tmpfs.*/mnt/tmp.*tmpfs.*size=256M.*0.*0" cat etc/fstab
1138	test -d mnt/data || atf_fail "/mnt/data directory not created"
1139	test -d mnt/tmp || atf_fail "/mnt/tmp directory not created"
1140	true
1141}
1142
1143config2_userdata_fqdn_and_hostname_body()
1144{
1145	mkdir -p media/nuageinit
1146	setup_test_adduser
1147	printf "{}" > media/nuageinit/meta_data.json
1148	cat > media/nuageinit/user_data <<EOF
1149#cloud-config
1150fqdn: host.domain.tld
1151hostname: host
1152EOF
1153	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1154	atf_check -o inline:"hostname=\"host.domain.tld\"\n" cat ${PWD}/etc/rc.conf.d/hostname
1155	cat > media/nuageinit/user_data <<EOF
1156#cloud-config
1157hostname: host
1158EOF
1159	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1160	atf_check -o inline:"hostname=\"host\"\n" cat ${PWD}/etc/rc.conf.d/hostname
1161}
1162
1163atf_init_test_cases()
1164{
1165	atf_add_test_case args
1166	atf_add_test_case nocloud
1167	atf_add_test_case nocloud_userdata_script
1168	atf_add_test_case nocloud_user_data_script
1169	atf_add_test_case nocloud_userdata_cloudconfig_users
1170	atf_add_test_case nocloud_network
1171	atf_add_test_case config2
1172	atf_add_test_case config2_pubkeys
1173	atf_add_test_case config2_pubkeys_user_data
1174	atf_add_test_case config2_pubkeys_meta_data
1175	atf_add_test_case config2_network
1176	atf_add_test_case config2_network_static_v4
1177	atf_add_test_case config2_network_dns
1178	atf_add_test_case config2_ssh_keys
1179	atf_add_test_case nocloud_userdata_cloudconfig_ssh_pwauth
1180	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd
1181	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
1182	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
1183	atf_add_test_case config2_userdata_runcmd
1184	atf_add_test_case config2_userdata_packages
1185	atf_add_test_case config2_userdata_update_packages
1186	atf_add_test_case config2_userdata_upgrade_packages
1187	atf_add_test_case config2_userdata_shebang
1188	atf_add_test_case config2_userdata_ssh_deletekeys
1189	atf_add_test_case config2_userdata_disable_root
1190	atf_add_test_case config2_userdata_bootcmd
1191	atf_add_test_case config2_userdata_manage_etc_hosts
1192	atf_add_test_case config2_userdata_mounts
1193	atf_add_test_case config2_userdata_fqdn_and_hostname
1194	atf_add_test_case config2_userdata_write_files
1195}
1196