This is an automated email from the ASF dual-hosted git repository.
pierrejeambrun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 38977c2f70 Generate providers requirements based on
provider_metadata.json (#34698)
38977c2f70 is described below
commit 38977c2f70ef5f8d986594f6ecd1dc824831e4c6
Author: Pierre Jeambrun <[email protected]>
AuthorDate: Tue Oct 3 02:00:59 2023 +0200
Generate providers requirements based on provider_metadata.json (#34698)
Co-authored-by: Hussein Awala <[email protected]>
---
.../src/airflow_breeze/commands/sbom_commands.py | 63 +++++++++++++-----
.../commands/sbom_commands_config.py | 1 +
dev/breeze/src/airflow_breeze/utils/cdxgen.py | 19 +++++-
images/breeze/output-commands-hash.txt | 4 +-
...output_sbom_generate-providers-requirements.svg | 74 ++++++++++------------
5 files changed, 100 insertions(+), 61 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
index c89b9fdfbd..cefa82cff5 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
@@ -17,6 +17,7 @@
from __future__ import annotations
+import json
from pathlib import Path
import click
@@ -45,12 +46,13 @@ from airflow_breeze.utils.common_options import (
option_skip_cleanup,
option_verbose,
)
+from airflow_breeze.utils.confirm import Answer, user_confirm
from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.custom_param_types import BetterChoice
from airflow_breeze.utils.docker_command_utils import
perform_environment_checks
from airflow_breeze.utils.github import get_active_airflow_versions
from airflow_breeze.utils.parallel import ShowLastLineProgressMatcher,
check_async_run_results, run_with_pool
-from airflow_breeze.utils.path_utils import AIRFLOW_TMP_DIR_PATH
+from airflow_breeze.utils.path_utils import AIRFLOW_TMP_DIR_PATH,
PROVIDER_METADATA_JSON_FILE_PATH
from airflow_breeze.utils.shared_options import get_dry_run
@@ -248,7 +250,7 @@ def update_sbom_information(
@click.option(
"--provider-id",
type=BetterChoice(list(PROVIDER_DEPENDENCIES.keys())),
- required=True,
+ required=False,
help="Provider to generate the requirements for",
multiple=True,
)
@@ -260,6 +262,11 @@ def update_sbom_information(
@option_debug_resources
@option_include_success_outputs
@option_skip_cleanup
[email protected](
+ "--force",
+ is_flag=True,
+ help="Force update providers requirements even if they already exist.",
+)
def generate_providers_requirements(
airflow_version: str | None,
python: str,
@@ -269,19 +276,41 @@ def generate_providers_requirements(
debug_resources: bool,
include_success_outputs: bool,
skip_cleanup: bool,
+ force: bool,
):
- provider_ids = provider_id
perform_environment_checks()
- if airflow_version is None:
- airflow_version = get_active_airflow_versions(confirm=False)[-1]
- get_console().print(f"[info]Using {airflow_version} as airflow
version")
+
+ provider_ids = provider_id
+ if len(provider_ids) == 0:
+ user_confirm(
+ "You are about to generate all providers requirements based on the
"
+ "`provider_metadata.json` file (for all releases). Do you want to
proceed?",
+ quit_allowed=False,
+ default_answer=Answer.YES,
+ )
+ with open(PROVIDER_METADATA_JSON_FILE_PATH) as f:
+ provider_metadata = json.load(f)
+ providers_info = [
+ (p_id, p_version, info["associated_airflow_version"])
+ for (p_id, p_versions) in provider_metadata.items()
+ for (p_version, info) in p_versions.items()
+ ]
+ else:
+ if airflow_version is None:
+ airflow_version = get_active_airflow_versions(confirm=False)[-1]
+ get_console().print(f"[info]Using {airflow_version} as airflow
version")
+ providers_info = [(provider_id, None, airflow_version) for provider_id
in provider_ids]
+
build_all_airflow_versions_base_image(python_version=python)
if run_in_parallel:
- parallelism = min(parallelism, len(provider_ids))
- get_console().print(f"[info]Running {len(provider_ids)} jobs in
parallel")
- with ci_group(f"Generating provider requirements for {provider_ids}"):
- all_params = [f"Generate provider requirements for {p_id}" for
p_id in provider_ids]
+ parallelism = min(parallelism, len(providers_info))
+ get_console().print(f"[info]Running {len(providers_info)} jobs in
parallel")
+ with ci_group(f"Generating provider requirements for
{providers_info}"):
+ all_params = [
+ f"Generate provider requirements for {p_id} version
{p_version}"
+ for (p_id, p_version, _) in providers_info
+ ]
with run_with_pool(
parallelism=parallelism,
all_params=all_params,
@@ -293,12 +322,13 @@ def generate_providers_requirements(
get_requirements_for_provider,
kwds={
"provider_id": p_id,
- "provider_version": None,
- "airflow_version": airflow_version,
+ "provider_version": p_version,
+ "airflow_version": a_version,
"python_version": python,
+ "force": force,
},
)
- for index, p_id in enumerate(provider_ids)
+ for (p_id, p_version, a_version) in providers_info
]
check_async_run_results(
results=results,
@@ -308,10 +338,11 @@ def generate_providers_requirements(
skip_cleanup=skip_cleanup,
)
else:
- for p_id in provider_ids:
+ for p_id, p_version, a_version in providers_info:
get_requirements_for_provider(
provider_id=p_id,
- provider_version=None,
- airflow_version=airflow_version,
+ provider_version=p_version,
+ airflow_version=a_version,
python_version=python,
+ force=force,
)
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
index dc01bbc3ed..763b133cf3 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
@@ -54,6 +54,7 @@ SBOM_PARAMETERS: dict[str, list[dict[str, str | list[str]]]]
= {
"--airflow-version",
"--python",
"--provider-id",
+ "--force",
],
},
{
diff --git a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
index 2f75411e42..d329069872 100644
--- a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
+++ b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
@@ -136,6 +136,7 @@ def get_requirements_for_provider(
airflow_version: str,
provider_version: str | None = None,
python_version: str = DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+ force: bool = False,
) -> tuple[int, str]:
provider_path_array = provider_id.split(".")
if not provider_version:
@@ -148,6 +149,21 @@ def get_requirements_for_provider(
f"provider-{provider_id}-{provider_version}-with-airflow-requirements.txt"
)
provider_file_name =
f"provider-{provider_id}-{provider_version}-without-airflow-requirements.txt"
+ target_dir = FILES_DIR / TARGET_DIR_NAME
+ airflow_file = target_dir / airflow_file_name
+ provider_with_airflow_file = target_dir / provider_with_airflow_file_name
+
+ if os.path.exists(airflow_file) and
os.path.exists(provider_with_airflow_file) and force is False:
+ get_console().print(
+ f"[warning] Requirements for provider {provider_id} version
{provider_version} already exist, "
+ f"skipping. Set force=True to force generation."
+ )
+ return (
+ 0,
+ f"Provider requirements already existed, skipped generation for
{provider_id} version "
+ f"{provider_version}",
+ )
+
command = f"""
mkdir -pv {DOCKER_FILE_PREFIX}
/opt/airflow/airflow-{airflow_version}/bin/pip freeze | sort >
{DOCKER_FILE_PREFIX}{airflow_file_name}
@@ -173,9 +189,6 @@ chown --recursive {os.getuid()}:{os.getgid()}
{DOCKER_FILE_PREFIX}
";".join(command.splitlines()[1:-1]),
]
)
- target_dir = FILES_DIR / TARGET_DIR_NAME
- airflow_file = target_dir / airflow_file_name
- provider_with_airflow_file = target_dir / provider_with_airflow_file_name
get_console().print(f"[info]Airflow requirements in {airflow_file}")
get_console().print(f"[info]Provider requirements in
{provider_with_airflow_file}")
base_packages = {package.split("==")[0] for package in
airflow_file.read_text().splitlines()}
diff --git a/images/breeze/output-commands-hash.txt
b/images/breeze/output-commands-hash.txt
index ab98660bf1..a13a0f4347 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -52,9 +52,9 @@
release-management:start-release:419f48f6a4ff4457cb9de7ff496aebbe
release-management:update-constraints:02ec4b119150e3fdbac52026e94820ef
release-management:verify-provider-packages:96dce5644aad6b37080acf77b3d8de3a
release-management:885a5fe8a39a3773011cf1f9bd2983ad
-sbom:generate-providers-requirements:671f7da791b6ffde8df91e2bcdf4ec52
+sbom:generate-providers-requirements:f8328b801efa7908d5b14b25a0097c4d
sbom:update-sbom-information:653be48be70b4b7ff5172d491aadc694
-sbom:d9b5533a533ef67f88b1b40b7c7b1c87
+sbom:104afc4ac8c007dcd99218d1b040047e
setup:autocomplete:fffcd49e102e09ccd69b3841a9e3ea8e
setup:check-all-params-in-groups:7aa55fa1b0f17a6f7b7ca225c6b82574
setup:config:fd32471ee31894decf91984615771add
diff --git a/images/breeze/output_sbom_generate-providers-requirements.svg
b/images/breeze/output_sbom_generate-providers-requirements.svg
index 46b6740f12..e9f8758c46 100644
--- a/images/breeze/output_sbom_generate-providers-requirements.svg
+++ b/images/breeze/output_sbom_generate-providers-requirements.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 928.4"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -38,14 +38,12 @@
.breeze-sbom-generate-providers-requirements-r4 { fill: #868887 }
.breeze-sbom-generate-providers-requirements-r5 { fill: #68a0b3;font-weight:
bold }
.breeze-sbom-generate-providers-requirements-r6 { fill: #8d7b39 }
-.breeze-sbom-generate-providers-requirements-r7 { fill: #cc555a }
-.breeze-sbom-generate-providers-requirements-r8 { fill: #8a4346 }
-.breeze-sbom-generate-providers-requirements-r9 { fill: #98a84b;font-weight:
bold }
+.breeze-sbom-generate-providers-requirements-r7 { fill: #98a84b;font-weight:
bold }
</style>
<defs>
<clipPath id="breeze-sbom-generate-providers-requirements-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="901.8" />
+ <rect x="0" y="0" width="1463.0" height="877.4" />
</clipPath>
<clipPath id="breeze-sbom-generate-providers-requirements-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -152,12 +150,9 @@
<clipPath id="breeze-sbom-generate-providers-requirements-line-34">
<rect x="0" y="831.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-sbom-generate-providers-requirements-line-35">
- <rect x="0" y="855.5" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="950.8" rx="8"/><text
class="breeze-sbom-generate-providers-requirements-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: sbom generate-providers-requirements</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="926.4" rx="8"/><text
class="breeze-sbom-generate-providers-requirements-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: sbom generate-providers-requirements</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -173,37 +168,36 @@
</text><text class="breeze-sbom-generate-providers-requirements-r2" x="12.2"
y="93.2" textLength="536.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-3)">Generate requirements for selected provider.</text><text
class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="93.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-3)">
</text><text class="breeze-sbom-generate-providers-requirements-r2" x="1464"
y="117.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-4)">
</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="142" textLength="24.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-5)">╭─</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="142"
textLength="463.6"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-5)"> Generate provider requirements flags </text><text
class="breeze-sbom-generate-providers-requirements-r4" x="488" y="142" t [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="166.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="61" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="73.2" y="166.4"
textLength="97.6" clip-path="url(#breeze-sbom-generate-provi [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="190.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="61" y="190.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="73.2" y="190.8"
textLength="85.4" clip-path="url(#breeze-sbom-generate-provi [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="215.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">│</text><text
class="breeze-sbom-generate-providers-requirements-r7" x="24.4" y="215.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">*</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="61" y="215.2"
textLength="12.2" clip-path="url(#breeze-sbom-generate-provi [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="239.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="239.6"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">(airbyte | alibaba | amazon | apache.beam | apache.cassandra | apache.drill | apach
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="264" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="264"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">apache.flink | apache.hdfs | apache.hive | apache.impala | apache.kafka | apache.kylin |&#
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="288.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="288.4"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">apache.livy | apache.pig | apache.pinot | apache.spark | apache.sqoop | apprise | 
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="312.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="312.8"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">asana | atlassian.jira | celery | cloudant | cncf.kubernetes | common.sql | daske
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="337.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="337.2"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">databricks | datadog | dbt.cloud | dingding | discord | docker | elasticsearch
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="361.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="361.6"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">facebook | ftp | github | google | grpc | hashicorp | http | imap 
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="386" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="386"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">jenkins | microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo |&#
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="410.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="410.4"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">mysql | neo4j | odbc | openfaas | openlineage | opsgenie | oracle | pag
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="434.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="434.8"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">plexus | postgres | presto | redis | salesforce | samba | segment | sen
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="459.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="459.2"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">singularity | slack | smtp | snowflake | sqlite | ssh | tableau | tabul
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="483.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="483.6"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">| vertica | yandex | zendesk)              
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="508" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">│</text><text
class="breeze-sbom-generate-providers-requirements-r8" x="317.2" y="508"
textLength="1122.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">[required]                      
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="532.4" textLength="1464"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="532.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="556.8" textLength="24.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">╭─</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="556.8"
textLength="219.6"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)"> Parallel running </text><text
class="breeze-sbom-generate-providers-requirements-r4" x="244" y="556.8"
textLength="1195.6" cli [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="581.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="581.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="581.2"
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="605.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="605.6"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="605.6"
textLength="146.4" clip-path="url(#breeze-sbom-generate- [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="630" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="378.2" y="630"
textLength="915"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">(INTEGER RANGE)                     &#
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="654.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">│</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="378.2" y="654.4"
textLength="915"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">[default: 4; 1<=x<=8]                  
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="678.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="678.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="678.8"
textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="703.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="703.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="703.2"
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="727.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="727.6"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="727.6"
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="752" textLength="1464"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="752"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="776.4" textLength="24.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">╭─</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="776.4"
textLength="195.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)"> Common options </text><text
class="breeze-sbom-generate-providers-requirements-r4" x="219.6" y="776.4"
textLength="1220" clip- [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="800.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="800.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="800.8"
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="825.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="825.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="825.2"
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="849.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="849.6"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="849.6"
textLength="85.4" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="874" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="874"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="874"
textLength="61" clip-path="url(#breeze-sbom-generate-providers [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="898.4" textLength="1464"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="898.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="166.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="166.4"
textLength="97.6" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="190.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="190.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="190.8"
textLength="85.4" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="215.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="215.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="215.2"
textLength="109.8" clip-path="url(#breeze-sbom-generate-pr [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="239.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="239.6"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">(airbyte | alibaba | amazon | apache.beam | apache.cassandra | apache.drill | apache.
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="264" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="264"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">apache.flink | apache.hdfs | apache.hive | apache.impala | apache.kafka | apache.kylin |
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="288.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="288.4"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">apache.livy | apache.pig | apache.pinot | apache.spark | apache.sqoop | apprise | a
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="312.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="312.8"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">asana | atlassian.jira | celery | cloudant | cncf.kubernetes | common.sql | daskexe
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="337.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="337.2"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">databricks | datadog | dbt.cloud | dingding | discord | docker | elasticsearch 
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="361.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="361.6"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">facebook | ftp | github | google | grpc | hashicorp | http | imap |&
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="386" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="386"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | 
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="410.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="410.4"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">odbc | openfaas | openlineage | opsgenie | oracle | pagerduty | papermill |
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="434.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="434.8"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">presto | redis | salesforce | samba | segment | sendgrid | sftp | singula
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="459.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="459.2"
textLength="1159"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">snowflake | sqlite | ssh | tableau | tabular | telegram | trino | vertica
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="483.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="483.6"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="483.6"
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="508" textLength="1464"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="508"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="532.4" textLength="24.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">╭─</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="532.4"
textLength="219.6"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)"> Parallel running </text><text
class="breeze-sbom-generate-providers-requirements-r4" x="244" y="532.4"
textLength="1195.6" cli [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="556.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="556.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="556.8"
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="581.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="581.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="581.2"
textLength="146.4" clip-path="url(#breeze-sbom-generate- [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="605.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="378.2" y="605.6"
textLength="915"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">(INTEGER RANGE)                    
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="630" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">│</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="378.2" y="630"
textLength="915"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">[default: 4; 1<=x<=8]                  
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="654.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="654.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="654.4"
textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="678.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="678.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="678.8"
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="703.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="703.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="703.2"
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="727.6" textLength="1464"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="727.6"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="752" textLength="24.4"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">╭─</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="752"
textLength="195.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)"> Common options </text><text
class="breeze-sbom-generate-providers-requirements-r4" x="219.6" y="752"
textLength="1220" clip-path=" [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="776.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="776.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="776.4"
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="800.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="800.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="800.8"
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="825.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="825.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="825.2"
textLength="85.4" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="849.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">│</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="849.6"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">-</text><text
class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="849.6"
textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0"
y="874" textLength="1464"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="874"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">
</text>
</g>
</g>