mirror of
https://github.com/dokku/dokku.git
synced 2026-09-01 19:49:25 +02:00
`storage:set` now takes `<name> <property> [<value>]` like every other `:set` command, where omitting the value unsets the property. Previously it took flags and could not distinguish an empty value from an omitted one, so nothing it set could ever be cleared. The flag form keeps working and emits a deprecation warning. Annotations and labels move to `storage:annotations:set`, `storage:annotations:report`, `storage:labels:set`, and `storage:labels:report`, matching the `scheduler-k3s` equivalents. These operate on a single key, so clearing one leaves the rest in place rather than replacing the whole map as the `--annotation` and `--label` flags do.
845 lines
27 KiB
Bash
845 lines
27 KiB
Bash
#!/usr/bin/env bats
|
|
|
|
load test_helper
|
|
|
|
setup() {
|
|
global_setup
|
|
create_app
|
|
rm -rf "$DOKKU_LIB_ROOT/data/storage/rdmtestapp*"
|
|
}
|
|
|
|
teardown() {
|
|
destroy_app
|
|
global_teardown
|
|
}
|
|
|
|
@test "(storage) storage:create / storage:list-entries / storage:destroy" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-entry"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-entry$'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "rdmtest-entry"
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-entry --format json | jq -r '.scheduler'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "docker-local"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-entry --force"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:create) --chown sets directory ownership" {
|
|
run /bin/bash -c "dokku storage:create --chown herokuish rdmtest-chown"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "stat -c '%u:%g' $DOKKU_LIB_ROOT/data/storage/rdmtest-chown"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "32767:32767"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-chown --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:create) --chown accepts a custom numeric uid" {
|
|
run /bin/bash -c "dokku storage:create --chown 1500 rdmtest-chown-numeric"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "stat -c '%u:%g' $DOKKU_LIB_ROOT/data/storage/rdmtest-chown-numeric"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "1500:1500"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-chown-numeric --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:create) --chown rejects an out-of-bounds numeric uid" {
|
|
run /bin/bash -c "dokku storage:create --chown 65536 rdmtest-chown-oob"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "Unsupported chown permissions"
|
|
|
|
run /bin/bash -c "dokku storage:create --chown -1 rdmtest-chown-oob"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "Unsupported chown permissions"
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-chown-oob$' || true"
|
|
assert_output ""
|
|
}
|
|
|
|
@test "(storage:create) --chown rejects a non-default host path" {
|
|
custom_path="/tmp/rdmtest-chown-custom"
|
|
rm -rf "$custom_path"
|
|
|
|
run /bin/bash -c "dokku storage:create --chown herokuish rdmtest-chown-custom $custom_path"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "--chown is only supported when the storage entry uses the default host path"
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-chown-custom$' || true"
|
|
assert_output ""
|
|
|
|
rm -rf "$custom_path"
|
|
}
|
|
|
|
@test "(storage) storage:create rejects invalid names" {
|
|
# underscore: rejected
|
|
run /bin/bash -c "dokku storage:create rdmtest_invalid"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
|
|
# uppercase: rejected
|
|
run /bin/bash -c "dokku storage:create RdmTest"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
|
|
# 46 chars: too long
|
|
long_name=$(printf 'a%.0s' {1..46})
|
|
run /bin/bash -c "dokku storage:create $long_name"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
|
|
# legacy- prefix: reserved
|
|
run /bin/bash -c "dokku storage:create legacy-foo"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
}
|
|
|
|
@test "(storage) storage:destroy refuses to remove a still-mounted entry" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-busy"
|
|
assert_success
|
|
run /bin/bash -c "dokku storage:mount $TEST_APP rdmtest-busy --container-dir /data"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-busy"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "still mounted"
|
|
|
|
run /bin/bash -c "dokku storage:unmount $TEST_APP rdmtest-busy"
|
|
assert_success
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-busy --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:destroy) requires confirmation without --force" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-confirm"
|
|
assert_success
|
|
|
|
# No --force and no matching stdin: aborts, entry remains.
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-confirm < /dev/null"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-confirm$'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "rdmtest-confirm"
|
|
|
|
# Matching confirmation via stdin: succeeds and removes the entry.
|
|
run /bin/bash -c "echo rdmtest-confirm | dokku storage:destroy rdmtest-confirm"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-confirm$' || true"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_output ""
|
|
}
|
|
|
|
@test "(storage:destroy) --force skips confirmation" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-force"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-force --force < /dev/null"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-force$' || true"
|
|
assert_output ""
|
|
}
|
|
|
|
@test "(storage:destroy) global --force skips confirmation" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-gforce"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku --force storage:destroy rdmtest-gforce < /dev/null"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-gforce$' || true"
|
|
assert_output ""
|
|
}
|
|
|
|
@test "(storage:create) --mode sets directory permissions" {
|
|
run /bin/bash -c "dokku storage:create --mode 0777 rdmtest-mode"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "stat -c '%a' $DOKKU_LIB_ROOT/data/storage/rdmtest-mode"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "777"
|
|
|
|
# the mode is stored on the entry in its canonical 4-digit form
|
|
run /bin/bash -c "dokku storage:info rdmtest-mode --format json | jq -r '.mode'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "0777"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-mode --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:create) --mode re-applies on an existing directory" {
|
|
# the default mode assertion below only holds for a freshly created directory
|
|
rm -rf "$DOKKU_LIB_ROOT/data/storage/rdmtest-mode-converge"
|
|
|
|
run /bin/bash -c "dokku storage:create rdmtest-mode-converge"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "stat -c '%a' $DOKKU_LIB_ROOT/data/storage/rdmtest-mode-converge"
|
|
assert_success
|
|
assert_output "755"
|
|
|
|
# re-running create against the existing entry converges the directory
|
|
run /bin/bash -c "dokku storage:create --mode 0700 rdmtest-mode-converge"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "stat -c '%a' $DOKKU_LIB_ROOT/data/storage/rdmtest-mode-converge"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "700"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-mode-converge --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:create) --mode accepts a 3 digit octal mode" {
|
|
run /bin/bash -c "dokku storage:create --mode 750 rdmtest-mode-short"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "stat -c '%a' $DOKKU_LIB_ROOT/data/storage/rdmtest-mode-short"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "750"
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-mode-short --format json | jq -r '.mode'"
|
|
assert_success
|
|
assert_output "0750"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-mode-short --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:create) --mode rejects an invalid value" {
|
|
run /bin/bash -c "dokku storage:create --mode 0888 rdmtest-mode-bad"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "Unsupported directory mode"
|
|
|
|
run /bin/bash -c "dokku storage:create --mode u+rwx rdmtest-mode-bad"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "Unsupported directory mode"
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-mode-bad$' || true"
|
|
assert_output ""
|
|
}
|
|
|
|
@test "(storage:create) --mode rejects a non-default host path" {
|
|
custom_path="/tmp/rdmtest-mode-custom"
|
|
rm -rf "$custom_path"
|
|
|
|
run /bin/bash -c "dokku storage:create --mode 0777 rdmtest-mode-custom $custom_path"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "--mode is only supported when the storage entry uses the default host path"
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-mode-custom$' || true"
|
|
assert_output ""
|
|
|
|
rm -rf "$custom_path"
|
|
}
|
|
|
|
@test "(storage:create) --mode is rejected on a k3s entry" {
|
|
run /bin/bash -c "dokku storage:create --scheduler k3s --size 1Gi --mode 0777 rdmtest-mode-k3s"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "does not accept --mode"
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-mode-k3s$' || true"
|
|
assert_output ""
|
|
}
|
|
|
|
@test "(storage:set) mode converges the directory via the positional form" {
|
|
run /bin/bash -c "dokku storage:create --mode 0755 rdmtest-mode-set"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-mode-set mode 0770"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "stat -c '%a' $DOKKU_LIB_ROOT/data/storage/rdmtest-mode-set"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "770"
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-mode-set --format json | jq -r '.mode'"
|
|
assert_success
|
|
assert_output "0770"
|
|
|
|
# the text renderer surfaces it too
|
|
run /bin/bash -c "dokku storage:info rdmtest-mode-set"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output_contains "Mode:"
|
|
assert_output_contains "0770"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-mode-set --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:set) the deprecated flag form still works and warns" {
|
|
run /bin/bash -c "dokku storage:create --mode 0755 rdmtest-set-flags"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-flags --mode 0770 2>&1"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output_contains "Deprecated:"
|
|
|
|
run /bin/bash -c "stat -c '%a' $DOKKU_LIB_ROOT/data/storage/rdmtest-set-flags"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "770"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-set-flags --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:set) sets a property via the positional form" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-set-prop"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-prop chown herokuish"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-set-prop --format json | jq -r '.chown'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "herokuish"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-set-prop --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:set) unsets a property when the value is omitted" {
|
|
run /bin/bash -c "dokku storage:create --mode 0770 rdmtest-set-unset"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-set-unset --format json | jq -r '.mode'"
|
|
assert_success
|
|
assert_output "0770"
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-unset mode"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-set-unset --format json | jq -r '.mode // empty'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output ""
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-set-unset --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:set) rejects an unknown property" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-set-bad"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-bad bogus value"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "Invalid property specified, valid properties include:"
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-bad"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "No property specified"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-set-bad --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:set) rejects mixing a property with flags" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-set-mixed"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-mixed mode 0770 --chown herokuish"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "either a property and a value or flags, not both"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-set-mixed --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:set) refuses an in-place access-mode or storage-class change" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-set-inplace"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-inplace access-mode ReadWriteMany"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "cannot change access-mode in place"
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-inplace storage-class-name longhorn"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "cannot change storage-class-name in place"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-set-inplace --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:destroy) leaves the host directory in place by default" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-keep-dir"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-keep-dir --force"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "test -d $DOKKU_LIB_ROOT/data/storage/rdmtest-keep-dir"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
rm -rf "$DOKKU_LIB_ROOT/data/storage/rdmtest-keep-dir"
|
|
}
|
|
|
|
@test "(storage:destroy) --destroy-host-dir removes a non-empty host directory" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-drop-dir"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "sudo touch $DOKKU_LIB_ROOT/data/storage/rdmtest-drop-dir/payload"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-drop-dir --destroy-host-dir --force"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "test -d $DOKKU_LIB_ROOT/data/storage/rdmtest-drop-dir"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-drop-dir$' || true"
|
|
assert_output ""
|
|
}
|
|
|
|
@test "(storage:destroy) --reclaim-policy Delete removes the host directory" {
|
|
run /bin/bash -c "dokku storage:create --reclaim-policy Delete rdmtest-reclaim"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-reclaim --force"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "test -d $DOKKU_LIB_ROOT/data/storage/rdmtest-reclaim"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
}
|
|
|
|
@test "(storage:create) --reclaim-policy Delete rejects a non-default host path" {
|
|
custom_path="/tmp/rdmtest-reclaim-custom"
|
|
rm -rf "$custom_path"
|
|
|
|
run /bin/bash -c "dokku storage:create --reclaim-policy Delete rdmtest-reclaim-custom $custom_path"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "default host path"
|
|
|
|
run /bin/bash -c "dokku storage:list-entries --format json | jq -r '.[].name' | grep '^rdmtest-reclaim-custom$' || true"
|
|
assert_output ""
|
|
|
|
rm -rf "$custom_path"
|
|
}
|
|
|
|
@test "(storage:destroy) --destroy-host-dir refuses a non-default host path" {
|
|
custom_path="/tmp/rdmtest-drop-custom"
|
|
rm -rf "$custom_path"
|
|
mkdir -p "$custom_path"
|
|
|
|
run /bin/bash -c "dokku storage:create rdmtest-drop-custom $custom_path"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-drop-custom --destroy-host-dir --force"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "--destroy-host-dir is only supported when the storage entry uses the default host path"
|
|
|
|
run /bin/bash -c "test -d $custom_path"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-drop-custom --force"
|
|
assert_success
|
|
|
|
rm -rf "$custom_path"
|
|
}
|
|
|
|
@test "(storage:annotations:set) sets and clears a single key" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-annot"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot first one"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-annot --format json | jq -r '.annotations.first'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "one"
|
|
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot first"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-annot --format json | jq -r '.annotations // empty'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output ""
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-annot --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:annotations:set) leaves other keys untouched" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-annot-multi"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot-multi first one"
|
|
assert_success
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot-multi second two"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot-multi first"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-annot-multi --format json | jq -r '.annotations.second'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "two"
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-annot-multi --format json | jq -r '.annotations.first // empty'"
|
|
assert_success
|
|
assert_output ""
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-annot-multi --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:annotations:set) accepts a kubernetes-style key containing a slash" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-annot-slash"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot-slash backup.velero.io/backup-volumes rdmtest-annot-slash"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-annot-slash --format json | jq -r '.annotations.\"backup.velero.io/backup-volumes\"'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "rdmtest-annot-slash"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-annot-slash --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:annotations:report) reports one entry and every entry" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-annot-rpt"
|
|
assert_success
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot-rpt team billing"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:annotations:report rdmtest-annot-rpt"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output_contains "rdmtest-annot-rpt annotations information"
|
|
assert_output_contains "Annotation team:"
|
|
assert_output_contains "billing"
|
|
|
|
# without a name, every registered entry is covered
|
|
run /bin/bash -c "dokku storage:annotations:report"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output_contains "rdmtest-annot-rpt annotations information"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-annot-rpt --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:annotations:report) emits json and answers a single info flag" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-annot-json"
|
|
assert_success
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot-json team billing"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:annotations:report rdmtest-annot-json --format json | jq -r '.team'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "billing"
|
|
|
|
run /bin/bash -c "dokku storage:annotations:report rdmtest-annot-json --storage-annotations.team"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "billing"
|
|
|
|
run /bin/bash -c "dokku storage:annotations:report rdmtest-annot-json --storage-annotations.absent"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "Invalid flag passed, valid flags:"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-annot-json --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:labels:set) sets and clears a single key" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-label"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:labels:set rdmtest-label app.kubernetes.io/part-of billing"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-label --format json | jq -r '.labels.\"app.kubernetes.io/part-of\"'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "billing"
|
|
|
|
# labels and annotations are stored separately
|
|
run /bin/bash -c "dokku storage:info rdmtest-label --format json | jq -r '.annotations // empty'"
|
|
assert_success
|
|
assert_output ""
|
|
|
|
run /bin/bash -c "dokku storage:labels:set rdmtest-label app.kubernetes.io/part-of"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-label --format json | jq -r '.labels // empty'"
|
|
assert_success
|
|
assert_output ""
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-label --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:labels:report) reports one entry" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-label-rpt"
|
|
assert_success
|
|
run /bin/bash -c "dokku storage:labels:set rdmtest-label-rpt tier cache"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:labels:report rdmtest-label-rpt"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output_contains "rdmtest-label-rpt labels information"
|
|
assert_output_contains "Label tier:"
|
|
assert_output_contains "cache"
|
|
|
|
run /bin/bash -c "dokku storage:labels:report rdmtest-label-rpt --format json | jq -r '.tier'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "cache"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-label-rpt --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:annotations:set) fails on a missing entry or key" {
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot-absent key value"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "does not exist"
|
|
|
|
run /bin/bash -c "dokku storage:create rdmtest-annot-nokey"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:annotations:set rdmtest-annot-nokey"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "No annotation key specified"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-annot-nokey --destroy-host-dir --force"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:destroy) --destroy-host-dir warns before the confirmation prompt" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-drop-confirm"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
|
|
run /bin/bash -c "sudo touch $DOKKU_LIB_ROOT/data/storage/rdmtest-drop-confirm/payload"
|
|
assert_success
|
|
|
|
run /bin/bash -c "echo rdmtest-drop-confirm | dokku storage:destroy rdmtest-drop-confirm --destroy-host-dir 2>&1"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output_contains "which will be removed along with its contents"
|
|
assert_output_contains "WARNING: Potentially Destructive Action"
|
|
|
|
run /bin/bash -c "test -d $DOKKU_LIB_ROOT/data/storage/rdmtest-drop-confirm"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
}
|
|
|
|
@test "(storage:destroy) --destroy-host-dir is rejected on a k3s entry" {
|
|
# a k3s entry cannot be created without a cluster, since storage:create
|
|
# rolls the entry back when the scheduler trigger fails
|
|
entry_path="$DOKKU_LIB_ROOT/data/storage-registry/entries/rdmtest-drop-k3s.json"
|
|
run /bin/bash -c "echo '{\"name\":\"rdmtest-drop-k3s\",\"scheduler\":\"k3s\",\"size\":\"1Gi\",\"schema_version\":1}' | sudo tee $entry_path >/dev/null"
|
|
assert_success
|
|
run /bin/bash -c "sudo chown dokku:dokku $entry_path"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-drop-k3s --destroy-host-dir --force"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_failure
|
|
assert_output_contains "--destroy-host-dir only applies to docker-local storage entries"
|
|
|
|
run /bin/bash -c "sudo rm -f $entry_path"
|
|
assert_success
|
|
}
|
|
|
|
@test "(storage:set) the deprecated --annotation flag warns toward annotations:set" {
|
|
run /bin/bash -c "dokku storage:create rdmtest-set-annot"
|
|
assert_success
|
|
|
|
run /bin/bash -c "dokku storage:set rdmtest-set-annot --annotation team=billing 2>&1"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output_contains "Deprecated:"
|
|
assert_output_contains "storage:annotations:set"
|
|
|
|
run /bin/bash -c "dokku storage:info rdmtest-set-annot --format json | jq -r '.annotations.team'"
|
|
echo "output: $output"
|
|
echo "status: $status"
|
|
assert_success
|
|
assert_output "billing"
|
|
|
|
run /bin/bash -c "dokku storage:destroy rdmtest-set-annot --destroy-host-dir --force"
|
|
assert_success
|
|
}
|