Path: blob/main/libexec/nuageinit/tests/nuageinit.sh
35072 views
#-1# Copyright (c) 2022-2025 Baptiste Daroussin <[email protected]>2#3# SPDX-License-Identifier: BSD-2-Clause4#56export NUAGE_FAKE_ROOTDIR="$PWD"78atf_test_case args9atf_test_case nocloud10atf_test_case nocloud_userdata_script11atf_test_case nocloud_user_data_script12atf_test_case nocloud_userdata_cloudconfig_users13atf_test_case nocloud_network14atf_test_case config215atf_test_case config2_pubkeys16atf_test_case config2_pubkeys_user_data17atf_test_case config2_pubkeys_meta_data18atf_test_case config2_network19atf_test_case config2_network_static_v420atf_test_case config2_ssh_keys21atf_test_case nocloud_userdata_cloudconfig_ssh_pwauth22atf_test_case nocloud_userdata_cloudconfig_chpasswd23atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_string24atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_list25atf_test_case config2_userdata_runcmd26atf_test_case config2_userdata_packages27atf_test_case config2_userdata_update_packages28atf_test_case config2_userdata_upgrade_packages29atf_test_case config2_userdata_shebang30atf_test_case config2_userdata_fqdn_and_hostname31atf_test_case config2_userdata_write_files3233setup_test_adduser()34{35here=$(pwd)36export NUAGE_FAKE_ROOTDIR=$(pwd)37mkdir -p etc/ssh38cat > etc/master.passwd << EOF39root:*:0:0::0:0:Charlie &:/root:/bin/csh40sys:*:1:0::0:0:Sys:/home/sys:/bin/csh41EOF42pwd_mkdb -d etc ${here}/etc/master.passwd43cat > etc/group << EOF44wheel:*:0:root45users:*:1:46EOF47}4849args_body()50{51atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit52atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla53atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla meh plop54atf_check -s exit:1 -e inline:"nuageinit: Unknown cloud init type: meh\n" /usr/libexec/nuageinit bla meh55}5657nocloud_body()58{59mkdir -p media/nuageinit60atf_check -s exit:1 -e match:"nuageinit: error parsing nocloud.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit/ nocloud61printf "instance-id: iid-local01\nlocal-hostname: cloudimg\n" > "${PWD}"/media/nuageinit/meta-data62atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud63atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname64cat > media/nuageinit/meta-data << EOF65instance-id: iid-local0166hostname: myhost67EOF68atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud69atf_check -o inline:"hostname=\"myhost\"\n" cat etc/rc.conf.d/hostname70}7172nocloud_userdata_script_body()73{74mkdir -p media/nuageinit75printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data76printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user-data77chmod 755 "${PWD}"/media/nuageinit/user-data78atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud79atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data80}8182nocloud_user_data_script_body()83{84mkdir -p media/nuageinit85printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data86printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user_data87chmod 755 "${PWD}"/media/nuageinit/user_data88atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud89atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data90}9192nocloud_userdata_cloudconfig_users_head()93{94atf_set "require.user" root95}96nocloud_userdata_cloudconfig_users_body()97{98mkdir -p media/nuageinit99printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data100mkdir -p etc101cat > etc/master.passwd << EOF102root:*:0:0::0:0:Charlie &:/root:/bin/sh103sys:*:1:0::0:0:Sys:/home/sys:/bin/sh104EOF105pwd_mkdb -d etc "${PWD}"/etc/master.passwd106cat > etc/group << EOF107wheel:*:0:root108users:*:1:109EOF110cat > media/nuageinit/user-data << 'EOF'111#cloud-config112groups:113- admingroup: [root,sys]114- cloud-users115users:116- default117- name: foobar118gecos: Foo B. Bar119primary_group: foobar120sudo: ALL=(ALL) NOPASSWD:ALL121groups: users122passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/123- name: bla124sudo:125- "ALL=(ALL) NOPASSWD:/usr/sbin/pw"126- "ALL=(ALL) ALL"127EOF128atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud129atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet130cat > expectedgroup << EOF131wheel:*:0:root,freebsd132users:*:1:foobar133admingroup:*:1001:root,sys134cloud-users:*:1002:135freebsd:*:1003:136foobar:*:1004:137bla:*:1005:138EOF139cat > expectedpasswd << 'EOF'140root:*:0:0::0:0:Charlie &:/root:/bin/sh141sys:*:1:0::0:0:Sys:/home/sys:/bin/sh142freebsd:freebsd:1001:1003::0:0:FreeBSD User:/home/freebsd:/bin/sh143foobar:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1002:1004::0:0:Foo B. Bar:/home/foobar:/bin/sh144bla::1003:1005::0:0:bla User:/home/bla:/bin/sh145EOF146sed -i "" "s/freebsd:.*:1001/freebsd:freebsd:1001/" "${PWD}"/etc/master.passwd147atf_check -o file:expectedpasswd cat "${PWD}"/etc/master.passwd148atf_check -o file:expectedgroup cat "${PWD}"/etc/group149atf_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-users150}151152nocloud_network_head()153{154atf_set "require.user" root155}156nocloud_network_body()157{158mkdir -p media/nuageinit159mkdir -p etc160cat > etc/master.passwd << EOF161root:*:0:0::0:0:Charlie &:/root:/bin/sh162sys:*:1:0::0:0:Sys:/home/sys:/bin/sh163EOF164pwd_mkdb -d etc "${PWD}"/etc/master.passwd165cat > etc/group << EOF166wheel:*:0:root167users:*:1:168EOF169mynetworks=$(ifconfig -l ether)170if [ -z "$mynetworks" ]; then171atf_skip "a network interface is needed"172fi173set -- $mynetworks174myiface=$1175myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')176printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data177cat > media/nuageinit/user-data << EOF178#cloud-config179network:180version: 2181ethernets:182# opaque ID for physical interfaces, only referred to by other stanzas183id0:184match:185macaddress: "$myaddr"186addresses:187- 192.0.2.2/24188- 2001:db8::2/64189gateway4: 192.0.2.1190gateway6: 2001:db8::1191EOF192atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud193cat > network << EOF194ifconfig_${myiface}="inet 192.0.2.2/24"195ifconfig_${myiface}_ipv6="inet6 2001:db8::2/64"196ipv6_network_interfaces="${myiface}"197ipv6_default_interface="${myiface}"198EOF199cat > routing << EOF200defaultrouter="192.0.2.1"201ipv6_defaultrouter="2001:db8::1"202ipv6_route_${myiface}="2001:db8::1 -prefixlen 128 -interface ${myiface}"203EOF204atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network205atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing206}207208config2_body()209{210mkdir -p media/nuageinit211atf_check -s exit:1 -e match:"nuageinit: error parsing config-2 meta_data.json:.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2212printf "{}" > media/nuageinit/meta_data.json213atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2214cat > media/nuageinit/meta_data.json << EOF215{216"hostname": "cloudimg"217}218EOF219atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2220atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname221}222223config2_pubkeys_head()224{225atf_set "require.user" root226}227config2_pubkeys_body()228{229mkdir -p media/nuageinit230touch media/nuageinit/meta_data.json231cat > media/nuageinit/user-data << EOF232#cloud-config233ssh_authorized_keys:234- "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"235EOF236mkdir -p etc237cat > etc/master.passwd << EOF238root:*:0:0::0:0:Charlie &:/root:/bin/sh239sys:*:1:0::0:0:Sys:/home/sys:/bin/sh240EOF241pwd_mkdb -d etc "${PWD}"/etc/master.passwd242cat > etc/group << EOF243wheel:*:0:root244users:*:1:245EOF246atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2247atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys248}249250config2_pubkeys_user_data_head()251{252atf_set "require.user" root253}254config2_pubkeys_user_data_body()255{256mkdir -p media/nuageinit257touch media/nuageinit/meta_data.json258cat > media/nuageinit/user_data << EOF259#cloud-config260ssh_authorized_keys:261- "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"262EOF263mkdir -p etc264cat > etc/master.passwd << EOF265root:*:0:0::0:0:Charlie &:/root:/bin/sh266sys:*:1:0::0:0:Sys:/home/sys:/bin/sh267EOF268pwd_mkdb -d etc "${PWD}"/etc/master.passwd269cat > etc/group << EOF270wheel:*:0:root271users:*:1:272EOF273atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2274atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys275}276277config2_pubkeys_meta_data_body()278{279here=$(pwd)280export NUAGE_FAKE_ROOTDIR=$(pwd)281if [ $(id -u) -ne 0 ]; then282atf_skip "root required"283fi284mkdir -p media/nuageinit285cat > media/nuageinit/meta_data.json << EOF286{287"uuid": "uuid_for_this_instance",288"admin_pass": "a_generated_password",289"public_keys": {290"tdb": "ssh-ed25519 my_key_id tdb@host"291},292"keys": [293{294"name": "tdb",295"type": "ssh",296"data": "ssh-ed25519 my_key_id tdb@host"297}298],299"hostname": "freebsd-14-test.novalocal",300"name": "freebsd-14-test",301"launch_index": 0,302"availability_zone": "nova",303"random_seed": "long_random_seed",304"project_id": "my_project_id",305"devices": [],306"dedicated_cpus": []307}308EOF309mkdir -p etc310cat > etc/master.passwd << EOF311root:*:0:0::0:0:Charlie &:/root:/bin/csh312sys:*:1:0::0:0:Sys:/home/sys:/bin/csh313EOF314pwd_mkdb -d etc ${here}/etc/master.passwd315cat > etc/group << EOF316wheel:*:0:root317users:*:1:318EOF319atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2320atf_check -o inline:"ssh-ed25519 my_key_id tdb@host\n" cat home/freebsd/.ssh/authorized_keys321}322323config2_network_body()324{325mkdir -p media/nuageinit326printf "{}" > media/nuageinit/meta_data.json327mynetworks=$(ifconfig -l ether)328if [ -z "$mynetworks" ]; then329atf_skip "a network interface is needed"330fi331set -- $mynetworks332myiface=$1333myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')334cat > media/nuageinit/network_data.json << EOF335{336"links": [337{338"ethernet_mac_address": "$myaddr",339"id": "iface0",340"mtu": null341}342],343"networks": [344{345"id": "network0",346"link": "iface0",347"type": "ipv4_dhcp"348},349{ // IPv6350"id": "private-ipv4",351"type": "ipv6",352"link": "iface0",353// supports condensed IPv6 with CIDR netmask354"ip_address": "2001:db8::3257:9652/64",355"gateway": "fd00::1",356"routes": [357{358"network": "::",359"netmask": "::",360"gateway": "fd00::1"361},362{363"network": "::",364"netmask": "ffff:ffff:ffff::",365"gateway": "fd00::1:1"366}367],368"network_id": "da5bb487-5193-4a65-a3df-4a0055a8c0d8"369}370]371}372EOF373atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2374cat > network << EOF375ifconfig_${myiface}="DHCP"376ifconfig_${myiface}_ipv6="inet6 2001:db8::3257:9652/64"377ipv6_network_interfaces="${myiface}"378ipv6_default_interface="${myiface}"379EOF380cat > routing << EOF381ipv6_defaultrouter="fd00::1"382ipv6_route_${myiface}="fd00::1 -prefixlen 128 -interface ${myiface}"383ipv6_static_routes="${myiface}"384EOF385atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network386atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing387}388389config2_network_static_v4_body()390{391mkdir -p media/nuageinit392printf "{}" > media/nuageinit/meta_data.json393mynetworks=$(ifconfig -l ether)394if [ -z "$mynetworks" ]; then395atf_skip "a network interface is needed"396fi397set -- $mynetworks398myiface=$1399myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')400cat > media/nuageinit/network_data.json << EOF401{402"links": [403{404"ethernet_mac_address": "$myaddr",405"id": "iface0",406"mtu": null407}408],409"networks": [410{411"id": "network0",412"link": "iface0",413"type": "ipv4",414"ip_address": "10.184.0.244",415"netmask": "255.255.240.0",416"routes": [417{418"network": "10.0.0.0",419"netmask": "255.0.0.0",420"gateway": "11.0.0.1"421},422{423"network": "0.0.0.0",424"netmask": "0.0.0.0",425"gateway": "23.253.157.1"426}427]428}429]430}431EOF432atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2433cat > network << EOF434ifconfig_${myiface}="inet 10.184.0.244 netmask 255.255.240.0"435EOF436cat > routing << EOF437route_cloudinit1_${myiface}="-net 10.0.0.0 11.0.0.1 255.0.0.0"438defaultrouter="23.253.157.1"439static_routes="cloudinit1_${myiface}"440EOF441atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network442atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing443}444445config2_ssh_keys_head()446{447atf_set "require.user" root448}449config2_ssh_keys_body()450{451here=$(pwd)452export NUAGE_FAKE_ROOTDIR=$(pwd)453mkdir -p media/nuageinit454touch media/nuageinit/meta_data.json455cat > media/nuageinit/user-data << EOF456#cloud-config457ssh_keys:458rsa_private: |459-----BEGIN RSA PRIVATE KEY-----460MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco461...462-----END RSA PRIVATE KEY-----463rsa_public: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...464ed25519_private: |465-----BEGIN OPENSSH PRIVATE KEY-----466blabla467...468-----END OPENSSH PRIVATE KEY-----469ed25519_public: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+470EOF471mkdir -p etc/ssh472cat > etc/master.passwd << EOF473root:*:0:0::0:0:Charlie &:/root:/bin/csh474sys:*:1:0::0:0:Sys:/home/sys:/bin/csh475EOF476pwd_mkdb -d etc ${here}/etc/master.passwd477cat > etc/group << EOF478wheel:*:0:root479users:*:1:480EOF481atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2482_expected="-----BEGIN RSA PRIVATE KEY-----483MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco484...485-----END RSA PRIVATE KEY-----486487"488atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key489_expected="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...\n"490atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key.pub491_expected="-----BEGIN OPENSSH PRIVATE KEY-----492blabla493...494-----END OPENSSH PRIVATE KEY-----495496"497atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key498_expected="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+\n"499atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key.pub500}501502503nocloud_userdata_cloudconfig_ssh_pwauth_head()504{505atf_set "require.user" root506}507nocloud_userdata_cloudconfig_ssh_pwauth_body()508{509mkdir -p etc510cat > etc/master.passwd << EOF511root:*:0:0::0:0:Charlie &:/root:/bin/sh512sys:*:1:0::0:0:Sys:/home/sys:/bin/sh513EOF514pwd_mkdb -d etc "${PWD}"/etc/master.passwd515cat > etc/group << EOF516wheel:*:0:root517users:*:1:518EOF519mkdir -p media/nuageinit520printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data521cat > media/nuageinit/user-data << 'EOF'522#cloud-config523ssh_pwauth: true524EOF525mkdir -p etc/ssh/526touch etc/ssh/sshd_config527528atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud529atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config530531# Same value we don't touch anything532printf " PasswordAuthentication yes # I want password\n" > etc/ssh/sshd_config533atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud534atf_check -o inline:" PasswordAuthentication yes # I want password\n" cat etc/ssh/sshd_config535536printf " PasswordAuthentication no # Should change\n" > etc/ssh/sshd_config537atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud538atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config539540cat > media/nuageinit/user-data << 'EOF'541#cloud-config542ssh_pwauth: false543EOF544545printf " PasswordAuthentication no # no passwords\n" > etc/ssh/sshd_config546atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud547atf_check -o inline:" PasswordAuthentication no # no passwords\n" cat etc/ssh/sshd_config548549printf " PasswordAuthentication yes # Should change\n" > etc/ssh/sshd_config550atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud551atf_check -o inline:"PasswordAuthentication no\n" cat etc/ssh/sshd_config552}553554nocloud_userdata_cloudconfig_chpasswd_head()555{556atf_set "require.user" root557}558nocloud_userdata_cloudconfig_chpasswd_body()559{560mkdir -p etc561cat > etc/master.passwd << EOF562root:*:0:0::0:0:Charlie &:/root:/bin/sh563sys:*:1:0::0:0:Sys:/home/sys:/bin/sh564user:*:1:0::0:0:Sys:/home/sys:/bin/sh565EOF566pwd_mkdb -d etc "${PWD}"/etc/master.passwd567cat > etc/group << EOF568wheel:*:0:root569users:*:1:570EOF571mkdir -p media/nuageinit572printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data573cat > media/nuageinit/user-data << 'EOF'574#cloud-config575chpasswd:576expire: true577users:578- { user: "sys", password: RANDOM }579EOF580581atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud582atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'name'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet583# nothing modified584atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys585586cat > media/nuageinit/user-data << 'EOF'587#cloud-config588chpasswd:589expire: true590users:591- { name: "sys", pwd: RANDOM }592EOF593atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'password'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet594# nothing modified595atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys596597cat > media/nuageinit/user-data << 'EOF'598#cloud-config599chpasswd:600expire: false601users:602- { name: "sys", password: RANDOM }603EOF604# not empty because the password is printed to stdout605atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet606atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys607608cat > media/nuageinit/user-data << 'EOF'609#cloud-config610chpasswd:611expire: true612users:613- { name: "sys", password: RANDOM }614EOF615# not empty because the password is printed to stdout616atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet617atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys618619cat > media/nuageinit/user-data << 'EOF'620#cloud-config621chpasswd:622expire: true623users:624- { name: "user", password: "$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/" }625EOF626# not empty because the password is printed to stdout627atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet628atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::1:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user629}630631632nocloud_userdata_cloudconfig_chpasswd_list_string_head()633{634atf_set "require.user" root635}636nocloud_userdata_cloudconfig_chpasswd_list_string_body()637{638mkdir -p etc639cat > etc/master.passwd << EOF640root:*:0:0::0:0:Charlie &:/root:/bin/sh641sys:*:1:0::0:0:Sys:/home/sys:/bin/sh642user:*:1:0::0:0:Sys:/home/sys:/bin/sh643EOF644pwd_mkdb -d etc "${PWD}"/etc/master.passwd645cat > etc/group << EOF646wheel:*:0:root647users:*:1:648EOF649mkdir -p media/nuageinit650printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data651cat > media/nuageinit/user-data << 'EOF'652#cloud-config653chpasswd:654expire: true655list: |656sys:RANDOM657EOF658659atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud660atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet661atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys662663cat > media/nuageinit/user-data << 'EOF'664#cloud-config665chpasswd:666expire: false667list: |668sys:plop669user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/670root:R671EOF672673atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet674atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys675atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::0:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user676atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root677}678679nocloud_userdata_cloudconfig_chpasswd_list_list_head()680{681atf_set "require.user" root682}683nocloud_userdata_cloudconfig_chpasswd_list_list_body()684{685mkdir -p etc686cat > etc/master.passwd << EOF687root:*:0:0::0:0:Charlie &:/root:/bin/sh688sys:*:1:0::0:0:Sys:/home/sys:/bin/sh689user:*:1:0::0:0:Sys:/home/sys:/bin/sh690EOF691pwd_mkdb -d etc "${PWD}"/etc/master.passwd692cat > etc/group << EOF693wheel:*:0:root694users:*:1:695EOF696mkdir -p media/nuageinit697printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data698cat > media/nuageinit/user-data << 'EOF'699#cloud-config700chpasswd:701expire: true702list:703- sys:RANDOM704EOF705706atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud707atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet708atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys709710cat > media/nuageinit/user-data << 'EOF'711#cloud-config712chpasswd:713expire: false714list:715- sys:plop716- user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/717- root:R718EOF719720atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet721atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys722atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::0:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user723atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root724}725726config2_userdata_runcmd_head()727{728atf_set "require.user" root729}730config2_userdata_runcmd_body()731{732mkdir -p media/nuageinit733setup_test_adduser734printf "{}" > media/nuageinit/meta_data.json735cat > media/nuageinit/user_data << 'EOF'736#cloud-config737runcmd:738EOF739chmod 755 "${PWD}"/media/nuageinit/user_data740atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2741cat > media/nuageinit/user_data << 'EOF'742#cloud-config743runcmd:744- plop745EOF746chmod 755 "${PWD}"/media/nuageinit/user_data747atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2748test -f var/cache/nuageinit/runcmds || atf_fail "File not created"749test -x var/cache/nuageinit/runcmds || atf_fail "Missing execution permission"750atf_check -o inline:"#!/bin/sh\nplop\n" cat var/cache/nuageinit/runcmds751752cat > media/nuageinit/user_data << 'EOF'753#cloud-config754runcmd:755- echo "yeah!"756- uname -s757EOF758chmod 755 "${PWD}"/media/nuageinit/user_data759atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2760atf_check -o inline:"#!/bin/sh\necho \"yeah!\"\nuname -s\n" cat var/cache/nuageinit/runcmds761}762763config2_userdata_packages_head()764{765atf_set "require.user" root766}767768config2_userdata_packages_body()769{770mkdir -p media/nuageinit771setup_test_adduser772export NUAGE_RUN_TESTS=1773printf "{}" > media/nuageinit/meta_data.json774cat > media/nuageinit/user_data << 'EOF'775#cloud-config776packages:777EOF778chmod 755 "${PWD}"/media/nuageinit/user_data779atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet780cat > media/nuageinit/user_data << 'EOF'781#cloud-config782packages:783- yeah/plop784EOF785chmod 755 "${PWD}"/media/nuageinit/user_data786atf_check -s exit:0 -o inline:"pkg install -y yeah/plop\npkg info -q yeah/plop\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet787788cat > media/nuageinit/user_data << 'EOF'789#cloud-config790packages:791- curl792EOF793chmod 755 "${PWD}"/media/nuageinit/user_data794atf_check -o inline:"pkg install -y curl\npkg info -q curl\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet795796cat > media/nuageinit/user_data << 'EOF'797#cloud-config798packages:799- curl800- meh: bla801EOF802chmod 755 "${PWD}"/media/nuageinit/user_data803atf_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 postnet804}805806config2_userdata_update_packages_body()807{808mkdir -p media/nuageinit809setup_test_adduser810export NUAGE_RUN_TESTS=1811printf "{}" > media/nuageinit/meta_data.json812cat > media/nuageinit/user_data << 'EOF'813#cloud-config814package_update: true815EOF816chmod 755 "${PWD}"/media/nuageinit/user_data817atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg update\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet818}819820config2_userdata_upgrade_packages_body()821{822mkdir -p media/nuageinit823setup_test_adduser824export NUAGE_RUN_TESTS=1825printf "{}" > media/nuageinit/meta_data.json826cat > media/nuageinit/user_data << 'EOF'827#cloud-config828package_upgrade: true829EOF830chmod 755 "${PWD}"/media/nuageinit/user_data831atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg upgrade\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet832}833834config2_userdata_shebang_body()835{836mkdir -p media/nuageinit837setup_test_adduser838printf "{}" > media/nuageinit/meta_data.json839cat > media/nuageinit/user_data <<EOF840#!/we/dont/care841anything842EOF843atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2844test -f var/cache/nuageinit/user_data || atf_fail "File not created"845test -x var/cache/nuageinit/user_data || atf_fail "Missing execution permission"846atf_check -o inline:"#!/we/dont/care\nanything\n" cat var/cache/nuageinit/user_data847cat > media/nuageinit/user_data <<EOF848/we/dont/care849EOF850rm var/cache/nuageinit/user_data851if [ -f var/cache/nuageinit/user_data ]; then852atf_fail "File should not have been created"853fi854}855856config2_userdata_write_files_body()857{858mkdir -p media/nuageinit859setup_test_adduser860printf "{}" > media/nuageinit/meta_data.json861cat > media/nuageinit/user_data <<EOF862#cloud-config863write_files:864- content: "plop"865path: /file1866- path: /emptyfile867- content: !!binary |868YmxhCg==869path: /file_base64870encoding: b64871permissions: '0755'872owner: nobody873- content: "bob"874path: "/foo"875defer: true876EOF877atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2878atf_check -o inline:"plop" cat file1879atf_check -o inline:"" cat emptyfile880atf_check -o inline:"bla\n" cat file_base64881test -f foo && atf_fail "foo creation should have been defered"882atf_check -o match:"^-rwxr-xr-x.*nobody" ls -l file_base64883rm file1 emptyfile file_base64884atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet885test -f file1 -o -f emptyfile -o -f file_base64 && atf_fail "defer not working properly"886atf_check -o inline:"bob" cat foo887}888889config2_userdata_fqdn_and_hostname_body()890{891mkdir -p media/nuageinit892setup_test_adduser893printf "{}" > media/nuageinit/meta_data.json894cat > media/nuageinit/user_data <<EOF895#cloud-config896fqdn: host.domain.tld897hostname: host898EOF899atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2900atf_check -o inline:"hostname=\"host.domain.tld\"\n" cat ${PWD}/etc/rc.conf.d/hostname901cat > media/nuageinit/user_data <<EOF902#cloud-config903hostname: host904EOF905atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2906atf_check -o inline:"hostname=\"host\"\n" cat ${PWD}/etc/rc.conf.d/hostname907}908909atf_init_test_cases()910{911atf_add_test_case args912atf_add_test_case nocloud913atf_add_test_case nocloud_userdata_script914atf_add_test_case nocloud_user_data_script915atf_add_test_case nocloud_userdata_cloudconfig_users916atf_add_test_case nocloud_network917atf_add_test_case config2918atf_add_test_case config2_pubkeys919atf_add_test_case config2_pubkeys_user_data920atf_add_test_case config2_pubkeys_meta_data921atf_add_test_case config2_network922atf_add_test_case config2_network_static_v4923atf_add_test_case config2_ssh_keys924atf_add_test_case nocloud_userdata_cloudconfig_ssh_pwauth925atf_add_test_case nocloud_userdata_cloudconfig_chpasswd926atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_string927atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_list928atf_add_test_case config2_userdata_runcmd929atf_add_test_case config2_userdata_packages930atf_add_test_case config2_userdata_update_packages931atf_add_test_case config2_userdata_upgrade_packages932atf_add_test_case config2_userdata_shebang933atf_add_test_case config2_userdata_fqdn_and_hostname934atf_add_test_case config2_userdata_write_files935}936937938