mirror of
https://gitlab.alpinelinux.org/alpine/cloud/tiny-cloud.git
synced 2026-02-04 12:32:45 +03:00
Rename Phases & Support doas.conf
This commit is contained in:
parent
69733fbedd
commit
5f26d1f579
15
TODO.md
15
TODO.md
@ -1,20 +1,17 @@
|
|||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
## Tiny Cloud v3.0.0
|
|
||||||
|
|
||||||
* Support for Alpine Linux ISO auto-install via NoCloud `CIDATA` volumes, which
|
|
||||||
have pre-network access to UserData and MetaData. Adjust phase actions as
|
|
||||||
appropriate.
|
|
||||||
|
|
||||||
* Detect UserData content type. In addition to handling `#!` scripts and raw
|
|
||||||
data, provide basic handling a subset of `#cloud-config` directives.
|
|
||||||
|
|
||||||
## FUTURE
|
## FUTURE
|
||||||
|
|
||||||
* cloud auto-detection
|
* cloud auto-detection
|
||||||
|
|
||||||
|
* `#cloud-config` user-data handler (support a useful subset)
|
||||||
|
|
||||||
|
* `#tiny-config` user-data handler (should be simple-yet-flexible)
|
||||||
|
|
||||||
* `imds-net-sync` improvements
|
* `imds-net-sync` improvements
|
||||||
* Feature parity with current [amazon-ec2-net-utils](
|
* Feature parity with current [amazon-ec2-net-utils](
|
||||||
https://github.com/amazonlinux/amazon-ec2-net-utils)
|
https://github.com/amazonlinux/amazon-ec2-net-utils)
|
||||||
* Support for non-AWS clouds
|
* Support for non-AWS clouds
|
||||||
* daemonize to pick up IMDS network changes between reboots
|
* daemonize to pick up IMDS network changes between reboots
|
||||||
|
|
||||||
|
* Support LVM partitioning and non-`ext[234]` filesystems
|
||||||
|
|||||||
16
dist/openrc/tiny-cloud-boot
vendored
Executable file
16
dist/openrc/tiny-cloud-boot
vendored
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
#!/sbin/openrc-run
|
||||||
|
# vim:set ft=sh:
|
||||||
|
# shellcheck shell=sh
|
||||||
|
|
||||||
|
description="Tiny Cloud Bootstrap - boot phase"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
after root logger
|
||||||
|
before net
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
ebegin "Tiny Cloud - boot phase"
|
||||||
|
tiny-cloud boot
|
||||||
|
eend $?
|
||||||
|
}
|
||||||
4
dist/openrc/tiny-cloud-early
vendored
4
dist/openrc/tiny-cloud-early
vendored
@ -5,8 +5,8 @@
|
|||||||
description="Tiny Cloud Bootstrap - early phase"
|
description="Tiny Cloud Bootstrap - early phase"
|
||||||
|
|
||||||
depend() {
|
depend() {
|
||||||
after root logger
|
need net
|
||||||
before net
|
before tiny-cloud-main
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
|
|||||||
@ -3,7 +3,6 @@
|
|||||||
# shellcheck shell=sh
|
# shellcheck shell=sh
|
||||||
|
|
||||||
description="Tiny Cloud Bootstrap - main phase"
|
description="Tiny Cloud Bootstrap - main phase"
|
||||||
extra_commands="complete incomplete"
|
|
||||||
|
|
||||||
depend() {
|
depend() {
|
||||||
need net
|
need net
|
||||||
@ -15,7 +14,3 @@ start() {
|
|||||||
tiny-cloud main
|
tiny-cloud main
|
||||||
eend $?
|
eend $?
|
||||||
}
|
}
|
||||||
|
|
||||||
# allow setting / unsetting of bootstrapped state
|
|
||||||
complete() { tiny-cloud --bootstrap complete ; }
|
|
||||||
incomplete() { tiny-cloud --bootstrap incomplete ; }
|
|
||||||
15
dist/openrc/tiny-cloud-net
vendored
15
dist/openrc/tiny-cloud-net
vendored
@ -1,15 +0,0 @@
|
|||||||
#!/sbin/openrc-run
|
|
||||||
# vim:set ft=sh:
|
|
||||||
# shellcheck shell=sh
|
|
||||||
|
|
||||||
description="Tiny Cloud Bootstrap - net phase"
|
|
||||||
depend() {
|
|
||||||
need net
|
|
||||||
before tiny-cloud
|
|
||||||
}
|
|
||||||
|
|
||||||
start() {
|
|
||||||
ebegin "Tiny Cloud - net"
|
|
||||||
tiny-cloud net
|
|
||||||
eend $?
|
|
||||||
}
|
|
||||||
@ -2,7 +2,7 @@
|
|||||||
# vim:set ft=sh:
|
# vim:set ft=sh:
|
||||||
# shellcheck shell=sh
|
# shellcheck shell=sh
|
||||||
|
|
||||||
INIT_ACTIONS_EARLY="$(replace_word set_default_interfaces set_network_interfaces $INIT_ACTIONS_EARLY)"
|
INIT_ACTIONS_BOOT="$(replace_word set_default_interfaces set_network_interfaces $INIT_ACTIONS_BOOT)"
|
||||||
|
|
||||||
set_resolv_conf() {
|
set_resolv_conf() {
|
||||||
# resolv.conf
|
# resolv.conf
|
||||||
|
|||||||
@ -11,14 +11,14 @@
|
|||||||
|
|
||||||
### default phase actions (without leading 'init__')
|
### default phase actions (without leading 'init__')
|
||||||
|
|
||||||
DEFAULT_ACTIONS_EARLY="
|
DEFAULT_ACTIONS_BOOT="
|
||||||
expand_root
|
expand_root
|
||||||
install_hotplugs
|
install_hotplugs
|
||||||
set_default_interfaces
|
set_default_interfaces
|
||||||
create_default_user
|
create_default_user
|
||||||
enable_sshd
|
enable_sshd
|
||||||
"
|
"
|
||||||
DEFAULT_ACTIONS_NET="
|
DEFAULT_ACTIONS_EARLY="
|
||||||
save_userdata
|
save_userdata
|
||||||
"
|
"
|
||||||
DEFAULT_ACTIONS_MAIN="
|
DEFAULT_ACTIONS_MAIN="
|
||||||
@ -27,8 +27,8 @@ DEFAULT_ACTIONS_MAIN="
|
|||||||
"
|
"
|
||||||
DEFAULT_ACTIONS_FINAL=""
|
DEFAULT_ACTIONS_FINAL=""
|
||||||
|
|
||||||
|
: "${INIT_ACTIONS_BOOT=$DEFAULT_ACTIONS_BOOT}"
|
||||||
: "${INIT_ACTIONS_EARLY=$DEFAULT_ACTIONS_EARLY}"
|
: "${INIT_ACTIONS_EARLY=$DEFAULT_ACTIONS_EARLY}"
|
||||||
: "${INIT_ACTIONS_NET=$DEFAULT_ACTIONS_NET}"
|
|
||||||
: "${INIT_ACTIONS_MAIN=$DEFAULT_ACTIONS_MAIN}"
|
: "${INIT_ACTIONS_MAIN=$DEFAULT_ACTIONS_MAIN}"
|
||||||
: "${INIT_ACTIONS_FINAL=$DEFAULT_ACTIONS_FINAL}"
|
: "${INIT_ACTIONS_FINAL=$DEFAULT_ACTIONS_FINAL}"
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ DEFAULT_ACTIONS_FINAL=""
|
|||||||
[ ! -d "$TINY_CLOUD_VAR" ] && mkdir -p "$TINY_CLOUD_VAR" || true
|
[ ! -d "$TINY_CLOUD_VAR" ] && mkdir -p "$TINY_CLOUD_VAR" || true
|
||||||
|
|
||||||
|
|
||||||
### standard init-early functions...
|
### standard boot phase functions...
|
||||||
|
|
||||||
init__expand_root() {
|
init__expand_root() {
|
||||||
local dev=$(awk '$2 == "/" {print $1}' "$ROOT"/proc/mounts 2>/dev/null)
|
local dev=$(awk '$2 == "/" {print $1}' "$ROOT"/proc/mounts 2>/dev/null)
|
||||||
@ -185,6 +185,8 @@ init__create_default_user() {
|
|||||||
fi
|
fi
|
||||||
if [ -d "$ROOT/etc/doas.d" ]; then
|
if [ -d "$ROOT/etc/doas.d" ]; then
|
||||||
echo 'permit nopass :wheel' > "$TARGET/etc/doas.d/wheel.conf"
|
echo 'permit nopass :wheel' > "$TARGET/etc/doas.d/wheel.conf"
|
||||||
|
elif [ -f "$ROOT/etc/doas.conf" ]; then
|
||||||
|
add_once "$TARGET/etc/doas.conf" "permit nopass :wheel"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,8 +196,39 @@ init__enable_sshd() {
|
|||||||
$MOCK rc-update --update
|
$MOCK rc-update --update
|
||||||
}
|
}
|
||||||
|
|
||||||
|
### standard early phase functions
|
||||||
|
|
||||||
### standard init-main functions
|
init__save_userdata() {
|
||||||
|
local userdata="$TINY_CLOUD_VAR/user-data"
|
||||||
|
if [ -f "$userdata" ]; then
|
||||||
|
log -i -t "$phase" info "$ACTION: user-data already saved"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
local tmpfile=$(mktemp "$userdata.XXXXXX")
|
||||||
|
|
||||||
|
imds -e @userdata > "$tmpfile"
|
||||||
|
if printf '\037\213\010' | cmp -s -n 3 "$tmpfile"; then
|
||||||
|
gzip -dc "$tmpfile" > "$userdata"
|
||||||
|
elif printf 'BZh' | cmp -s -n 3 "$tmpfile"; then
|
||||||
|
bzip2 -dc "$tmpfile" > "$userdata"
|
||||||
|
elif printf '\375\067\172\130\132\000' | cmp -s -n 6 "$tmpfile"; then
|
||||||
|
unxz -c "$tmpfile" > "$userdata"
|
||||||
|
elif printf '\135\000\000' | cmp -s -n 3 "$tmpfile"; then
|
||||||
|
lzma -dc "$tmpfile" > "$userdata"
|
||||||
|
elif printf '\211\114\132' | cmp -s -n 3 "$tmpfile"; then
|
||||||
|
lzop -dc "$tmpfile" > "$userdata"
|
||||||
|
elif printf '\004\042\115\030' | cmp -s -n 4 "$tmpfile"; then
|
||||||
|
lz4 -dc "$tmpfile" > "$userdata"
|
||||||
|
elif printf '(\265/\375' | cmp -s -n 4 "$tmpfile"; then
|
||||||
|
zstd -dc "$tmpfile" > "$userdata"
|
||||||
|
else
|
||||||
|
cp "$tmpfile" "$userdata"
|
||||||
|
fi
|
||||||
|
rm "$tmpfile"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### standard main phase functions
|
||||||
|
|
||||||
init__set_hostname() {
|
init__set_hostname() {
|
||||||
local fqdn=$(imds @hostname)
|
local fqdn=$(imds @hostname)
|
||||||
@ -243,37 +276,8 @@ init__set_ssh_keys() {
|
|||||||
echo "$sshkeys" > "$keys_file"
|
echo "$sshkeys" > "$keys_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
init__save_userdata() {
|
|
||||||
local userdata="$TINY_CLOUD_VAR/user-data"
|
|
||||||
if [ -f "$userdata" ]; then
|
|
||||||
log -i -t "$phase" info "$ACTION: user-data already saved"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
local tmpfile=$(mktemp "$userdata.XXXXXX")
|
|
||||||
|
|
||||||
imds -e @userdata > "$tmpfile"
|
### standard final phase functions would be here, if there were any
|
||||||
if printf '\037\213\010' | cmp -s -n 3 "$tmpfile"; then
|
|
||||||
gzip -dc "$tmpfile" > "$userdata"
|
|
||||||
elif printf 'BZh' | cmp -s -n 3 "$tmpfile"; then
|
|
||||||
bzip2 -dc "$tmpfile" > "$userdata"
|
|
||||||
elif printf '\375\067\172\130\132\000' | cmp -s -n 6 "$tmpfile"; then
|
|
||||||
unxz -c "$tmpfile" > "$userdata"
|
|
||||||
elif printf '\135\000\000' | cmp -s -n 3 "$tmpfile"; then
|
|
||||||
lzma -dc "$tmpfile" > "$userdata"
|
|
||||||
elif printf '\211\114\132' | cmp -s -n 3 "$tmpfile"; then
|
|
||||||
lzop -dc "$tmpfile" > "$userdata"
|
|
||||||
elif printf '\004\042\115\030' | cmp -s -n 4 "$tmpfile"; then
|
|
||||||
lz4 -dc "$tmpfile" > "$userdata"
|
|
||||||
elif printf '(\265/\375' | cmp -s -n 4 "$tmpfile"; then
|
|
||||||
zstd -dc "$tmpfile" > "$userdata"
|
|
||||||
else
|
|
||||||
cp "$tmpfile" "$userdata"
|
|
||||||
fi
|
|
||||||
rm "$tmpfile"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
### standard init-final functions would be here, if there were any
|
|
||||||
|
|
||||||
|
|
||||||
### load cloud-specific init functions / vars (potentially overriding)
|
### load cloud-specific init functions / vars (potentially overriding)
|
||||||
|
|||||||
@ -10,7 +10,7 @@ set -e
|
|||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<-EOF
|
cat <<-EOF
|
||||||
Usage: ${0##*/} [-h | --help] { early | net | main | final | --bootstrap {complete|incomplete|status} | --setup }
|
Usage: ${0##*/} [-h | --help] { boot | early | main | final | --bootstrap {complete|incomplete|status} | --setup }
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,12 +46,12 @@ while true; do
|
|||||||
esac
|
esac
|
||||||
exit 0;;
|
exit 0;;
|
||||||
-s|--setup) # just openrc for now
|
-s|--setup) # just openrc for now
|
||||||
for phase in -early -net '' -final; do
|
for phase in -boot -early -main -final '' -net; do
|
||||||
rc-update -a del "tiny-cloud$phase" || true
|
rc-update -a del "tiny-cloud$phase" || true
|
||||||
done
|
done
|
||||||
rc-update add tiny-cloud-early boot
|
rc-update add tiny-cloud-boot boot
|
||||||
rc-update add tiny-cloud-net default
|
rc-update add tiny-cloud-early default
|
||||||
rc-update add tiny-cloud default
|
rc-update add tiny-cloud-main default
|
||||||
rc-update add tiny-cloud-final default
|
rc-update add tiny-cloud-final default
|
||||||
exit 0;;
|
exit 0;;
|
||||||
--) shift; break;;
|
--) shift; break;;
|
||||||
@ -64,7 +64,7 @@ phase="$1"
|
|||||||
shift
|
shift
|
||||||
|
|
||||||
case "$phase" in
|
case "$phase" in
|
||||||
early|net|main|final) ;;
|
boot|early|main|final) ;;
|
||||||
*) usage >&2; exit 1;;
|
*) usage >&2; exit 1;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@ -97,8 +97,8 @@ INIT_ACTIONS_FINAL="${INIT_ACTIONS_FINAL} bootstrap_complete"
|
|||||||
### let's do stuff!
|
### let's do stuff!
|
||||||
|
|
||||||
case "$phase" in
|
case "$phase" in
|
||||||
|
boot) INIT_ACTIONS="$INIT_ACTIONS_BOOT";;
|
||||||
early) INIT_ACTIONS="$INIT_ACTIONS_EARLY";;
|
early) INIT_ACTIONS="$INIT_ACTIONS_EARLY";;
|
||||||
net) INIT_ACTIONS="$INIT_ACTIONS_NET";;
|
|
||||||
main) INIT_ACTIONS="$INIT_ACTIONS_MAIN";;
|
main) INIT_ACTIONS="$INIT_ACTIONS_MAIN";;
|
||||||
final) INIT_ACTIONS="$INIT_ACTIONS_FINAL";;
|
final) INIT_ACTIONS="$INIT_ACTIONS_FINAL";;
|
||||||
*) usage >&2; exit 1;;
|
*) usage >&2; exit 1;;
|
||||||
|
|||||||
123
tests/init-boot.test
Executable file
123
tests/init-boot.test
Executable file
@ -0,0 +1,123 @@
|
|||||||
|
#!/usr/bin/env atf-sh
|
||||||
|
# vim:set ft=sh
|
||||||
|
# shellcheck shell=sh
|
||||||
|
|
||||||
|
. $(atf_get_srcdir)/test_env.sh
|
||||||
|
|
||||||
|
export PREFIX="$srcdir"
|
||||||
|
export MOCK=echo
|
||||||
|
lib="$srcdir"/lib/tiny-cloud/init
|
||||||
|
|
||||||
|
init_tests \
|
||||||
|
expand_root \
|
||||||
|
expand_root_partition \
|
||||||
|
install_hotplugs_fail \
|
||||||
|
ethernets \
|
||||||
|
find_first_interface_up \
|
||||||
|
auto_detect_ethernet_interface \
|
||||||
|
set_default_interfaces \
|
||||||
|
enable_sshd \
|
||||||
|
create_default_user
|
||||||
|
|
||||||
|
PROVIDERS="alpine aws azure gcp nocloud oci"
|
||||||
|
|
||||||
|
expand_root_body() {
|
||||||
|
mkdir proc
|
||||||
|
echo "/dev/xvda / ext4 rw,noatime 0 0" > proc/mounts
|
||||||
|
for provider in $PROVIDERS; do
|
||||||
|
CLOUD="$provider" atf_check \
|
||||||
|
-o match:"resize2fs /dev/xvda" \
|
||||||
|
sh -c ". $lib; init__expand_root"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
expand_root_partition_body() {
|
||||||
|
mkdir -p proc sys/class/block \
|
||||||
|
sys/devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 \
|
||||||
|
sys/devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/device
|
||||||
|
ln -s ../../devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1 sys/class/block/nvme0n1
|
||||||
|
ln -s ../../devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 sys/class/block/nvme0n1p2
|
||||||
|
echo 2 > sys/class/block/nvme0n1p2/partition
|
||||||
|
|
||||||
|
echo "/dev/nvme0n1p2 / ext4 rw,noatime 0 0" > proc/mounts
|
||||||
|
for provider in $PROVIDERS; do
|
||||||
|
CLOUD="$provider" atf_check \
|
||||||
|
-o match:"sfdisk .*/dev/nvme0n1" \
|
||||||
|
-o match:"partx .*/dev/nvme0n1" \
|
||||||
|
-o match:"resize2fs /dev/nvme0n1p2" \
|
||||||
|
sh -c ". $lib; init__expand_root"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
install_hotplugs_fail_body() {
|
||||||
|
CLOUD=aws atf_check -s not-exit:0 \
|
||||||
|
-e match:"vnic_eth_hotplug: failed" \
|
||||||
|
sh -c ". $lib; HOTPLUG_MODULES='vnic_eth_hotplug'; init__install_hotplugs"
|
||||||
|
}
|
||||||
|
|
||||||
|
ethernets_body() {
|
||||||
|
fake_interfaces lo br0 eth0 eth2 eth11
|
||||||
|
|
||||||
|
# check that they are sorted by ifindex, not name
|
||||||
|
# and that br0 and lo are excluded
|
||||||
|
atf_check \
|
||||||
|
-o match:"eth0 eth2 eth11" \
|
||||||
|
-o not-match:"br0" \
|
||||||
|
-o not-match:"lo" \
|
||||||
|
sh -c ". $lib; ethernets | tr '\n' ' '"
|
||||||
|
}
|
||||||
|
|
||||||
|
find_first_interface_up_body() {
|
||||||
|
fake_interfaces eth0 eth1
|
||||||
|
echo up > sys/class/net/eth1/operstate
|
||||||
|
|
||||||
|
atf_check \
|
||||||
|
-o match:"eth1" \
|
||||||
|
sh -c ". $lib; find_first_interface_up eth0 eth1"
|
||||||
|
}
|
||||||
|
|
||||||
|
auto_detect_ethernet_interface_body() {
|
||||||
|
fake_interfaces eth0 eth1
|
||||||
|
echo up > sys/class/net/eth1/operstate
|
||||||
|
|
||||||
|
atf_check \
|
||||||
|
-o match:"^eth1$" \
|
||||||
|
sh -c ". $lib; auto_detect_ethernet_interface"
|
||||||
|
|
||||||
|
# test that we pick first if all are down
|
||||||
|
echo down > sys/class/net/eth1/operstate
|
||||||
|
atf_check \
|
||||||
|
-o match:"^eth0$" \
|
||||||
|
sh -c ". $lib; TINY_CLOUD_LINK_WAIT_MAX=1; auto_detect_ethernet_interface"
|
||||||
|
}
|
||||||
|
|
||||||
|
set_default_interfaces_body() {
|
||||||
|
fake_interfaces eth0 eth1
|
||||||
|
echo up > sys/class/net/eth1/operstate
|
||||||
|
|
||||||
|
atf_check \
|
||||||
|
sh -c ". $lib; init__set_default_interfaces"
|
||||||
|
atf_check \
|
||||||
|
-o match:"auto lo" \
|
||||||
|
-o match:"iface eth1" \
|
||||||
|
-o match:"use dhcp" \
|
||||||
|
cat etc/network/interfaces
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_sshd_body() {
|
||||||
|
for provider in $PROVIDERS; do
|
||||||
|
CLOUD="$provider" atf_check \
|
||||||
|
-o match:"rc-update.* add sshd default" \
|
||||||
|
-o match:"rc-update.* --update" \
|
||||||
|
sh -c ". $lib; init__enable_sshd"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
create_default_user_body() {
|
||||||
|
atf_check \
|
||||||
|
-o match:"addgroup alpine" \
|
||||||
|
-o match:"adduser.*alpine" \
|
||||||
|
-o match:"addgroup alpine wheel" \
|
||||||
|
-o match:"chpasswd -e" \
|
||||||
|
sh -c ". $lib; init__create_default_user"
|
||||||
|
}
|
||||||
@ -9,115 +9,30 @@ export MOCK=echo
|
|||||||
lib="$srcdir"/lib/tiny-cloud/init
|
lib="$srcdir"/lib/tiny-cloud/init
|
||||||
|
|
||||||
init_tests \
|
init_tests \
|
||||||
expand_root \
|
save_userdata_plain \
|
||||||
expand_root_partition \
|
save_userdata_compressed
|
||||||
install_hotplugs_fail \
|
|
||||||
ethernets \
|
|
||||||
find_first_interface_up \
|
|
||||||
auto_detect_ethernet_interface \
|
|
||||||
set_default_interfaces \
|
|
||||||
enable_sshd \
|
|
||||||
create_default_user
|
|
||||||
|
|
||||||
PROVIDERS="alpine aws azure gcp nocloud oci"
|
save_userdata_plain_body() {
|
||||||
|
fake_userdata_nocloud <<-EOF
|
||||||
|
#userdata
|
||||||
|
EOF
|
||||||
|
CLOUD="nocloud" atf_check -e match:"NoCloud 'meta-data' is empty" \
|
||||||
|
sh -c ". \"$lib\"; init__save_userdata"
|
||||||
|
atf_check -o match:"^#userdata" cat var/lib/cloud/user-data
|
||||||
|
}
|
||||||
|
|
||||||
expand_root_body() {
|
save_userdata_compressed_body() {
|
||||||
mkdir proc
|
for comp in gzip bzip2 xz lzma lzop lz4 zstd; do
|
||||||
echo "/dev/xvda / ext4 rw,noatime 0 0" > proc/mounts
|
# fake_userdata_nocloud will set PATH so dont run it in a subshell
|
||||||
for provider in $PROVIDERS; do
|
printf "%s\n" "#userdata" | $comp -c > tmpfile
|
||||||
CLOUD="$provider" atf_check \
|
fake_userdata_nocloud < tmpfile
|
||||||
-o match:"resize2fs /dev/xvda" \
|
|
||||||
sh -c ". $lib; init__expand_root"
|
CLOUD="nocloud" atf_check \
|
||||||
|
-e 'ignore' \
|
||||||
|
sh -c ". \"$lib\"; init__save_userdata"
|
||||||
|
|
||||||
|
if ! grep "^#userdata" var/lib/cloud/user-data; then
|
||||||
|
atf_fail "$comp failed"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
expand_root_partition_body() {
|
|
||||||
mkdir -p proc sys/class/block \
|
|
||||||
sys/devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 \
|
|
||||||
sys/devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/device
|
|
||||||
ln -s ../../devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1 sys/class/block/nvme0n1
|
|
||||||
ln -s ../../devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 sys/class/block/nvme0n1p2
|
|
||||||
echo 2 > sys/class/block/nvme0n1p2/partition
|
|
||||||
|
|
||||||
echo "/dev/nvme0n1p2 / ext4 rw,noatime 0 0" > proc/mounts
|
|
||||||
for provider in $PROVIDERS; do
|
|
||||||
CLOUD="$provider" atf_check \
|
|
||||||
-o match:"sfdisk .*/dev/nvme0n1" \
|
|
||||||
-o match:"partx .*/dev/nvme0n1" \
|
|
||||||
-o match:"resize2fs /dev/nvme0n1p2" \
|
|
||||||
sh -c ". $lib; init__expand_root"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
install_hotplugs_fail_body() {
|
|
||||||
CLOUD=aws atf_check -s not-exit:0 \
|
|
||||||
-e match:"vnic_eth_hotplug: failed" \
|
|
||||||
sh -c ". $lib; HOTPLUG_MODULES='vnic_eth_hotplug'; init__install_hotplugs"
|
|
||||||
}
|
|
||||||
|
|
||||||
ethernets_body() {
|
|
||||||
fake_interfaces lo br0 eth0 eth2 eth11
|
|
||||||
|
|
||||||
# check that they are sorted by ifindex, not name
|
|
||||||
# and that br0 and lo are excluded
|
|
||||||
atf_check \
|
|
||||||
-o match:"eth0 eth2 eth11" \
|
|
||||||
-o not-match:"br0" \
|
|
||||||
-o not-match:"lo" \
|
|
||||||
sh -c ". $lib; ethernets | tr '\n' ' '"
|
|
||||||
}
|
|
||||||
|
|
||||||
find_first_interface_up_body() {
|
|
||||||
fake_interfaces eth0 eth1
|
|
||||||
echo up > sys/class/net/eth1/operstate
|
|
||||||
|
|
||||||
atf_check \
|
|
||||||
-o match:"eth1" \
|
|
||||||
sh -c ". $lib; find_first_interface_up eth0 eth1"
|
|
||||||
}
|
|
||||||
|
|
||||||
auto_detect_ethernet_interface_body() {
|
|
||||||
fake_interfaces eth0 eth1
|
|
||||||
echo up > sys/class/net/eth1/operstate
|
|
||||||
|
|
||||||
atf_check \
|
|
||||||
-o match:"^eth1$" \
|
|
||||||
sh -c ". $lib; auto_detect_ethernet_interface"
|
|
||||||
|
|
||||||
# test that we pick first if all are down
|
|
||||||
echo down > sys/class/net/eth1/operstate
|
|
||||||
atf_check \
|
|
||||||
-o match:"^eth0$" \
|
|
||||||
sh -c ". $lib; TINY_CLOUD_LINK_WAIT_MAX=1; auto_detect_ethernet_interface"
|
|
||||||
}
|
|
||||||
|
|
||||||
set_default_interfaces_body() {
|
|
||||||
fake_interfaces eth0 eth1
|
|
||||||
echo up > sys/class/net/eth1/operstate
|
|
||||||
|
|
||||||
atf_check \
|
|
||||||
sh -c ". $lib; init__set_default_interfaces"
|
|
||||||
atf_check \
|
|
||||||
-o match:"auto lo" \
|
|
||||||
-o match:"iface eth1" \
|
|
||||||
-o match:"use dhcp" \
|
|
||||||
cat etc/network/interfaces
|
|
||||||
}
|
|
||||||
|
|
||||||
enable_sshd_body() {
|
|
||||||
for provider in $PROVIDERS; do
|
|
||||||
CLOUD="$provider" atf_check \
|
|
||||||
-o match:"rc-update.* add sshd default" \
|
|
||||||
-o match:"rc-update.* --update" \
|
|
||||||
sh -c ". $lib; init__enable_sshd"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
create_default_user_body() {
|
|
||||||
atf_check \
|
|
||||||
-o match:"addgroup alpine" \
|
|
||||||
-o match:"adduser.*alpine" \
|
|
||||||
-o match:"addgroup alpine wheel" \
|
|
||||||
-o match:"chpasswd -e" \
|
|
||||||
sh -c ". $lib; init__create_default_user"
|
|
||||||
}
|
|
||||||
|
|||||||
@ -10,10 +10,7 @@ lib="$srcdir"/lib/tiny-cloud/init
|
|||||||
|
|
||||||
init_tests \
|
init_tests \
|
||||||
set_hostname \
|
set_hostname \
|
||||||
set_ssh_keys \
|
set_ssh_keys
|
||||||
save_userdata_plain \
|
|
||||||
save_userdata_compressed
|
|
||||||
|
|
||||||
|
|
||||||
set_nocloud_meta() {
|
set_nocloud_meta() {
|
||||||
local metadata="$(cat)"
|
local metadata="$(cat)"
|
||||||
@ -65,28 +62,3 @@ set_ssh_keys_body() {
|
|||||||
-o match:"^ssh-rsa foobar" \
|
-o match:"^ssh-rsa foobar" \
|
||||||
cat home/alpine/.ssh/authorized_keys
|
cat home/alpine/.ssh/authorized_keys
|
||||||
}
|
}
|
||||||
|
|
||||||
save_userdata_plain_body() {
|
|
||||||
fake_userdata_nocloud <<-EOF
|
|
||||||
#userdata
|
|
||||||
EOF
|
|
||||||
CLOUD="nocloud" atf_check -e match:"NoCloud 'meta-data' is empty" \
|
|
||||||
sh -c ". \"$lib\"; init__save_userdata"
|
|
||||||
atf_check -o match:"^#userdata" cat var/lib/cloud/user-data
|
|
||||||
}
|
|
||||||
|
|
||||||
save_userdata_compressed_body() {
|
|
||||||
for comp in gzip bzip2 xz lzma lzop lz4 zstd; do
|
|
||||||
# fake_userdata_nocloud will set PATH so dont run it in a subshell
|
|
||||||
printf "%s\n" "#userdata" | $comp -c > tmpfile
|
|
||||||
fake_userdata_nocloud < tmpfile
|
|
||||||
|
|
||||||
CLOUD="nocloud" atf_check \
|
|
||||||
-e 'ignore' \
|
|
||||||
sh -c ". \"$lib\"; init__save_userdata"
|
|
||||||
|
|
||||||
if ! grep "^#userdata" var/lib/cloud/user-data; then
|
|
||||||
atf_fail "$comp failed"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|||||||
@ -44,7 +44,7 @@ set_network_config_network_interfaces_body() {
|
|||||||
atf_check \
|
atf_check \
|
||||||
-o match:"rc-update" \
|
-o match:"rc-update" \
|
||||||
-e match:"set_network_interfaces: done" \
|
-e match:"set_network_interfaces: done" \
|
||||||
tiny-cloud early
|
tiny-cloud boot
|
||||||
atf_check \
|
atf_check \
|
||||||
-o match:"auto eth1" \
|
-o match:"auto eth1" \
|
||||||
-o match:"iface eth1" \
|
-o match:"iface eth1" \
|
||||||
@ -70,7 +70,7 @@ set_network_config_auto_body() {
|
|||||||
atf_check \
|
atf_check \
|
||||||
-o match:"rc-update" \
|
-o match:"rc-update" \
|
||||||
-e match:"set_network_interfaces: done" \
|
-e match:"set_network_interfaces: done" \
|
||||||
tiny-cloud early
|
tiny-cloud boot
|
||||||
atf_check \
|
atf_check \
|
||||||
-o match:"auto eth1" \
|
-o match:"auto eth1" \
|
||||||
-o match:"iface eth1" \
|
-o match:"iface eth1" \
|
||||||
@ -89,7 +89,7 @@ userdata_bootcmd_body() {
|
|||||||
- echo foo
|
- echo foo
|
||||||
- echo bar
|
- echo bar
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_bootcmd: done" \
|
-e match:"userdata_bootcmd: done" \
|
||||||
-o match:"^foo$" -o match:"^bar$" \
|
-o match:"^foo$" -o match:"^bar$" \
|
||||||
@ -102,7 +102,7 @@ userdata_ntp_body() {
|
|||||||
ntp:
|
ntp:
|
||||||
enabled: true
|
enabled: true
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_ntp: done" \
|
-e match:"userdata_ntp: done" \
|
||||||
-o match:"apk add.*chrony" \
|
-o match:"apk add.*chrony" \
|
||||||
@ -118,7 +118,7 @@ userdata_ntp_busybox_body() {
|
|||||||
enabled: true
|
enabled: true
|
||||||
ntp_client: busybox
|
ntp_client: busybox
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_ntp: done" \
|
-e match:"userdata_ntp: done" \
|
||||||
-o not-match:"apk add" \
|
-o not-match:"apk add" \
|
||||||
@ -134,7 +134,7 @@ userdata_ntp_openntpd_body() {
|
|||||||
enabled: true
|
enabled: true
|
||||||
ntp_client: openntpd
|
ntp_client: openntpd
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_ntp: done" \
|
-e match:"userdata_ntp: done" \
|
||||||
-o match:"apk add.*openntpd" \
|
-o match:"apk add.*openntpd" \
|
||||||
@ -149,7 +149,7 @@ userdata_apk_cache_body() {
|
|||||||
apk:
|
apk:
|
||||||
cache: /var/cache/apk
|
cache: /var/cache/apk
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_apk_cache: done" \
|
-e match:"userdata_apk_cache: done" \
|
||||||
-o ignore \
|
-o ignore \
|
||||||
@ -165,7 +165,7 @@ userdata_apk_repositories_body() {
|
|||||||
- base_url: /srv/packages
|
- base_url: /srv/packages
|
||||||
repos: [ "main", "community" ]
|
repos: [ "main", "community" ]
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_apk_repositories: done" \
|
-e match:"userdata_apk_repositories: done" \
|
||||||
-o ignore \
|
-o ignore \
|
||||||
@ -184,7 +184,7 @@ userdata_apk_repositories_version_body() {
|
|||||||
version: edge
|
version: edge
|
||||||
repos: [ "main", "community" ]
|
repos: [ "main", "community" ]
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_apk_repositories: done" \
|
-e match:"userdata_apk_repositories: done" \
|
||||||
-o ignore \
|
-o ignore \
|
||||||
@ -205,7 +205,7 @@ userdata_apk_repositories_version_auto_edge_body() {
|
|||||||
mkdir -p etc
|
mkdir -p etc
|
||||||
echo "VERSION_ID=3.18_alpha20230329" > etc/os-release
|
echo "VERSION_ID=3.18_alpha20230329" > etc/os-release
|
||||||
|
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_apk_repositories: done" \
|
-e match:"userdata_apk_repositories: done" \
|
||||||
-o ignore \
|
-o ignore \
|
||||||
@ -220,7 +220,7 @@ userdata_package_update_body() {
|
|||||||
#alpine-config
|
#alpine-config
|
||||||
package_update: true
|
package_update: true
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_package_update: done" \
|
-e match:"userdata_package_update: done" \
|
||||||
-o match:"apk update" \
|
-o match:"apk update" \
|
||||||
@ -232,7 +232,7 @@ userdata_package_upgrade_body() {
|
|||||||
#alpine-config
|
#alpine-config
|
||||||
package_upgrade: true
|
package_upgrade: true
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_package_upgrade: done" \
|
-e match:"userdata_package_upgrade: done" \
|
||||||
-o match:"apk upgrade" \
|
-o match:"apk upgrade" \
|
||||||
@ -246,7 +246,7 @@ userdata_packages_body() {
|
|||||||
- tmux
|
- tmux
|
||||||
- vim
|
- vim
|
||||||
EOF
|
EOF
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_packages: done" \
|
-e match:"userdata_packages: done" \
|
||||||
-o match:"apk add .*tmux" \
|
-o match:"apk add .*tmux" \
|
||||||
@ -262,7 +262,7 @@ userdata_runcmd_body() {
|
|||||||
- echo bar
|
- echo bar
|
||||||
EOF
|
EOF
|
||||||
# run net phase to extract the user data
|
# run net phase to extract the user data
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_runcmd: done" \
|
-e match:"userdata_runcmd: done" \
|
||||||
-o match:"^foo$" -o match:"^bar$" \
|
-o match:"^foo$" -o match:"^bar$" \
|
||||||
@ -301,7 +301,7 @@ userdata_write_files_body() {
|
|||||||
world
|
world
|
||||||
EOF
|
EOF
|
||||||
# fetch user-data
|
# fetch user-data
|
||||||
atf_check -e ignore -o ignore tiny-cloud net
|
atf_check -e ignore -o ignore tiny-cloud early
|
||||||
|
|
||||||
atf_check \
|
atf_check \
|
||||||
-e match:"userdata_write_files: done" \
|
-e match:"userdata_write_files: done" \
|
||||||
|
|||||||
@ -10,8 +10,8 @@ PROVIDERS="alpine aws azure gcp nocloud oci"
|
|||||||
|
|
||||||
init_tests \
|
init_tests \
|
||||||
tiny_cloud_help \
|
tiny_cloud_help \
|
||||||
no_metadata_early \
|
no_metadata_boot \
|
||||||
no_userdata_net \
|
no_userdata_early \
|
||||||
no_userdata_main \
|
no_userdata_main \
|
||||||
no_userdata_final
|
no_userdata_final
|
||||||
|
|
||||||
@ -27,23 +27,23 @@ tiny_cloud_help_body() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
no_metadata_early_body() {
|
no_metadata_boot_body() {
|
||||||
for provider in $PROVIDERS; do
|
for provider in $PROVIDERS; do
|
||||||
CLOUD="$provider" atf_check \
|
CLOUD="$provider" atf_check \
|
||||||
-e not-match:"unknown" \
|
-e not-match:"unknown" \
|
||||||
-e not-match:"not found" \
|
-e not-match:"not found" \
|
||||||
-e not-match:"o such file" \
|
-e not-match:"o such file" \
|
||||||
-o match:"rc-update add.*sshd" \
|
-o match:"rc-update add.*sshd" \
|
||||||
tiny-cloud early
|
tiny-cloud boot
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
no_userdata_net_body() {
|
no_userdata_early_body() {
|
||||||
for provider in $PROVIDERS; do
|
for provider in $PROVIDERS; do
|
||||||
CLOUD="$provider" atf_check \
|
CLOUD="$provider" atf_check \
|
||||||
-e not-match:"unknown" \
|
-e not-match:"unknown" \
|
||||||
-e match:"save_userdata.*done" \
|
-e match:"save_userdata.*done" \
|
||||||
tiny-cloud net
|
tiny-cloud early
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user