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