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