xref: /freebsd/libexec/nuageinit/tests/nuageinit.sh (revision ac7a19d41ee5eb1271c46fbc620b2f98dffa2230)
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
26atf_test_case config2_userdata_runcmd
27atf_test_case config2_userdata_packages
28atf_test_case config2_userdata_update_packages
29atf_test_case config2_userdata_upgrade_packages
30atf_test_case config2_userdata_shebang
31atf_test_case config2_userdata_fqdn_and_hostname
32
33setup_test_adduser()
34{
35	here=$(pwd)
36	export NUAGE_FAKE_ROOTDIR=$(pwd)
37	mkdir -p etc/ssh
38	cat > etc/master.passwd << EOF
39root:*:0:0::0:0:Charlie &:/root:/bin/csh
40sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
41EOF
42	pwd_mkdb -d etc ${here}/etc/master.passwd
43	cat > etc/group << EOF
44wheel:*:0:root
45users:*:1:
46EOF
47}
48
49args_body()
50{
51	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit
52	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla
53	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla meh plop
54	atf_check -s exit:1 -e inline:"nuageinit: Unknown cloud init type: meh\n" /usr/libexec/nuageinit bla meh
55}
56
57nocloud_body()
58{
59	mkdir -p media/nuageinit
60	atf_check -s exit:1 -e match:"nuageinit: error parsing nocloud.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit/ nocloud
61	printf "instance-id: iid-local01\nlocal-hostname: cloudimg\n" > "${PWD}"/media/nuageinit/meta-data
62	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
63	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
64	cat > media/nuageinit/meta-data << EOF
65instance-id: iid-local01
66hostname: myhost
67EOF
68	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
69	atf_check -o inline:"hostname=\"myhost\"\n" cat etc/rc.conf.d/hostname
70}
71
72nocloud_userdata_script_body()
73{
74	mkdir -p media/nuageinit
75	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
76	printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user-data
77	chmod 755 "${PWD}"/media/nuageinit/user-data
78	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
79	atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data
80}
81
82nocloud_user_data_script_body()
83{
84	mkdir -p media/nuageinit
85	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
86	printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user_data
87	chmod 755 "${PWD}"/media/nuageinit/user_data
88	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
89	atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data
90}
91
92nocloud_userdata_cloudconfig_users_head()
93{
94	atf_set "require.user" root
95}
96nocloud_userdata_cloudconfig_users_body()
97{
98	mkdir -p media/nuageinit
99	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
100	mkdir -p etc
101	cat > etc/master.passwd << EOF
102root:*:0:0::0:0:Charlie &:/root:/bin/sh
103sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
104EOF
105	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
106	cat > etc/group << EOF
107wheel:*:0:root
108users:*:1:
109EOF
110	cat > media/nuageinit/user-data << 'EOF'
111#cloud-config
112groups:
113  - admingroup: [root,sys]
114  - cloud-users
115users:
116  - default
117  - name: foobar
118    gecos: Foo B. Bar
119    primary_group: foobar
120    sudo: ALL=(ALL) NOPASSWD:ALL
121    groups: users
122    passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
123EOF
124	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
125	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
126	cat > expectedgroup << EOF
127wheel:*:0:root,freebsd
128users:*:1:foobar
129admingroup:*:1001:root,sys
130cloud-users:*:1002:
131freebsd:*:1003:
132foobar:*:1004:
133EOF
134	cat > expectedpasswd << 'EOF'
135root:*:0:0::0:0:Charlie &:/root:/bin/sh
136sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
137freebsd:freebsd:1001:1003::0:0:FreeBSD User:/home/freebsd:/bin/sh
138foobar:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1002:1004::0:0:Foo B. Bar:/home/foobar:/bin/sh
139EOF
140	sed -i "" "s/freebsd:.*:1001/freebsd:freebsd:1001/" "${PWD}"/etc/master.passwd
141	atf_check -o file:expectedpasswd cat "${PWD}"/etc/master.passwd
142	atf_check -o file:expectedgroup cat "${PWD}"/etc/group
143	atf_check -o inline:"foobar ALL=(ALL) NOPASSWD:ALL\n" cat ${PWD}/usr/local/etc/sudoers.d/90-nuageinit-users
144}
145
146nocloud_network_head()
147{
148	atf_set "require.user" root
149}
150nocloud_network_body()
151{
152	mkdir -p media/nuageinit
153	mkdir -p etc
154	cat > etc/master.passwd << EOF
155root:*:0:0::0:0:Charlie &:/root:/bin/sh
156sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
157EOF
158	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
159	cat > etc/group << EOF
160wheel:*:0:root
161users:*:1:
162EOF
163	mynetworks=$(ifconfig -l ether)
164	if [ -z "$mynetworks" ]; then
165		atf_skip "a network interface is needed"
166	fi
167	set -- $mynetworks
168	myiface=$1
169	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
170	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
171	cat > media/nuageinit/user-data << EOF
172#cloud-config
173network:
174  version: 2
175  ethernets:
176    # opaque ID for physical interfaces, only referred to by other stanzas
177    id0:
178      match:
179        macaddress: "$myaddr"
180      addresses:
181        - 192.0.2.2/24
182        - 2001:db8::2/64
183      gateway4: 192.0.2.1
184      gateway6: 2001:db8::1
185EOF
186	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
187	cat > network << EOF
188ifconfig_${myiface}="inet 192.0.2.2/24"
189ifconfig_${myiface}_ipv6="inet6 2001:db8::2/64"
190ipv6_network_interfaces="${myiface}"
191ipv6_default_interface="${myiface}"
192EOF
193	cat > routing << EOF
194defaultrouter="192.0.2.1"
195ipv6_defaultrouter="2001:db8::1"
196ipv6_route_${myiface}="2001:db8::1 -prefixlen 128 -interface ${myiface}"
197EOF
198	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
199	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
200}
201
202config2_body()
203{
204	mkdir -p media/nuageinit
205	atf_check -s exit:1 -e match:"nuageinit: error parsing config-2 meta_data.json:.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
206	printf "{}" > media/nuageinit/meta_data.json
207	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
208	cat > media/nuageinit/meta_data.json << EOF
209{
210    "hostname": "cloudimg"
211}
212EOF
213	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
214	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
215}
216
217config2_pubkeys_head()
218{
219	atf_set "require.user" root
220}
221config2_pubkeys_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_user_data_head()
245{
246	atf_set "require.user" root
247}
248config2_pubkeys_user_data_body()
249{
250	mkdir -p media/nuageinit
251	touch media/nuageinit/meta_data.json
252	cat > media/nuageinit/user_data << EOF
253#cloud-config
254ssh_authorized_keys:
255  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
256EOF
257	mkdir -p etc
258	cat > etc/master.passwd << EOF
259root:*:0:0::0:0:Charlie &:/root:/bin/sh
260sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
261EOF
262	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
263	cat > etc/group << EOF
264wheel:*:0:root
265users:*:1:
266EOF
267	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
268	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
269}
270
271config2_pubkeys_meta_data_body()
272{
273	here=$(pwd)
274	export NUAGE_FAKE_ROOTDIR=$(pwd)
275	if [ $(id -u) -ne 0 ]; then
276		atf_skip "root required"
277	fi
278	mkdir -p media/nuageinit
279	cat > media/nuageinit/meta_data.json << EOF
280{
281    "uuid": "uuid_for_this_instance",
282    "admin_pass": "a_generated_password",
283    "public_keys": {
284        "tdb": "ssh-ed25519 my_key_id tdb@host"
285    },
286    "keys": [
287        {
288            "name": "tdb",
289            "type": "ssh",
290            "data": "ssh-ed25519 my_key_id tdb@host"
291        }
292    ],
293    "hostname": "freebsd-14-test.novalocal",
294    "name": "freebsd-14-test",
295    "launch_index": 0,
296    "availability_zone": "nova",
297    "random_seed": "long_random_seed",
298    "project_id": "my_project_id",
299    "devices": [],
300    "dedicated_cpus": []
301}
302EOF
303	mkdir -p etc
304	cat > etc/master.passwd << EOF
305root:*:0:0::0:0:Charlie &:/root:/bin/csh
306sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
307EOF
308	pwd_mkdb -d etc ${here}/etc/master.passwd
309	cat > etc/group << EOF
310wheel:*:0:root
311users:*:1:
312EOF
313	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
314	atf_check -o inline:"ssh-ed25519 my_key_id tdb@host\n" cat home/freebsd/.ssh/authorized_keys
315}
316
317config2_network_body()
318{
319	mkdir -p media/nuageinit
320	printf "{}" > media/nuageinit/meta_data.json
321	mynetworks=$(ifconfig -l ether)
322	if [ -z "$mynetworks" ]; then
323		atf_skip "a network interface is needed"
324	fi
325	set -- $mynetworks
326	myiface=$1
327	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
328cat > media/nuageinit/network_data.json << EOF
329{
330    "links": [
331        {
332            "ethernet_mac_address": "$myaddr",
333            "id": "iface0",
334            "mtu": null
335        }
336    ],
337    "networks": [
338        {
339            "id": "network0",
340            "link": "iface0",
341            "type": "ipv4_dhcp"
342        },
343        { // IPv6
344            "id": "private-ipv4",
345            "type": "ipv6",
346            "link": "iface0",
347            // supports condensed IPv6 with CIDR netmask
348            "ip_address": "2001:db8::3257:9652/64",
349            "gateway": "fd00::1",
350            "routes": [
351                {
352                    "network": "::",
353                    "netmask": "::",
354                    "gateway": "fd00::1"
355                },
356                {
357                    "network": "::",
358                    "netmask": "ffff:ffff:ffff::",
359                    "gateway": "fd00::1:1"
360                }
361            ],
362            "network_id": "da5bb487-5193-4a65-a3df-4a0055a8c0d8"
363        }
364    ]
365}
366EOF
367	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
368	cat > network << EOF
369ifconfig_${myiface}="DHCP"
370ifconfig_${myiface}_ipv6="inet6 2001:db8::3257:9652/64"
371ipv6_network_interfaces="${myiface}"
372ipv6_default_interface="${myiface}"
373EOF
374	cat > routing << EOF
375ipv6_defaultrouter="fd00::1"
376ipv6_route_${myiface}="fd00::1 -prefixlen 128 -interface ${myiface}"
377ipv6_static_routes="${myiface}"
378EOF
379	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
380	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
381}
382
383config2_network_static_v4_body()
384{
385	mkdir -p media/nuageinit
386	printf "{}" > media/nuageinit/meta_data.json
387	mynetworks=$(ifconfig -l ether)
388	if [ -z "$mynetworks" ]; then
389		atf_skip "a network interface is needed"
390	fi
391	set -- $mynetworks
392	myiface=$1
393	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
394cat > media/nuageinit/network_data.json << EOF
395{
396    "links": [
397        {
398            "ethernet_mac_address": "$myaddr",
399            "id": "iface0",
400            "mtu": null
401        }
402    ],
403    "networks": [
404        {
405            "id": "network0",
406            "link": "iface0",
407            "type": "ipv4",
408            "ip_address": "10.184.0.244",
409            "netmask": "255.255.240.0",
410            "routes": [
411                {
412                    "network": "10.0.0.0",
413                    "netmask": "255.0.0.0",
414                    "gateway": "11.0.0.1"
415                },
416                {
417                    "network": "0.0.0.0",
418                    "netmask": "0.0.0.0",
419                    "gateway": "23.253.157.1"
420                }
421            ]
422        }
423    ]
424}
425EOF
426	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
427	cat > network << EOF
428ifconfig_${myiface}="inet 10.184.0.244 netmask 255.255.240.0"
429EOF
430	cat > routing << EOF
431route_cloudinit1_${myiface}="-net 10.0.0.0 11.0.0.1 255.0.0.0"
432defaultrouter="23.253.157.1"
433static_routes="cloudinit1_${myiface}"
434EOF
435	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
436	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
437}
438
439config2_ssh_keys_head()
440{
441	atf_set "require.user" root
442}
443config2_ssh_keys_body()
444{
445	here=$(pwd)
446	export NUAGE_FAKE_ROOTDIR=$(pwd)
447	mkdir -p media/nuageinit
448	touch media/nuageinit/meta_data.json
449	cat > media/nuageinit/user-data << EOF
450#cloud-config
451ssh_keys:
452  rsa_private: |
453    -----BEGIN RSA PRIVATE KEY-----
454    MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
455    ...
456    -----END RSA PRIVATE KEY-----
457  rsa_public: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...
458  ed25519_private: |
459    -----BEGIN OPENSSH PRIVATE KEY-----
460    blabla
461    ...
462    -----END OPENSSH PRIVATE KEY-----
463  ed25519_public: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+
464EOF
465	mkdir -p etc/ssh
466	cat > etc/master.passwd << EOF
467root:*:0:0::0:0:Charlie &:/root:/bin/csh
468sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
469EOF
470	pwd_mkdb -d etc ${here}/etc/master.passwd
471	cat > etc/group << EOF
472wheel:*:0:root
473users:*:1:
474EOF
475	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
476	_expected="-----BEGIN RSA PRIVATE KEY-----
477MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
478...
479-----END RSA PRIVATE KEY-----
480"
481	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key
482	_expected="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...\n"
483	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key.pub
484	_expected="-----BEGIN OPENSSH PRIVATE KEY-----
485blabla
486...
487-----END OPENSSH PRIVATE KEY-----\n"
488	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key
489	_expected="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+\n"
490	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key.pub
491}
492
493
494nocloud_userdata_cloudconfig_ssh_pwauth_head()
495{
496	atf_set "require.user" root
497}
498nocloud_userdata_cloudconfig_ssh_pwauth_body()
499{
500	mkdir -p etc
501	cat > etc/master.passwd << EOF
502root:*:0:0::0:0:Charlie &:/root:/bin/sh
503sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
504EOF
505	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
506	cat > etc/group << EOF
507wheel:*:0:root
508users:*:1:
509EOF
510	mkdir -p media/nuageinit
511	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
512	cat > media/nuageinit/user-data << 'EOF'
513#cloud-config
514ssh_pwauth: true
515EOF
516	mkdir -p etc/ssh/
517	touch etc/ssh/sshd_config
518
519	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
520	atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
521
522	# Same value we don't touch anything
523	printf "   PasswordAuthentication yes # I want password\n" > etc/ssh/sshd_config
524	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
525	atf_check -o inline:"   PasswordAuthentication yes # I want password\n" cat etc/ssh/sshd_config
526
527	printf "   PasswordAuthentication no # Should change\n" > etc/ssh/sshd_config
528	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
529	atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
530
531	cat > media/nuageinit/user-data << 'EOF'
532#cloud-config
533ssh_pwauth: false
534EOF
535
536	printf "   PasswordAuthentication no # no passwords\n" > etc/ssh/sshd_config
537	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
538	atf_check -o inline:"   PasswordAuthentication no # no passwords\n" cat etc/ssh/sshd_config
539
540	printf "   PasswordAuthentication yes # Should change\n" > etc/ssh/sshd_config
541	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
542	atf_check -o inline:"PasswordAuthentication no\n" cat etc/ssh/sshd_config
543}
544
545nocloud_userdata_cloudconfig_chpasswd_head()
546{
547	atf_set "require.user" root
548}
549nocloud_userdata_cloudconfig_chpasswd_body()
550{
551	mkdir -p etc
552	cat > etc/master.passwd << EOF
553root:*:0:0::0:0:Charlie &:/root:/bin/sh
554sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
555user:*:1:0::0:0:Sys:/home/sys:/bin/sh
556EOF
557	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
558	cat > etc/group << EOF
559wheel:*:0:root
560users:*:1:
561EOF
562	mkdir -p media/nuageinit
563	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
564	cat > media/nuageinit/user-data << 'EOF'
565#cloud-config
566chpasswd:
567  expire: true
568  users:
569  - { user: "sys", password: RANDOM }
570EOF
571
572	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
573	atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'name'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
574	# nothing modified
575	atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
576
577	cat > media/nuageinit/user-data << 'EOF'
578#cloud-config
579chpasswd:
580  expire: true
581  users:
582  - { name: "sys", pwd: RANDOM }
583EOF
584	atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'password'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
585	# nothing modified
586	atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
587
588	cat > media/nuageinit/user-data << 'EOF'
589#cloud-config
590chpasswd:
591  expire: false
592  users:
593  - { name: "sys", password: RANDOM }
594EOF
595	# not empty because the password is printed to stdout
596	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
597	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
598
599	cat > media/nuageinit/user-data << 'EOF'
600#cloud-config
601chpasswd:
602  expire: true
603  users:
604  - { name: "sys", password: RANDOM }
605EOF
606	# not empty because the password is printed to stdout
607	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
608	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
609
610	cat > media/nuageinit/user-data << 'EOF'
611#cloud-config
612chpasswd:
613  expire: true
614  users:
615  - { name: "user", password: "$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/" }
616EOF
617	# not empty because the password is printed to stdout
618	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
619	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
620}
621
622
623nocloud_userdata_cloudconfig_chpasswd_list_string_head()
624{
625	atf_set "require.user" root
626}
627nocloud_userdata_cloudconfig_chpasswd_list_string_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  list: |
647     sys:RANDOM
648EOF
649
650	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
651	atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
652	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
653
654	cat > media/nuageinit/user-data << 'EOF'
655#cloud-config
656chpasswd:
657  expire: false
658  list: |
659     sys:plop
660     user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
661     root:R
662EOF
663
664	atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
665	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
666	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
667	atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
668}
669
670nocloud_userdata_cloudconfig_chpasswd_list_list_head()
671{
672	atf_set "require.user" root
673}
674nocloud_userdata_cloudconfig_chpasswd_list_list_body()
675{
676	mkdir -p etc
677	cat > etc/master.passwd << EOF
678root:*:0:0::0:0:Charlie &:/root:/bin/sh
679sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
680user:*:1:0::0:0:Sys:/home/sys:/bin/sh
681EOF
682	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
683	cat > etc/group << EOF
684wheel:*:0:root
685users:*:1:
686EOF
687	mkdir -p media/nuageinit
688	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
689	cat > media/nuageinit/user-data << 'EOF'
690#cloud-config
691chpasswd:
692  expire: true
693  list:
694  - sys:RANDOM
695EOF
696
697	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
698	atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
699	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
700
701	cat > media/nuageinit/user-data << 'EOF'
702#cloud-config
703chpasswd:
704  expire: false
705  list:
706  - sys:plop
707  - user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
708  - root:R
709EOF
710
711	atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
712	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
713	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
714	atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
715}
716
717config2_userdata_runcmd_head()
718{
719	atf_set "require.user" root
720}
721config2_userdata_runcmd_body()
722{
723	mkdir -p media/nuageinit
724	setup_test_adduser
725	printf "{}" > media/nuageinit/meta_data.json
726	cat > media/nuageinit/user_data << 'EOF'
727#cloud-config
728runcmd:
729EOF
730	chmod 755 "${PWD}"/media/nuageinit/user_data
731	atf_check -s exit:1 -e match:"attempt to index a nil value" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
732	cat > media/nuageinit/user_data << 'EOF'
733#cloud-config
734runcmd:
735  - plop
736EOF
737	chmod 755 "${PWD}"/media/nuageinit/user_data
738	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
739	test -f var/cache/nuageinit/runcmds || atf_fail "File not created"
740	test -x var/cache/nuageinit/runcmds || atf_fail "Missing execution permission"
741	atf_check -o inline:"#!/bin/sh\nplop\n" cat var/cache/nuageinit/runcmds
742
743	cat > media/nuageinit/user_data << 'EOF'
744#cloud-config
745runcmd:
746  - echo "yeah!"
747  - uname -s
748EOF
749	chmod 755 "${PWD}"/media/nuageinit/user_data
750	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
751	atf_check -o inline:"#!/bin/sh\necho \"yeah!\"\nuname -s\n" cat var/cache/nuageinit/runcmds
752}
753
754config2_userdata_packages_head()
755{
756	atf_set "require.user" root
757}
758
759config2_userdata_packages_body()
760{
761	mkdir -p media/nuageinit
762	setup_test_adduser
763	export NUAGE_RUN_TESTS=1
764	printf "{}" > media/nuageinit/meta_data.json
765	cat > media/nuageinit/user_data << 'EOF'
766#cloud-config
767packages:
768EOF
769	chmod 755 "${PWD}"/media/nuageinit/user_data
770	atf_check -s exit:1 -e match:"attempt to index a nil value" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
771	cat > media/nuageinit/user_data << 'EOF'
772#cloud-config
773packages:
774  - yeah/plop
775EOF
776	chmod 755 "${PWD}"/media/nuageinit/user_data
777	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
778
779	cat > media/nuageinit/user_data << 'EOF'
780#cloud-config
781packages:
782  - curl
783EOF
784	chmod 755 "${PWD}"/media/nuageinit/user_data
785	atf_check -o inline:"pkg install -y curl\npkg info -q curl\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
786
787	cat > media/nuageinit/user_data << 'EOF'
788#cloud-config
789packages:
790  - curl
791  - meh: bla
792EOF
793	chmod 755 "${PWD}"/media/nuageinit/user_data
794	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
795}
796
797config2_userdata_update_packages_body()
798{
799	mkdir -p media/nuageinit
800	setup_test_adduser
801	export NUAGE_RUN_TESTS=1
802	printf "{}" > media/nuageinit/meta_data.json
803	cat > media/nuageinit/user_data << 'EOF'
804#cloud-config
805package_update: true
806EOF
807	chmod 755 "${PWD}"/media/nuageinit/user_data
808	atf_check -o inline:"pkg update -y\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
809}
810
811config2_userdata_upgrade_packages_body()
812{
813	mkdir -p media/nuageinit
814	setup_test_adduser
815	export NUAGE_RUN_TESTS=1
816	printf "{}" > media/nuageinit/meta_data.json
817	cat > media/nuageinit/user_data << 'EOF'
818#cloud-config
819package_upgrade: true
820EOF
821	chmod 755 "${PWD}"/media/nuageinit/user_data
822	atf_check -o inline:"pkg upgrade -y\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
823}
824
825config2_userdata_shebang_body()
826{
827	mkdir -p media/nuageinit
828	setup_test_adduser
829	printf "{}" > media/nuageinit/meta_data.json
830	cat > media/nuageinit/user_data <<EOF
831#!/we/dont/care
832anything
833EOF
834	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
835	test -f var/cache/nuageinit/user_data || atf_fail "File not created"
836	test -x var/cache/nuageinit/user_data || atf_fail "Missing execution permission"
837	atf_check -o inline:"#!/we/dont/care\nanything\n" cat var/cache/nuageinit/user_data
838	cat > media/nuageinit/user_data <<EOF
839/we/dont/care
840EOF
841	rm var/cache/nuageinit/user_data
842	if [ -f var/cache/nuageinit/user_data ]; then
843		atf_fail "File should not have been created"
844	fi
845}
846
847config2_userdata_fqdn_and_hostname_body()
848{
849	mkdir -p media/nuageinit
850	setup_test_adduser
851	printf "{}" > media/nuageinit/meta_data.json
852	cat > media/nuageinit/user_data <<EOF
853#cloud-config
854fqdn: host.domain.tld
855hostname: host
856EOF
857	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
858	atf_check -o inline:"hostname=\"host.domain.tld\"\n" cat ${PWD}/etc/rc.conf.d/hostname
859	cat > media/nuageinit/user_data <<EOF
860#cloud-config
861hostname: host
862EOF
863	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
864	atf_check -o inline:"hostname=\"host\"\n" cat ${PWD}/etc/rc.conf.d/hostname
865}
866
867atf_init_test_cases()
868{
869	atf_add_test_case args
870	atf_add_test_case nocloud
871	atf_add_test_case nocloud_userdata_script
872	atf_add_test_case nocloud_user_data_script
873	atf_add_test_case nocloud_userdata_cloudconfig_users
874	atf_add_test_case nocloud_network
875	atf_add_test_case config2
876	atf_add_test_case config2_pubkeys
877	atf_add_test_case config2_pubkeys_user_data
878	atf_add_test_case config2_pubkeys_meta_data
879	atf_add_test_case config2_network
880	atf_add_test_case config2_network_static_v4
881	atf_add_test_case config2_ssh_keys
882	atf_add_test_case nocloud_userdata_cloudconfig_ssh_pwauth
883	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd
884	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
885	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
886	atf_add_test_case config2_userdata_runcmd
887	atf_add_test_case config2_userdata_packages
888	atf_add_test_case config2_userdata_update_packages
889	atf_add_test_case config2_userdata_upgrade_packages
890	atf_add_test_case config2_userdata_shebang
891	atf_add_test_case config2_userdata_fqdn_and_hostname
892}
893