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