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