diff --git a/dokku b/dokku index 550d29037..b1acacf6c 100755 --- a/dokku +++ b/dokku @@ -73,13 +73,13 @@ case "$1" in do PROC_NAME=${line%%=*} PROC_COUNT=${line#*=} - CONTAINER_NUM=1 + CONTAINER_INDEX=1 oldids=$(get_container_ids $APP) - while [[ $CONTAINER_NUM -le $PROC_COUNT ]];do - DOKKU_CONTAINER_ID_FILE="$DOKKU_ROOT/$APP/CONTAINER.$PROC_NAME.$CONTAINER_NUM" - DOKKU_IP_FILE="$DOKKU_ROOT/$APP/IP.$PROC_NAME.$CONTAINER_NUM" - DOKKU_PORT_FILE="$DOKKU_ROOT/$APP/PORT.$PROC_NAME.$CONTAINER_NUM" + while [[ $CONTAINER_INDEX -le $PROC_COUNT ]];do + DOKKU_CONTAINER_ID_FILE="$DOKKU_ROOT/$APP/CONTAINER.$PROC_NAME.$CONTAINER_INDEX" + DOKKU_IP_FILE="$DOKKU_ROOT/$APP/IP.$PROC_NAME.$CONTAINER_INDEX" + DOKKU_PORT_FILE="$DOKKU_ROOT/$APP/PORT.$PROC_NAME.$CONTAINER_INDEX" # start the app DOCKER_ARGS=$(: | pluginhook docker-args $APP deploy) @@ -121,8 +121,18 @@ case "$1" in # cleanup pre-migration files rm -f $DOKKU_ROOT/$APP/CONTAINER $DOKKU_ROOT/$APP/IP $DOKKU_ROOT/$APP/PORT - CONTAINER_NUM=$(( CONTAINER_NUM + 1 )) + + CONTAINER_INDEX=$(( CONTAINER_INDEX + 1 )) done + # cleanup when we scale down + if [[ "$PROC_COUNT" == 0 ]]; then + CONTAINER_IDX_OFFSET=0 + else + CONTAINER_IDX_OFFSET=$((PROC_COUNT + 1)) + fi + find $DOKKU_ROOT/$APP -name "CONTAINER.$PROC_NAME.*" | tail -n +$CONTAINER_IDX_OFFSET | xargs rm -f + find $DOKKU_ROOT/$APP -name "IP.$PROC_NAME.*" | tail -n +$CONTAINER_IDX_OFFSET | xargs rm -f + find $DOKKU_ROOT/$APP -name "PORT.$PROC_NAME.*" | tail -n +$CONTAINER_IDX_OFFSET | xargs rm -f done < "$DOKKU_SCALE_FILE" dokku_log_info1 "Running post-deploy" diff --git a/tests/unit/ps-buildstep.bats b/tests/unit/ps-buildstep.bats index 1eb0d5c70..c4379af38 100644 --- a/tests/unit/ps-buildstep.bats +++ b/tests/unit/ps-buildstep.bats @@ -3,25 +3,26 @@ load test_helper setup() { - deploy_app + create_app } teardown() { destroy_app } -# @test "(ps) buildstep" { -# # CI support: 'Ah. I just spoke with our Docker expert -- -# # looks like docker exec is built to work with docker-under-libcontainer, -# # but we're using docker-under-lxc. I don't have an estimated time for the fix, sorry -# skip "circleci does not support docker exec at the moment." -# run bash -c "dokku ps $TEST_APP | grep -q \"node web.js\"" -# echo "output: "$output -# echo "status: "$status -# assert_success -# } +@test "(ps) buildstep" { + # CI support: 'Ah. I just spoke with our Docker expert -- + # looks like docker exec is built to work with docker-under-libcontainer, + # but we're using docker-under-lxc. I don't have an estimated time for the fix, sorry + skip "circleci does not support docker exec at the moment." + run bash -c "dokku ps $TEST_APP | grep -q \"node web.js\"" + echo "output: "$output + echo "status: "$status + assert_success +} @test "(ps) buildstep" { + deploy_app run bash -c "dokku ps:stop $TEST_APP" echo "output: "$output echo "status: "$status @@ -66,3 +67,52 @@ teardown() { assert_success done } + +@test "(ps:scale) buildstep" { + run bash -c "dokku ps:scale $TEST_APP web=2" + echo "output: "$output + echo "status: "$status + assert_success + + deploy_app + CIDS="" + for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.web.*; do + CIDS+=$(< $CID_FILE) + CIDS+=" " + done + CIDS_PATTERN=$(echo $CIDS | sed -e "s: :|:g") + run bash -c "docker ps -q --no-trunc | egrep \"$CIDS_PATTERN\" | wc -l | grep 2" + echo "output: "$output + echo "status: "$status + assert_success + + run bash -c "dokku ps:scale $TEST_APP web=1" + echo "output: "$output + echo "status: "$status + assert_success + CIDS="" + for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.web.*; do + CIDS+=$(< $CID_FILE) + CIDS+=" " + done + CIDS_PATTERN=$(echo $CIDS | sed -e "s: :|:g") + run bash -c "docker ps -q --no-trunc | egrep \"$CIDS_PATTERN\" | wc -l | grep 1" + echo "output: "$output + echo "status: "$status + assert_success + + run bash -c "dokku ps:scale $TEST_APP web=0" + echo "output: "$output + echo "status: "$status + assert_success + CIDS="" + shopt -s nullglob + for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.web.*; do + CIDS+=$(< $CID_FILE) + CIDS+=" " + done + run bash -c "[[ -z \"$CIDS\" ]]" + echo "output: "$output + echo "status: "$status + assert_success +} diff --git a/tests/unit/ps-dockerfile.bats b/tests/unit/ps-dockerfile.bats index bfd187982..131546525 100644 --- a/tests/unit/ps-dockerfile.bats +++ b/tests/unit/ps-dockerfile.bats @@ -3,25 +3,26 @@ load test_helper setup() { - deploy_app dockerfile + create_app } teardown() { destroy_app } -# @test "(ps) dockerfile" { -# # CI support: 'Ah. I just spoke with our Docker expert -- -# # looks like docker exec is built to work with docker-under-libcontainer, -# # but we're using docker-under-lxc. I don't have an estimated time for the fix, sorry -# skip "circleci does not support docker exec at the moment." -# run bash -c "dokku ps $TEST_APP | grep -q \"node web.js\"" -# echo "output: "$output -# echo "status: "$status -# assert_success -# } +@test "(ps) dockerfile" { + # CI support: 'Ah. I just spoke with our Docker expert -- + # looks like docker exec is built to work with docker-under-libcontainer, + # but we're using docker-under-lxc. I don't have an estimated time for the fix, sorry + skip "circleci does not support docker exec at the moment." + run bash -c "dokku ps $TEST_APP | grep -q \"node web.js\"" + echo "output: "$output + echo "status: "$status + assert_success +} @test "(ps) dockerfile" { + deploy_app dockerfile run bash -c "dokku ps:stop $TEST_APP" echo "output: "$output echo "status: "$status @@ -66,3 +67,52 @@ teardown() { assert_success done } + +@test "(ps:scale) dockerfile" { + run bash -c "dokku ps:scale $TEST_APP web=2" + echo "output: "$output + echo "status: "$status + assert_success + + deploy_app dockerfile + CIDS="" + for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.web.*; do + CIDS+=$(< $CID_FILE) + CIDS+=" " + done + CIDS_PATTERN=$(echo $CIDS | sed -e "s: :|:g") + run bash -c "docker ps -q --no-trunc | egrep \"$CIDS_PATTERN\" | wc -l | grep 2" + echo "output: "$output + echo "status: "$status + assert_success + + run bash -c "dokku ps:scale $TEST_APP web=1" + echo "output: "$output + echo "status: "$status + assert_success + CIDS="" + for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.web.*; do + CIDS+=$(< $CID_FILE) + CIDS+=" " + done + CIDS_PATTERN=$(echo $CIDS | sed -e "s: :|:g") + run bash -c "docker ps -q --no-trunc | egrep \"$CIDS_PATTERN\" | wc -l | grep 1" + echo "output: "$output + echo "status: "$status + assert_success + + run bash -c "dokku ps:scale $TEST_APP web=0" + echo "output: "$output + echo "status: "$status + assert_success + CIDS="" + shopt -s nullglob + for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.web.*; do + CIDS+=$(< $CID_FILE) + CIDS+=" " + done + run bash -c "[[ -z \"$CIDS\" ]]" + echo "output: "$output + echo "status: "$status + assert_success +}