From 82d7b9f2e21c93cfb12c8f199284c38f3e858280 Mon Sep 17 00:00:00 2001
From: baude <bbaude@redhat.com>
Date: Wed, 2 Dec 2020 08:45:08 -0600
Subject: [PATCH] add compose regression to ci

to prevent any regressions, we should be running regression tests using
compose.

Signed-off-by: baude <bbaude@redhat.com>
---
 .cirrus.yml                                   | 18 ++++++++++++++-
 contrib/cirrus/runner.sh                      |  4 ++++
 contrib/cirrus/setup_environment.sh           |  1 +
 .../elasticsearch-logstash-kibana.curl        |  3 +++
 .../compose/env_and_volume/docker-compose.yml | 18 +++++++++++++++
 test/compose/env_and_volume/read/Dockerfile   |  5 +++++
 test/compose/env_and_volume/read/app.py       | 10 +++++++++
 test/compose/env_and_volume/write/Dockerfile  |  5 +++++
 test/compose/env_and_volume/write/app.py      | 13 +++++++++++
 test/{docker-compose => compose}/flask.curl   |  0
 .../gitea-postgres.curl                       |  0
 .../mount_and_label/docker-compose.yml        | 10 +++++++++
 .../mount_and_label/frontend/Dockerfile       |  5 +++++
 test/compose/mount_and_label/frontend/app.py  | 10 +++++++++
 test/compose/mount_and_label/readme.txt       |  5 +++++
 .../port_map_diff_port/docker-compose.yml     |  6 +++++
 .../port_map_diff_port/frontend/Dockerfile    |  5 +++++
 .../port_map_diff_port/frontend/app.py        |  9 ++++++++
 .../react-rust-postgres.skip                  |  0
 .../simple_port_map/docker-compose.yml        |  6 +++++
 .../simple_port_map/frontend/Dockerfile       |  6 +++++
 test/compose/simple_port_map/frontend/app.py  |  9 ++++++++
 .../test-compose}                             | 22 +++++++++----------
 .../elasticsearch-logstash-kibana.curl        |  3 ---
 24 files changed, 157 insertions(+), 16 deletions(-)
 create mode 100644 test/compose/elasticsearch-logstash-kibana.curl
 create mode 100644 test/compose/env_and_volume/docker-compose.yml
 create mode 100644 test/compose/env_and_volume/read/Dockerfile
 create mode 100644 test/compose/env_and_volume/read/app.py
 create mode 100644 test/compose/env_and_volume/write/Dockerfile
 create mode 100644 test/compose/env_and_volume/write/app.py
 rename test/{docker-compose => compose}/flask.curl (100%)
 rename test/{docker-compose => compose}/gitea-postgres.curl (100%)
 create mode 100644 test/compose/mount_and_label/docker-compose.yml
 create mode 100644 test/compose/mount_and_label/frontend/Dockerfile
 create mode 100644 test/compose/mount_and_label/frontend/app.py
 create mode 100644 test/compose/mount_and_label/readme.txt
 create mode 100644 test/compose/port_map_diff_port/docker-compose.yml
 create mode 100644 test/compose/port_map_diff_port/frontend/Dockerfile
 create mode 100644 test/compose/port_map_diff_port/frontend/app.py
 rename test/{docker-compose => compose}/react-rust-postgres.skip (100%)
 create mode 100644 test/compose/simple_port_map/docker-compose.yml
 create mode 100644 test/compose/simple_port_map/frontend/Dockerfile
 create mode 100644 test/compose/simple_port_map/frontend/app.py
 rename test/{docker-compose/test-docker-compose => compose/test-compose} (96%)
 delete mode 100644 test/docker-compose/elasticsearch-logstash-kibana.curl

diff --git a/.cirrus.yml b/.cirrus.yml
index 0fa51be636..8507aa3d2f 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -30,7 +30,7 @@ env:
     PRIOR_UBUNTU_NAME: "ubuntu-19"
 
     # Google-cloud VM Images
-    IMAGE_SUFFIX: "c5402398833246208"
+    IMAGE_SUFFIX: "c4704091098054656"
     FEDORA_CACHE_IMAGE_NAME: "fedora-${IMAGE_SUFFIX}"
     PRIOR_FEDORA_CACHE_IMAGE_NAME: "prior-fedora-${IMAGE_SUFFIX}"
     UBUNTU_CACHE_IMAGE_NAME: "ubuntu-${IMAGE_SUFFIX}"
@@ -434,6 +434,21 @@ apiv2_test_task:
         podman_system_info_script: '$SCRIPT_BASE/logcollector.sh podman'
         time_script: '$SCRIPT_BASE/logcollector.sh time'
 
+compose_test_task:
+    name: "compose test on $DISTRO_NV"
+    alias: compose_test
+    depends_on:
+        - validate
+    gce_instance: *standardvm
+    env:
+        <<: *stdenvars
+        TEST_FLAVOR: compose
+    clone_script: *noop  # Comes from cache
+    gopath_cache: *ro_gopath_cache
+    setup_script: *setup
+    main_script: *main
+    always: *logs_artifacts
+
 
 # Execute the podman integration tests on all primary platforms and release
 # versions, as root, without involving the podman-remote client.
@@ -619,6 +634,7 @@ success_task:
         - docker-py_test
         - unit_test
         - apiv2_test
+        - compose_test
         - local_integration_test
         - remote_integration_test
         - rootless_integration_test
diff --git a/contrib/cirrus/runner.sh b/contrib/cirrus/runner.sh
index fa921f3e4c..cc6d155f9a 100755
--- a/contrib/cirrus/runner.sh
+++ b/contrib/cirrus/runner.sh
@@ -73,6 +73,10 @@ function _run_apiv2() {
     make localapiv2 |& logformatter
 }
 
+function _run_compose() {
+    ./test/compose/test-compose |& logformatter
+}
+
 function _run_int() {
     dotest integration
 }
diff --git a/contrib/cirrus/setup_environment.sh b/contrib/cirrus/setup_environment.sh
index c32b45a4f0..a3c0f9a136 100755
--- a/contrib/cirrus/setup_environment.sh
+++ b/contrib/cirrus/setup_environment.sh
@@ -195,6 +195,7 @@ case "$TEST_FLAVOR" in
     build) make clean ;;
     unit) ;;
     apiv2) ;&  # use next item
+    compose) ;&
     int) ;&
     sys) ;&
     bindings) ;&
diff --git a/test/compose/elasticsearch-logstash-kibana.curl b/test/compose/elasticsearch-logstash-kibana.curl
new file mode 100644
index 0000000000..ddb7a96b08
--- /dev/null
+++ b/test/compose/elasticsearch-logstash-kibana.curl
@@ -0,0 +1,3 @@
+9200   You Know, for Search
+9600   "status":"green"
+5601   Kibana
diff --git a/test/compose/env_and_volume/docker-compose.yml b/test/compose/env_and_volume/docker-compose.yml
new file mode 100644
index 0000000000..df906e1705
--- /dev/null
+++ b/test/compose/env_and_volume/docker-compose.yml
@@ -0,0 +1,18 @@
+version: '3'
+services:
+  writer:
+    environment:
+      - PODMAN_MSG=podman_rulez
+    build: write
+    ports:
+      - '5000:5000'
+    volumes:
+      - data:/data
+  reader:
+    build: read
+    ports:
+      - '5001:5000'
+    volumes:
+      - data:/data
+volumes:
+  data:
diff --git a/test/compose/env_and_volume/read/Dockerfile b/test/compose/env_and_volume/read/Dockerfile
new file mode 100644
index 0000000000..a393a0dcb5
--- /dev/null
+++ b/test/compose/env_and_volume/read/Dockerfile
@@ -0,0 +1,5 @@
+FROM podman_python
+WORKDIR /app
+COPY . /app
+ENTRYPOINT ["python3"]
+CMD ["app.py"]
diff --git a/test/compose/env_and_volume/read/app.py b/test/compose/env_and_volume/read/app.py
new file mode 100644
index 0000000000..71fbbb26af
--- /dev/null
+++ b/test/compose/env_and_volume/read/app.py
@@ -0,0 +1,10 @@
+from flask import Flask
+app = Flask(__name__)
+
+@app.route('/')
+def hello():
+    f = open("/data/message", "r")
+    return f.read()
+
+if __name__ == '__main__':
+	app.run(host='0.0.0.0')
diff --git a/test/compose/env_and_volume/write/Dockerfile b/test/compose/env_and_volume/write/Dockerfile
new file mode 100644
index 0000000000..a393a0dcb5
--- /dev/null
+++ b/test/compose/env_and_volume/write/Dockerfile
@@ -0,0 +1,5 @@
+FROM podman_python
+WORKDIR /app
+COPY . /app
+ENTRYPOINT ["python3"]
+CMD ["app.py"]
diff --git a/test/compose/env_and_volume/write/app.py b/test/compose/env_and_volume/write/app.py
new file mode 100644
index 0000000000..b6ad6fe63e
--- /dev/null
+++ b/test/compose/env_and_volume/write/app.py
@@ -0,0 +1,13 @@
+from flask import Flask
+import os
+app = Flask(__name__)
+
+@app.route('/')
+def hello():
+    f = open("/data/message", "w")
+    f.write(os.getenv("PODMAN_MSG"))
+    f.close()
+    return "done"
+
+if __name__ == '__main__':
+	app.run(host='0.0.0.0')
diff --git a/test/docker-compose/flask.curl b/test/compose/flask.curl
similarity index 100%
rename from test/docker-compose/flask.curl
rename to test/compose/flask.curl
diff --git a/test/docker-compose/gitea-postgres.curl b/test/compose/gitea-postgres.curl
similarity index 100%
rename from test/docker-compose/gitea-postgres.curl
rename to test/compose/gitea-postgres.curl
diff --git a/test/compose/mount_and_label/docker-compose.yml b/test/compose/mount_and_label/docker-compose.yml
new file mode 100644
index 0000000000..6487067e3b
--- /dev/null
+++ b/test/compose/mount_and_label/docker-compose.yml
@@ -0,0 +1,10 @@
+version: '3'
+services:
+  web:
+    build: frontend
+    ports:
+      - '5000:5000'
+    volumes:
+      - /tmp/mount:/data:ro
+    labels:
+      - "io.podman=the_best"
diff --git a/test/compose/mount_and_label/frontend/Dockerfile b/test/compose/mount_and_label/frontend/Dockerfile
new file mode 100644
index 0000000000..a393a0dcb5
--- /dev/null
+++ b/test/compose/mount_and_label/frontend/Dockerfile
@@ -0,0 +1,5 @@
+FROM podman_python
+WORKDIR /app
+COPY . /app
+ENTRYPOINT ["python3"]
+CMD ["app.py"]
diff --git a/test/compose/mount_and_label/frontend/app.py b/test/compose/mount_and_label/frontend/app.py
new file mode 100644
index 0000000000..bd2794d94e
--- /dev/null
+++ b/test/compose/mount_and_label/frontend/app.py
@@ -0,0 +1,10 @@
+from flask import Flask
+app = Flask(__name__)
+
+@app.route('/')
+def hello():
+    f = open("/data/message")
+    return f.read()
+
+if __name__ == '__main__':
+	app.run(host='0.0.0.0')
diff --git a/test/compose/mount_and_label/readme.txt b/test/compose/mount_and_label/readme.txt
new file mode 100644
index 0000000000..bba769c511
--- /dev/null
+++ b/test/compose/mount_and_label/readme.txt
@@ -0,0 +1,5 @@
+this test creates a container with a mount (not volume) and also adds a label to the container.
+
+validate by curl http://localhost:5000 and message should be same message as piped into the mount message.
+
+also verify the label with podman ps and a filter that only catches that container
diff --git a/test/compose/port_map_diff_port/docker-compose.yml b/test/compose/port_map_diff_port/docker-compose.yml
new file mode 100644
index 0000000000..3003c52f49
--- /dev/null
+++ b/test/compose/port_map_diff_port/docker-compose.yml
@@ -0,0 +1,6 @@
+version: '3'
+services:
+  web:
+    build: frontend
+    ports:
+      - '5001:5000'
diff --git a/test/compose/port_map_diff_port/frontend/Dockerfile b/test/compose/port_map_diff_port/frontend/Dockerfile
new file mode 100644
index 0000000000..a393a0dcb5
--- /dev/null
+++ b/test/compose/port_map_diff_port/frontend/Dockerfile
@@ -0,0 +1,5 @@
+FROM podman_python
+WORKDIR /app
+COPY . /app
+ENTRYPOINT ["python3"]
+CMD ["app.py"]
diff --git a/test/compose/port_map_diff_port/frontend/app.py b/test/compose/port_map_diff_port/frontend/app.py
new file mode 100644
index 0000000000..895556a895
--- /dev/null
+++ b/test/compose/port_map_diff_port/frontend/app.py
@@ -0,0 +1,9 @@
+from flask import Flask
+app = Flask(__name__)
+
+@app.route('/')
+def hello():
+	return "Podman rulez!"
+
+if __name__ == '__main__':
+	app.run(host='0.0.0.0')
diff --git a/test/docker-compose/react-rust-postgres.skip b/test/compose/react-rust-postgres.skip
similarity index 100%
rename from test/docker-compose/react-rust-postgres.skip
rename to test/compose/react-rust-postgres.skip
diff --git a/test/compose/simple_port_map/docker-compose.yml b/test/compose/simple_port_map/docker-compose.yml
new file mode 100644
index 0000000000..e7eab1047c
--- /dev/null
+++ b/test/compose/simple_port_map/docker-compose.yml
@@ -0,0 +1,6 @@
+version: '3'
+services:
+  web:
+    build: frontend
+    ports:
+      - '5000:5000'
diff --git a/test/compose/simple_port_map/frontend/Dockerfile b/test/compose/simple_port_map/frontend/Dockerfile
new file mode 100644
index 0000000000..2595828ff7
--- /dev/null
+++ b/test/compose/simple_port_map/frontend/Dockerfile
@@ -0,0 +1,6 @@
+FROM alpine
+WORKDIR /app
+RUN apk update && apk add py3-pip && pip3 install flask
+COPY . /app
+ENTRYPOINT ["python3"]
+CMD ["app.py"]
diff --git a/test/compose/simple_port_map/frontend/app.py b/test/compose/simple_port_map/frontend/app.py
new file mode 100644
index 0000000000..895556a895
--- /dev/null
+++ b/test/compose/simple_port_map/frontend/app.py
@@ -0,0 +1,9 @@
+from flask import Flask
+app = Flask(__name__)
+
+@app.route('/')
+def hello():
+	return "Podman rulez!"
+
+if __name__ == '__main__':
+	app.run(host='0.0.0.0')
diff --git a/test/docker-compose/test-docker-compose b/test/compose/test-compose
similarity index 96%
rename from test/docker-compose/test-docker-compose
rename to test/compose/test-compose
index d37caa12af..f7643b0785 100755
--- a/test/docker-compose/test-docker-compose
+++ b/test/compose/test-compose
@@ -81,12 +81,13 @@ function like() {
     # "is" (equality) is a subset of "like", but one that expr fails on if
     # the expected result has shell-special characters like '['. Treat it
     # as a special case.
-    if [[ $actual = $expect ]]; then
+
+    if [[ "$actual" = "$expect" ]]; then
         _show_ok 1 "$testname=$expect"
         return
     fi
 
-    if expr "$actual" : "$expect" &>/dev/null; then
+    if expr "$actual" : ".*$expect" &>/dev/null; then
         # On success, include expected value; this helps readers understand
         _show_ok 1 "$testname ('$actual') ~ $expect"
         return
@@ -132,9 +133,9 @@ function _show_ok() {
     # Failed
     local expect=$3
     local actual=$4
-    echo -e "${red}not ok $count $testname${reset}"
-    echo -e "${red}#  expected: $expect${reset}"
-    echo -e "${red}#    actual: ${bold}$actual${reset}"
+    printf "${red}not ok $count $testname${reset}\n"
+    printf "${red}#  expected: %s${reset}\n" "$expect"
+    printf "${red}#    actual: ${bold}%s${reset}\n" "$actual"
 
     echo    "not ok $count $testname" >>$LOG
     echo    "  expected: $expect"                     >>$LOG
@@ -347,6 +348,7 @@ done
 TESTS_DIR=$WORKDIR/awesome-compose
 
 git clone $AWESOME_COMPOSE $TESTS_DIR
+git -C $TESTS_DIR checkout -q a3c38822277bcca04abbadf34120dcff808db3ec
 
 # Identify the tests to run. If called with args, use those as globs.
 tests_to_run=()
@@ -402,14 +404,10 @@ for t in ${tests_to_run[@]}; do
                     docker-compose down >>$logfile 2>&1
                     exit 1
                 fi
-                echo "got here: $actual"
                 like "$actual" "$expect" "$testname : port $port"
             done < $curls
         fi
 
-        echo "OK, press ENTER to stop"
-        read x
-
         docker-compose down     &> $logfile
         if [[ $? -eq 0 ]]; then
             _show_ok 1 "$testname - down"
@@ -434,8 +432,8 @@ done
 test_count=$(<$testcounter_file)
 failure_count=$(<$failures_file)
 
-#if [ -z "$PODMAN_TESTS_KEEP_WORKDIR" ]; then
-#    rm -rf $WORKDIR
-#fi
+if [ -z "$PODMAN_TESTS_KEEP_WORKDIR" ]; then
+    rm -rf $WORKDIR
+fi
 
 exit $failure_count
diff --git a/test/docker-compose/elasticsearch-logstash-kibana.curl b/test/docker-compose/elasticsearch-logstash-kibana.curl
deleted file mode 100644
index 9a94bd65cb..0000000000
--- a/test/docker-compose/elasticsearch-logstash-kibana.curl
+++ /dev/null
@@ -1,3 +0,0 @@
-9200   elasticsearch
-9600   logstash
-5601   kibana