diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14a7ac9..29bee78 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: - id: trailing-whitespace - id: flake8 args: - - --max-line-length=100 + - --max-line-length=120 - repo: https://github.com/pre-commit/mirrors-mypy rev: v0.711 hooks: diff --git a/Makefile b/Makefile index 6219e62..22b130f 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ build-test: test: cd tests && PYTHONPATH=$(CURDIR) pytest --color=yes -v --showlocals -test-in-container: +test-in-container: build-test $(PODMAN) run --rm --net=host -e DEPLOYMENT=test ${TEST_IMAGE_NAME} clean: diff --git a/README.md b/README.md index 4d173ee..560e153 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ class TestDummyImage(object): * [x] ct_cleanup * [ ] ct_enable_cleanup -* [ ] ct_check_envs_set +* [x] ct_check_envs_set * [x] ct_get_cip * [x] ct_get_cid * [x] ct_wait_for_cid @@ -69,7 +69,6 @@ class TestDummyImage(object): * [ ] ct_clone_git_repository * [ ] ct_show_resources * [ ] ct_s2i_multistage_build -* [ ] ## OpenShift tests diff --git a/container_ci_suite/api.py b/container_ci_suite/api.py index c08b1ba..5e81af8 100644 --- a/container_ci_suite/api.py +++ b/container_ci_suite/api.py @@ -24,6 +24,7 @@ import os import logging +import re import time import subprocess import shutil @@ -416,3 +417,34 @@ def doc_content_old(self): def test_response(self): pass + + def test_check_exec_env_vars(self, env_filter: str = "^X_SCLS=|/opt/rh|/opt/app-root"): + check_envs = DockerCLIWrapper.docker_run_command(f'--rm {self.image_name} /bin/bash -c env') + logger.debug(f"Run envs {check_envs}") + self.create_container(cid_file="exec_env_vars", container_args="bash -c 'sleep 1000'") + loop_envs = DockerCLIWrapper.run_docker_command(f"exec {self.get_cid_file(self.cid_file)} env") + self.test_check_envs_set(env_filter=env_filter, check_envs=check_envs, loop_envs=loop_envs) + + def test_check_envs_set(self, env_filter: str, check_envs: str, loop_envs: str, env_format="VALUE"): + fields_to_check: List = [ + x for x in loop_envs.split('\n') if re.findall(env_filter, x) and not x.startswith("PWD=") + ] + for field in fields_to_check: + var_name, stripped = field.split('=', 2) + filtered_envs = [x for x in check_envs.split('\n') if x.startswith(f"{var_name}=")] + if not filtered_envs: + logger.error(f"{var_name} not found during 'docker exec'") + return False + filter_envs = ''.join(filtered_envs) + for value in stripped.split(':'): + # If the value checked does not go through env_filter we do not care about it + ret = re.findall(env_filter, value) + if not ret: + continue + new_env = env_format.replace('VALUE', value) + find_env = re.findall(rf"{new_env}", filter_envs) + if not find_env: + logger.error(f"Value {value} is missing from variable {var_name}") + logger.error(filtered_envs) + return False + return True diff --git a/tests/test_api.py b/tests/test_api.py index 7efc15e..63955b5 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -64,3 +64,107 @@ def test_s2i_build_from_df(self, app_path, s2i_args, src_image, dest_image, df): dst_image=dest_image, ) assert generated_df == df + + def test_check_envs_set(self): + run_envs = """MANPATH=/opt/rh/rh-ruby26/root/usr/local/share/man:/opt/rh/rh-ruby26/root/usr/share/man:/opt/rh/rh-nodejs14/root/usr/share/man: +APP_ROOT=/opt/app-root +NODEJS_SCL=rh-nodejs14 +X_SCLS=rh-nodejs14 rh-ruby26 +LD_LIBRARY_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64:/opt/rh/rh-ruby26/root/usr/lib64:/opt/rh/rh-nodejs14/root/usr/lib64 +PATH=/opt/rh/rh-ruby26/root/usr/local/bin:/opt/rh/rh-ruby26/root/usr/bin:/opt/rh/rh-nodejs14/root/usr/bin:/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +STI_SCRIPTS_URL=image:///usr/libexec/s2i +PWD=/opt/app-root/src +STI_SCRIPTS_PATH=/usr/libexec/s2i +IMAGE_NAME=rhscl/ruby-26-rhel7 +HOME=/opt/app-root/src +RUBY_SCL=rh-ruby26 +XDG_DATA_DIRS=/opt/rh/rh-ruby26/root/usr/local/share:/opt/rh/rh-ruby26/root/usr/share:/usr/local/share:/usr/share +PKG_CONFIG_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64/pkgconfig:/opt/rh/rh-ruby26/root/usr/lib64/pkgconfig +RUBY_VERSION=2.6""" + exec_envs = """PATH=/opt/rh/rh-ruby26/root/usr/local/bin:/opt/rh/rh-ruby26/root/usr/bin:/opt/rh/rh-nodejs14/root/usr/bin:/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +SUMMARY=Platform for building and running Ruby 2.6 applications +STI_SCRIPTS_URL=image:///usr/libexec/s2i +STI_SCRIPTS_PATH=/usr/libexec/s2i +APP_ROOT=/opt/app-root +HOME=/opt/app-root/src +BASH_ENV=/opt/app-root/etc/scl_enable +ENV=/opt/app-root/etc/scl_enable +PROMPT_COMMAND=. /opt/app-root/etc/scl_enable +NODEJS_SCL=rh-nodejs14 +RUBY_SCL=rh-ruby26 +IMAGE_NAME=rhscl/ruby-26-rhel7 +LD_LIBRARY_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64:/opt/rh/rh-ruby26/root/usr/lib64:/opt/rh/rh-nodejs14/root/usr/lib64 +X_SCLS=rh-nodejs14 rh-ruby26 +MANPATH=/opt/rh/rh-ruby26/root/usr/local/share/man:/opt/rh/rh-ruby26/root/usr/share/man:/opt/rh/rh-nodejs14/root/usr/share/man: +XDG_DATA_DIRS=/opt/rh/rh-ruby26/root/usr/local/share:/opt/rh/rh-ruby26/root/usr/share:/usr/local/share:/usr/share +PKG_CONFIG_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64/pkgconfig:/opt/rh/rh-ruby26/root/usr/lib64/pkgconfig +""" + ccs = ContainerCISuite(image_name="f32/nodejs:12") + ccs.test_check_envs_set(env_filter="^X_SCLS=|/opt/rh|/opt/app-root", check_envs=exec_envs, loop_envs=run_envs) + + def test_check_envs_set_home_not_in_docker_exec(self): + run_envs = """MANPATH=/opt/rh/rh-ruby26/root/usr/local/share/man:/opt/rh/rh-ruby26/root/usr/share/man:/opt/rh/rh-nodejs14/root/usr/share/man: +APP_ROOT=/opt/app-root +X_SCLS=rh-nodejs14 rh-ruby26 +LD_LIBRARY_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64:/opt/rh/rh-ruby26/root/usr/lib64:/opt/rh/rh-nodejs14/root/usr/lib64 +PATH=/opt/rh/rh-ruby26/root/usr/local/bin:/opt/rh/rh-ruby26/root/usr/bin:/opt/rh/rh-nodejs14/root/usr/bin:/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +STI_SCRIPTS_URL=image:///usr/libexec/s2i +STI_SCRIPTS_PATH=/usr/libexec/s2i +HOME=/opt/app-root/src +XDG_DATA_DIRS=/opt/rh/rh-ruby26/root/usr/local/share:/opt/rh/rh-ruby26/root/usr/share:/usr/local/share:/usr/share +PKG_CONFIG_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64/pkgconfig:/opt/rh/rh-ruby26/root/usr/lib64/pkgconfig +RUBY_VERSION=2.6""" + exec_envs = """PATH=/opt/rh/rh-ruby26/root/usr/local/bin:/opt/rh/rh-ruby26/root/usr/bin:/opt/rh/rh-nodejs14/root/usr/bin:/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +STI_SCRIPTS_URL=image:///usr/libexec/s2i +STI_SCRIPTS_PATH=/usr/libexec/s2i +APP_ROOT=/opt/app-root +BASH_ENV=/opt/app-root/etc/scl_enable +ENV=/opt/app-root/etc/scl_enable +PROMPT_COMMAND=. /opt/app-root/etc/scl_enable +LD_LIBRARY_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64:/opt/rh/rh-ruby26/root/usr/lib64:/opt/rh/rh-nodejs14/root/usr/lib64 +X_SCLS=rh-nodejs14 rh-ruby26 +MANPATH=/opt/rh/rh-ruby26/root/usr/local/share/man:/opt/rh/rh-ruby26/root/usr/share/man:/opt/rh/rh-nodejs14/root/usr/share/man: +XDG_DATA_DIRS=/opt/rh/rh-ruby26/root/usr/local/share:/opt/rh/rh-ruby26/root/usr/share:/usr/local/share:/usr/share +PKG_CONFIG_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64/pkgconfig:/opt/rh/rh-ruby26/root/usr/lib64/pkgconfig +""" + ccs = ContainerCISuite(image_name="f32/nodejs:12") + ret = ccs.test_check_envs_set( + env_filter="^X_SCLS=|/opt/rh|/opt/app-root", + check_envs=exec_envs, + loop_envs=run_envs + ) + assert not ret + + def test_check_envs_set_not_in_run_envs_not_path(self): + run_envs = """MANPATH=/opt/rh/rh-ruby26/root/usr/local/share/man:/opt/rh/rh-ruby26/root/usr/share/man:/opt/rh/rh-nodejs14/root/usr/share/man: +APP_ROOT=/opt/app-root +X_SCLS=rh-nodejs14 rh-ruby26 +LD_LIBRARY_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64:/opt/rh/rh-ruby26/root/usr/lib64:/opt/rh/rh-nodejs14/root/usr/lib64 +PATH=/opt/rh/rh-ruby26/root/usr/local/bin:/opt/rh/rh-ruby26/root/usr/bin:/opt/rh/rh-nodejs14/root/usr/bin:/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +STI_SCRIPTS_URL=image:///usr/libexec/s2i +STI_SCRIPTS_PATH=/usr/libexec/s2i +HOME=/opt/app-root/src +XDG_DATA_DIRS=/opt/rh/rh-ruby26/root/usr/local/share:/opt/rh/rh-ruby26/root/usr/share:/usr/local/share:/usr/share +PKG_CONFIG_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64/pkgconfig:/opt/rh/rh-ruby26/root/usr/lib64/pkgconfig +RUBY_VERSION=2.6""" + exec_envs = """PATH=/opt/rh/rh-ruby26/root/usr/local/bin:/opt/rh/rh-nodejs14/root/usr/bin:/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +STI_SCRIPTS_URL=image:///usr/libexec/s2i +STI_SCRIPTS_PATH=/usr/libexec/s2i +APP_ROOT=/opt/app-root +BASH_ENV=/opt/app-root/etc/scl_enable +ENV=/opt/app-root/etc/scl_enable +PROMPT_COMMAND=. /opt/app-root/etc/scl_enable +LD_LIBRARY_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64:/opt/rh/rh-ruby26/root/usr/lib64:/opt/rh/rh-nodejs14/root/usr/lib64 +X_SCLS=rh-nodejs14 rh-ruby26 +HOME=/opt/app-root/src +MANPATH=/opt/rh/rh-ruby26/root/usr/local/share/man:/opt/rh/rh-ruby26/root/usr/share/man:/opt/rh/rh-nodejs14/root/usr/share/man: +XDG_DATA_DIRS=/opt/rh/rh-ruby26/root/usr/local/share:/opt/rh/rh-ruby26/root/usr/share:/usr/local/share:/usr/share +PKG_CONFIG_PATH=/opt/rh/rh-ruby26/root/usr/local/lib64/pkgconfig:/opt/rh/rh-ruby26/root/usr/lib64/pkgconfig +""" + ccs = ContainerCISuite(image_name="f32/nodejs:12") + ret = ccs.test_check_envs_set( + env_filter="^X_SCLS=|/opt/rh|/opt/app-root", + check_envs=exec_envs, + loop_envs=run_envs + ) + assert not ret