From ffa72395f6350a8e6e9fb06252b80b6b58f0deea Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 8 Feb 2023 00:03:25 -0500 Subject: [PATCH] feat: add support for network related flags on create, clone, and upgrade Also add some tests to cover all the network-related functionality. --- common-functions | 26 ++++++- subcommands/clone | 3 + subcommands/create | 3 + subcommands/destroy | 2 + subcommands/upgrade | 3 + tests/link_networks.bats | 143 +++++++++++++++++++++++++++++++++++++++ tests/test_helper.bash | 14 ++++ 7 files changed, 193 insertions(+), 1 deletion(-) create mode 100755 tests/link_networks.bats diff --git a/common-functions b/common-functions index b42ac0d..7b401e0 100755 --- a/common-functions +++ b/common-functions @@ -349,6 +349,18 @@ service_commit_config() { if [[ -n "$PLUGIN_IMAGE_VERSION" ]]; then echo "$PLUGIN_IMAGE_VERSION" >"$SERVICE_ROOT/IMAGE_VERSION" fi + + if [[ -n "$SERVICE_INITIAL_NETWORK" ]]; then + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "initial-network" "$SERVICE_INITIAL_NETWORK" + fi + + if [[ -n "$SERVICE_POST_CREATE_NETWORK" ]]; then + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network" "$SERVICE_POST_CREATE_NETWORK" + fi + + if [[ -n "$SERVICE_POST_START_NETWORK" ]]; then + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network" "$SERVICE_POST_START_NETWORK" + fi } service_backup_auth() { @@ -699,9 +711,12 @@ service_parse_args() { "--custom-env") set -- "$@" "-C" ;; "--database") set -- "$@" "-d" ;; "--image-version") set -- "$@" "-I" ;; + "--initial-network") set -- "$@" "-N" ;; "--image") set -- "$@" "-i" ;; "--memory") set -- "$@" "-m" ;; "--password") set -- "$@" "-p" ;; + "--post-create-network") set -- "$@" "-P" ;; + "--post-start-network") set -- "$@" "-S" ;; "--querystring") set -- "$@" "-q" ;; "--restart-apps") set -- "$@" "-R" ;; "--root-password") set -- "$@" "-r" ;; @@ -712,7 +727,7 @@ service_parse_args() { done OPTIND=1 - while getopts "a:c:C:d:i:I:m:p:q:R:r:s:u:" opt; do + while getopts "a:c:C:d:i:I:m:n:p:P:q:R:r:s:S:u:" opt; do case "$opt" in a) SERVICE_ALIAS="${OPTARG^^}" @@ -736,9 +751,15 @@ service_parse_args() { m) export SERVICE_MEMORY=$OPTARG ;; + N) + export SERVICE_INITIAL_NETWORK=$OPTARG + ;; p) export SERVICE_PASSWORD=$OPTARG ;; + P) + export SERVICE_POST_CREATE_NETWORK=$OPTARG + ;; q) export SERVICE_QUERYSTRING=${OPTARG#"?"} ;; @@ -751,6 +772,9 @@ service_parse_args() { s) export SERVICE_SHM_SIZE=$OPTARG ;; + S) + export SERVICE_POST_START_NETWORK=$OPTARG + ;; u) export SERVICE_USER=$OPTARG ;; diff --git a/subcommands/clone b/subcommands/clone index a7e2f64..6ee9d1e 100755 --- a/subcommands/clone +++ b/subcommands/clone @@ -15,8 +15,11 @@ service-clone-cmd() { #F -i|--image IMAGE, the image name to start the service with #F -I|--image-version IMAGE_VERSION, the image version to start the service with #F -m|--memory MEMORY, container memory limit in megabytes (default: unlimited) + #F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to #F -p|--password PASSWORD, override the user-level service password + #F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation #F -r|--root-password PASSWORD, override the root-level service password + #F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start #F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container declare desc="create container then copy data from into " local cmd="$PLUGIN_COMMAND_PREFIX:clone" argv=("$@") diff --git a/subcommands/create b/subcommands/create index 557b8b8..a5975ce 100755 --- a/subcommands/create +++ b/subcommands/create @@ -23,8 +23,11 @@ service-create-cmd() { #F -i|--image IMAGE, the image name to start the service with #F -I|--image-version IMAGE_VERSION, the image version to start the service with #F -m|--memory MEMORY, container memory limit in megabytes (default: unlimited) + #F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to #F -p|--password PASSWORD, override the user-level service password + #F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation #F -r|--root-password PASSWORD, override the root-level service password + #F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start #F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container declare desc="create a $PLUGIN_SERVICE service" local cmd="$PLUGIN_COMMAND_PREFIX:create" argv=("$@") diff --git a/subcommands/destroy b/subcommands/destroy index 1294b8a..4ae563f 100755 --- a/subcommands/destroy +++ b/subcommands/destroy @@ -49,6 +49,8 @@ service-destroy-cmd() { "$DOCKER_BIN" container run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/config" "$PLUGIN_BUSYBOX_IMAGE" chmod 777 -R /config /data rm -rf "$SERVICE_ROOT" + fn-plugin-property-destroy "$PLUGIN_COMMAND_PREFIX" "$SERVICE" + plugn trigger service-action post-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" dokku_log_info2 "$PLUGIN_SERVICE container deleted: $SERVICE" } diff --git a/subcommands/upgrade b/subcommands/upgrade index 788c767..40374cd 100755 --- a/subcommands/upgrade +++ b/subcommands/upgrade @@ -14,7 +14,10 @@ service-upgrade-cmd() { #F -C|--custom-env "USER=alpha;HOST=beta", semi-colon delimited environment variables to start the service with #F -i|--image IMAGE, the image name to start the service with #F -I|--image-version IMAGE_VERSION, the image version to start the service with + #F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to + #F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation #F -R|--restart-apps "true", whether to force an app restart + #F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start #F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container declare desc="upgrade service to the specified versions" local cmd="$PLUGIN_COMMAND_PREFIX:upgrade" argv=("$@") diff --git a/tests/link_networks.bats b/tests/link_networks.bats new file mode 100755 index 0000000..0e5bccc --- /dev/null +++ b/tests/link_networks.bats @@ -0,0 +1,143 @@ +#!/usr/bin/env bats +load test_helper + +setup() { + dokku "$PLUGIN_COMMAND_PREFIX:create" ls + dokku network:create custom-network +} + +teardown() { + dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls || true + dokku network:destroy --force custom-network +} + +@test "($PLUGIN_COMMAND_PREFIX:set) set initial-network" { + run dokku "$PLUGIN_COMMAND_PREFIX:set" ls initial-network custom-network + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --initial-network + assert_output "custom-network" + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:set" ls initial-network + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --initial-network + assert_output "" + assert_success + + run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains bridge + assert_output_contains custom-network 0 + + run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:start" ls + assert_success + + run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains bridge 0 + assert_output_contains custom-network +} + +@test "($PLUGIN_COMMAND_PREFIX:set) set post-create-network" { + run dokku "$PLUGIN_COMMAND_PREFIX:set" ls post-create-network custom-network + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --post-create-network + assert_output "custom-network" + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:set" ls post-create-network + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --post-create-network + assert_output "" + assert_success + + run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains bridge + assert_output_contains custom-network 0 + + run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:start" ls + assert_success + + run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains custom-network + assert_output_contains bridge +} + +@test "($PLUGIN_COMMAND_PREFIX:set) set an post-start-network" { + run dokku "$PLUGIN_COMMAND_PREFIX:set" ls post-start-network custom-network + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --post-start-network + assert_output "custom-network" + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:set" ls post-start-network + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --post-start-network + assert_output "" + assert_success + + run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains bridge + assert_output_contains custom-network 0 + + run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:start" ls + assert_success + + run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains bridge + assert_output_contains custom-network +} + +@test "($PLUGIN_COMMAND_PREFIX:create) flags" { + run dokku "$PLUGIN_COMMAND_PREFIX:create" lsa --initial-network custom-network + assert_success + + run docker inspect "dokku.$PLUGIN_COMMAND_PREFIX.lsa" -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains bridge 0 + assert_output_contains custom-network + + run dokku "$PLUGIN_COMMAND_PREFIX:destroy" lsa --force + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:create" lsa --post-create-network custom-network + assert_success + + run docker inspect "dokku.$PLUGIN_COMMAND_PREFIX.lsa" -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains bridge + assert_output_contains custom-network + + run dokku "$PLUGIN_COMMAND_PREFIX:destroy" lsa --force + assert_success + + run dokku "$PLUGIN_COMMAND_PREFIX:create" lsa --post-start-network custom-network + assert_success + + run docker inspect "dokku.$PLUGIN_COMMAND_PREFIX.lsa" -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' + assert_success + assert_output_contains bridge + assert_output_contains custom-network + + run dokku "$PLUGIN_COMMAND_PREFIX:destroy" lsa --force + assert_success +} diff --git a/tests/test_helper.bash b/tests/test_helper.bash index 8a0d1ee..fb397ab 100755 --- a/tests/test_helper.bash +++ b/tests/test_helper.bash @@ -70,3 +70,17 @@ assert_output() { fi assert_equal "$expected" "$output" } + +# ShellCheck doesn't know about $output from Bats +# shellcheck disable=SC2154 +assert_output_contains() { + local input="$output" + local expected="$1" + local count="${2:-1}" + local found=0 + until [ "${input/$expected/}" = "$input" ]; do + input="${input/$expected/}" + found=$((found + 1)) + done + assert_equal "$count" "$found" +}