You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

1482 lines
24 KiB

#!/usr/bin/env bash-shlib
# -*- mode: shell-script -*-
include shunit
depends sed grep git mkdir readlink
export -f matches
export grep
tmp=/tmp
tprog="../bin/compose"
tprog=$(readlink -f $tprog)
export PATH=".:$PATH"
short_tprog=$(basename "$tprog")
##
## Convenience function
##
init_test() {
test_tmpdir=$(mktemp -d -t tmp.XXXXXXXXXX)
cd "$test_tmpdir"
export CACHEDIR="$test_tmpdir/.cache"
export VARDIR="$test_tmpdir/.var"
mkdir -p "$CACHEDIR"
}
tear_test() {
rm -rf "$test_tmpdir"
}
##
## Tests
##
##
# Checking arguments
test_calling_sourcing() {
assert_list <<EOF
### Calling and sourcing
## -- call of '$short_tprog' with no arg fails (errlvl != 0)
! "$tprog"
## -- source '$short_tprog' should not fail
. "$tprog"
EOF
}
test_mixin_functions() {
init_test
assert_list <<EOF
### Testing get_docker_compose_mixin_from_metadata
## -- Empty metadata.yml
export CHARM_STORE=$test_tmpdir
mkdir $test_tmpdir/testcharm
cat <<EOF2 > $test_tmpdir/testcharm/metadata.yml
EOF2
. "$tprog"
_setup_state_dir
out="\$(get_docker_compose_mixin_from_metadata testcharm)"
expected='\
labels:
- compose.charm=testcharm'
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- volumes
export CHARM_STORE=$test_tmpdir
export CONFIGSTORE=/tmp/CONFIG
export DATASTORE=/tmp/DATA
mkdir -p $test_tmpdir/testcharm
cat <<EOF2 > $test_tmpdir/testcharm/metadata.yml
data-resources:
- /a
config-resources:
- /b
host-resources:
- /tmp:/tmp
EOF2
. "$tprog"
_setup_state_dir
out=\$(get_docker_compose_mixin_from_metadata testcharm) || exit 1
expected="\
labels:
- compose.charm=testcharm
volumes:
- /tmp/DATA/testcharm/a:/a:rw
- /tmp/CONFIG/testcharm/b:/b:rw
- /tmp:/tmp:rw"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- docker-compose
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/testcharm
cat <<EOF2 > $test_tmpdir/testcharm/metadata.yml
docker-compose:
volumes:
- /any:/vol
entrypoint: any
EOF2
. "$tprog"
_setup_state_dir
out="\$(get_docker_compose_mixin_from_metadata testcharm)" || exit 1
expected="\
entrypoint: any
labels:
- compose.charm=testcharm
volumes:
- /any:/vol"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- image
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/testcharm
cat <<EOF2 > $test_tmpdir/testcharm/metadata.yml
docker-image: toto
EOF2
. "$tprog"
_setup_state_dir
out="\$(get_docker_compose_mixin_from_metadata testcharm)" || exit 1
expected="\
image: toto
labels:
- compose.charm=testcharm"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- build
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/testcharm/build
cat <<EOF2 > $test_tmpdir/testcharm/metadata.yml
# XXX new content to invalidate cache
EOF2
. "$tprog"
_setup_state_dir
out="\$(get_docker_compose_mixin_from_metadata testcharm)" || exit 1
expected="\
build: $test_tmpdir/testcharm/build
labels:
- compose.charm=testcharm"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- subordinate with image
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/testcharm
cat <<EOF2 > $test_tmpdir/testcharm/metadata.yml
subordinate: true
docker-image: toto
EOF2
. "$tprog"
_setup_state_dir
! get_docker_compose_mixin_from_metadata testcharm
## -- subordinate with build subdir
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/testcharm/build
cat <<EOF2 > $test_tmpdir/testcharm/metadata.yml
subordinate: true
EOF2
. "$tprog"
_setup_state_dir
! get_docker_compose_mixin_from_metadata testcharm
EOF
tear_test
}
function test_merge_yaml {
init_test
assert_list <<EOF
### Testing merge_yaml
## -- basic example
. "$tprog"
_setup_state_dir
test "\$(merge_yaml <(echo "
a:
b: 1
c:
- d
- e
") <(echo "
a:
y: 3
b: 2
c:
- new
x:
1
"))" == "a:
b: 2
c:
- d
- e
- new
y: 3
x: 1"
## -- Nothing
. "$tprog"
_setup_state_dir
test -z "\$(merge_yaml <(echo) <(echo))"
## -- No variable expansions
. "$tprog"
_setup_state_dir
out=\$(merge_yaml <(echo '- \$\$') <(echo "- a"))
test "\$out" == '- \$\$
- a' || {
echo -e "** merge_yaml:\n\$out"; exit 1
}
EOF
}
function test_merge_yaml_str {
init_test
assert_list <<EOF
### Testing merge_yaml_str
## -- basic example
. "$tprog"
_setup_state_dir
test "\$(merge_yaml_str "
a:
b: 1
c:
- d
- e
" "
a:
y: 3
b: 2
c:
- new
x:
1
")" == "a:
b: 2
c:
- d
- e
- new
y: 3
x: 1"
## -- Nothing
. "$tprog"
_setup_state_dir
test -z "\$(merge_yaml_str "" "")"
## -- No variable expansions
. "$tprog"
_setup_state_dir
out=\$(merge_yaml_str '- \$\$' "- a")
test "\$out" == '- \$\$
- a' || {
echo -e "** merge_yaml_str:\n\$out"; exit 1
}
EOF
}
function test_merge_yaml_str {
init_test
assert_list <<EOF
### Testing merge_yaml_str
## -- basic example
. "$tprog"
_setup_state_dir
test "\$(merge_yaml_str "
a:
b: 1
c:
- d
- e
" "
a:
y: 3
b: 2
c:
- new
x:
1
")" == "a:
b: 2
c:
- d
- e
- new
y: 3
x: 1"
## -- Nothing
. "$tprog"
_setup_state_dir
test -z "\$(merge_yaml_str "" "")"
## -- No variable expansions
. "$tprog"
_setup_state_dir
out=\$(merge_yaml_str '- \$\$' "- a")
test "\$out" == '- \$\$
- a' || {
echo -e "** merge_yaml_str:\n\$out"; exit 1
}
EOF
}
function test_yaml_key_val_str {
init_test
assert_list <<EOF
### Testing yaml_key_val_str
## -- basic example
. "$tprog"
_setup_state_dir
out="\$(yaml_key_val_str "a" "data: |
hello
multi
line
b:
x: 1
y: 2
")"
test "\$out" == "a:
data: 'hello
multi
line
'
b:
x: 1
y: 2" || {
echo -e "** yaml_key_val_str:\n\$out"
exit 1
}
EOF
}
test_get_compose_service_def() {
init_test
assert_list <<EOF
### Testing get_compose_service_def
## -- Simple (no docker-compose)
export CHARM_STORE=$test_tmpdir
mkdir $test_tmpdir/www
touch $test_tmpdir/www/metadata.yml
. "$tprog"
_setup_state_dir
out="\$(get_compose_service_def www)"
test "\$out" == "charm: www" || {
echo OUTPUT:
echo "\$out"
false
}
## -- Simple (no docker-compose, no charm dir)
export CHARM_STORE=$test_tmpdir
. "$tprog"
_setup_state_dir
! get_compose_service_def www_not_existent
## -- Simple (compose is self sufficient)
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/www
cat <<EOF2 > $test_tmpdir/compose.yml
toto:
charm: www
blabla: xxx
EOF2
. "$tprog"
_setup_state_dir
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
out="\$(get_compose_service_def toto)"
test "\$out" == "charm: www
blabla: xxx" || {
echo -e "** get_compose_service_def toto:\n\$out"
exit 1
}
## -- Addition of default charm
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/www
cat <<EOF2 > $test_tmpdir/compose.yml
www:
blabla: xxx
EOF2
. "$tprog"
_setup_state_dir
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
test "\$(get_compose_service_def www)" == "blabla: xxx
charm: www"
EOF
}
##
##
##
function test_get_master_service_for_service() {
init_test
assert_list <<EOF
### Testing get_master_service_for_service
## -- Simple (no subordinate)
export CHARM_STORE=$test_tmpdir
mkdir $test_tmpdir/www
cat <<EOF2 > $test_tmpdir/www/metadata.yml
EOF2
. "$tprog"
_setup_state_dir
test "\$(get_master_service_for_service www)" == "www"
## -- subordinate
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
touch $test_tmpdir/mysql/metadata.yml
cat <<EOF2 > $test_tmpdir/www/metadata.yml
subordinate: true
requires:
a-label-for-relation:
interface: a-name-relation
scope: container
EOF2
cat <<EOF2 > $test_tmpdir/compose.yml
www:
charm: www
relations:
a-name-relation:
mysql:
label: value
EOF2
. "$tprog"
_setup_state_dir
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
test "\$(get_master_service_for_service www)" == "mysql"
EOF
}
##
##
##
function test_get_docker_compose_service_mixin() {
init_test
assert_list <<EOF
### Testing get_docker_compose_service_mixin
## -- Simple (no compose, no subordinate)
export CHARM_STORE=$test_tmpdir
mkdir $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
data-resources:
- /tmp/a
config-resources:
- /tmp/b
EOF2
. "$tprog"
_setup_state_dir
out=\$(_get_docker_compose_service_mixin www | shyaml get-value www.volumes)
[[ "\$out" == "\
- /www/tmp/a:/tmp/a:rw
- /www/tmp/b:/tmp/b:rw" ]] || {
echo -e "** _get_docker_compose_service_mixin www:\n\$out"; exit 1
}
## -- Simple (compose, but no subordinate)
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
data-resources:
- /tmp/a
config-resources:
- /tmp/b
EOF2
touch $test_tmpdir/mysql/metadata.yml
cat <<EOF2 > $test_tmpdir/compose.yml
www:
charm: www
relations:
a-name-relation:
mysql:
label: value
EOF2
. "$tprog"
_setup_state_dir
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
out="\$(_get_docker_compose_service_mixin www)" || exit 1
[ "\$out" == "www:
labels:
- compose.service=www
- compose.master-service=www
- compose.project=\$(basename "$test_tmpdir")
- compose.charm=www
links:
- mysql
volumes:
- /www/tmp/a:/tmp/a:rw
- /www/tmp/b:/tmp/b:rw" ] || {
echo -e "OUT:\n\$out"
exit 1
}
## -- compose, subordinate
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
subordinate: true
data-resources:
- /tmp/a
config-resources:
- /tmp/b
requires:
a-name-relation:
interface: a-name-relation
scope: container
EOF2
cat <<EOF2 > $test_tmpdir/compose.yml
www:
charm: www
relations:
a-name-relation:
mysql:
label: value
EOF2
. "$tprog"
_setup_state_dir
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
out="\$(_get_docker_compose_service_mixin www)" || exit 1
expected="mysql:
labels:
- compose.service=www
- compose.master-service=mysql
- compose.project=$(basename "$test_tmpdir")
- compose.charm=www
volumes:
- /www/tmp/a:/tmp/a:rw
- /www/tmp/b:/tmp/b:rw"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
EOF
}
function test_get_docker_compose {
init_test
assert_list <<EOF
### Testing get_docker_compose
## -- no docker-compose
export CHARM_STORE=$test_tmpdir
mkdir $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
data-resources:
- /tmp/a
config-resources:
- /tmp/b
EOF2
. "$tprog"
_setup_state_dir
out=\$(get_docker_compose www)
echo "OUT:"
echo "\$out"
out=\$(echo "\$out" | shyaml get-value services.www.volumes)
echo "OUT volumes:"
echo "\$out"
test "\$out" == "\\
- /www/tmp/a:/tmp/a:rw
- /www/tmp/b:/tmp/b:rw"
## -- simple with docker-compose
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
data-resources:
- /tmp/a
config-resources:
- /tmp/b
EOF2
cat <<EOF2 > $test_tmpdir/mysql/metadata.yml
data-resources:
- /tmp/c
config-resources:
- /tmp/d
EOF2
cat <<EOF2 > $test_tmpdir/compose.yml
web_site:
charm: www
relations:
db-connection:
mysql:
user: toto
dbname: tata
EOF2
. "$tprog"
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
_setup_state_dir
out=\$(get_docker_compose www | shyaml get-value services.www.volumes)
test "\$out" == "\\
- /www/tmp/a:/tmp/a:rw
- /www/tmp/b:/tmp/b:rw" || {
echo -e "** get_docker_compose www:\n\$out"
exit 1
}
out=\$(get_docker_compose_links web_site | shyaml get-value web_site.links)
test "\$out" == "- mysql" || {
echo -e "** get_docker_compose_links web_site:\n\$out"
exit 1
}
out=\$(get_docker_compose web_site | shyaml get-value services)
expected="\
mysql:
labels:
- compose.service=mysql
- compose.master-service=mysql
- compose.project=$(basename "$test_tmpdir")
- compose.charm=mysql
volumes:
- /mysql/tmp/c:/tmp/c:rw
- /mysql/tmp/d:/tmp/d:rw
web_site:
labels:
- compose.service=web_site
- compose.master-service=web_site
- compose.project=$(basename "$test_tmpdir")
- compose.charm=www
links:
- mysql
volumes:
- /web_site/tmp/a:/tmp/a:rw
- /web_site/tmp/b:/tmp/b:rw"
test "\$out" == "\$expected" || {
echo -e "** get_docker_compose web_site:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- subordinate
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
subordinate: true
data-resources:
- /tmp/a
config-resources:
- /tmp/b
requires:
my-db-connection:
interface: db-connection
scope: container
EOF2
cat <<EOF2 > $test_tmpdir/mysql/metadata.yml
data-resources:
- /tmp/c
config-resources:
- /tmp/d
EOF2
cat <<EOF2 > $test_tmpdir/compose.yml
web_site:
charm: www
relations:
db-connection:
mysql:
user: toto
dbname: tata
EOF2
. "$tprog"
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
_setup_state_dir
# should fail because of missing relations
! get_docker_compose www || exit 1
# volumes gets mixed
out="\$(get_docker_compose web_site | shyaml get-value services.mysql.volumes)"
test "\$out" == "\
- /web_site/tmp/a:/tmp/a:rw
- /web_site/tmp/b:/tmp/b:rw
- /mysql/tmp/c:/tmp/c:rw
- /mysql/tmp/d:/tmp/d:rw" || {
echo -e "OUT:\n\$out"
exit 1
}
## -- subordinate with complex features
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
subordinate: true
data-resources:
- /tmp/a
config-resources:
- /tmp/b
requires:
my-db-connection:
interface: db-connection
scope: container
docker-compose:
volumes:
- /special-volume-from-www:/special-volume-from-www
EOF2
cat <<EOF2 > $test_tmpdir/mysql/metadata.yml
data-resources:
- /tmp/c
config-resources:
- /tmp/d
docker-compose:
entrypoint: custom-entrypoint
volumes:
- /special-volume-from-mysql:/special-volume-from-mysql
EOF2
cat <<EOF2 > $test_tmpdir/compose.yml
web_site:
charm: www
relations:
db-connection:
mysql:
user: toto
dbname: tata
EOF2
. "$tprog"
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
_setup_state_dir
# should fail because of missing relations
#! get_docker_compose www || exit 1
# volumes gets mixed
out="\$(get_docker_compose web_site | shyaml get-value services.mysql)"
expected="\
entrypoint: custom-entrypoint
labels:
- compose.service=web_site
- compose.charm=www
- compose.service=mysql
- compose.master-service=mysql
- compose.project=$(basename "$test_tmpdir")
- compose.charm=mysql
volumes:
- /web_site/tmp/a:/tmp/a:rw
- /web_site/tmp/b:/tmp/b:rw
- /special-volume-from-www:/special-volume-from-www
- /mysql/tmp/c:/tmp/c:rw
- /mysql/tmp/d:/tmp/d:rw
- /special-volume-from-mysql:/special-volume-from-mysql"
test "\$out" == "\$expected" || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
EOF
tear_test
}
## XXXvlab: only broken due to Wrap being used for relations
# function test_run_service_relations {
# init_test
# assert_list <<EOF
# ### Testing run_service_relations
# ## -- no docker-compose
# export CHARM_STORE=$test_tmpdir
# mkdir $test_tmpdir/{www,mysql}
# cat <<EOF2 > $test_tmpdir/www/metadata.yml
# data-resources:
# - /tmp/a
# config-resources:
# - /tmp/b
# EOF2
# . "$tprog"
# _setup_state_dir
# echo "Docker Compose:"
# get_docker_compose www
# echo "Run Service relations:"
# _run_service_relation() {
# echo "\$FUNCNAME: received $*"
# }
# out=\$(run_service_relations www)
# test -z "\$out"
# ## -- simple with docker-compose
# export CHARM_STORE=$test_tmpdir
# mkdir -p $test_tmpdir/{www,mysql}
# cat <<EOF2 > $test_tmpdir/www/metadata.yml
# data-resources:
# - /tmp/a
# config-resources:
# - /tmp/b
# EOF2
# cat <<EOF2 > $test_tmpdir/mysql/metadata.yml
# data-resources:
# - /tmp/c
# config-resources:
# - /tmp/d
# EOF2
# cat <<EOF2 > $test_tmpdir/compose.yml
# web_site:
# charm: www
# relations:
# db-connection:
# mysql:
# user: toto
# dbname: tata
# EOF2
# . "$tprog"
# COMPOSE_YML_FILE=$test_tmpdir/compose.yml
# _setup_state_dir
# _setup_state_dir
# echo "Docker Compose:"
# get_docker_compose web_site
# echo "Run Service relations:"
# _run_service_relation() {
# echo "\$FUNCNAME \$2 <-- \$1 --> \$3"
# }
# export -f _run_service_relation
# out=\$(run_service_relations www)
# test -z "\$out" || exit 1
# out=\$(run_service_relations web_site)
# echo "OUT: \$out"
# test "\$out" == "_run_service_relation web_site <-- db-connection --> mysql"
# ## -- subordinate
# export CHARM_STORE=$test_tmpdir
# mkdir -p $test_tmpdir/{www,mysql}
# cat <<EOF2 > $test_tmpdir/www/metadata.yml
# subordinate: true
# data-resources:
# - /tmp/a
# config-resources:
# - /tmp/b
# requires:
# my-db-connection:
# interface: db-connection
# scope: container
# EOF2
# cat <<EOF2 > $test_tmpdir/mysql/metadata.yml
# data-resources:
# - /tmp/c
# config-resources:
# - /tmp/d
# EOF2
# cat <<EOF2 > $test_tmpdir/compose.yml
# web_site:
# charm: www
# relations:
# db-connection:
# mysql:
# user: toto
# dbname: tata
# EOF2
# . "$tprog"
# COMPOSE_YML_FILE=$test_tmpdir/compose.yml
# _setup_state_dir
# echo "Docker Compose:"
# get_docker_compose web_site
# echo "Run Service relations:"
# _run_service_relation() {
# echo "\$FUNCNAME \$2 <-- \$1 --> \$3"
# }
# export -f _run_service_relation
# out=\$(run_service_relations www)
# test -z "\$out" || exit 1
# out=\$(run_service_relations web_site)
# echo "\$out"
# test "\$out" == "_run_service_relation web_site <-- db-connection --> mysql"
# EOF
# tear_test
# }
function test_get_docker_compose_2() {
init_test
assert_list <<EOF
## -- Simple
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql,pg}
touch $test_tmpdir/www/metadata.yml
touch $test_tmpdir/mysql/metadata.yml
cat <<EOF2 > $test_tmpdir/compose.yml
app:
charm: app
relations:
web-proxy:
www:
user: toto
db: mysql
EOF2
. "$tprog"
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
_setup_state_dir
out=\$(get_docker_compose_links "app")
test "\$out" == "app:
links:
- www
- mysql" || {
echo -e "** get_docker_compose_links:\n\$out"; exit 1
}
## -- reverse-tech-dep
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
provides:
web-proxy:
tech-dep: reversed
EOF2
touch $test_tmpdir/mysql/metadata.yml
cat <<EOF2 > $test_tmpdir/compose.yml
web_site:
charm: mysql
relations:
web-proxy:
www:
user: toto
EOF2
. "$tprog"
COMPOSE_YML_FILE=$test_tmpdir/compose.yml
_setup_state_dir
out=\$(get_charm_relation_def "www" "web-proxy") || exit 1
test "\$out" == "tech-dep: reversed" || {
echo -e "** get_charm_relation_def:\n\$out"; exit 1
}
out=\$(get_charm_tech_dep_orientation_for_relation "www" "web-proxy")
test "\$out" == "reversed" || {
echo -e "** get_charm_tech_dep_orientation_for_relation:\n\$out"; exit 1
}
out=\$(get_docker_compose_links "web_site")
expected="www:
links:
- web_site"
test "\$out" == "\$expected" || {
echo -e "** get_docker_compose_links:\n\$out\nExpected:\n\$expected"; exit 1
}
out=\$(get_docker_compose web_site | shyaml get-value services.www.links)
test "\$out" == "- web_site" || {
echo -e "** get_docker_compose:\n\$out"; exit 1
}
EOF
tear_test
}
function test_compose_config {
init_test
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
subordinate: true
data-resources:
- /tmp/a
config-resources:
- /tmp/b
requires:
my-db-connection:
interface: db-connection
scope: container
docker-compose:
volumes:
- /special-volume-from-www:/special-volume-from-www
EOF2
cat <<EOF2 > $test_tmpdir/mysql/metadata.yml
docker-image:
docker.0k.io/mysql
data-resources:
- /tmp/c
config-resources:
- /tmp/d
docker-compose:
entrypoint: custom-entrypoint
volumes:
- /special-volume-from-mysql:/special-volume-from-mysql
EOF2
cat <<EOF2 > $test_tmpdir/compose.yml
web_site:
charm: www
relations:
db-connection:
mysql:
user: toto
dbname: tata
EOF2
assert_list <<EOF
### Testing get_compose_config - syntax validation from docker-compose
## -- no service provided
cd "$test_tmpdir"
export DISABLE_SYSTEM_CONFIG_FILE=true
"$tprog" config
## -- simple service provided
cd "$test_tmpdir"
export DISABLE_SYSTEM_CONFIG_FILE=true
"$tprog" config mysql
## -- complex service provided
cd "$test_tmpdir"
export DISABLE_SYSTEM_CONFIG_FILE=true
"$tprog" config web_site
EOF
tear_test
}
function test_compose_run_args {
init_test
export CHARM_STORE=$test_tmpdir
mkdir -p $test_tmpdir/{www,mysql}
cat <<EOF2 > $test_tmpdir/www/metadata.yml
EOF2
cat <<EOF2 > $test_tmpdir/mysql/metadata.yml
EOF2
cat <<EOF2 > $test_tmpdir/compose.yml
web_site:
charm: www
EOF2
export DISABLE_SYSTEM_CONFIG_FILE=true
assert_list <<EOF
### Testing args passing to docker-compose
## -- simple action
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run run web_site 2>&1 >/dev/null )
expected="docker-compose run web_site"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- simple single dash arg
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run run -T web_site 2>&1 >/dev/null )
expected="docker-compose run -T web_site"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- desaggregation of combined single char args
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run logs -ft web_site 2>&1 >/dev/null)
expected="docker-compose logs -f -t web_site"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- desaggregation of combined single char option and valued option char
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run run -Tv x:y web_site 2>&1 >/dev/null)
expected="docker-compose run -T -v x:y web_site"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- simple unexpected single dash arg
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run run -Z web_site 2>&1)
expected_reg="Unknown option '-Z'"
[[ "\$out" =~ \$expected_reg ]] || {
echo -e "Can't find '\$expected_reg' in out:\n\$out"
exit 1
}
## -- simple unexpected single dash arg after expected one
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run run -T -Z web_site 2>&1)
expected_reg="Unknown option '-Z'"
[[ "\$out" =~ \$expected_reg ]] || {
echo -e "Can't find '\$expected_reg' in out:\n\$out"
exit 1
}
## -- simple unexpected single dash arg after expected aggregated one
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run run -TZ web_site 2>&1)
expected_reg="Unknown option '-Z'"
[[ "\$out" =~ \$expected_reg ]] || {
echo -e "Can't find '\$expected_reg' in out:\n\$out"
exit 1
}
## -- multiple services
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run logs web_site mysql 2>&1 >/dev/null)
expected="docker-compose logs web_site mysql"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- single services
cd "$test_tmpdir"
out=\$("$tprog" --dry-compose-run run web_site mysql 2>&1 >/dev/null)
expected="docker-compose run web_site mysql"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
EOF
tear_test
}
function test_filter_opts {
src=$(cat <<'EOF'
-d, --detach
--name NAME
--entrypoint CMD
-e KEY=VAL
-l, --label KEY=VAL
-u, --user=""
--no-deps
--rm
-p, --publish=[]
--service-ports
--use-aliases
-v, --volume=[]
-T
-w, --workdir=""
EOF
)
export src
assert_list <<EOF
### Testing filtering opts
## -- multi_opts_filter should find opts with args
. "$tprog"
out=\$(echo "\$src" | multi_opts_filter | tr " " "\n") || exit 12
expected="--name
--entrypoint
-e
-l
--label
-u
--user
-p
--publish
-v
--volume
-w
--workdir"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
## -- single_opts_filter should find opts with args
. "$tprog"
out=\$(echo "\$src" | single_opts_filter | tr " " "\n") || exit 12
expected="-d
--detach
--no-deps
--rm
--service-ports
--use-aliases
-T"
[ "\$out" == "\$expected" ] || {
echo -e "DIFF:\n\$(diff <(echo "\$out") <(echo "\$expected"))"
exit 1
}
EOF
}
continue_on_error="0" testbench $*