This is an automated email from the ASF dual-hosted git repository. potiuk pushed a commit to branch v2-3-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit c059dd7e60ce66359a78005373dcbcbd3bc9b05b Author: Joppe Vos <[email protected]> AuthorDate: Fri May 6 11:03:05 2022 +0200 Move tests command in new breeze (#23445) (cherry picked from commit 7ba4e35a9d1b65b4c1a318ba4abdf521f98421a2) --- BREEZE.rst | 9 +- TESTING.rst | 6 +- dev/breeze/src/airflow_breeze/commands/testing.py | 76 ++++++++++- dev/breeze/src/airflow_breeze/shell/enter_shell.py | 11 +- .../airflow_breeze/utils/docker_command_utils.py | 11 +- images/breeze/output-commands.svg | 55 ++++---- images/breeze/output-tests.svg | 142 +++++++++++++++++++++ 7 files changed, 264 insertions(+), 46 deletions(-) diff --git a/BREEZE.rst b/BREEZE.rst index c9f44c90c5..862bfeceea 100644 --- a/BREEZE.rst +++ b/BREEZE.rst @@ -471,11 +471,9 @@ Those are commands mostly used by contributors: * Build documentation with ``breeze build-docs`` command * Initialize local virtualenv with ``./scripts/tools/initialize_virtualenv.py`` command * Run static checks with autocomplete support ``breeze static-checks`` command -* Run test specified with ``./breeze-legacy tests`` command +* Run test specified with ``breeze tests`` command * Build CI docker image with ``breeze build-image`` command * Cleanup breeze with ``breeze cleanup`` command -* Run static checks with autocomplete support ``breeze static-checks`` command -* Run test specified with ``./breeze-legacy tests`` command Additional management tasks: @@ -487,6 +485,11 @@ Tests ----- * Run docker-compose tests with ``breeze docker-compose-tests`` command. +* Run test specified with ``breeze tests`` command. + +.. image:: ./images/breeze/output-tests.svg + :width: 100% + :alt: Breeze tests Kubernetes tests ---------------- diff --git a/TESTING.rst b/TESTING.rst index 002c31c0ad..12983726e1 100644 --- a/TESTING.rst +++ b/TESTING.rst @@ -168,19 +168,19 @@ to breeze. .. code-block:: bash - ./breeze-legacy tests tests/providers/http/hooks/test_http.py tests/core/test_core.py --db-reset -- --log-cli-level=DEBUG + breeze tests tests/providers/http/hooks/test_http.py tests/core/test_core.py --db-reset --log-cli-level=DEBUG You can run the whole test suite without adding the test target: .. code-block:: bash - ./breeze-legacy tests --db-reset + breeze tests --db-reset You can also specify individual tests or a group of tests: .. code-block:: bash - ./breeze-legacy tests --db-reset tests/core/test_core.py::TestCore + breeze tests --db-reset tests/core/test_core.py::TestCore Running Tests of a specified type from the Host diff --git a/dev/breeze/src/airflow_breeze/commands/testing.py b/dev/breeze/src/airflow_breeze/commands/testing.py index 456544b57f..e4a1ec1eb5 100644 --- a/dev/breeze/src/airflow_breeze/commands/testing.py +++ b/dev/breeze/src/airflow_breeze/commands/testing.py @@ -15,6 +15,7 @@ # specific language governing permissions and limitations # under the License. +import os import sys from typing import Tuple @@ -22,22 +23,28 @@ import click from airflow_breeze.build_image.prod.build_prod_params import BuildProdParams from airflow_breeze.commands.common_options import ( + option_db_reset, option_dry_run, option_github_repository, option_image_name, option_image_tag, + option_integration, option_python, option_verbose, ) +from airflow_breeze.commands.custom_param_types import BetterChoice from airflow_breeze.commands.main import main +from airflow_breeze.global_constants import ALLOWED_TEST_TYPES +from airflow_breeze.shell.enter_shell import check_docker_is_running, check_docker_resources +from airflow_breeze.shell.shell_params import ShellParams from airflow_breeze.utils.console import get_console +from airflow_breeze.utils.docker_command_utils import construct_env_variables_docker_compose_command from airflow_breeze.utils.run_tests import run_docker_compose_tests +from airflow_breeze.utils.run_utils import run_command TESTING_COMMANDS = { "name": "Testing", - "commands": [ - "docker-compose-tests", - ], + "commands": ["docker-compose-tests", "tests"], } TESTING_PARAMETERS = { @@ -51,6 +58,16 @@ TESTING_PARAMETERS = { ], } ], + "breeze tests": [ + { + "name": "Basic flag for tests command", + "options": [ + "--integration", + "--test-type", + "--db-reset", + ], + } + ], } @@ -91,3 +108,56 @@ def docker_compose_tests( extra_pytest_args=extra_pytest_args, ) sys.exit(return_code) + + [email protected]( + name='tests', + help="Run the specified unit test targets. Multiple targets may be specified separated by spaces.", + context_settings=dict( + ignore_unknown_options=True, + allow_extra_args=True, + ), +) +@option_dry_run +@option_verbose +@option_integration [email protected]('extra_pytest_args', nargs=-1, type=click.UNPROCESSED) [email protected]( + "-tt", + "--test-type", + help="Type of test to run.", + default="All", + type=BetterChoice(ALLOWED_TEST_TYPES), +) +@option_db_reset +def tests( + dry_run: bool, + verbose: bool, + integration: Tuple, + extra_pytest_args: Tuple, + test_type: str, + db_reset: bool, +): + os.environ["RUN_TESTS"] = "true" + if test_type: + os.environ["TEST_TYPE"] = test_type + if integration: + if "trino" in integration: + integration = integration + ("kerberos",) + os.environ["LIST_OF_INTEGRATION_TESTS_TO_RUN"] = ' '.join(list(integration)) + if db_reset: + os.environ["DB_RESET"] = "true" + + exec_shell_params = ShellParams(verbose=verbose, dry_run=dry_run) + env_variables = construct_env_variables_docker_compose_command(exec_shell_params) + check_docker_is_running(verbose) + check_docker_resources(exec_shell_params.airflow_image_name, verbose=verbose, dry_run=dry_run) + + cmd = ['docker-compose', 'run', '--service-ports', '--rm', 'airflow'] + cmd.extend(list(extra_pytest_args)) + run_command( + cmd, + verbose=verbose, + dry_run=dry_run, + env=env_variables, + ) diff --git a/dev/breeze/src/airflow_breeze/shell/enter_shell.py b/dev/breeze/src/airflow_breeze/shell/enter_shell.py index 951d36220a..e73153b60e 100644 --- a/dev/breeze/src/airflow_breeze/shell/enter_shell.py +++ b/dev/breeze/src/airflow_breeze/shell/enter_shell.py @@ -23,8 +23,10 @@ from airflow_breeze.shell.shell_params import ShellParams from airflow_breeze.utils.cache import read_from_cache_file from airflow_breeze.utils.console import get_console from airflow_breeze.utils.docker_command_utils import ( + check_docker_compose_version, check_docker_is_running, check_docker_resources, + check_docker_version, construct_env_variables_docker_compose_command, ) from airflow_breeze.utils.rebuild_image_if_needed import rebuild_ci_image_if_needed @@ -46,12 +48,9 @@ def enter_shell(**kwargs) -> Union[subprocess.CompletedProcess, subprocess.Calle """ verbose = kwargs['verbose'] dry_run = kwargs['dry_run'] - if not check_docker_is_running(verbose): - get_console().print( - '[error]Docker is not running.[/]\n' - '[warning]Please make sure Docker is installed and running.[/]' - ) - sys.exit(1) + check_docker_is_running(verbose) + check_docker_version(verbose) + check_docker_compose_version(verbose) if read_from_cache_file('suppress_asciiart') is None: get_console().print(ASCIIART, style=ASCIIART_STYLE) if read_from_cache_file('suppress_cheatsheet') is None: diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py index c7c54630fa..9d30a86345 100644 --- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py +++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py @@ -18,6 +18,7 @@ import os import re import subprocess +import sys from random import randint from typing import Dict, List, Tuple, Union @@ -174,11 +175,10 @@ def compare_version(current_version: str, min_version: str) -> bool: return version.parse(current_version) >= version.parse(min_version) -def check_docker_is_running(verbose: bool) -> bool: +def check_docker_is_running(verbose: bool): """ Checks if docker is running. Suppressed Dockers stdout and stderr output. :param verbose: print commands when running - :return: False if docker is not running. """ response = run_command( ["docker", "info"], @@ -190,8 +190,11 @@ def check_docker_is_running(verbose: bool) -> bool: check=False, ) if response.returncode != 0: - return False - return True + get_console().print( + '[error]Docker is not running.[/]\n' + '[warning]Please make sure Docker is installed and running.[/]' + ) + sys.exit(1) def check_docker_version(verbose: bool): diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg index 66b560b308..59d7de7f66 100644 --- a/images/breeze/output-commands.svg +++ b/images/breeze/output-commands.svg @@ -1,4 +1,4 @@ -<svg width="1720.0" height="1858" viewBox="0 0 1720.0 1858" +<svg width="1720.0" height="1880" viewBox="0 0 1720.0 1880" xmlns="http://www.w3.org/2000/svg"> <style> @font-face { @@ -17,30 +17,30 @@ font-style: bold; font-weight: 700; } - .rich-svg-3448604350-terminal-wrapper span { + .rich-svg-1735457778-terminal-wrapper span { display: inline-block; white-space: pre; vertical-align: top; font-size: 18px; font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace; } - .rich-svg-3448604350-terminal-wrapper a { + .rich-svg-1735457778-terminal-wrapper a { text-decoration: none; color: inherit; } - .rich-svg-3448604350-terminal-body .blink { - animation: rich-svg-3448604350-blinker 1s infinite; + .rich-svg-1735457778-terminal-body .blink { + animation: rich-svg-1735457778-blinker 1s infinite; } - @keyframes rich-svg-3448604350-blinker { + @keyframes rich-svg-1735457778-blinker { from { opacity: 1.0; } 50% { opacity: 0.3; } to { opacity: 1.0; } } - .rich-svg-3448604350-terminal-wrapper { + .rich-svg-1735457778-terminal-wrapper { padding: 140px; padding-top: 100px; } - .rich-svg-3448604350-terminal { + .rich-svg-1735457778-terminal { position: relative; display: flex; flex-direction: column; @@ -49,7 +49,7 @@ border-radius: 14px; box-shadow: 0 0 0 1px #484848; } - .rich-svg-3448604350-terminal:after { + .rich-svg-1735457778-terminal:after { position: absolute; width: 100%; height: 100%; @@ -60,7 +60,7 @@ transform: rotate(-4.5deg); z-index: -1; } - .rich-svg-3448604350-terminal-header { + .rich-svg-1735457778-terminal-header { position: relative; width: 100%; background-color: #2e2e2e; @@ -72,7 +72,7 @@ box-shadow: inset 0px -1px 0px 0px #4e4e4e, inset 0px -4px 8px 0px #1a1a1a; } - .rich-svg-3448604350-terminal-title-tab { + .rich-svg-1735457778-terminal-title-tab { display: inline-block; margin-top: 14px; margin-left: 124px; @@ -85,36 +85,36 @@ inset 1px 0px 0px 0px #4e4e4e, inset -1px 0px 0px 0px #4e4e4e; } - .rich-svg-3448604350-terminal-traffic-lights { + .rich-svg-1735457778-terminal-traffic-lights { position: absolute; top: 24px; left: 20px; } - .rich-svg-3448604350-terminal-body { + .rich-svg-1735457778-terminal-body { line-height: 22px; padding: 14px; } - .rich-svg-3448604350-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;} -.rich-svg-3448604350-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;} -.rich-svg-3448604350-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;} -.rich-svg-3448604350-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;} -.rich-svg-3448604350-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;} -.rich-svg-3448604350-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;} -.rich-svg-3448604350-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;} + .rich-svg-1735457778-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;} +.rich-svg-1735457778-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;} +.rich-svg-1735457778-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;} +.rich-svg-1735457778-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;} +.rich-svg-1735457778-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;} +.rich-svg-1735457778-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;} +.rich-svg-1735457778-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;} </style> <foreignObject x="0" y="0" width="100%" height="100%"> <body xmlns="http://www.w3.org/1999/xhtml"> - <div class="rich-svg-3448604350-terminal-wrapper"> - <div class="rich-svg-3448604350-terminal"> - <div class="rich-svg-3448604350-terminal-header"> - <svg class="rich-svg-3448604350-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg"> + <div class="rich-svg-1735457778-terminal-wrapper"> + <div class="rich-svg-1735457778-terminal"> + <div class="rich-svg-1735457778-terminal-header"> + <svg class="rich-svg-1735457778-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg"> <circle cx="14" cy="8" r="8" fill="#ff6159"/> <circle cx="38" cy="8" r="8" fill="#ffbd2e"/> <circle cx="62" cy="8" r="8" fill="#28c941"/> </svg> - <div class="rich-svg-3448604350-terminal-title-tab">Breeze commands</div> + <div class="rich-svg-1735457778-terminal-title-tab">Breeze commands</div> </div> - <div class="rich-svg-3448604350-terminal-body"> + <div class="rich-svg-1735457778-terminal-body"> <div><span class="r2"> </span></div> <div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze [OPTIONS] COMMAND [ARGS]... </span></div> <div><span class="r2"> </span></div> @@ -153,7 +153,8 @@ <div><span class="r4">│</span><span class="r1"> </span><span class="r5"> static-checks </span><span class="r1"> </span><span class="r1">Run static checks. </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div> <div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div> <div><span class="r4">╭─ Testing ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮</span></div> -<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> docker-compose-tests </span><span class="r1"> </span><span class="r1">Run docker-compose tests.</span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> docker-compose-tests </span><span class="r1"> </span><span class="r1">Run docker-compose tests. </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> tests </span><span class="r1"> </span><span class="r1">Run the specified unit test targets. Multiple targets may be specified separated by spaces.</span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div> <div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div> <div><span class="r4">╭─ Configuration & maintenance ────────────────────────────────────────────────────────────────────────────────────────╮</span></div> <div><span class="r4">│</span><span class="r1"> </span><span class="r5"> cleanup </span><span class="r1"> </span><span class="r1">Cleans the cache of parameters, docker cache and optionally - currently downloaded images.</span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div> diff --git a/images/breeze/output-tests.svg b/images/breeze/output-tests.svg new file mode 100644 index 0000000000..ca27be92e1 --- /dev/null +++ b/images/breeze/output-tests.svg @@ -0,0 +1,142 @@ +<svg width="1720.0" height="758" viewBox="0 0 1720.0 758" + xmlns="http://www.w3.org/2000/svg"> + <style> + @font-face { + font-family: "Rich Fira Code"; + src: local("FiraCode-Regular"), + url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"), + url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff"); + font-style: normal; + font-weight: 400; + } + @font-face { + font-family: "Rich Fira Code"; + src: local("FiraCode-Bold"), + url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"), + url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff"); + font-style: bold; + font-weight: 700; + } + .rich-svg-356577593-terminal-wrapper span { + display: inline-block; + white-space: pre; + vertical-align: top; + font-size: 18px; + font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace; + } + .rich-svg-356577593-terminal-wrapper a { + text-decoration: none; + color: inherit; + } + .rich-svg-356577593-terminal-body .blink { + animation: rich-svg-356577593-blinker 1s infinite; + } + @keyframes rich-svg-356577593-blinker { + from { opacity: 1.0; } + 50% { opacity: 0.3; } + to { opacity: 1.0; } + } + .rich-svg-356577593-terminal-wrapper { + padding: 140px; + padding-top: 100px; + } + .rich-svg-356577593-terminal { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + background-color: #0c0c0c; + border-radius: 14px; + box-shadow: 0 0 0 1px #484848; + } + .rich-svg-356577593-terminal:after { + position: absolute; + width: 100%; + height: 100%; + content: ''; + border-radius: 14px; + background: rgb(71,77,102); + background: linear-gradient(90deg, #804D69 0%, #4E4B89 100%); + transform: rotate(-4.5deg); + z-index: -1; + } + .rich-svg-356577593-terminal-header { + position: relative; + width: 100%; + background-color: #2e2e2e; + margin-bottom: 12px; + font-weight: bold; + border-radius: 14px 14px 0 0; + color: #f2f2f2; + font-size: 18px; + box-shadow: inset 0px -1px 0px 0px #4e4e4e, + inset 0px -4px 8px 0px #1a1a1a; + } + .rich-svg-356577593-terminal-title-tab { + display: inline-block; + margin-top: 14px; + margin-left: 124px; + font-family: sans-serif; + padding: 14px 28px; + border-radius: 6px 6px 0 0; + background-color: #0c0c0c; + box-shadow: inset 0px 1px 0px 0px #4e4e4e, + 0px -4px 4px 0px #1e1e1e, + inset 1px 0px 0px 0px #4e4e4e, + inset -1px 0px 0px 0px #4e4e4e; + } + .rich-svg-356577593-terminal-traffic-lights { + position: absolute; + top: 24px; + left: 20px; + } + .rich-svg-356577593-terminal-body { + line-height: 22px; + padding: 14px; + } + .rich-svg-356577593-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;} +.rich-svg-356577593-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;} +.rich-svg-356577593-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;} +.rich-svg-356577593-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;} +.rich-svg-356577593-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;} +.rich-svg-356577593-terminal-body .r6 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;} +.rich-svg-356577593-terminal-body .r7 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;} + </style> + <foreignObject x="0" y="0" width="100%" height="100%"> + <body xmlns="http://www.w3.org/1999/xhtml"> + <div class="rich-svg-356577593-terminal-wrapper"> + <div class="rich-svg-356577593-terminal"> + <div class="rich-svg-356577593-terminal-header"> + <svg class="rich-svg-356577593-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg"> + <circle cx="14" cy="8" r="8" fill="#ff6159"/> + <circle cx="38" cy="8" r="8" fill="#ffbd2e"/> + <circle cx="62" cy="8" r="8" fill="#28c941"/> + </svg> + <div class="rich-svg-356577593-terminal-title-tab">Command: tests</div> + </div> + <div class="rich-svg-356577593-terminal-body"> + <div><span class="r2"> </span></div> +<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze tests [OPTIONS] [EXTRA_PYTEST_ARGS]... </span></div> +<div><span class="r2"> </span></div> +<div><span class="r1"> </span><span class="r1">Run the specified unit test targets. Multiple targets may be specified separated by spaces. </span><span class="r1"> </span></div> +<div><span class="r1"> </span></div> +<div><span class="r4">╭─ Basic flag for tests command ───────────────────────────────────────────────────────────────────────────────────────╮</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--integration</span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r1">Integration(s) to enable when running (can be more than one). </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r6">(cassandra | kerberos | mongo | openldap | pinot | rabbitmq | redis | statsd | trino | all)</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--test-type</span><span class="r1"> </span><span class="r7">-tt</span><span class="r1"> </span><span class="r1">Type of test to run. </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r6">(All | Always | Core | Providers | API | CLI | Integration | Other | WWW | Postgres | MySQL | </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r6">Helm | Quarantined) </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--db-reset</span><span class="r1"> </span><span class="r7">-d</span><span class="r1"> </span><span class="r1">Reset DB when entering the container. </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div> +<div><span class="r4">╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--dry-run</span><span class="r1"> </span><span class="r7">-D</span><span class="r1"> </span><span class="r1">If dry-run is set, commands are only printed, not executed. </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--verbose</span><span class="r1"> </span><span class="r7">-v</span><span class="r1"> </span><span class="r1">Print verbose information about performed steps. </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--help</span><span class="r1"> </span><span class="r7">-h</span><span class="r1"> </span><span class="r1">Show this message and exit. </span><span class="r1"> </span><span class="r4">│</span></div> +<div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div> +<div><span class="r1"></span><span class="r1"> </span></div> + </div> + </div> + </div> + </body> + </foreignObject> +</svg>
