From f70826e1b68eb314672b61e9e65edfe21b7ed4d8 Mon Sep 17 00:00:00 2001 From: Teddy Date: Wed, 19 Apr 2023 14:12:47 +0200 Subject: [PATCH] Fixes #10805 - Documentation for Profiler, Nifi, MLflow, Trino, Presto, Redshift, Hive, SingleStore, MariaDB, MySQL (#11135) * feat: profiler workflow documentation * feat: Added MySQL connection information * doc: connector requirements for MySQL, MariaDB, and SingleStore * doc: added requirements to main documentation for MariaDB, SingleStore and MySQL * doc: added new profiler metric definitions * doc: Added new table test documentation * doc: added connector requirements for Hive * doc: Added Redshift documentation * doc: Added Presto & Trino documentation * doc: added MLflow documentation * doc: Added Nifi documentation * Move requirements to H2 * doc: add links/queries to grant permissions --- .../v1.0.0/connectors/database/hive/index.md | 8 +- .../connectors/database/mariadb/index.md | 23 +- .../v1.0.0/connectors/database/mysql/index.md | 21 +- .../connectors/database/presto/index.md | 10 +- .../connectors/database/redshift/index.md | 17 +- .../connectors/database/singlestore/index.md | 21 ++ .../v1.0.0/connectors/database/trino/index.md | 11 +- .../ingestion/workflows/data-quality/tests.md | 66 ++++ .../ingestion/workflows/profiler/metrics.md | 28 +- .../connectors/ml-model/mlflow/index.md | 8 +- .../connectors/pipeline/nifi/airflow.md | 313 ++++++++++++++++++ .../v1.0.0/connectors/pipeline/nifi/cli.md | 197 +++++++++++ .../v1.0.0/connectors/pipeline/nifi/index.md | 306 +++++++++++++++++ openmetadata-docs-v1/content/v1.0.0/menu.md | 6 + .../connectors/nifi/add-new-service.png | Bin 0 -> 31507 bytes .../connectors/nifi/select-service.png | Bin 0 -> 45313 bytes .../connectors/nifi/service-connection.png | Bin 0 -> 45794 bytes .../ui/public/locales/en-US/Database/Hive.md | 45 +-- .../public/locales/en-US/Database/MariaDB.md | 55 +-- .../ui/public/locales/en-US/Database/Mysql.md | 84 +++-- .../public/locales/en-US/Database/Presto.md | 47 +-- .../public/locales/en-US/Database/Redshift.md | 44 +-- .../locales/en-US/Database/SingleStore.md | 55 +-- .../ui/public/locales/en-US/Database/Trino.md | 55 +-- .../en-US/Database/workflows/profiler.md | 29 ++ .../ui/public/locales/en-US/Mlmodel/Mlflow.md | 26 +- .../ui/public/locales/en-US/Pipeline/Nifi.md | 54 ++- 27 files changed, 1254 insertions(+), 275 deletions(-) create mode 100644 openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/airflow.md create mode 100644 openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/cli.md create mode 100644 openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/index.md create mode 100644 openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/add-new-service.png create mode 100644 openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/select-service.png create mode 100644 openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/service-connection.png create mode 100644 openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/workflows/profiler.md diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/database/hive/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/database/hive/index.md index 78e95c01005..40f9f751fe1 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/database/hive/index.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/database/hive/index.md @@ -60,9 +60,13 @@ the following docs to connect using Airflow SDK or with the CLI. To deploy OpenMetadata, check the Deployment guides. {%/inlineCallout%} -To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with -custom Airflow plugins to handle the workflow deployment. +To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. +### Metadata +To extract metadata, the user used in the connection needs to be able to perform `SELECT`, `SHOW`, and `DESCRIBE` operations in the database/schema where the metadata needs to be extracted from. + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](/connectors/ingestion/workflows/profiler) and data quality tests [here](/connectors/ingestion/workflows/data-quality). ## Metadata Ingestion diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/database/mariadb/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/database/mariadb/index.md index 7bbcc717369..3210cab8c70 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/database/mariadb/index.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/database/mariadb/index.md @@ -60,8 +60,27 @@ the following docs to connect using Airflow SDK or with the CLI. To deploy OpenMetadata, check the Deployment guides. {%/inlineCallout%} -To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with -custom Airflow plugins to handle the workflow deployment. +To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. + +### Metadata +To extract metadata the user used in the connection needs to have access to the `INFORMATION_SCHEMA`. By default a user can see only the rows in the `INFORMATION_SCHEMA` that correspond to objects for which the user has the proper access privileges. + +```SQL +-- Create user. More details https://mariadb.com/kb/en/create-user/ +CREATE USER [@] IDENTIFIED BY ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a specific object +GRANT SELECT ON world.hello TO ''; +``` + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](/connectors/ingestion/workflows/profiler) and data quality tests [here](/connectors/ingestion/workflows/data-quality). ## Metadata Ingestion diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/database/mysql/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/database/mysql/index.md index ef5b3d333f0..420a1f0fb48 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/database/mysql/index.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/database/mysql/index.md @@ -63,7 +63,26 @@ To deploy OpenMetadata, check the Deployment guides. To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. -Note that We support MySQL (version 8.0.0 or greater) and the user should have access to the `INFORMATION_SCHEMA` table. +### Metadata +Note that We support MySQL (version 8.0.0 or greater) and the user should have access to the `INFORMATION_SCHEMA` table. By default a user can see only the rows in the `INFORMATION_SCHEMA` that correspond to objects for which the user has the proper access privileges. + +```SQL +-- Create user. If is ommited, defaults to '%' +-- More details https://dev.mysql.com/doc/refman/8.0/en/create-user.html +CREATE USER ''[@''] IDENTIFIED BY ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a specific object +GRANT SELECT ON world.hello TO ''; +``` + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](/connectors/ingestion/workflows/profiler) and data quality tests [here](/connectors/ingestion/workflows/data-quality). ## Metadata Ingestion diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/database/presto/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/database/presto/index.md index d8fef1a8997..b8d16e70f4b 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/database/presto/index.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/database/presto/index.md @@ -60,8 +60,14 @@ the following docs to connect using Airflow SDK or with the CLI. To deploy OpenMetadata, check the Deployment guides. {%/inlineCallout%} -To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with -custom Airflow plugins to handle the workflow deployment. +To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. + +### Metadata +To extract metadata, the user needs to be able to perform `SHOW CATALOGS`, `SHOW TABLES`, and `SHOW COLUMNS FROM` on the catalogs/tables you wish to extract metadata from and have `SELECT` permission on the `INFORMATION_SCHEMA`. Access to resources will be different based on the connector used. You can find more details in the Presto documentation website [here](https://prestodb.io/docs/current/connector.html). You can also get more information regarding system access control in Presto [here](https://prestodb.io/docs/current/security/built-in-system-access-control.html). + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). + ## Metadata Ingestion diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/database/redshift/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/database/redshift/index.md index e889584c6a5..4b569c1aa74 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/database/redshift/index.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/database/redshift/index.md @@ -62,17 +62,26 @@ the following docs to connect using Airflow SDK or with the CLI. To deploy OpenMetadata, check the Deployment guides. {%/inlineCallout%} -To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with -custom Airflow plugins to handle the workflow deployment. +To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. +### Metadata Redshift user must grant `SELECT` privilege on table [SVV_TABLE_INFO](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_TABLE_INFO.html) to fetch the metadata of tables and views. For more information visit [here](https://docs.aws.amazon.com/redshift/latest/dg/c_visibility-of-data.html). ```sql - +-- Create a new user +-- More details https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_USER.html CREATE USER test_user with PASSWORD 'password'; -GRANT SELECT ON TABLE svv_table_info to test_user; +-- Grant SELECT on table +GRANT SELECT ON TABLE svv_table_info to test_user; ``` + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). + +### Usage & Linegae +For the usage and lineage workflow, the user will need `SELECT` privilege on `STL_QUERY` table. You can find more information on the usage workflow [here](https://docs.open-metadata.org/connectors/ingestion/workflows/usage) and the lineage workflow [here](https://docs.open-metadata.org/connectors/ingestion/workflows/lineage). + ## Metadata Ingestion {% stepsContainer %} diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/database/singlestore/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/database/singlestore/index.md index 6345649dd18..53bc1c7e37e 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/database/singlestore/index.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/database/singlestore/index.md @@ -63,6 +63,27 @@ To deploy OpenMetadata, check the Deployment guides. To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. +### Metadata +To extract metadata the user used in the connection needs to have access to the `INFORMATION_SCHEMA`. By default a user can see only the rows in the `INFORMATION_SCHEMA` that correspond to objects for which the user has the proper access privileges. + +```SQL +-- Create user. +-- More details https://docs.singlestore.com/managed-service/en/reference/sql-reference/security-management-commands/create-user.html +CREATE USER [@] IDENTIFIED BY ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a specific object +GRANT SELECT ON world.hello TO ''; +``` + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](/connectors/ingestion/workflows/profiler) and data quality tests [here](/connectors/ingestion/workflows/data-quality). + ## Metadata Ingestion {% stepsContainer %} diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/database/trino/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/database/trino/index.md index b537670325c..e46c3264dcd 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/database/trino/index.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/database/trino/index.md @@ -60,18 +60,23 @@ the following docs to connect using Airflow SDK or with the CLI. To deploy OpenMetadata, check the Deployment guides. {%/inlineCallout%} -To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with -custom Airflow plugins to handle the workflow deployment. +To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. {% tilesContainer %} -To ingest metadata from the Trino source, the user must have select privileges for the following tables. +### Metadata +To extract metadata, the user needs to be able to have `SELECT` permission to the following tables: - `information_schema.schemata` - `information_schema.columns` - `information_schema.tables` - `information_schema.views` - `system.metadata.table_comments` +Access to resources will be based on the user access permission to access specific data sources. More information regarding access and security can be found in the Trino documentation [here](https://trino.io/docs/current/security.html). + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). + {% /tilesContainer %} diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/ingestion/workflows/data-quality/tests.md b/openmetadata-docs-v1/content/v1.0.0/connectors/ingestion/workflows/data-quality/tests.md index 82dce4b7170..b8b17fbadf3 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/ingestion/workflows/data-quality/tests.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/ingestion/workflows/data-quality/tests.md @@ -20,6 +20,7 @@ Tests applied on top of a Table. Here is the list of all table tests: - [Table Column Name to Exist](#table-column-name-to-exist) - [Table Column to Match Set](#table-column-to-match-set) - [Table Custom SQL Test](#table-custom-sql-test) +- [Table Row Inserted Count To Be Between](#table-row-inserted-count-to-be-between) ### Table Row Count to Equal Validate the total row count in the table is equal to the given value. @@ -326,6 +327,71 @@ parameterValues: } ``` +### Table Row Inserted Count To Be Between +Validate the number of rows inserted for the defined period is between the expected range + +**Properties** + +* `Min Row Count`: Lower bound +* `Max Row Count`: Upper bound +* `Column Name`: The name of the column used to apply the range filter +* `Range Type`: One of `HOUR`, `DAY`, `MONTH`, `YEAR` +* `Interval`: The range interval (e.g. 1,2,3,4,5, etc) + +**Behavior** + +| Condition | Status | +| ----------- | ----------- | +|Number of rows **is between** `Min Row Count` and `Max Row Count`| Success ✅| +|Number of rows **is not between** `Min Row Count` and `Max Row Count|Failed ❌| + +**YAML Config** + +```yaml +testDefinitionName: tableRowInsertedCountToBeBetween +parameterValues: + - name: min + value: 10 + - name: max + value: 100 + - name: columnName + value: colA + - name: rangeType + value: DAY + - name: rangeInterval + value: 1 +``` + +**JSON Config** + +```json +{ + "testDefinitionName": "tableRowInsertedCountToBeBetween", + "parameterValues": [ + { + "name": "min", + "value": 10 + }, + { + "name": "max", + "value": 100 + }, + { + "name": "columnName", + "value": "colA" + }, + { + "name": "rangeType", + "value": "DAY" + }, + { + "name": "rangeInterval", + "value": 1 + } + ] +} +``` + ## Column Tests Tests applied on top of Column metrics. Here is the list of all column tests: - [Column Values to Be Unique](#column-values-to-be-unique) diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/ingestion/workflows/profiler/metrics.md b/openmetadata-docs-v1/content/v1.0.0/connectors/ingestion/workflows/profiler/metrics.md index b1a182e6e58..71aafa701fc 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/ingestion/workflows/profiler/metrics.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/ingestion/workflows/profiler/metrics.md @@ -127,8 +127,30 @@ Only for numerical values. Returns the sum of all values in a column. Only for numerical values. Returns the standard deviation. ### Histogram +The histogram returns a dictionary of the different bins and the number of values found for that bin. It will be computed only if the Inter Quartile Range value is available -The histogram returns a dictionary of the different bins and the number of values found for that bin. +### First Quartile +Only for numerical values. Middle number between the smallest value and the median + +### Third Quartile +Only for numerical values. Middle number between the median and the greatest value + +### Inter Quartile Range +Only for numerical values. Difference between the third quartile and the first quartile + +### Nonparametric Skew +Measure of skewness of the column distribution. Nonparametric skew is computed as follow +$$ + S = \frac{\mu-\tilde{\mu}}{\sigma} +$$ + +Where + +$$ +\mu = mean\\ +\tilde{\mu} = median\\ +\sigma = standard deviation\\ +$$ ## Grant Access to User for System Metrics OpenMetadata uses system tables to compute system metrics. You can find the required access as well as more details for your database engine below. @@ -138,12 +160,12 @@ OpenMetadata uses the `QUERY_HISTORY_BY_WAREHOUSE` view of the `INFORMATION_SCHE OpenMetadata will look at the past 24-hours to fetch the operations that were performed against a table. ### Redshift -OpenMetadata uses `stl_insert`, `stl_delete`, `svv_table_info`, and `stl_querytext` to fecth DNL operations as well as the number of rows affected by these operations. You need to make sure the user running the profiler workflow has access to these views and tables. +OpenMetadata uses `stl_insert`, `stl_delete`, `svv_table_info`, and `stl_querytext` to fecth DML operations as well as the number of rows affected by these operations. You need to make sure the user running the profiler workflow has access to these views and tables. OpenMetadata will look at the previous day to fetch the operations that were performed against a table. ### BigQuery -Bigquery uses the `JOBS` table of the `INFORMATION_SCHEMA` to fecth DNL operations as well as the number of rows affected by these operations. You will need to make sure your data location is properly set when creating your BigQuery service connection in OpenMetadata. +Bigquery uses the `JOBS` table of the `INFORMATION_SCHEMA` to fecth DML operations as well as the number of rows affected by these operations. You will need to make sure your data location is properly set when creating your BigQuery service connection in OpenMetadata. OpenMetadata will look at the previous day to fetch the operations that were performed against a table filter on the `creation_time` partition field to limit the size of data scanned. diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/ml-model/mlflow/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/ml-model/mlflow/index.md index ce7babcadca..6cccd79cce9 100644 --- a/openmetadata-docs-v1/content/v1.0.0/connectors/ml-model/mlflow/index.md +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/ml-model/mlflow/index.md @@ -12,8 +12,12 @@ Configure and schedule Mlflow metadata and profiler workflows from the OpenMetad - [Requirements](#requirements) - [Metadata Ingestion](#metadata-ingestion) -If you don't want to use the OpenMetadata Ingestion container to configure the workflows via the UI, then you can check -the following docs to connect using Airflow SDK or with the CLI. +If you don't want to use the OpenMetadata Ingestion container to configure the workflows via the UI, then you can check the following docs to connect using Airflow SDK or with the CLI. + +### Metadata +To extract metadata, OpenMetadata needs two elements: +- **Tracking URI**: Address of local or remote tracking server. More information on the MLFlow documentation [here](https://www.mlflow.org/docs/latest/tracking.html#where-runs-are-recorded) +- **Registry URI**: Address of local or remote model registry server. {% tilesContainer %} diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/airflow.md b/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/airflow.md new file mode 100644 index 00000000000..c2c9e038f3e --- /dev/null +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/airflow.md @@ -0,0 +1,313 @@ +--- +title: Run Nifi Connector using Airflow SDK +slug: /connectors/pipeline/nifi/airflow +--- + +# Run Nifi using the metadata CLI + +In this section, we provide guides and references to use the Nifi connector. + +Configure and schedule Nifi metadata and profiler workflows from the OpenMetadata UI: + +- [Requirements](#requirements) +- [Metadata Ingestion](#metadata-ingestion) + +## Requirements + +{%inlineCallout icon="description" bold="OpenMetadata 0.12 or later" href="/deployment"%} +To deploy OpenMetadata, check the Deployment guides. +{% /inlineCallout %} + +To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. + +### Python Requirements + +To run the Nifi ingestion, you will need to install: + +```bash +pip3 install "openmetadata-ingestion[nifi]" +``` + +## Metadata Ingestion + +All connectors are defined as JSON Schemas. +[Here](https://github.com/open-metadata/OpenMetadata/blob/main/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/pipeline/nifiConnection.json) +you can find the structure to create a connection to Nifi. + +In order to create and run a Metadata Ingestion workflow, we will follow +the steps to create a YAML configuration able to connect to the source, +process the Entities if needed, and reach the OpenMetadata server. + +The workflow is modeled around the following +[JSON Schema](https://github.com/open-metadata/OpenMetadata/blob/main/openmetadata-spec/src/main/resources/json/schema/metadataIngestion/workflow.json) + +### 1. Define the YAML Config + +This is a sample config for Nifi: + +{% codePreview %} + +{% codeInfoContainer %} + +#### Source Configuration - Service Connection + +{% codeInfo srNumber=1 %} + +**hostPort**: Pipeline Service Management UI URL +**nifiConfig**: one of + **1.** Using Basic authentication + - **username**: Username to connect to Nifi. This user should be able to send request to the Nifi API and access the `Resources` endpoint. + - **password**: Password to connect to Nifi. + - **verifySSL**: Whether SSL verification should be perform when authenticating. + **2.** Using client certificate authentication + - **certificateAuthorityPath**: Path to the certificate authority (CA) file. This is the certificate used to store and issue your digital certificate. This is an optional parameter. If omitted SSL verification will be skipped; this can present some sever security issue. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + - **clientCertificatePath**: Path to the certificate client file. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + - **clientkeyPath**: Path to the client key file. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + +{% /codeInfo %} + + +#### Source Configuration - Source Config + +{% codeInfo srNumber=2 %} + +The `sourceConfig` is defined [here](https://github.com/open-metadata/OpenMetadata/blob/main/openmetadata-spec/src/main/resources/json/schema/metadataIngestion/pipelineServiceMetadataPipeline.json): + +**dbServiceNames**: Database Service Name for the creation of lineage, if the source supports it. + +**includeTags**: Set the Include tags toggle to control whether or not to include tags as part of metadata ingestion. + +**markDeletedPipelines**: Set the Mark Deleted Pipelines toggle to flag pipelines as soft-deleted if they are not present anymore in the source system. + +**pipelineFilterPattern** and **chartFilterPattern**: Note that the `pipelineFilterPattern` and `chartFilterPattern` both support regex as include or exclude. + +{% /codeInfo %} + + +#### Sink Configuration + +{% codeInfo srNumber=3 %} + +To send the metadata to OpenMetadata, it needs to be specified as `type: metadata-rest`. + +{% /codeInfo %} + +#### Workflow Configuration + +{% codeInfo srNumber=4 %} + +The main property here is the `openMetadataServerConfig`, where you can define the host and security provider of your OpenMetadata installation. + +For a simple, local installation using our docker containers, this looks like: + +{% /codeInfo %} + +{% /codeInfoContainer %} + +{% codeBlock fileName="filename.yaml" %} + + +```yaml +source: + type: nifi + serviceName: nifi_source + serviceConnection: + config: + type: Nifi + hostPort: my_host:8443 + nifiConfig: + username: my_username + password: my_password + verifySSL: + ## client certificate authentication + # certificateAuthorityPath: path/to/CA + # clientCertificatePath: path/to/clientCertificate + # clientkeyPath: path/to/clientKey + +``` +```yaml {% srNumber=1 %} + hostPort: http://localhost:8000 +``` +```yaml {% srNumber=2 %} + sourceConfig: + config: + type: PipelineMetadata + # markDeletedPipelines: True + # includeTags: True + # includeLineage: true + # pipelineFilterPattern: + # includes: + # - pipeline1 + # - pipeline2 + # excludes: + # - pipeline3 + # - pipeline4 +``` +```yaml {% srNumber=3 %} +sink: + type: metadata-rest + config: {} +``` + +```yaml {% srNumber=4 %} +workflowConfig: + openMetadataServerConfig: + hostPort: "http://localhost:8585/api" + authProvider: openmetadata + securityConfig: + jwtToken: "{bot_jwt_token}" +``` + +{% /codeBlock %} + +{% /codePreview %} + +### Workflow Configs for Security Provider + +We support different security providers. You can find their definitions [here](https://github.com/open-metadata/OpenMetadata/tree/main/openmetadata-spec/src/main/resources/json/schema/security/client). + +## Openmetadata JWT Auth + +- JWT tokens will allow your clients to authenticate against the OpenMetadata server. To enable JWT Tokens, you will get more details [here](/deployment/security/enable-jwt-tokens). + +```yaml +workflowConfig: + openMetadataServerConfig: + hostPort: "http://localhost:8585/api" + authProvider: openmetadata + securityConfig: + jwtToken: "{bot_jwt_token}" +``` + +- You can refer to the JWT Troubleshooting section [link](/deployment/security/jwt-troubleshooting) for any issues in your JWT configuration. If you need information on configuring the ingestion with other security providers in your bots, you can follow this doc [link](/deployment/security/workflow-config-auth). + + +### 2. Prepare the Ingestion DAG + +Create a Python file in your Airflow DAGs directory with the following contents: + +{% codePreview %} + +{% codeInfoContainer %} + + +{% codeInfo srNumber=5 %} + +#### Import necessary modules + +The `Workflow` class that is being imported is a part of a metadata ingestion framework, which defines a process of getting data from different sources and ingesting it into a central metadata repository. + +Here we are also importing all the basic requirements to parse YAMLs, handle dates and build our DAG. + +{% /codeInfo %} + +{% codeInfo srNumber=6 %} + +**Default arguments for all tasks in the Airflow DAG.** + +- Default arguments dictionary contains default arguments for tasks in the DAG, including the owner's name, email address, number of retries, retry delay, and execution timeout. + +{% /codeInfo %} + +{% codeInfo srNumber=7 %} + +- **config**: Specifies config for the metadata ingestion as we prepare above. + +{% /codeInfo %} + +{% codeInfo srNumber=8 %} + +- **metadata_ingestion_workflow()**: This code defines a function `metadata_ingestion_workflow()` that loads a YAML configuration, creates a `Workflow` object, executes the workflow, checks its status, prints the status to the console, and stops the workflow. + +{% /codeInfo %} + +{% codeInfo srNumber=9 %} + +- **DAG**: creates a DAG using the Airflow framework, and tune the DAG configurations to whatever fits with your requirements +- For more Airflow DAGs creation details visit [here](https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/dags.html#declaring-a-dag). + +{% /codeInfo %} + +Note that from connector to connector, this recipe will always be the same. +By updating the `YAML configuration`, you will be able to extract metadata from different sources. + +{% /codeInfoContainer %} + +{% codeBlock fileName="filename.py" %} + +```python {% srNumber=5 %} +import pathlib +import yaml +from datetime import timedelta +from airflow import DAG +from metadata.config.common import load_config_file +from metadata.ingestion.api.workflow import Workflow +from airflow.utils.dates import days_ago + +try: + from airflow.operators.python import PythonOperator +except ModuleNotFoundError: + from airflow.operators.python_operator import PythonOperator + + +``` + +```python {% srNumber=6 %} +default_args = { + "owner": "user_name", + "email": ["username@org.com"], + "email_on_failure": False, + "retries": 3, + "retry_delay": timedelta(minutes=5), + "execution_timeout": timedelta(minutes=60) +} + + +``` + +```python {% srNumber=7 %} +config = """ + +""" + + +``` + +```python {% srNumber=8 %} +def metadata_ingestion_workflow(): + workflow_config = yaml.safe_load(config) + workflow = Workflow.create(workflow_config) + workflow.execute() + workflow.raise_from_status() + workflow.print_status() + workflow.stop() + + +``` + +```python {% srNumber=9 %} +with DAG( + "sample_data", + default_args=default_args, + description="An example DAG which runs a OpenMetadata ingestion workflow", + start_date=days_ago(1), + is_paused_upon_creation=False, + schedule_interval='*/5 * * * *', + catchup=False, +) as dag: + ingest_task = PythonOperator( + task_id="ingest_using_recipe", + python_callable=metadata_ingestion_workflow, + ) + + +``` + +{% /codeBlock %} + +{% /codePreview %} + + diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/cli.md b/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/cli.md new file mode 100644 index 00000000000..70323fa5f54 --- /dev/null +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/cli.md @@ -0,0 +1,197 @@ +--- +title: Run Nifi Connector using the CLI +slug: /connectors/pipeline/nifi/cli +--- + +# Run Nifi using the metadata CLI + +In this section, we provide guides and references to use the Nifi connector. + +Configure and schedule Nifi metadata and profiler workflows from the OpenMetadata UI: + +- [Requirements](#requirements) +- [Metadata Ingestion](#metadata-ingestion) + +## Requirements + +{%inlineCallout icon="description" bold="OpenMetadata 0.12 or later" href="/deployment"%} +To deploy OpenMetadata, check the Deployment guides. +{% /inlineCallout %} + +To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with +custom Airflow plugins to handle the workflow deployment. + +### Python Requirements + +To run the Nifi ingestion, you will need to install: + +```bash +pip3 install "openmetadata-ingestion[nifi]" +``` + +## Metadata Ingestion + +All connectors are defined as JSON Schemas. +[Here](https://github.com/open-metadata/OpenMetadata/blob/main/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/pipeline/nifiConnection.json) +you can find the structure to create a connection to Nifi. + +In order to create and run a Metadata Ingestion workflow, we will follow +the steps to create a YAML configuration able to connect to the source, +process the Entities if needed, and reach the OpenMetadata server. + +The workflow is modeled around the following +[JSON Schema](https://github.com/open-metadata/OpenMetadata/blob/main/openmetadata-spec/src/main/resources/json/schema/metadataIngestion/workflow.json) + +### 1. Define the YAML Config + +This is a sample config for Nifi: + +{% codePreview %} + +{% codeInfoContainer %} + +#### Source Configuration - Service Connection + +{% codeInfo srNumber=1 %} + +**hostPort**: Pipeline Service Management UI URL +**nifiConfig**: one of + **1.** Using Basic authentication + - **username**: Username to connect to Nifi. This user should be able to send request to the Nifi API and access the `Resources` endpoint. + - **password**: Password to connect to Nifi. + - **verifySSL**: Whether SSL verification should be perform when authenticating. + **2.** Using client certificate authentication + - **certificateAuthorityPath**: Path to the certificate authority (CA) file. This is the certificate used to store and issue your digital certificate. This is an optional parameter. If omitted SSL verification will be skipped; this can present some sever security issue. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + - **clientCertificatePath**: Path to the certificate client file. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + - **clientkeyPath**: Path to the client key file. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + + +{% /codeInfo %} + + +#### Source Configuration - Source Config + +{% codeInfo srNumber=2 %} + +The `sourceConfig` is defined [here](https://github.com/open-metadata/OpenMetadata/blob/main/openmetadata-spec/src/main/resources/json/schema/metadataIngestion/pipelineServiceMetadataPipeline.json): + +**dbServiceNames**: Database Service Name for the creation of lineage, if the source supports it. + +**includeTags**: Set the Include tags toggle to control whether or not to include tags as part of metadata ingestion. + +**markDeletedPipelines**: Set the Mark Deleted Pipelines toggle to flag pipelines as soft-deleted if they are not present anymore in the source system. + +**pipelineFilterPattern** and **chartFilterPattern**: Note that the `pipelineFilterPattern` and `chartFilterPattern` both support regex as include or exclude. + +{% /codeInfo %} + + +#### Sink Configuration + +{% codeInfo srNumber=3 %} + +To send the metadata to OpenMetadata, it needs to be specified as `type: metadata-rest`. + +{% /codeInfo %} + +#### Workflow Configuration + +{% codeInfo srNumber=4 %} + +The main property here is the `openMetadataServerConfig`, where you can define the host and security provider of your OpenMetadata installation. + +For a simple, local installation using our docker containers, this looks like: + +{% /codeInfo %} + +{% /codeInfoContainer %} + +{% codeBlock fileName="filename.yaml" %} + + +```yaml +source: + type: nifi + serviceName: nifi_source + serviceConnection: + config: + type: Nifi + hostPort: my_host:8433 + nifiConfig: + username: my_username + password: my_password + verifySSL: + ## client certificate authentication + # certificateAuthorityPath: path/to/CA + # clientCertificatePath: path/to/clientCertificate + # clientkeyPath: path/to/clientKey +``` +```yaml {% srNumber=1 %} + hostPort: http://localhost:8000 +``` +```yaml {% srNumber=2 %} + sourceConfig: + config: + type: PipelineMetadata + # markDeletedPipelines: True + # includeTags: True + # includeLineage: true + # pipelineFilterPattern: + # includes: + # - pipeline1 + # - pipeline2 + # excludes: + # - pipeline3 + # - pipeline4 +``` +```yaml {% srNumber=3 %} +sink: + type: metadata-rest + config: {} +``` + +```yaml {% srNumber=4 %} +workflowConfig: + openMetadataServerConfig: + hostPort: "http://localhost:8585/api" + authProvider: openmetadata + securityConfig: + jwtToken: "{bot_jwt_token}" +``` + +{% /codeBlock %} + +{% /codePreview %} + +### Workflow Configs for Security Provider + +We support different security providers. You can find their definitions [here](https://github.com/open-metadata/OpenMetadata/tree/main/openmetadata-spec/src/main/resources/json/schema/security/client). + +## Openmetadata JWT Auth + +- JWT tokens will allow your clients to authenticate against the OpenMetadata server. To enable JWT Tokens, you will get more details [here](/deployment/security/enable-jwt-tokens). + +```yaml +workflowConfig: + openMetadataServerConfig: + hostPort: "http://localhost:8585/api" + authProvider: openmetadata + securityConfig: + jwtToken: "{bot_jwt_token}" +``` + +- You can refer to the JWT Troubleshooting section [link](/deployment/security/jwt-troubleshooting) for any issues in your JWT configuration. If you need information on configuring the ingestion with other security providers in your bots, you can follow this doc [link](/deployment/security/workflow-config-auth). + +### 2. Run with the CLI + +First, we will need to save the YAML file. Afterward, and with all requirements installed, we can run: + +```bash +metadata ingest -c +``` + +Note that from connector to connector, this recipe will always be the same. By updating the YAML configuration, +you will be able to extract metadata from different sources. diff --git a/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/index.md b/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/index.md new file mode 100644 index 00000000000..0bacffa6aa9 --- /dev/null +++ b/openmetadata-docs-v1/content/v1.0.0/connectors/pipeline/nifi/index.md @@ -0,0 +1,306 @@ +--- +title: Nifi +slug: /connectors/pipeline/nifi +--- + +# Nifi + +In this section, we provide guides and references to use the Nifi connector. + +Configure and schedule Nifi metadata workflows from the OpenMetadata UI: + +- [Requirements](#requirements) +- [Metadata Ingestion](#metadata-ingestion) + +If you don't want to use the OpenMetadata Ingestion container to configure the workflows via the UI, then you can check the following docs to connect using Airflow SDK or with the CLI. + +{% tilesContainer %} +{% tile + title="Ingest with Airflow" + description="Configure the ingestion using Airflow SDK" + link="/connectors/dashboard/nifi/airflow" + / %} +{% tile + title="Ingest with the CLI" + description="Run a one-time ingestion using the metadata CLI" + link="/connectors/dashboard/nifi/cli" + / %} + +{% /tilesContainer %} + +## Requirements + +{%inlineCallout icon="description" bold="OpenMetadata 0.12 or later" href="/deployment"%} +To deploy OpenMetadata, check the Deployment guides. +{% /inlineCallout %} + +To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. + +### Metadata +OpenMetadata supports 2 types of connection for the Nifi connector: +- **basic authentication**: use username/password to authenticate to Nifi. +- **client certificate authentication**: use CA, client certificate and client key files to authenticate. + +The user should be able to send request to the Nifi API and access the `Resources` endpoint. + +## Metadata Ingestion + +{% stepsContainer %} + +{% step srNumber=1 %} + +{% stepDescription title="1. Visit the Services Page" %} + +The first step is ingesting the metadata from your sources. Under +Settings, you will find a Services link an external source system to +OpenMetadata. Once a service is created, it can be used to configure +metadata, usage, and profiler workflows. + +To visit the Services page, select Services from the Settings menu. + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image +src="/images/v1.0.0/openmetadata/connectors/visit-services.png" +alt="Visit Services Page" +caption="Find Pipeline option on left panel of the settings page" /%} + +{% /stepVisualInfo %} + +{% /step %} + +{% step srNumber=2 %} + +{% stepDescription title="2. Create a New Service" %} + +Click on the 'Add New Service' button to start the Service creation. + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image +src="/images/v1.0.0/openmetadata/connectors/create-service.png" +alt="Create a new service" +caption="Add a new Service from the Dashboard Services page" /%} + +{% /stepVisualInfo %} + +{% /step %} + + + +{% step srNumber=3 %} + +{% stepDescription title="3. Select the Service Type" %} + +Select Nifi as the service type and click Next. + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image + src="/images/v1.0.0/openmetadata/connectors/nifi/select-service.png" + alt="Select Service" + caption="Select your service from the list" /%} + +{% /stepVisualInfo %} + +{% /step %} + +{% step srNumber=4 %} + +{% stepDescription title="4. Name and Describe your Service" %} + +Provide a name and description for your service as illustrated below. + +#### Service Name + +OpenMetadata uniquely identifies services by their Service Name. Provide +a name that distinguishes your deployment from other services, including +the other {connector} services that you might be ingesting metadata +from. + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image + src="/images/v1.0.0/openmetadata/connectors/nifi/add-new-service.png" + alt="Add New Service" + caption="Provide a Name and description for your Service" /%} + +{% /stepVisualInfo %} + +{% /step %} + +{% step srNumber=5 %} + +{% stepDescription title="5. Configure the Service Connection" %} + +In this step, we will configure the connection settings required for +this connector. Please follow the instructions below to ensure that +you've configured the connector to read from your nifi service as +desired. + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image + src="/images/v1.0.0/openmetadata/connectors/nifi/service-connection.png" + alt="Configure service connection" + caption="Configure the service connection by filling the form" /%} + +{% /stepVisualInfo %} + +{% /step %} + +{% extraContent parentTagName="stepsContainer" %} + +#### Connection Options + +- **Host and Port**: Pipeline Service Management/UI URI. This should be specified as a string in the format 'hostname:port'. + +- **Nifi Config**: OpenMetadata supports username/password or client certificate authentication. + 1. Basic Authentication + - Username: Username to connect to Nifi. This user should be able to send request to the Nifi API and access the `Resources` endpoint. + - Password: Password to connect to Nifi. + - Verify SSL: Whether SSL verification should be perform when authenticating. + 2. Client Certificate Authentication + - Certificate Authority Path: Path to the certificate authority (CA) file. This is the certificate used to store and issue your digital certificate. This is an optional parameter. If omitted SSL verification will be skipped; this can present some sever security issue. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + - Client Certificate Path: Path to the certificate client file. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + - Client Key Path: Path to the client key file. + **important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. + +{% /extraContent %} + +{% step srNumber=6 %} + +{% stepDescription title="6. Test the Connection" %} + +Once the credentials have been added, click on `Test Connection` and Save +the changes. + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image + src="/images/v1.0.0/openmetadata/connectors/test-connection.png" + alt="Test Connection" + caption="Test the connection and save the Service" /%} + +{% /stepVisualInfo %} + +{% /step %} + +{% step srNumber=7 %} + +{% stepDescription title="7. Configure Metadata Ingestion" %} + +In this step we will configure the metadata ingestion pipeline, +Please follow the instructions below + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image +src="/images/v1.0.0/openmetadata/connectors/configure-metadata-ingestion-dashboard.png" +alt="Configure Metadata Ingestion" +caption="Configure Metadata Ingestion Page" /%} + +{% /stepVisualInfo %} + +{% /step %} + +{% extraContent parentTagName="stepsContainer" %} + +#### Metadata Ingestion Options + +- **Name**: This field refers to the name of ingestion pipeline, you can customize the name or use the generated name. +- **Pipeline Filter Pattern (Optional)**: Use to pipeline filter patterns to control whether or not to include pipeline as part of metadata ingestion. + - **Include**: Explicitly include pipeline by adding a list of comma-separated regular expressions to the Include field. OpenMetadata will include all pipeline with names matching one or more of the supplied regular expressions. All other schemas will be excluded. + - **Exclude**: Explicitly exclude pipeline by adding a list of comma-separated regular expressions to the Exclude field. OpenMetadata will exclude all pipeline with names matching one or more of the supplied regular expressions. All other schemas will be included. +- **Include lineage (toggle)**: Set the Include lineage toggle to control whether or not to include lineage between pipelines and data sources as part of metadata ingestion. +- **Enable Debug Log (toggle)**: Set the Enable Debug Log toggle to set the default log level to debug, these logs can be viewed later in Airflow. +- **Mark Deleted Pipelines (toggle)**: Set the Mark Deleted Pipelines toggle to flag pipelines as soft-deleted if they are not present anymore in the source system. + +{% /extraContent %} + +{% step srNumber=8 %} + +{% stepDescription title="8. Schedule the Ingestion and Deploy" %} + +Scheduling can be set up at an hourly, daily, or weekly cadence. The +timezone is in UTC. Select a Start Date to schedule for ingestion. It is +optional to add an End Date. + +Review your configuration settings. If they match what you intended, +click Deploy to create the service and schedule metadata ingestion. + +If something doesn't look right, click the Back button to return to the +appropriate step and change the settings as needed. + +After configuring the workflow, you can click on Deploy to create the +pipeline. + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image +src="/images/v1.0.0/openmetadata/connectors/schedule.png" +alt="Schedule the Workflow" +caption="Schedule the Ingestion Pipeline and Deploy" /%} + +{% /stepVisualInfo %} + +{% /step %} + + +{% step srNumber=9 %} + +{% stepDescription title="9. View the Ingestion Pipeline" %} + +Once the workflow has been successfully deployed, you can view the +Ingestion Pipeline running from the Service Page. + +{% /stepDescription %} + +{% stepVisualInfo %} + +{% image +src="/images/v1.0.0/openmetadata/connectors/view-ingestion-pipeline.png" +alt="View Ingestion Pipeline" +caption="View the Ingestion Pipeline from the Service Page" /%} + +{% /stepVisualInfo %} + +{% /step %} + +{% /stepsContainer %} + +## Troubleshooting + + ### Workflow Deployment Error + +If there were any errors during the workflow deployment process, the +Ingestion Pipeline Entity will still be created, but no workflow will be +present in the Ingestion container. + +- You can then edit the Ingestion Pipeline and Deploy it again. + +- From the Connection tab, you can also Edit the Service if needed. + +{% image +src="/images/v1.0.0/openmetadata/connectors/workflow-deployment-error.png" +alt="Workflow Deployment Error" +caption="Edit and Deploy the Ingestion Pipeline" /%} + diff --git a/openmetadata-docs-v1/content/v1.0.0/menu.md b/openmetadata-docs-v1/content/v1.0.0/menu.md index bb7cd0742c6..51280d52a96 100644 --- a/openmetadata-docs-v1/content/v1.0.0/menu.md +++ b/openmetadata-docs-v1/content/v1.0.0/menu.md @@ -457,6 +457,12 @@ site_menu: url: /connectors/pipeline/airbyte/airflow - category: Connectors / Pipeline / Airbyte / CLI url: /connectors/pipeline/airbyte/cli + - category: Connectors / Pipeline / Nifi + url: /connectors/pipeline/nifi + - category: Connectors / Pipeline / Nifi / Airflow + url: /connectors/pipeline/nifi/airflow + - category: Connectors / Pipeline / Nifi / CLI + url: /connectors/pipeline/nifi/cli - category: Connectors / Pipeline / Glue Pipeline url: /connectors/pipeline/glue-pipeline - category: Connectors / Pipeline / Glue Pipeline / Airflow diff --git a/openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/add-new-service.png b/openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/add-new-service.png new file mode 100644 index 0000000000000000000000000000000000000000..41f4548dffec02c3f0e8f3c031cbf542a95fb184 GIT binary patch literal 31507 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 literal 0 HcmV?d00001 diff --git a/openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/select-service.png b/openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/select-service.png new file mode 100644 index 0000000000000000000000000000000000000000..66e580fb9bd9b11847e1f41ff4ac8874751aa8e1 GIT binary patch literal 45313 zcmeFZWl&vB7bXgXBoN%)-GjTkTW|{pcXucF!958sf#3&scXxLQ7To=weBb*fnS1M2 z%~Z{=siF2Rn!Q_AcduUZthEVOQjkP=hx-l!0s=u=N=yX;0tyJeVPM{XpS&5(GlYPE z{AeL6sw6EcO048)XKG<>0s%oCXA>tV)un{o+h(4ZMer`-6PGhav6Rkhl%U$Mch9hD zXJg5E%oy>PabjZq--?U5c)~vcKOHT0bm%GDW2OPeg>^PtKG+lq)Vm1^95=ZwziI@q z7=^&JSL^Z$W=7fBoOF|wBTvM@d}AgnMjVowL`_=fb<4OXgU&eVb1&CYzbF$|v?Fi% z+EjV>Sl7CBiOD9Jznqn-^7#l#5dW< zS!fjh9(5;$MhN@OiO83yXvpp;~(>y!E|++WY2LG%E;M)Mm=DobYo9 zyyWU8n$o87@({G(G7JP{s09QxxC9BlaltnP#H;uah_~S1sNh>H3+msuP{6ELzsoSc zDhjKLN=t)(s~S0)nAkd*+c`sty(R;9HEZ!f(^*qqj>pK(hSAX24q(FQZe#ze2?U=z z54dP!;%rFlZewlh#N*CS`kxv+;PS7>Or*sBsp4$KPpT=eL@a9OXhO`v_@41SslYp8 zVq!i=V^ba#F^PYgga6_uHFtKl=V4-Ub8};KV`a2+G-G1s=H_O4&%(sQ!T_$p;N)TJ zZ0OEl>qPe7PX6sj%*4sa(Zb%@!p@fXSHFe;I~QkuQqo@o{r>qcohI%Ue@3!(`e$0; z2{Qe9!^F(^p6Per;HG@Pp7JPJxSLpOiCNfymj^tC06WWjzW>z!|GfD#;$JN_|Fq;_ zXa2k8UvK{3E!CV%97XMHz(YC<{Mng*8vp(BpN4!)zh?f|O8j@3|ML{Q&I0fFn11h> zz`N{n(hUd*AqZ(P;ScVRKhxiSM4wp`9dgbAd6M?Hw4e7QKjreD@_ zSmR|gr(gcM35NC~WFnX%iSo;*AY`H>vzTp&5|kU+&&qs3m&_?BXrE% zHO*NS=shOtiJzjOrTqWBvbfPsRj^KWZG=DiBLzM_ts4b%ZfXa0&h_D~V#+$1c3DwD zq7wi23NTg78nzVw&O&Nxyh}pW2BYusT6{+s(szUq9x@gJ_V@Jxxu1!?cY|!dB1}B) z@6r6B@nORx=;@e3gZ0LuHQnW)$c6sBh@s)5`h_E!iT)7h4=o3)ME@nn@UOmOA$mwp zev|a8pbCW!{AP~*yQ5zPP`}sjDS`{_i4Z+GG`MemQwT07(Vr9kGqL}4_ntxsWF8R$ z`G+DQaL3JW|1UYe_Wyt1>JZXlPE}T(b#?B1!!Y}MW82TD)N*(VRZ`K882dplCt=}$YgV}O_;qLx>?!W@t~xeTtiE|QXAnGNSsH&CyqhVm z0?4`c+s=M)I9YL9+_KheL)=Z{N8OFY2~SJI=L%gSBjlg2vtuG}J1lE?hqUU4j{YpG zq~4dz9A{2|XN1|q@FMuE>0h_%O#t}}xwrO`C}VM4zlE9Rb?jk|f(M+nS!^SiJk+N^=g)vAJTCiKqiIj> z>+5TYP(%WU1B(I@V&V$@b7RWir)?y~U+%ra&|t8nCgyIbF0gQ1>8E^!)@6}ZvYoF^ zBq^3&*G#?x#*eM7+*06Dt&Iyt$&(m)Z(ZbEAAo|-{-dCF(Z$olwHoXkA>zyMXI7o? z&JOp}Y)R%HX`uSe!Q#_pxR;J|6F>Dza~aN?Z}NC?DJh4s+UyFJw3CyQN*_K1)mXhq zWFG_yI`1hZxzo@LNGU4LSv0wv=!;X!w74D5L+-P@@a_hb4y%q$2ba+r1iHvRgl@TdnSkd$qs$Y;`4bp^t+4FVrzO4q?DIv ztb|u+KJ{+CAC$dy+DA<+I(F?kTByQfYCff3eONd0z8bknz3Rf}U$sBm43IG2)>Gppu(xcNGrQXuS@U(Bn?G!QP*qeWio_F} zCgitj?A9RNo(>85?)N^)EI)n3E$4s~?&zqu-|V?h$V>^XQ{y}rMOp@Ci-rpKqEeDm zt}mEnRGPK8foI@6IdFZ^-cI}g!k4kI}oy3bXu{N?-dM`4= zrPMV*PAU4K5xj`eYkwHwE0__)_Z1jj_cB~&@FzA5xpprhrG|zjfc-E8`4#mC_n~Ez zjazPKd9oGe6Cw=T%i$*qY2|JAP(BY=k}-t*F3u>?bGp0;Qw4qziQDKa`96!^MNhAr zi0Tv4`A2Whur|Np6&OAS!6}y|KkpX|+PkLnx(WLV3&bbH%$qq5P4d8oBISzqMb|Jc zHQ;9?{HrF|e4r3k5eW89-Wtph=%!y>oy}Uke{S?fFy`+ictF~iGqEa?RoSZOBYdgL zaQVqqR?+*Ji(E=ZrZYj2FGBP!lBEHP)yu=)tL~m2iw@Vt*eQ_7q3PrOkS;$j4;dLj z-I^jgA0i{G4;Y=LWM&&)B=WJJ05vJQR(kO1&g; z!QVpun|xMB4K=jQ_o3@1QER2BTj|BeYSweQ+;C^&>zoNFD=m9g!y_7-Z3UX!;?N=dZ8eI9*B3 zYNu6o*VbkgOeHUjvV@GwQOi8#FWtJshz~4{jg5VvCOoO6@ZkhM7 zzOg+G>7_vCxD75VC4=-_O+gcha%bVUMWxq_I8LSvG62+nn}LnJfG^0WFd%9SLbu-U zdy};ozPi;SZk$8(77MIATBYBq%e)?H-4A~Fk!rdWe2H?HM!7@!SK@=`CDej)iVdRH zn9dc|c^ViV5Eqf*ahw)esnm^@a~x39n{-Mk>CCGNom=W*CHs5S16a0O=#+!vKBd2( zh7hkaqv_&qZfa5fHHg0#G_H5L_)XD(=I?U}E+7c|13)B&RdRoNFeitm#>A5r1%3Hb zaUA*Avp}99^52$nfP@IRX&f7RvGl(d_y0-uT!-%DOYb$S!X=Y0pDt(+Q^V}%7? z_vYVpe{3)OIK>4|9MFi|uTIMBV1OtCEd91{d#i=KMuKiA!!{Y$en#B>aO$pPl5r*7 zKHm`x0113&DYt|j_7!|3*piaH<-AYiuR4Y>F)Ie5jc`#ei7fUV=ozgE<{7;`BxAPK zHm>ntiG{Y5A>L6Uj7R#hZ`@%x7>JFQ#Ss1sxk^n-Kb72DGA*)glCsAIviUTTgJ7U* zIr#akn5zAu!czeL3Lfk;WK1BAe8W7%+Sw{?N^q`Q6+8~>)Jh5Ys{e3eV6w5KF-5Y% z%K214ai4)>jGF>Uu7n1~jU&!g!4Ic@&{ls<5*CfbCZCb^Th;v6Z=;dHc|4w-7Os*seg){KlGZLUwXjg+N-UsMDr#>^W&i(H&>pq$q zfpTmA)o@>E!(jWb3K*fj|DcRE96O=c>7j~sd3Wn;rGK{rciMrU^hpEP-M~1t_mD~sk2d=Ia5Q$vFd%OF#K9Rkf`7HP%&V?9?XUd-pr_P z-*N54pP=ZGJ5o|?f=M7&8gRpz6ee#7Q4bYRdr83Vr;bLxd54C&wmw-0ctzrY^y4c| z_Ha{=I6_dz$b~Tv^b~?!)geI#k;u}@T@;|H*&P|eP#r}7c zH7PsXI7o7Pd>AEq!ncLPl`H{w3 z*2KneZI5ZFc@&LiJIP=cnUwbAK`o?%Tn%-h=)e3&L~&NJyb7dGz4x~%nR6@87j-rN zJ}O<`jYhRk&i^06BDt++q+8qz2VP5F?-HuMA4FtCRos;2kyez1a-jepr!wfztt2q^ zc6(snlpES!9UrOQ;Qv|KKvf>fF2!1kc+zFMcpCMyGV16VEbO$p*sl+sTZoYiT2qVM zOqrW7_dQ!LGqB;Ydq5GUk$VQ5P?Z%9o2~dQtUxV=$t(Od;SeQzMRQh(%W}M5q;K_2 z_hmx#Y@V47qsqac|IoTBqkpJFH+-2Tote?dxn92#f5>w2ym zKT50%T2-Ps{V;>Dus%)1JDCllz1(AdBIux7Qr&PdSN=IPYf~c`|C?+u{@@M)86l2j z4z2!|Tg#W^Pl9RDdNz#-X!(ORw7&xHh^G))#k)UJef>LFs`J;FXfpkg{-+RN9wi)y zDS`TLU;^lWg*R+G8WG~{<^<9VYXP@IjBey4wdW$WBHai`E zYO03W6vHWfP|}~;X55nHPZ=I|!1+;T)=)H2%9$P=eI&+nWqP+~eMBImzG%;Z70a5DV!F50@-^Zh zmM)=D^y5H01=oIF!f6+hpm`i8pc|&YtBJ$5Cj!I$VuX{~a+*4Q82~Eu%8llfM4&z2 z1Tt+N6qnEDxGh#&xStPDS;a2$9fY?cUVLF|LAI!x$dwd@9*g2!4LdAvYwciCIUv8O zyz)G4eHZh_MO2yyY6Vtnq;Ma(_zF-~x2+QUcV{{hoW~MhQ4u@Azb@yuStw z`(IE2k5dS(xz*H3I^0W^c=IG#Lnmi{zbSE!QYY|y2!-Gz_epHr z<>ygMKNk^o*PGf>S|yPxm<{IDQ>5xAdka4klI7Y)VgyN@V4?A7O-Z+--@68CM>$HA)VfTH2Gm$pd zPgiD#gHXEes^}pG=x+=Rn8=B!C$5s~<3nr1isWu=7)5MNKUdCT5_1i^KB4wSrUXr> zQ7WmZ1jdm`Zl)Occ1(X)Wp>yU3wtd_xV*_^d$d?{yI+v0R5sjJs$Dbb>-TsT>dQ6q zg&nS^r^kGykzGYarFx#8mR1DpHjU@YVi}v5WZNv&!ob6eSz6MzJ{T z52taX@q1lQ-`Or!OBbN{(d3qt$QA6*mg0GPdskm=j|skr4J9+6prYnXaXqtooEw*D zRlPCG^x-J0-+ag5KgPX_uczVRKbp$?3Jm3&ueG)))Vdt1<8wQT?H(Q-MVSmGXR8({ z#2V4)l$C3g>o*>sGcfY<>gX^A%Qm?lAtQf$;B`%EQ)u^-gO$<=pHUB5m$rxb;dD$o=gUCyS2J?zkpBB zoMBvCT{tMAzn+nVDm~v=7KeXVyL~OFH@u0aG+< zMVj?oj?6RM`F&Ad^(1RAS35*#r{w97coR9?YxL?^dq~1w{DBLWl z(#)T^WnW`it#L9H&_Jpq8c>j$wWODo3qxUz^b4PNsI2HQo^^-6_uU#LXPD<;8tS8Z zQJ8o(y*q5Td_GeLD3`6-ueHXP1)FFCV4rW?S(51>>F4N7-pM+cHb?T^>Ir|m_%Whg zI3U_*@3!KCmEpb#>%-%7@4W0Z#(&@OI4+8`|F!|Tzw5(e&k9)R#g>_QfG~uqL}Xig zq}?u`pB`%7^BtB{Rrjb6`lskRhWkp%rZt_k>a9*=|4{0u|c4l{Tyi#);TW0tD(>BS~Vyz7xW8)qv!5J6>>!}(OD2_ph zqhAU1_4Ux3cs@vX^~4}bY}>d`Nzm5lw{53zY=ly=sXH^#!04E%@4gXy zf1-RmwPf2QUyv^7*V^iKH8A0ah|iVvGAiZ{H?^DTx5}K_Cm-g2G*=6&r{vU<*p3W$ z?9NXJ*E-mlhQyjgF^ZRP5-q%B>#KQdgQ-A(7fAT()x=RE#0-0yKS*O?H9lCwuoVOB zENrwQ=~#Kcbwf8?$?=BAMT_LegFBnou&MTAGATu$D@q`O3Z%#8;t|urNQ!W@kAIa0iFhv%k-0ErMSXK<`* ze@g^p;URF`T7;p3W=$%;`Fv-@G1^3l`by$$ah1|fT`RQonH{G6;k1f(D(YQ{q7NFeXZ##6N`Zj15btEPw?O zJgBT+)bjRpqyBo)%H>kWu0<^q*dq>|>I_04;Q1hU8)a)wX5f)3t&tlh=+N7>0>k;x z`ttnXk^w+Sv~>hMh9`gw&LNzSE76DYVWy=MC`kkbiDCrqsTo@?RaV%2?{-o|p$|Ws zWrR;D3KAgko%)Z;mhh6s_Jo@prn{|n-0fz@*tI>WXCC_JzJ&SXzyIiu*}q9KN3*Hc zxH@v~CO5V<2)+G`Mwd!QRq_@Q-yG|}ajf5mJV!yFSnM$@Ujcf0xxwkGWqr_~yRg_x z@))=?lw!2i8`bFU0gFtfZU%xM^dZHx16hLAWLxOjR-b5yK$tlj{f-1rl^qChvf84f z)1)_}d~Da(C?#+>TRNpa-0JgifR$3W>N#X`4cJe?qS!i7jo$x42{z^_r^_Z?ycT?z z?<3To(}0Q@QXO5Hb+dXyZ)>sWI!y3*=Z%!Ij<4An`B@v_S!V5@m520N4>*#`%+C_+ zx^PzJdK(t%j^AkLZ2tFim)nAWX@;Niq|057}79&ToaSs6t z=diSKeduHFP*~pyc=fVPHRbU|^MNNw3oB$~C zmm#c;2s^riENNSyTO12SB7qX|0Oh&MOJ}c?`Z)F0d^~079PjQxnjEDPRX|JJu_y}F zrWhM8nnxr{_e=GZLKlJCa(2_zb~b(I#Dp||-q4Eu)5FbNsOcRZraGBG8y#Bg!KZ*DDairGhv?BvYsJjvK-F6p}OQQ zZCFL(1_n#FsQ!AMfT@DMWrpv)Mf2sP?CrxzTTPGNV2+h1G;PMX{K?{%8H{ij`Nl|u zxw23}?`TVA5b`wvVbH+fCg=V&^(7t-yln8Sh&8W4_xG_NJW`jmiImVoCmgd>$HEUW z3klvD&+)(&JZp76q8S%DOlh;5!-CJ69K4cV57e@0Vf=TPR7Ti}{G4JbU=#wn@w!fn z)+MV;FwSx~mv1R$bg(z}qBt7IYHf<>Ysv!U3Hr7+^I@rT`r^tXK}03dH4#eW2;I9& zImfR(lbF?hvT-f4-oOKGEZI^VCNERILNTFU<^f|&&?dG*P;w+08r9ZiGNWEmj7F(; zK9S0OUdW4-TdDI+xVTd9cb}^njca^kzEn-bo`J5Zqy$fyx^(9l;74@XtPAXtHY18PK>W*l!$1W(v^U$?7L?oMt6(EF60BV621O0%_1d1Uzv`{OqeCfU zA6T2YV%HD^ariyo?RqX3zK;c!Y*MXE6{I;v5EgxG7V38wI4l0n+T_-4(49h3pGO$7 zqa8wyeUoS8admY=>>)E(lgMd3|K5k`>&jZROB|yu&e9#&y0Vn5-8x0-^Be?4YM_%m zEtqBQ$3!OOS$%<~9j27Oxc@SuCXIC*(a_+2aNY%@u~IZ?!AmC)u@lOc_#HqXftN!hTi}I*xWy|=!;CCr!(po&@Y7uwGpMo9YrjG>fjpxnne2iH!6`Utd9(r?=WNhHXQx~gViO`PHA2fU5< zqN1kme@1mW>%ltok{mo(X{u}KZ+zzOpV$A)N2zWDLL5xh?5ebJ_2Zp2S*~|z#M7r= z=sP$-L`0mWd)5C$6L=dZNeD7{i}VE(vb>VTs$m#4-wGF6EN#a$Nw~ymRH4(DB{YnH zm8!}=y~&57EDu9?XU|xoLQ9|JRim!FCaf~+xAb%^oYAvr7e+Mm?#_Kaxo@?1LykhC zR6!z*`#l3CdzpfR-3T(oGIb3Xw{qdCOO@m{PR{2-C>_*DIA&C&DxH>xVp-uz=)iQ% zm~Kxhb#5FiN`;aDz&>l$HFq){rkDn6b`%%sW?qv@BSZQ{!XdJ36iiqnm&ZKtBYUGr zRPzCyA6eUvO9nj<3r<(VNaP08=yQ#sk?To)V_Uw@4q49RLPNv}enIVS*};XK3TieK4Y4SVYZN)moDD6&s&457=K(o3|k6Nac1-77Pg2GQ1R-B;Ef-k@Le!M);KQe&D$ps}M zzCiO;PbV|j$y}+SOF)Ourrzj1XLaCK$E;)!hh44ZO4xJF&T?ZX@W z+NIf+bvD{znV+M{O}FN2BrhAD*B)(alM9zRp9a`I2NrXg-p!JiX%SxDSVL9Qd%8YU zxc-4Q#=+SiLpcq11;Rx=BEO?~U^s*?9E@8~)x0?r`GZ;$N`P^TF5I9Ql0UeGA}JWR zkS^_L{0p}TMFHa$6>kh({(@B!e!(g#RuznY#$Gr41*?<@YZCkgtC0V~ai?)h;QoSD zuz!I!R>k$Z=G#B}M+`X!-c&uOY^Fc^7wZq^k^ZHBL&d+C;(snLXuPm{Q^&3~y1exfUvT)I z(C-l>R63Sw*jBOT`|x^9@TU5ynd7bBQ_VZOwyQ=3ZK6BwITB7zjk%|`@|H*<-_-EH zK&V}67am1f*)Dbs14x?CzmlR3J_+Tb0#Djr5NAtufMEZAeaWu1GZ<~OFXZZwE!0-8 z$*4az+XWCG7Zdg#g&n2JA%a)SpMtT+w28b#}f7Cp-{V zZ8mLPU8MfQs9)d$CMQ)&4B80A#l_Va7c6T4U_&-`sI!3j%~9%F=d z?ym3Tf*r~0+d)<%k1USL>=*W87rs7cKFWXPKw*Y|Obn8Ct@W?Csro{%JJ|PJEZm~e zxl{9_s2zW&wxM8+1e~hUup=iY-_vF=c%~A#KlSlxb{+um-QAMi&gs<&KbE&0TYBI1 zIC~uxD84{*u5lsArZCRV3ZSTtj&iq25_upiK0Uw=XWr0JMiLdTV$U9sQ&3RU`!2G( z-=x=_g8h+oA}oWj>gf-=KQ9Ghysm%tW`BBnWazf$M09_3SU%R1<8jt~rdjckFvH`= zn)_bILv#^PRy0vZ@iVyjWoNLZ4D}MK8 znd>1I8b%A1f)2X`bq72$A6;CMJ$1QVB3fI=3jDrtscoB$rT)q6m_ZE#0zb9234%S> zk1;7lmjRb-t_RZt$8*?-xZZYqiz29WYgn0nA;O>DG!2W0ZQoS+sx);45z{cEU>UGM zqA`8RD+%nV&(We zAo4smm}PeI-|+i`;WP`Y3}-E%Nx9ce2DQrUVAFBqTLK=}X@|b3CL!P&9AmRopI)Uq zif!wTD}m`FS>V;Dn>DpLZXFv5!r+n;`sVX{A~&&v7X@ z%#03963#}wh;mXYV`Y3vWadX7uCUULFOo;*8%=cP>J|O&T9vy>#)CRmUlWL2b_(!dITFcUv^*?Cj5? z|A=OGGUBc-&+DJz3b-~rJVF`!Q6ucMAnN4y^0qtus8?Zv-)P-3Ea-Px1cZ9g zdy6mU*6b5nO24hx=VI!(B4NFa-hyDz$7s2+S*#XMVO+5vph!9RutObMZl^}4E7EDG z=PM?bhiS-yv#ZRP)%WK5*e71WYe#L4SS1*kz#}fP7~P_Dhah&~c%ABW6?qzkH*2(f z3+Ig6=O-d6GPAzGC&~2S;NpTQyNe|F6e*9#S@`JJmpFiB)H_Uclrxn9i}YL1M@tJ; z%NDDbUdm9gM1z;T_DVP!tLB~ZC@MfFE=r_{U*5_&J z96}{_zT6ixU2exN5@YjR!m~G+kZIT0=3gv<)9s$MTPkJLS)$K7-X4n^8fGIV-2Yr@ z(tsUdynn=J2WmB@^A?twf&!nx`6PMd1s?|bPGcF53_fVo=ivx=2W{BA98XkXArkQz z6X`S<^||T_?4bG_&CJ}TWbPg~B>3E4tLiP)?Q>=g56gMA^8MCxg*XAVHcOUpMk6X7 z3O^-Gv`S!Wvn?aDN}AloM&2ZUZewb`tvr@Me23UOWl4Gdbn`50Mzwi_$lkO#;i#G5 zC=n%q$Lnf6HFSGRgXSb91(V^okx#3o%XJ3ezwr3Uor_$sN*}LQchg`r)>SxROinQ@Qj#nf>Ij{y!X}ECw7$+i*ROw zgI~LEPf!uFRu>gJfzfP-7oV5F$RRMc-QBR8UM}vM1ef#nUv(^0MZB)2Zpu)nN$cj6 z(NDM5?7`|;%--sK=}xRJhcYl)*2n`_*WR9`4K&}abXWM-1W{sz z>JufK$$O)2#qEkOC6Z7>kNbW&C?^PrQPG;FNm)!cL@jBGfybJKAlPU3nL%xBG)XCu zrKq@ycTQ#P%Gmd}fs!GaB^@FDxr6sdniGEvhn3jBLkK}dMG7UL16la>1e||Y2Nzt( z#tThF=Z;i9fB9oUN@aZmTPjvEk!OF*-Ygsxb9)dqnt*XR;CH&qFCB*mIU$izIb-`N zM$394Cs>#kyVE=W>$d&M*qGad?g~q_igIUCa2Bm`N2rm$R+dDrt+Ml1oBBCXBNA=c^ zj`Z*l<^EN4zlL8A6v{;bsuyE`LsZj;%-7(|J4{(|B+tG{h51&Wug_Acyk*tZ=wKVS zU!zmCB%VR1md{W`6_Xfjzl(x{$T31GUax7=+bYEC2oV5im6s+t|!(DIvl>@pYGzqvKEC-hePU6zynI*`QPyp@qix z+}sOcMO#w38k%+ZN-CQ@1<2{x!b0Geb`STx~-pB&cn z{$R%@*PzXJZ#?_cbF})(jn~a_DY_b0e~qku2y2<*V3~AkoPL=o{TBdAyaWRF*3=t~{qRsPfJIy?WaaupCvbOzbl& zu7QC8fnsCUr@%mGd$1PzIYA!N_Ixi3Cxv1`O8;=VpWD@A5EOB1v(l&rH`3oP#gJv3 z?*j51oDH6Ap;H$=Lldqw>O*WvHw5cCX93bn4x7ci;4JS<=Sk@>U@?7&I66+?2k2bu zJF?E>@oZ6^v7@EBT(x5L!No-!(#AYnm1JE5DJiM^o>B3z@Knd+!DDcMwtJFRVY5WP zMO%lZXS31c!ZgiskR~>1Tb!7X&s}Mk=FV=pUO9B2MjeaNL#9P+Se9qtVp>&k22&5E z%WAe{!UdC=_6nQNy#n)-<4UFAw~~)cJG{LZhSUyk5peS^FltqzHB(K7q{6|;Gyj}0 zB|&K1D9yw(mxTo_ZOv3Y&stOsL&LsRQRR{_fT2#U^=C|AZv%6#cB2s3L$ScJn>1li z=S7hKg#S`4Wq~kt;FwyNCR-W|2?{r%WsCpi7SN~e3yIi1plZ>RS|}26Wc6#`$uU8Bz!mQCV<`=5sQ=R?h2O7-keXQqQQv_vdkTDD9+N z;!4~+C=TZ+W?{mjN)f>--RaY+Y1@Jy+aY}DuVSsRC})DhD=;=_W_29m73#ssv9d8e zKUZ6td=yXhnp`cEspn{+K5z|zxGc~bIB;}m6-x3tOTmd9_qy2O=HJMEJA?*MNlBtl zKlI8Qdiv@*dl3#@G^**C6Dd~`ig+t^Zr;Hex?sc(P^9y?OwMwk@RP#ys8G!EqJ)qZ zMKU`{xS4gMQv26oh?B`J2OFsX z9b;n#E>oE1%5Hn(!W4-jv?K8xU1TDPK}j&&1Cj!O@2Ik0!k8QYAeNvE&5~_RXkZu> z$X@!Ud|LWZmm9^g57kV9N0beB*K|$AY?p6G_c3NCZ%H@JxtRBz%>FTkAj;QK7mjmR zH9-wu2?G4CysrjaHCA&9Z)LGsnT4eX(GCl}iH30IY`fVHTuYqcf9rulyZ{N-4sk}+ z5+K;7ol4N0Ez<+$%VN@<)$1$TV!!{03^j9GdnF?$gJtKUK(9iIh_FEsC=Q(vc>#_~ ztajs4=E!tMYxd>AX>Nw?#g{3;CJeAeclLwiK+fUR?3By>sl5Bwu4$J4P_eMmr>WdyXq_h#G9UIibs8BtZ5uZdF|SKQOE;!J%Qq{MJtSR9MljN$Q;= z4J+e_1QwI#yvSm7s$``G^)6{$aOgSQDsqXf^G^QXV`T3QgTIvLUuZ&Q0CH`B5>IWIe4^FI0q(cD;QzCNn?}Ex#b0lFd*_Ggx<1TX=XgH!;ENx!6F@M@5Kx<@*rQ~Nye z9%wS&uiDEHk+1F^VUJ~1$_$Q21gD3|Hb@wnbthS+*jupvwkQL(WZR2NhP7=$^SuiM zYdN~RjA+ziFw+G~ZGM@Ait`1E1`pO|8h1c{w8Nw@QppL6ZVX7Wz+vv;l`>Vb%rCv1 zlWI45bGDkFVHxLaDD@A&v=ujgb%=G1^{g)fl0-y3rWqi^`}zKpzAvOoX3xi_B9E!6Cxi>0aYqut>gE3O#D?vyK)uUqZqZ{?dAkNkg-Qb4vVhe8#53YyLGb7v? z3k@LSSS@$G3%8_loVRAo$EmYgLh4v^%mgvN4d;Wtk@ht5iS`z|(dmihG@7qJgw9B04*h`&&*C z2mFu{N{&RcA;$~u_w3JD$MsgWRrGJ?`P(x7K>3k=aAkdEJgK;c^i&%zdf62$gmDwBq=#@jn%GT;LBy0 zM+7HfKYlILYi#19 zPZ3_*y`0{fjdG@o)9{cbLmxOcbBa9#h(qNiMc>-WF$7h(ErUSI+?a+8nf4T@Xfb&f zhdF)>-5g6D1dBf$4vGo#plgG<&D=x|iouj0k8{MR8XOT*R4@#4H=%Xb+J{bthpT4V zIFMTYWG{NE2?FA87ik4b_X{`OU-CtWcSi>RUVgpwzYE!5o zuR7-%i@$)W)-c;!@VrQxIQDaq&0qA(y*XUy&*-J>zA$kQBY1ciE?ca{G!{ho(>c5K zng-KfZ5tF+Q~uMo4BWPk(Wb+-5W!*2;$RXno@}X;eQxn~@Iu{vc6MPg=Xh(&O2=1K zMq{p)3x%Fff#M_j%%R{x^Wex!z@)y3i$jbTlHkE4-M z*I89NI*Un2Mq=rOLl{?92A(!!AcGGnbrt*{o;T0?b#N`ZK#PA4vpp${`>^#MngfWw zs|se@=N2;}g&{;k37NiwJy5f-kzE`q9vna6-Yx-Z>k z>wsbGM|>Q8c7=K>IewXBQ%ESrA5a6kf8J1AlB< z_c-dCdpZ-Nym`e?qnT#$8@eVC#$$UV0DqvG;RTBj`q8YCiC%xl-Q5%xmDT#$FrXbS z<+fetbKmh(EeuY>>OG55*WlS@PwU_sYckTM@ijQ=w9F&lY#WdwCw?{=Os&;0{3tVX zD=X`5b&G%v|H3*NcoNIHzN5j5;wT2&GjZseRiNFM0GPmUaFUXC;Qlcx(-k?U8fRZI z&#jq>wXNe|?-%z>|HKb>(wr71@Ji(UT_!U&AKS1AuICptYPI1P@TVN2yg)g!nxh}T zzTVi_8hV>fL;i-%0}5~2ZgTmGgJvuL8J&@EFUnAlVcxzFx@vAwEc@2LKH@c5qfUjV z0Zp=Xl_5$Lmq!K0)6&u=yN9Mry--9CPrK1%BT5A|9iaP=i1aY}P`T2u^l-RDT@#5& zEZf^R4N}$_9;!eem^GjQA#l9b`rT48i}}zE0MxGb7Ao|7%5ws?FU~Z$U+s5sm6U|B zJM364Ki;=FUYU*WXV-6K&xQfZ)BDS%8{{dDmu?6aQ>dqnhh6v7@19ke{SF%L@+=v=dyr>0=e_p%jiC~Ek=d?wP z)^dIok3wN+fa3eYNR-(U`^k-PxQ`cUduwX9lKBPC1ae-lD)f7tnbXVlJ6Q30)X3HX zct^Nkb_NWOa{ide!*5yi>^-GyIF?KOP8>hGLz(t{psmsO3j z_tMS|Ot|X}2NfP`nq95@cy{Ne$EqgTsvE=p{a*ls6&`n>;2it;TQf*UmU;$D)ix@3 zpC8bpyaR6yh1I=+PUaGG3(>hw$PL6oK0MkCYZ{3MRL(2@JSlb!D-L_PDq=}2%w}_* zL0ea?@)Y1<<8OdAXpR3gmPyz3#to$JcWorfg0mp$2IUR4Dp!yj_`{J zN2@VdY!bfKYTa(H1&|-nasSxu4?s;!KF!`E)atdQhwg;(d0%GG7^waM*7EoODt9<>FJq)t*Fk0lMLP3QAjS=ien zsw>LvZ%v1B99(81dHmOTblU6t4@e*HHm#d7@e`Aiw-!PXiP@UT6malWXdgapce7lvlf*^%mw(0mA6{V z#wA36O`i=4GSisG>O4TnZ9cY+x~5Xj=IC=4e1a{VNK@If1iEjNaQl!TgdtOFz|XfQ zVrQFcD^if?C#wiAF9L|m_t?k;R*DG)L7Q9@=qbFg;^D~Pm}S)w4(HjYJ15rn7egQF z%2i6jjCz-XHaEy5D?D});g6TFkOZa>=M)yBjj3dtV0sIPxcqP0jw1@O4eEvr#hjox z+t5SjU5`Q4w66w_5rS_Y7e4TFn?7D)kghdDhs64up<%BK5iyWm#3dTC9t^K2MPD{M zvP&>SoDB+|6}~hx>_`pN9xxshj+5r?&SxC4zA$!KrD&m`wvVb;B~#*{u~77=4?l^y zETMbQ7-~i=A3725qsnV3SkfJVuu0LykUszhm!(s>gm9KuA8+xh6Am|8b1ia$Lbnfm4r|NKP(RAh~|H?lqJtj zFp6q*>3hKk!@gx!hV8k-Noo=zU_C&W0+y2@ZQWiV#giDpS#4Ib+MH$jKFB{FHWVPQ zpTrom!&=Nf8cbBh+^t2@mseTn?QB4@)6~)QUBM|C36%qbGPRp3d3MV?`{aQ^<$gU~ z6^*yihAO=#H$5L`bu3TW31HbEp;X^^S#?D_&`hamRCAqi5~4Xi@5r!IY9b7{yT~A; z>cfs_c9q{687qEOQ`sC>qga2YvzV!tpQYk#LZ|afu7igYAuYw`DLbFf=nQ1ZBLWrG zy*P@AX&lE3*jPhwl=goL>$#GZVb+9|HnfTdef zB`r*=!|qP%1pPcKZTe_u^6^wy_=9zz?b+-3jE_y9v22+7HX^YAZ)Z?-iFHWZeCSKPBuVLj>j9-&2*R;L%^{xF{uFJoXJUrTW z;IZRro#U)nccdQapivBRjpIlZ5Wu{|E|gnrE9}^|JeN&ASVR++)?kIQVjW_3{fz5| ziX6N>tBmb-XLft}u=L*hWl#p^4qBsD-v%kV5dGMDl8Ott6>&>Gz3c1Y9jeJb9ev?4 zLhhRnS=ID-t*f2WS25q!7`V^YZM@==n4ww*M=Q1-t}z6iPxPMV`;ufGW3!(HNONyl zjoL?hYZr-3E7ecP9iL+}(9>8{8d&yL*7a-Qi5$z5nmN_`aKSaW1ESYxPujRaaL( zwd!e;z1IS8-^076Kur*wllbvU?DmYe_t$D1;GQWUO%{x(waI4KyafB9EU|M*&|<#hrR)C$(JVN>^H$g@oj1$L;MY@)B zRg*tS@Ayw9b`#n39d3;R{tivp_w^{E*(@9rvzdP7BTZW=kM|DC$Y(o3YZj=%NUw}D zN2Uj>*^XInPNm^hYD^X@b(4zWc-rJaC(P{j=r3ZP*~T$j3750Kuy;?14f>Kt{BPRI zAD+&1Y>!q|m<1*ot5yBWvBiG3NAGfo_LK}{Q7Z~|) zbOgY}tI8eU(mAbIZeUdfTO7Td8r3I9mwflYsfZB|KkMzSeY}ll%P#Lv>YZBiT)bm! zU00g}-S@LiVx}feQq`ic{LRp|fF!!?PUPLFNtpxzwJi%C48ljxwZ6#dv(yAJLIP%l ze}aJ?BAY)mEy_x2?6jwNhYR#RD6}cZ%2j<1&*KR^*hWEnK|nt1nsCu?H2H?y3;4pO zJs;ox-oL`W9cN{T;!~gPvA=_rTph^9%=g2I+GfW=)sj9$Z?xYO-R zaG|3|NRYNVxxD#DUjp@RazSFIQYzXiyc(08@TVi0Ro0u3Nc<6j)vP`4lH3a=HZsp1{(hsB}aNC(0! zL}`EH88r#Fsx4!MyQLTERH-uhMP(R`d3$&`$9Ql^H!m{b`pX$c{DUiCbz&CTj#ODk zCnz`e2jnyl=cT=T!@8vEPO>p&xn%@g8mZ3p93`_6+%U~->rogHPltePh& zQ#lOxRc64tazGWkd@;D3CmtvxX2r4U06$SB`IdS!8&Xq=Kj$Sx-=&oZNLZLh5rTkD1&R>g zQh0;!q&oOc^e8m?$%{4QHW1GDJz`q!(m7PlZdE_{=-Bcats=L`mfuy@(V+)QUSTE@ zd`n@MLli+HtQeqGG0Mj(8rKaw`pFI&@yLTT>lF9q9lupa8@N^&M!Vf=l9gHKCN|PL z5#z`)n}~KiuiTnJRlMl>O!vfqKdzhR7s@F{sw0Dx4K))Fa)?V2wt-rUe4WDTK*#A& z4YJ6PzNyAr4kGGK345^pj1MG*^ru2|{>L0DGR2i4nlYk;BvOn%#*W^wbr)mO@9MY* z7IJ!1)Bg!$ zt+L>l)4ct&&%0SJ;e%KPl|*>k>s%gJvG)u|xCJdBrHj%+IRzE*QkLNJg1I)AA(gm` zm$k~wUa@u4mVWmfnRrIgE2@55eCrPNvl znIoN;Q4XwxaEpiV8AZCx(lvo$`j8059&=N;(#27og*L$bt|rsvG>mi`H*8T9iae_* za+O&mz!1H9##t;YAcf#^ zb$x}nxBFV?YS&T>Casx~)v96}E2U&4Qo97+g7uW2kaH1!m~w6giKkc2S>%`M!qESC zj@DKNQ54^iFbGG|qUMDt84>^is&V0(bn@?3I@aQYhA2gPbTdY(>4@kn!~-R?OtDL! zs4y~0lCvrm;toaINS2S6wzTqtLPi@!oVl}16bvT+6t(24hNxZjOU2PL2AF2D{zyku z_MUZ(ocu86`_v6qjszT^^4%yB-xXJXp+vnBD@6fmYN#X3SDy7#)KB||2jj4lBA{0$ zE>5r*E+JEv05)2#YSb~KzQ*eX8HvP}D zR!cIPoLEPsK1p%N?oPZ)*FMfc6#1j0Jyi?N7v3OJ$p}F;8gQz0&xtmiK{=;Cu@&H?4hChwfxeCH$J!+o{36K|tl|#Mbk2P@3__ zl)mjTF|MV^cstk_-3Y&vTX(rR#aQvgJxQ6ai0M*kaZ8RqEibbPo#9qt)s4Ytb=4~Q z&u8l!irMEZUG;qBrW;uZrhPZBBmz-=wh123@1~Use zIKK}uqW1GtbTx%v4#PU{fIK}Ts)!Eol;~QyKgI!?hR&{M&U|$s=CHIQqBut4vgYh} zXP0zoZdWQQJ!ppU(TumMTaz4{yUm(%-KZU_WiK37DhW3kzXOZ;w@uv6R!hzQRw571 z`3^X+r0gD*aCA|v52UU*ls)0-2yM)8kS6DvFzO02sf_BN45apeu)lH>*EX0IoBrUg z5Ga5vyou;?ez!Fvy-&q%Q;pzT!WAhCYdAN_+!gdX7w=UjF{o5q(&Mz2bQ{`L=Wp*} z@Edg*q!AY3^i(1Jtv^s!@emK6LHDEUtIkJKAkul)LL60ik{b6q|;2oEex zS?Q>T&>zxybdN{`l)G3OTH_UP7ob(Em0LEU;#>z>WarsNUF2D|=4j5AZdGssI!tEy zJc|8yE;U4Q;aa#$`z&Eah2L*3X>M&U6wrBRu3@E#OoXVOm-nAwl_~l1LR8h7TnKaR zd&+z4@4hkr@v_xyHy*Szb`QPj%JSVQ#;FYz35kJCW^q>!9%A|TapS#d??RZWW7aSGta8{REm&ykxe z(96V2N(S{4os7`+x?23Xj9Q+$z7v*6Q_|8uXQ5Fj{+0JD)Gr>9MYl|@Pd34|xrTya zEh!@EMK&m0Gv6_*b7p#m!xu&J4{d!$R%6KznhrA=U7dRV6~;hj+G#5jJ{HAU*!U2K zbhcuQy#9N#_J~o*MpH4gIl9ZaZ4!@ktssGS)~LUw>z8{gYmI&y?abB>@L8Z>o*Ci>rZNNQw8LxQpe>8DkF#>4knQ65NN#!v41=VWG@ra zWR@@2)qcLY-2O5dizNatKOm6K=S<>q%=J@!o$iPDH@R8oBah!{N03;}Mxh8(>A95t zI)tvnQyB%;PtRvZJuL~&tDwNm-Dv{_kO}_S(-b&P>a<20gj9=Y~vqv00euYC)-Y+KEG&G;S{AE_B63izoR7At=5NtT*V61d-R$JCbECTRC0(^YyFbZ0^#U#grsBg>3o4qx)P^-{5F% zTep^73f#*Jcw3~Sgb;XSIqWnW!5dTY_zkG za)#zW=@U+NbLR5(cgvGs@`Nf$`YaT;Ig|rA#--$LkM)5T<9hY%xpMKTebkI1HCD{7=8~f&Tyh$jHEp+Gwjz7aPVedQo{tqN$SMK z-7UD3N+BxVRwZfk#L?Rc`x^h!>gB#qC%L4#xRPLa&(V6RMI9)j+L_46(4CpVvFZA! zNu|!*wwCB*6%cL=oGGKdez#VyO8q|520uAH0}w{s!CV$$k&=N(5U?9oO50&AK`yIA zLo?89?#5&zaNv{PcB}q1o``TDuRpxm2`<>rn$bf4{#$=avd=@?S&2y#c9Q#qk|u0r z%lU_Jfg(x)A75ObM|WfgN1AaqY=y;oPdbJU2%B{B0`|T8uG>yzo7#1e6KAQ&VFE(B zi>K7ly3((xb=fH&GJ@d94+AxUiwjM&6t9%Bp_BSgMJ#WD5BH&#dq8bV6BjrBXvdfujoGz7O`aS+0_8LYYW2RJJKo(dfx58xAgj{473T;FA zo`$JaMr21-q)tC{aFz8N<6Q4>BBqsBPcrUBl9pl!F>M|#u);+IP zDlI=*bD8y(5I#?GGZ44T^1ZX~u%#c^{6MQAcEMflKeIvn+0l>PQxt7#2JAic?AT?* z$X+|`5>T$C@hf9_hR$?X&`Oz`#|az}vD{FE1N<}cnde)PjWLds$8p&k6o8pZaBu>X z{cZ&gL5ORSFjbD3qxQ3=fkKhk#H8G48DIpjX}ewUj*^1j9VyV50Cfk2@k?Yl<zkCE%@erw)Jx4{&FRyM!iKTU4V|;p&(*1j}5+#+flSO6$%eOMy1yT z;u_@k;U(>MV?$usZKh;;YvOX}TL#5>RXM*+Bdd-K9;?OzRmS>zf14s$z0Q3-KF3}C zBV{bn(nCSaFCGP_;a>^{RkbHh8e!NmguyR)U;O*OcglT4O=~a1u%)A#&hqS_7Rh`l zX_A(4VosNq#yrd|6K8R^>pPX!4^2v?*A5V*`0~Riz$7V;Q%KeY@lR=BlSs}7Ua1Iv z0z-74nx0awGzTbeRT~F%^JOvCC z_>RM?AT>tGWK1s);!Y>{ez=tdn;}buj4Weq>&c4k#OE*O-LT)|3%s{TXxCnQOt=Q+ zd-Qx3jrv5My-B*Ovj=a^qV0il+DAYsc=v7h`k0_LpocN84K84kcj1@9>|ucd9Z?@H z-XGw+K+XQ!JAZ#nTPi_s-H`aa zZYH?*3F~JR*QlLEs-mD>4J}+gzhkBbkW^Te5`rASQReM81T$Wa_qFLB)b&bz6&fRGQ z-1kEGU#epC-OdhN?w;qRjdSXp1skk(gO>qGY#E-g9vOHcIz?d75)FG&`fBB<6af{< z(A)Lp&rz5Wn_nl)5TU2+++G8bYeChKEor>{;24Xvj;2HF@zZCEnW-s4W3Jj3;)nW? zp42w5=`EzK^Cq9=Dx}hFOm(OC3oEq95XA@vhGv~lYz8(wYvu#(fr(A2izBXgh0G@` zP<2F>w{nF^u*X4lM3Rm~X~H|v22^8R*&gi)$~RfMm?d-TtX^8a4L1?p#9y)oM5Ho% zFJ{UszHr}<$!P#Du?4~wzhr(3K^193&!j0LgB1%8ogh|!_!AA0l~wUYzL#79Qia=W z=9x0XzgLg0xVg;aW&Obz6&J6^YChz)CZSr_S+~4Z?O@K4>3QepgNTfD(~r(ruliV^ z`odeP_|`+2lw@RoFdy4h%dSzRoR>20oaP0}U^MjL9>ZN+|+Q1Jci-XVrEwA&7Z9n=hd64 z+n&y^*<&mO0Y&YmanhRaMGemPUpLBy8nO+=rQ*~Q+OWxOJGp)New7)p^Q4Yh!;lg1 z77sB51P5B2FG!UqGUEx zNfeax{I|$F<{qH zxTi{qg5fxw5TRuiT4hZ z{s)t%5#4uX`7KE#15-S!}a{X^G=re*GHw%T^p0VgTZzQ>1A>LXdtZY*Ua_>)_O@a8))Hd<*na%;;!bzeBrgPlXQW_ zEuu~1p(d;8dVpQ>O5>reB>)Hdo?YHt@)Y>dvFct=Xygv!jYS|cq}rDC46rq?7kSkQ zWESIZGM4w;xH<7xYX!KnPNdOpw{Vn)(cg|av#4E-d0d8;x67?MwY0{qs8);AKRi^n zCXMcvnDU~APx{tn`&AgO9~-lQySVVaqL;#N*6k zi0S+Xrz=nCKp2edH*i$n-Xh6&3d4NBl2KlyqxsKoKNt)= z(nJdW`<5R}1rn2*6CnIj3Hri+`a(x!Qe#svt}Xsw-+;I8ffZr)K1lNaeM*lE+Cl-c z!b=%Jzw@f&!@|5_0mzX09l==f~5J;PGaHTe)=c zva4fBX}(DN%66;e$d8Bfq?D9mw!yW|N^_!`f~dRotu=G13e(4jBOc*PO^)!bZCaSS zfW;AZK-JwA(C~ae4;720LZuw9q7_68{om0|MiA^3%B1~_z~|J1lH}Z-ELSp{ZM+$b`X(nK z_{@bZIF^wocnIY&>muw4+G?M4{ld#zI>lk1wcvGI&jB3@rH=cqNO+?q&eYUc=VCLp zrD1ti@P&qs`eAAD!Ob=K0Oft$>DmQV678d^NW%DX68`=%oSn;KgY9xy@gP;5?fly` z&gTeZ2CLHA_pq?p=F=u;x3|GhNby+x8yk8@FMGsS?fFsG=MGH#PG=-b^{3f_tt{(n z{4MtS%RsBkqosOuc8eKd2ZvZ5t|K8eH5@!Pvk;YXjYD^6kxjMZfJ?e>SD-~Z9@xvo zb6Z+_XLnb>C&<}s74$J5uIyL@TR(|sp?`q*M>L4Iq?E@Qf|Umpbos#RVk36>hhDzH zhM)hr)BhO(5m5xn9(P^!)NJecau3S@4PKGu2g;I29L45)nac>XxggSA<*+qhqlb2H&sl+L zc$riVk?npNCoJ;>!9s}DXez*LG8Yp{<92lydjlu-m^HQo_Zq%1oMa#|0EE)0ZDeV; zIIY%MXy09$SF2S)Difep|B8>Iyo2`AQz*_}G2{0y&k)win>Z|b&BaJt7Hy5qU7Yx0 zjYS6KflkP*p^;P0*OA0G`Nku2A>rXO^g+J1DPa7H?Hsx!6`=;|9_9_03GBuC5#wC-cEV3G36-lO!9B`72Fx*5C{IVGQvUHRQ3yISturfacJi znvCrGsV=nqhfcX;?)d6jb-Ir3Uf^``2p3hwSj`0oTP(;y!_6aJJb6?;`$bL zu2R=B1I}^p#V_=g^Q}}OU3a$Sqan0#9?A~b>-*|ic{~I3nm8fmmwdHYZMVk%97VYw zFbpknxONbDeL`PxJryrgt0w5NX~C89rT5}l0kfdD+7~kHbh^Fnd!FsYMd?E+_@m#L zEY|4GqF8rbtouy+dn(Y}*EH{Cz7{LZ`tCR1$=7>{#|8|E5zEe=?&=8`^b$h+S`|@W zn~e}n#^|^T%Egk8vS4R=P6_-AAZ)o`xpCGVrmxk&SE}A&=PuXk^_ieVlE>!5ihkRX zM1w7S^qHiS+T<4nA-%KNq^#{G)68D*vF7=mVblTxx?16%gsaDkb-SxU{pa>N@0_}4 zIn#@7-?61cr`BZlOHIDJPO~zdXYBq+@AtNC+||*Y({lWg?w3B@b+0lC^d=2U8Y63& ze29ib-Z)uae1uRc&zT~=@_~kNx;M}ZE)1&^zae7i`W(2^ske%I zlZxs^JqYm~fi-86_TSIKJg4vkVG__HTmSBOcM<4$wLck4;oi%I=#b^{p#FTHuw9=& z6^T2y9hE*5J-*upX(U^JTN&Yr2qlS!;ap`?gWGw$V#zPKIC)(Og_7YR1LF@j4lDeh zNEqnrZM@rEYF#y* zTOu%H65Cd|>TW|}J&1Jk`F3s2-@sgy{8(4y7F~Vq`8J~awa~|J9pH`H@@z7AE*m@Z zy0DkoPs`X*e4FM!e>MFWkZD%v>+XIJxs$&>=*+o8T1L3muhsH7=u1SWlvPuVjiXPx zIWQj@9-cZ>(*2bPT|SW8T2pV+Ci6i(;F6H_a;{IPMnB&}w)I^R@t)cX>lOa1ZcOHWvhbs%JaUcorzxXiAfW6#Dnp0dL$Qyh`&sO>Y8KUAL+q#X4*`^6u4=n zonKg}!CyL)Aye;l6M9M=AVt1Y!_~0$_R}d<&PW9>sOcgw3|kIZzb%wKEi z^9j~)uAMltc)>RV$kd<*e?x_NivvYsUXK~F5irHM*4YT(VYUcdLZWT^iy~@ic7JaB znbq`Bl&!A!b>Qx1@QY>I%>XeiovzP$3Q^+r%9FdGrjGkP+(=s7%Q(k)I4-eu8ep{1K-ugGf#*0AH_AULv=+L)eA{=fyb+D17OT445k_vpNU$OAe4J! z>VEI{y$-=Nz?mMJoWzC2D5&W76S#I!#1 zm%|=Ak2_GZ!kM0njLXAH;I$|B+Q+tC(Ge&Y=5^IIj#&pEe^;n)g&UT3IC4m zwrfTzscu@b3wW#z`9}>h7V^Xx4>g@mC(*ZcJpriDd)_p>?m9|v`0n1*X*9lJ(NbKh z(9kq`u55dVwXUhNBmeq!A+^~W-RmiW)|s?O5TD)VC_bdltX{e3F|Sm0{!&atq-6RT zTW@);ygBn(x%6kU6nx4fv72~9*ig8`=xp*prjrF>JC72`qQ0C+dqbr`hyS-Ky-KZ# zPm$aJw8|3~0+i0my*IsOa5`C;?T1oDxO#{Bg*R^YlQsj|9rqaaCl3v@?E3)V`=fQP zC2XVi*c-ver?s0k+~wHe8TpJquL>EH(bLmV^3i7FRiAbu{&AwXX6M5kxhVCb1{HcQ z@&ap3&b%TJz9nR>4Sr`lRma1ejts;G&}g!>^pQzuF(KwH1}SZC&kb8%C$4l@64=LG$*wo#=t`u;RGiw(YMJ z&?*N6(nqz%)BqZCSatXF4=j1LIU-1Sg=XD z0Lml_-um_H*TUKee$&zS_J&=$Y4&+7WK6B?u3(}-uNN)$nsqrNeh2kFUfT}DYeT%t zz1MIsc4k|zG{at1KOFtc%~132L}@fSpUc@K4>9GAJE!Mi_D~46X=s;$1o0bg5j~lU zwIy893Px@Zr!sm3_p>gsvRX`!gzO^OW1i^4lrr<3Vox-Dd`m*M(NbFHO?bf~Z773B zbc%xA8Q5gX8B<}xUIL{RlEj5ltRzMc^+NNlgH;5ryUld0MIAHswx89c9yXp`uc_-c zT_e7gYuG<5$>TD@4@05IlJQ40HcOYx@Tqy*15U`gGX#D*LG^mJYnxNox8RhA$$rY{ z&}g}I@dnP+%9_i?HXmL1^+k32k7f`V9h-Cp-s7l^Mc1_@8jV|Yd<^wKe#rM}DZCKn zd8?wLf&?~+sFr+J;`~hRfFWBM<@p8v!hxas5=Wo(D0-R=br6G0v=oMkx1cJ#)J4Ei znyqQ6CD!4>&tgUF6H@e@R5rw?oz(N1NZc_Z-`=$s-tYClNV&c)xDX!P@9Fx<2|h|9 zi+@tnP^1rnIQ+C)X78Rm#k0)R?>YVcyJJ3i_%@iJ#f!dPW&Wp5`Oj~U%525$CL1Ku z09WdmQ{|>Y4T0b}qZx4qd>qz4q^ovJ8xVgkIc;>wCp4 z9%rN}o*Jh`B)-QLDJMljHdQA%2HS*18BXvIe)&Qd-=a{G$>Q zL(`68c(Z9;`;9`s)YRkmpG`M#s@BI**bX1lothhM&aRssR|-dcv61`RpZ{1|)4uH+ z7kn;`lpwsS%JbE3b_yUEnR>NGOJjci;rzVyRTJxAf|5{hhi6*%&-nEAE}$YVj&b+# z#P=IK3j`xOlVU(n@Vd|Zqlp#rMJMNHJMrLbN@8E-EcIv^y2Ip6E9T~6mG4a`%Xl;5 zr>2X(Wejk#1^|z2s>9g1YTFKK1eyYNU2O|JOYT<5)oMd1+jR74)ccS45cALh^o&*E ztW>$5r`sSozZHSe7pu%KUml-JzkX;^Y4K@${}3*oCmM0h9{Td?f=6ra!y0*cpD41p z+3a$tQhXa*_hFbCo%<6?`%6E|p|&h-v8C`;rP#sS+dpZi3m1cxBuyLFZMUzc_>{Ig z^Fx=ATs7_pHlOa-O@Q;K#CHi_?|1K`A%v!{mLhUz=f1lN*ac`38M1DMWSQQ75O+$H zWE}K-oL688i^Yk|;ntqV8D^UbHekFx_A`5HfqR_-w@CS!)ZI->_vu_O(GFQsf9iL2l znO5;q3N?zLBsu1m94i$bd69~Qv_xKa3LoT)n7!R~nJhG~+(^McY#LG6$GPE?v{jxQ zaLr|K-JEp^?<90AYdfo%}w zZThL{p=j_L2(!_=)&$&Y;yJCFk*YesY|y&8Hy@)g`CM9@q?MUd;oa-!qq@&3<1mkY z7?qoQnd-bC$Dng{>-q#NVzEOZlKs~6V4qM;^W!jD*V`c?%=<8hPW)#VymIA!li-V@ z!5L){R#`)R^!+XgMvevvd2-315j47M52FK?jwB|c-;t$|(1SYt`rWUbE|RL(e4{;teZ8L+ez7j%Je7O=$T#3W2^KFPg5@`4QoHDb<`n&nP zQBdp+D(eYyWO(n;iyP^@3a_NG3?qHzOdzd)F5Q5Kw~_hC)y?^?{qIkzU;GUeT5>aZ zj*5~7E{>D-fT#bFGhuZeDrdstqWuS~j076}_BF^uSvw>?s2<)1vDOX)&P()Lh34b= z9vsMUgp^QPGD@BTiu-xLqI9eJer@&yGQA3eL0YC=b2RN#Y2$(jHYtguVnbjpH_f%!YDT%i53$;v5{GQ)X zs89|HOkR~hjP#*^r!7YDdiGngJhJP;(}ilnB4`Bbm|jq?KqO?6wNve&*hutwjR=HTi2 zY<~y^5s5#!ovsc+z5mBXVSY@=@lf21qkq86m(R~L+d_F~Q^s~1uW+++L`PEtF~S%aI|bh`S66doMrRYv-hDP1%Pb}CYBU|UdAe=) zoT%4yJzDQTb%xCJm2OjDXkfuhVn;XUS|13cZ}CFmOYb5E_0Lc(i^1-g6F~`~!Wc&9 zA-Gp@>#4su*FE6Z$1_8raf|+nW#yqcYoTw5`E=pNP*J9{+QlVf5w{izwH^h zyRMLts1q<4B2K4q2Fz>+WPsM77)F3dn#!WBnI;%*@5~3P@ipCGy0=h`8^Yio;DSF7 zu?KE$ZhAEOJij-aE8`CO(4>y4sV5{aUuC^EwRZQI@sVnmyEnG1vL|RgFd4$^u`;M| zOGZ(+(MHteYm77jmL?n9cn4z|MIs=NgXRAhSY|}{o%x*6E}$^Xa@k@#kz+`yT}H(3 zQ8GrKrqH0H&1SKprfb^hGD_1U(hdRnJk-_Fl?wF)sX{`%ZnmEDC1{09{8rg!r5KSyHnmL3ZE;t%SZ9it2?}_^2LCEXVTwsU zdl2p^@cpy6cYc=~%)IxwI5;*Wdb;L4QK!z@Gh*0Z3sc8$+2y*%xRI2UWE-R73ds1c zcLucK3e@`KWr|+jf6(H_?j@9Sy-0Lq_A;>l>p)qnw?Mmp_F3F)Mk&n zL&uIREK_JX6`XWYUk?!x5af&M0)`FkQIalsWm$ipmSo=F zV?n(kDwr;HQ)!R|iqh*)ZdCGAs8s^!n$KCvTVX`hUChkPCINPh>9A&+ve8=73D9&w znW9fcI&_M^>HD9fQ;^Zom7R&BK+OfC_&ZdyfRJ&(-(&(6jXd;fjNCjfX((u)EeW@P z-z<6G&i}&m(5G4VKMoorcNFh6iIkCc{E>xG znb&$)(WJ6G_PuB=YgUF|%VXebF3nLnv_H}=p+R}hAY%tzk}s^t|F1h#|NrT5a+WN{ z0TOPZy~Bv% z5N9qBtv+l>iO5-jSyRQWgy^zSaItK<#9W*|t|C+8Q&>oqJZ#H(X^|bXw=WehFT6Q! zin!dku(A;sNJIpOf$gx1iEy}<$cR=AJ5vF>41T;A{sg`MP{`rpZYNXM{SU)wGu60t zt#0DAy)O|a-SB%86XWf0B%E3YhnS=^(~eQE({Cgs6U3yDri#y0LBC*mlc$>`%Ha3X z!^Qw>*CZpR+86*Ao5t3|pVu4do|8?(Eks85Wx(9wv5&P3>5icArZQ)=lJ?pkBb&S} zx!^^^fW9yqrX;Cc_5jm28QXvFc$i6j~+zb*q~2}k~aEvFM1YB?VI1@>|OW`DjJL$`}EI`fL)e=Wx?2bxD>EMv1_ z`8TyxOb0dD1oF}A|I2KBd&`Ic^?-p1{W69B%8)?bsaIW--$e9(5>RafLIrKBnra;S zSBC5wXevu3k!}9Rzk;^PL#-EE1&AzE)jCOZO7&+G$ ztqQXk|IWFPP)PU(F*EV1Wg^}=6TQWTB6~egtk^BbRh>+AtWTP}pZ35=LRqA<6S;Xl?ZZc64Nk#qTIvq@rN-^!z|W!wTEjAb~=$whJLg zM+EuCMr8c_O7P*63TQ!`o@-*%ch)!NPOW4x8I|F^P31p6FpgN^-rA0Ir^1<5xhUXy z=<0ra7E^Ww`aS-#Z@*Zf47Y`I{F~N0)A4`uLUthx4~DKGb&$xp@CEfu2>?oS#m8%N zm6wo}6=gUemun);_WeU0(}_k_D6V1Dc2gzf3t!l^ULDbt(&hODeX#wWRQ*J&cX3Xi zT^3WX3SC^wqi{8x1MFWt#UZE#h(v|H&xb4UsHb`#X5;gQd;&}CoGtc`cYL_e?Es5B z+fUOZF_>ea+rIC75fmrrqPs|Yj;>i$t!)4JC8n&u9zz|%W}!wU=bAVmCQr~eExuIC zjf{PRz!{t19)_T`z)G-X&Ssy*M5D@=#rr6HUSJQ6NWQ&wM0As`GE>;=_??_#M_^{m#l{)w~XO}ytijF(HwZo*lW3T+|kPiV= zQX)@;qFmNF#}8lSFzqr^ffn$>&#O8({6|(oG{i!P;9i6N4zsCN+3NVsjuHIkv)K0J z%M`*D;mO*uJx%_b_t>dv)?G_|=3Gy52lE;nW<)JGq}WyE4Ad_GNQqwVNW61KTie*5XGg(?PT6+{BcUKnhL)9v9GXdDqpLS> z=-)^P3n^o{L5zsN6?DAv@z%>vV(%5>E%;l4f*e6J}=(R zIdE1B)%d00qi;!rlhhe)dWri}L-|(8l0bP80G_di#5RRKIordcsd%JO| zJ<8v)W`2Qsc}K`k&8=_WV7fc~{0#hajU>i@cgL#>Zin&)kuWiJb}6Q3%}DU0d;VFb zWVY~1FAo6nCG;)A2CEu5dD=)E{|-@(!0igzAqMN_(9zA+B=& zNo_GC7#%bJ$Idr|UyPF>aB$Qe3E4#e>Ifj<-WYW$% z_7oBm1n7HDwlcn$Jz4V%7|@wSJyf=}bbrr{{vV?b_PZ4GJf(^n(YzlW^x<;8dNUS< z{3Gufu1))SriuM^59`fK;hz0sZ7VAQx6kMG;M7;sIqIQ@;&~JOKQkmB=68@siiiOuZyFr_#zW|f zKn;IOazCN-tB@kQPvltHQBswp+f^g$Llw?gY@W@pm!T-2olbzqLaV24%1Cvw$KzEI zxtU_6Y}2ajUf6OjsjtJklb)8EiEI&sT+77qk`oqWWjIzX0XDob&S&7!e5>!ygk?<9x*xH3)9{ z=I#~!Y$K_)R^*^kPpV8w=apPD)Y!}t8|yrn-@!pTMRMrNa*li6*N!mq&*^rqSexwb zyBL>E<=<(nJa;EU6=vVrX{>^ZJm^J%nD0m7{t00z-|jKU(-bA7I54|671DuQ0tG(# zYSmMmh*>FP+z?CIncFYlVDWAC6-cKqR&@pyjKN>l#A-Ry@2AA`375V}|F7h_(0B#c zd8f!@gNzQQ$dR5aCIv`O$x`(sPs2fOLPARU>3(d5H$U9j&O!ezcgE9d?)qen!jB_v zhY$B4^w?7Kxvlk>9Gj(4POxjDOl&v*q?2$|7eXJrcm%B z;c79r;`B_dT};GvNmnr%et@IJtmsS!C3D_kCa}e{LSY3SrX!S$Tvo zg{WAzFM1Uf)aIkHJCv(>z^{VNF$u6i7uZUrSBy=xM7}@voa)NRfPeH5VSq0hl{_Ug z{hPngqfLeIWjZSE@l{=p{WeIZeSb%MPE0-BLydzL!wO}aWk>|=Qq#Xvj)HubIMx^d z1gBV+vM~9IB2~QF(m{$dcmF5BE7oeg8CZ%PK+pEZK4#2&67yFU%^U0a^#bQ)_dmbl zhPdJ~OJG__2qgG6u|z-?+AEEgs5}kkn{y7olke|x2%awNk#4L%^P zy&c$-czL^Bb~zcwbRo#mzYhXVg&3aw&LBi@>lkZV!aq#sA@`%yHE{ZZ`n_xq;2a43V)>Gshx=6#iirfHWD0%=#J^l@k;EwnmS(*>JU1V zrsryp6c{VO^yHdnH>bE)C-&vC+9&_BPFf|Qf03&?n~2Dv!c#XBRuU-;FK1~VsDGQ2 zSMl5C!F|`9eZ3>;7o`9Q**#avTmt6%!K{@pO>>7w>c@9|Q@vc7(0=@Gk*YZBZs#)O zY}_RwxUg{VK}wUjyNc}?&QYRGO`LI#Ftuwup@+mF&Nx&WNnbP6D;mo;f-WyKRQ9ke z1=|1l=F86&F@DWyLwk2)?jhuxk55;uK-t)XPdP(iNlF!jOJUH-x~*z_+mM4?@bS&Yz?ma zmTV|ITWdswD~+w2EiiIP!v$k^R!YD>2R9ZzDEO}3#uP8nM}~$8yU13Yd_0CEe$A2% zOz%&Ok4XvqZ@H*kXbQa+o$fG7~<()RskSUvS{+~n5-S|XZ57Ch? za4G+ZI(T8FiRm;-B~A)(v@2s?ELUGmF!}zFn!hp-D3nKv0p7S<9r73zVb*CJ@Ii*? zeXcc2I;;36)Zjv{HGi-VsbLSO2EagfiGj%HU^GH?pK<*PrJnPM+>bV(apSnhkpcD( z-6tPY%+^R}cOZ1J4Nl>mTcw) zP#O3L+_@LIsy%5PP^=V+64QDrH{rgC-@~yLSOp!3x?0T=IItcAQ#nQakTxzQ-Dh+U zDL&du41mES?;*3G5~9sjqysbYKl>>THuTVzul-F2YYSA8 z*yFMHrYnqI?0POiX`Gzzyl+Uv0sI*jRD#u)7=cG3vT9gef%FEokC;)P!8vXZGO5`<(}I!adOF=R1i5k?ct5H@3vL!DFBiMeO@SF*4$ke_MZ@7dLI@H7 zC^_pO2Ckyh6aJBt9TaKifjgES=88jgztXi980y1i82ft^{0G%Y?8=Hs4+*HH$g|hN z_!;oZKT6kdGNOwlr9v_Bvh-7>pCz$pXbkxSWSX$j_lZ80y*St~lrknQN!7r_a@_o| z*N`&yY;jzwEWoUSr;Sd%4ecN$1;<@maM`Whp3ZJ`mDy~G1EZEAOZcZptdz7?wo*r^ z12Ud7A!EAIKS$!uL+I%=QNdWPP$A!gB*|D{1>tYr_gAtQq@-?g>s zw9=IHF2yHYtgy{@m7Q0_Sl>OkZC5=z&uV@E{MH-rJ@Z?T7Mi7SG+axHY+JoA)GC^T z8ji>Zy=(>T%8qck;r|ogBtVbal%=$)*AuI4j+`)YD0xM|s7FT!%=A&&Y>74=9=)fX zfxeIutk9ilxVH3T6QQg~?5$iZnXBSdNL`(GEWT%Oi6z$K_5QE3iBFFbUZ+3(Rz$^k z+PLD#a-TQ%PK#hhVzZ$2*&qI&_P#PMs_xrgN>TxlMnDmzOS%S7kdP91=n|z{%ArG0 zNd*Cs20?0wp}Rpq=@O*Dp}QHld%$@9|IdAM@7w#EcXQ_KJ^P%q&syKL)_1K18Ke{r z5ldZ_J2;nHZNNjdGmIfglc4tjmn4_{RUEkvPwGu<60MJ)g)4d;lTBZ$4{N z+rVnEM98}O#8UI%$5|P~bDM(npx=fZi-2=;gtf_ZaP2{AW zU>^Hh6rdiRvZV1e;>F~)xqA~%?%5K?ft}8!x^3a6^*&;({eRdPAa`TJCE}L`MG^1T zN?(47bP+$ac)NtDMt;R=Sjx=VoraS9+Vue6nkpWZVmXa9Y9X5+pA6GabH@3e+gxA= zRp8S|hzfm^6Fxy$lf4iP$;c+#P%C4j^7{I|g?|=imCwQ-#&EtSVES`$)SKB-mYH1G zDk%5H)HayFv-XX)#2-J2ksh#F9Yhu`q&VuZIJl3!KXYQS{vK)t&Ks)#%M;aG`L}>F zmDWEhvHBr#fy&~EVK%yDWRGLF8r-$uP>mD^*wyN@36TTP#DeQ*(5P0W6Yk^3?`(p# z$~VX#QJiJljI@6&vC^Ccy;6F$J5655ls2escYWL^0X>=UYz&^vIGmgw+c83s|6(u4 z|BLF(1i{9`+}heIFm8gL*ezinZF?T{-0b`16q6_2_-^EIVwFGj@@JB?l2RDnRi&xI zHrm!8I;9d)r}YUjS$Sa#YW^+L@5Rg`6PW(~sTHe`(CC@NHxr zdbjvC=7bxP4-*rUUR<2EX`SNDWHh^Tr`dQ8=Y6jYE|dc-*=HRW6Ke8y;TsZdc{sl* zGs*KAK2G4c6RT~_{Na6P-9KVpy@)ke;KZIsapBf=6 zOF(0t`|$0!u`T(Y&7LL`l`0n-v9*3>Q=^Wk{f$%Xej-xRm(VkqSzFlZXSJ%U*TU|8 z=A1MEmCzY(-NGAUr2Itc1o)h?YV7*tC00RGQ$%CJxppftciGMRSjdQp(X?H9=d}UZ zVfn~;nagU(wfyvmI+%2D!fH3WuGn40o~xOI1I8c6Z*$q(J0Hoeo?AW7C#7SszdDw= zm%wS0)HD&Z)6lOh9%w+m4@#)QYzys%VKp}IXT~ZNG{xBZ&raPjzNKe(Z%MBb>DLIm zte-waCV%%YDB$8X?;!$y`JwHM%*>Kejz!89OacV0`%SL94`) z(Q-%>n_SO6#pZ{{g-cU|bL#zMhGWNO=~&<>y0mfBC5N?ez~fQ;`Xqa{tu9q(;}qmJ z34>%6-7*~fyaaLdws6R|hR|Wc#xEpycX*Gz_d0bqj~zoa zI^E~z$qU_j(Fv+El1}|flO_q)C!xpsHc&)Q!;_X0s2qK*^=Li|eVNgrUEOp~gMVeo zA)uasTqnUL$n-oYJXMX1iVC=!&raH_-|*^$%_mUehgjODNXlwS#1RT&sIOf1xXIvisuJ5!t_xVMRlUb zD{2R)$J$42!?R1d^=aXvuQa^#)R$@f0h3hH!Y%#?YLr^YX|;x>LgKpU4o< zi$?qI$C(o2rsv$y9q-MRd&*B*+md3mOfB-DC$BTPpD&cTId#nf0=r~%kqL{o(a&!; zDELocPe_&p%vG%QdWj!~)Aq8zQp;2v&Me5k;gsN2V>(r$Rro}xav$;9D!)d_EV2`a z_Qj5a-iv33Vr-B`z@}j(sG3z08&5HLNI)l!zGz{A7=*Ld9=b%^4z3R_yLx6dsO*|V z{6eAk>skG!adC>^a2r2Jc7GpeTQE}e0&dG!;fz=Z8XFNVixY+6YpyZCg%*mgj=Fr zL^hw#?3ja)rgf&OZn1S%S$`=yNlnFR;7zSs56as{wNp}wiB4rpX#<}~&Az2m={y3J z=6hkD*n>~pu0Z#yDKzz7kj4qvsak9IQB~L+{{v)XKYw18@Zd?6C3jiIb{whR8ZnHc z1TelIcsd{HJbv_ut?yo69(?m6p+-~!b)^+B6&QE1f#z;s=Pd7h!jcpcx{GI+&qM+^ z>FV|$OlG6inua#FSlHRQ2TgX$-=?i;7;0gy&sUb))h6WWuq-2b!W8Nkjf4ns; zp(CO>kUx3p>j3#|#7%+aMKUd->({M6mK6&OEmu9QtV{B?fPZ*$vdvlTr)yg|K_>b! zwTD!_J$mV3`-0-fo)Rn9F{-(s2)#gu!b(%sz4tVr3#Y*TiWfuDm)DVZX4~I3MJPzl z3AbU>dSH4U@0PJEOtgDABA*1}9pw(=cJjR*@=WdNqPYl!gp+S{FwK1vIrHy^95)Z$ z(~j~!wScXSj;5GQ_qXvVqRUp$%D>Z#EV1aHto)=BnE$xObpEJCCX_l2L}`zxa++sf z^T>HS9A!x;)=G5B!_B-i^WR4vrjz(Oi-7JMpM(jlWqv@NcZKJ4T1%|Pt3D}fkIh*1 z&tE_5?+$6HT36aDN!5V9xJ+29YN%wqI><>)UzT{JRT7}k##*tUDV)*1XermZ0+pi^ zETCJj-X=?bxhbbTafGT{X~*WXFrX$&t+HTl_j`YA1P@a#_^l zBEf2%2=#t%#|g9rbJo3SYZVRQa(0ipmzDKO6|JRN&TdSHXXS8Rg*}LH+?#Wu`%K$4 zz@oSMlg-w>Zt?K8LB|CT2=(ZaI%v{x9ycCyGMg;c6iW^Q;pdW!r^ya!cPg=DwhUYj zNk@R1sa;hn5ccF?XD2a8LaaOynyf?bGjZLRqE=U)sNr?EpX~gRpW^r=m_lTaaxUkX z-SnARiX<}dpzh3Ffm6da^WIVI*$iyDEX^fB_(;cKc`5z9=;;Xe;BK+x7)%fIsFYy7^OYwTx}T0cwibrx6tP>ys$aoSSJ8fu%Dhj zD~s1~;{Fxj=E#?+t)7c!2H7@D_w2IqSmp;D<>ZtizmPvuQBjeLyb(t2xh_j^L%7QY zKjNKI*%xO$N1bn{(ZW~BmlhtRC8i0lwhZtoj_ZlQb+N`bd3Az@oMU$5A|jIQx}S<^ zSVO!~8j(4s|BG~_Uh7RXBUB7q4qCnPaOieI=+mU4y4*(Lydp!^@9?6|rrq<%wK-Zv ze>=>76Fe_zcNz<%J^y<$Ci&BMwFe-v)mi*dij7$%YLO?e2wi%4Z{t0B80K7U>LLs~Dag$Z_*tukNNn5@1suakh+M}DXBhTNL6=avKtY_n(q zgIefPXAAPeCv_fZAjhgM5-8^U2eb2H64Z&JssKRW9l|TS5P>N0?e+@TR)kqNwwKRM zEfh%GcmTqfiCV1VfDwcOK`1bO6M%8C^jqbW=U>nNfCLpKeUfMYkx4}oeZ6iU@cfqW zyAF-{LDOizsHmr7aRwgKLTrY$UHsN_Ujbcav*CChk&91$>W4dP$X7(Ma1oa!1i5wy z$@dM4DH787k3RBaQ483rgwKzmK%WjIunwXxi@-q}|!mRg;aD<;+bgJh=nn4Q9@VGnnCN$B6Rw1S3>gMm zk*6pnRJu8j2RvR_FvoKXm&h5i;d0-5RMW6tBSJZRr4}tl&yg9x7df#t<;2C6p!RmA z>YYX{4?!deujPOiZ9~13!<`A8~#%>ws@wb*Ig+{C2`Cf&*YEH$fLsXR6j=cfMg;9r{^a@9%Yv(arXCFXIwqQoY*Z1ciOJN_2`w2k zH(#&jWDvQlR-cABC)|kAb};Q+jAgT`;wxRU-35y8tnfhVvt4`S(Ul&+2qmC&gwvMR z`z0qEja7fD+1wYQR?!)@@ti-^h@)ylx%xjtec=z+vnR>IfB5CVmNJz^1T4oXu2Ate z17vq|(=D~lmQx@E{S&UN{X(W6zg5IP-#vJ|_Ey$+c3*FKEx1l5-*5BlC}JGUA_>*3dYkne;D}Trv7yST3vIQ|zipXs)FS*FSjDxJ+_| zJnA^cSlAS0N~GtS8wz->F+lQ-^W18Mawtg{*ik==(HqkM_KM- z9Y~MZadILQcfhadwjN-m@llCwQhF^a%!{49N=25bwzMa5Y(b zA|4)i$BV25y?7Ace>3qER0|GBM0o+Avecnd1P6jVXbqwb36~uS{@J!w4 z6GUl%dJlBk=SeLQ5k?PW0%o-u<#wB2sXPdHd27UIIrcD{xc%EVNgbIxef{?a;n1d= zi87D3_finf`h3-H+s1#{9HC`ll%tpJzQMh9$%fbj{Y!%TdXA4QiIme`9|x#b_<78i zD3_O!b}6F%@)%2WVYKI;j;>tmc%jI!+<2O~`J(r|OOJ=FB$6Rg1NU+mRS5Vfn7-$m zw0$RFJKp2HYTYgM*aL>VUF%B!|MF7~MbTa!2VmG^M|QX;*%z=Vp{$;%Nc17I`|f%L zh{*43*Z*oT9yF^01oto-^aGth%!LXA&p1{Js6XcH4=?}aEdo1*>bVKWpXYCc2gF3i zXH&9we}++zfMoEl(2C!_s$?H#Fe)xJPFwcxut#8OZh?ghQw()Dg9wazV`+Nxd`qHs zmk&3Xx^+DEZ=(Hw7WAJx^grE0z7i&*|Jp)sVfEiiD7B7$SkR0ozKm>h6f?>HNfpbKV6-aiYQLkOQ5Pmd2Kd*a&M6$TB>k0pPRX)@EzUWuu`stsJrvn{i+xzZr z(t8G5(tvMy5630hH2@epWr1MHyL`^lJa;s>V!GsYH^(#Ak}|ysijwPCzY$ zL!X(zAyUT9`CsKCvbE^N_~@3s6`KGz!FZR`EaJT?-;Y4oyw2uv=Ir63pihYBCq2(3 za85ArChaPvGbMPfzY=}X(T^&S2MGNF1m8!`RGOQf*CjMrO}+Ojm)7S>XCK$;HwIZD zgF|HjImK^Hy)~n>nYx)4m)4*uv`3*#C&f_;cCf&!F+o)&H6#mz4 zBb|{;q~9-(^`8BSN|=q;^2fOVy&E31W14Pp($0@2>e%rCTZsN{m8A}M-WZ}|x&CcQ zFT$@6qpF@hS-a|zo|6U9t!(mQsmnpf()y!PiYOdz{(F&&??jUZj`z-Y+yKNk=GpbKUVBnye8-pNWkW7pZzY7J zVl?N5cvK_nxjl~LZ}DdjwU^PoYTI8=@RaIEFn32rbqIKUCE4ebeK&Wd}Cvi-(bA4y|31=(ZgPHy`d# z*POt$;lSkeg6A8X_^-duG-cv-u>0<;!$oJ`dbZ##G`{jv4#B4sWc|I#6WNJq=fgvI z+XQl8+5$K^>X|Wm0Qt& zMAl9PGZkH(+xU=9tiv6;dx^@;4GCD15%JmLbq`~g0*K$#(?dwLqJQXC7d8_l7nVW<|qyQ_0y&$k)R;A$2FV7Wp9#2WRL0u>ym=8)(gtRLmsLIww0w zGB(ynKKr<5rx9n&G~X~jv{Es0W1#JdlfvSc18Z63=M}BnVTBF{r%24(H#*w{BEx23 zKbNz^AlPr?jT%mrul25n#eE(-;1&0twD#DSLX(bF`f71lt>kV)AVK$mhY@6f?bl|K5IWpf9Px;u-xh7O#Sp!HDQnH%Yq{< zM1uy`hw+jt|DqK?X+zDqB~e8+CH!a>(?MLzs8u$Zsgnhm z5t~J|9eCHDdA@&td+Ir(O4Mp!f~S0KGrWkuN^dAFJL<1f1Wdw+&!xpS`qJbNdb@-b z1@^TU!EY3}p@UY@Tb_SMnHl7x7$O4-^?oTo5*%JjwXNOQS{0{@-wt>S34Z++iKi#@ zNGxcSoSIzYgVU&JvH>LprwT~GDk*zCAqc^N8py!+x#|L z>LVm-p#{%nWG=hdwYR=m?{_dagHz-@ljf>9YTFEUhs{v2)K38K=BMuIN53Fk;V3yg}ZJkoaiy&R?~;3G>lp;P)>tSSSH zGGAIUoBn-2{rF0qOJ)=MCn#{tbM1d;Ty&8Se2uf4vVM^0Ml0Zhus@4o<>r&mJ& literal 0 HcmV?d00001 diff --git a/openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/service-connection.png b/openmetadata-docs-v1/images/v1.0.0/openmetadata/connectors/nifi/service-connection.png new file mode 100644 index 0000000000000000000000000000000000000000..7415706c995446002957db49bad8565f2bb1949c GIT binary patch literal 45794 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 literal 0 HcmV?d00001 diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Hive.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Hive.md index e5a4b6aaaf9..adb9d73deb1 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Hive.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Hive.md @@ -1,78 +1,67 @@ # Hive +In this section, we provide guides and references to use the Hive connector. You can view the full documentation for Hive [here](https://docs.open-metadata.org/connectors/database/hive). -In this section, we provide guides and references to use the Hive connector. +## Requirements +To extract metadata, the user used in the connection needs to be able to perform `SELECT`, `SHOW`, and `DESCRIBE` operations in the database/schema where the metadata needs to be extracted from. -# Requirements - -To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with -custom Airflow plugins to handle the workflow deployment. +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). ## Connection Details $$section ### Scheme $(id="scheme") - -SQLAlchemy driver scheme options. -$$ - -$$section +SQLAlchemy driver scheme options. If you are unsure about this setting, you can use the default value. OpenMetadata supports both `Hive` and `Impala`. ### Username $(id="username") - -Username to connect to Hive. This user should have privileges to read all the metadata in Hive. +Username to connect to Hive. This user should have the necessary privileges described in the section above. $$ $$section ### Password $(id="password") - Password to connect to Hive. $$ $$section ### Host Port $(id="hostPort") - -The hostPort parameter specifies the host and port of the Hive server. This should be specified as a string in the format 'hostname:port'. For example, you might set the hostPort parameter to `myhivehost:10000`. +The hostPort parameter specifies the host and port of the Hive server. This should be specified as a string in the format `hostname:port`. +**Example**: `myhivehost:10000`. $$ $$section ### Auth $(id="auth") - - The auth parameter specifies the authentication method to use when connecting to the Hive server. Possible values are 'LDAP', 'NONE', 'CUSTOM', or 'KERBEROS'. If you are using Kerberos authentication, you should set auth to 'KERBEROS'. If you are using custom authentication, you should set auth to 'CUSTOM' and provide additional options in the authOptions parameter. +The auth parameter specifies the authentication method to use when connecting to the Hive server. Possible values are `LDAP`, `NONE`, `CUSTOM`, or `KERBEROS`. If you are using Kerberos authentication, you should set auth to `KERBEROS`. If you are using custom authentication, you should set auth to `CUSTOM` and provide additional options in the `authOptions` parameter. $$ $$section ### Kerberos Service Name $(id="kerberosServiceName") - -The kerberosServiceName parameter specifies the Kerberos service name to use for authentication. This should only be specified if using Kerberos authentication. The default value is 'hive'. +The kerberosServiceName parameter specifies the Kerberos service name to use for authentication. This should only be specified if using Kerberos authentication. The default value is `hive`. $$ $$section ### Database Schema $(id="databaseSchema") - databaseSchema of the data source. This is optional parameter, if you would like to restrict the metadata reading to a single databaseSchema. When left blank, OpenMetadata Ingestion attempts to scan all the databaseSchema. $$ $$section ### Database Name $(id="databaseName") - -Optional name to give to the database in OpenMetadata. If left blank, we will use default as the database name. +In OpenMetadata, the Database Service hierarchy works as follow: +``` +Database Service > Database > Schema > Table +``` +In the case of Hive, we won't have a Database as such. If you'd like to see your data in a database named something other than `default`, you can specify the name in this field. $$ $$section ### Auth Options $(id="authOptions") - Authentication options to pass to Hive connector. These options are based on SQLAlchemy. $$ $$section ### Connection Options $(id="connectionOptions") - Additional connection options to build the URL that can be sent to service during the connection. The connectionOptions parameter is specific to the connection method being used. For example, if you are using SSL encryption, you might set the connectionOptions parameter to {'ssl': 'true', 'sslTrustStore': '/path/to/truststore'}. - $$ $$section ### Connection Arguments $(id="connectionArguments") - Additional connection arguments such as security or protocol configs that can be sent to service during connection. - -$$ +$$ \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/MariaDB.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/MariaDB.md index 0ba877ed3cf..7053522ec6f 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/MariaDB.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/MariaDB.md @@ -1,65 +1,68 @@ # MariaDB +In this section, we provide guides and references to use the MariaDB connector. You can view the full documentation for MariaDB [here](https://docs.open-metadata.org/connectors/database/mariadb). -In this section, we provide guides and references to use the MariaDB connector. +## Requirements +To extract metadata the user used in the connection needs to have access to the `INFORMATION_SCHEMA`. By default a user can see only the rows in the `INFORMATION_SCHEMA` that correspond to objects for which the user has the proper access privileges. -# Requirements - -You can find further information on the Kafka connector in the [docs](https://docs.open-metadata.org/connectors/database/mariadb). +```SQL +-- Create user. More details https://mariadb.com/kb/en/create-user/ +CREATE USER [@] IDENTIFIED BY ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a specific object +GRANT SELECT ON world.hello TO ''; +``` + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). ## Connection Details - $$section ### Scheme $(id="scheme") - -SQLAlchemy driver scheme options. - +SQLAlchemy driver scheme options. If you are unsure about this setting, you can use the default value. $$ $$section ### Username $(id="username") - -Username to connect to MariaDB. This user should have privileges to read all the metadata in MariaDB. - +Username to connect to MariaDB. This user should have access to the `INFORMATION_SCHEMA` to extract metadata. Other workflows may require different permissions -- refer to the section above for more information. $$ $$section ### Password $(id="password") - Password to connect to MariaDB. - $$ $$section ### Host Port $(id="hostPort") - -Host and port of the MariaDB service. - +Host and port of the MariaDB service. This should be specified as a string in the format 'hostname:port'. +**Example**: `localhost:3306`, `host.docker.internal:3306` $$ $$section ### Database Name $(id="databaseName") - -Optional name to give to the database in OpenMetadata. If left blank, we will use default as the database name. - +In OpenMetadata, the Database Service hierarchy works as follow: +``` +Database Service > Database > Schema > Table +``` +In the case of MariaDB, we won't have a Database as such. If you'd like to see your data in a database named something other than `default`, you can specify the name in this field. $$ $$section ### Database Schema $(id="databaseSchema") - -databaseSchema of the data source. This is optional parameter, if you would like to restrict the metadata reading to a single databaseSchema. When left blank, OpenMetadata Ingestion attempts to scan all the databaseSchema. - +This is an optional parameter. When set, the value will be used to restrict the metadata reading to a single database (corresponding to the value passed in this field). When left blank, OpenMetadata will scan all the databases. $$ $$section ### Connection Options $(id="connectionOptions") - Additional connection options to build the URL that can be sent to service during the connection. - $$ $$section ### Connection Arguments $(id="connectionArguments") - Additional connection arguments such as security or protocol configs that can be sent to service during connection. - $$ diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Mysql.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Mysql.md index 79c2bf3c595..5417086dffb 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Mysql.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Mysql.md @@ -1,96 +1,88 @@ # Mysql +In this section, we provide guides and references to use the Mysql connector. You can view the full documentation for MySQL [here](https://docs.open-metadata.org/connectors/database/mysql). -In this section, we provide guides and references to use the Mysql connector. +## Requirements +To extract metadata the user used in the connection needs to have access to the `INFORMATION_SCHEMA`. By default a user can see only the rows in the `INFORMATION_SCHEMA` that correspond to objects for which the user has the proper access privileges. -# Requirements -To run the Ingestion via the UI you'll need to use the OpenMetadata Ingestion Container, which comes shipped with custom Airflow plugins to handle the workflow deployment. +```SQL +-- Create user. If is ommited, defaults to '%' +-- More details https://dev.mysql.com/doc/refman/8.0/en/create-user.html +CREATE USER ''[@''] IDENTIFIED BY ''; -Note that We support MySQL (version 8.0.0 or greater) and the user should have access to the `INFORMATION_SCHEMA` table. +-- Grant select on a database +GRANT SELECT ON world.* TO ''; -You can find further information on the Athena connector in the [docs](https://docs.open-metadata.org/connectors/database/mysql). +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a specific object +GRANT SELECT ON world.hello TO ''; +``` + +$$note +OpenMetadata supports MySQL version 8.0.0 and up. +$$ + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler). ## Connection Details - $$section ### Scheme $(id="scheme") - -SQLAlchemy driver scheme options. +SQLAlchemy driver scheme options. If you are unsure about this setting, you can use the default value. $$ $$section ### Username $(id="username") - -Username to connect to Mysql. This user should have privileges to read all the metadata in Mysql. +Username to connect to Mysql. This user should have access to the `INFORMATION_SCHEMA` to extract metadata. Other workflows may require different permissions -- refer to the section above for more information. $$ $$section ### Password $(id="password") - Password to connect to Mysql. $$ $$section ### Host Port $(id="hostPort") - -Host and port of the Mysql service. - -**Example**: `localhost:3306` or `host.docker.internal:3306` +Host and port of the Mysql service. This should be specified as a string in the format 'hostname:port'. +**Example**: `localhost:3306`, `host.docker.internal:3306` $$ $$section ### Database Name $(id="databaseName") - -In OpenMetadata, the Database Service hierarchy works as follows: - +In OpenMetadata, the Database Service hierarchy works as follow: ``` Database Service > Database > Schema > Table ``` - -In the case of Mysql, we won't have a Database as such. If you'd like to see your data in a database -named something other than `default`, you can specify the name in this field. +In the case of Mysql, we won't have a Database as such. If you'd like to see your data in a database named something other than `default`, you can specify the name in this field. $$ $$section ### Database Schema $(id="databaseSchema") - -In OpenMetadata, the Database Service hierarchy works as follows: - -``` -Database Service > Database > Schema > Table -``` - -In the case of MySQL, we won't have a DatabaseSchema as such. If you'd like to see your data in a databaseSchema named something other than `default`, you can specify the name in this field. +This is an optional parameter. When set, the value will be used to restrict the metadata reading to a single database (corresponding to the value passed in this field). When left blank, OpenMetadata will scan all the databases. $$ $$section -### Ssl CA $(id="sslCA") - -Provide the path to ssl ca file -Provide the path to ssl client certificate file (ssl_cert) +### SSL CA $(id="sslCA") +Provide the path to SSL ca file $$ $$section -### Ssl Cert $(id="sslCert") - -Provide the path to ssl client certificate file (ssl_cert) +### SSL Cert $(id="sslCert") +Provide the path to SSL client certificate file (ssl_cert) $$ $$section -### Ssl Key $(id="sslKey") - -Provide the path to ssl client certificate file (ssl_key) +### SSL Key $(id="sslKey") +Provide the path to SSL key file (ssl_key) $$ $$section ### Connection Options $(id="connectionOptions") - -Additional connection options to build the URL that can be sent to service during the connection. - +Additional connection options to build the URL that can be sent to the service during the connection. $$ $$section ### Connection Arguments $(id="connectionArguments") - -Additional connection arguments such as security or protocol configs that can be sent to service during connection. - -$$ +Additional connection arguments such as security or protocol configs that can be sent to the service during connection. +$$ \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Presto.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Presto.md index dd3569c37cc..37db1ef6e3e 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Presto.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Presto.md @@ -1,72 +1,51 @@ # Presto +In this section, we provide guides and references to use the Presto connector. You can view the full documentation for Presto [here](https://docs.open-metadata.org/connectors/database/presto). -In this section, we provide guides and references to use the Presto connector. +## Requirements +To extract metadata, the user needs to be able to perform `SHOW CATALOGS`, `SHOW TABLES`, and `SHOW COLUMNS FROM` on the catalogs/tables you wish to extract metadata from and have `SELECT` permission on the `INFORMATION_SCHEMA`. Access to resources will be different based on the connector used. You can find more details in the Presto documentation website [here](https://prestodb.io/docs/current/connector.html). You can also get more information regarding system access control in Presto [here](https://prestodb.io/docs/current/security/built-in-system-access-control.html). -# Requirements - -You can find further information on the Kafka connector in the [docs](https://docs.open-metadata.org/connectors/database/presto). + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). ## Connection Details - $$section ### Scheme $(id="scheme") - -SQLAlchemy driver scheme options. - +SQLAlchemy driver scheme options. If you are unsure about this setting, you can use the default value. $$ $$section ### Username $(id="username") - -Username to connect to Presto. This user should have privileges to read all the metadata in Postgres. - +Username to connect to Presto. This user should be able to perform `SHOW CATALOGS`, `SHOW TABLES`, and `SHOW COLUMNS FROM` and have `SELECT` permission on the `INFORMATION_SCHEMA`. $$ $$section ### Password $(id="password") - Password to connect to Presto. - $$ $$section ### Host Port $(id="hostPort") - -Host and port of the Presto service. - +Host and port of the Presto service. This should be specified as a string in the format 'hostname:port'. +**Example**: `localhost:8080`, `host.docker.internal:8080` $$ $$section ### Database Schema $(id="databaseSchema") - -databaseSchema of the data source. This is optional parameter, if you would like to restrict the metadata reading to a single databaseSchema. When left blank, OpenMetadata Ingestion attempts to scan all the databaseSchema. - +This is an optional parameter. When set, the value will be used to restrict the metadata reading to a single database (corresponding to the value passed in this field). When left blank, OpenMetadata will scan all the databases. $$ $$section ### Catalog $(id="catalog") - -Presto catalog - +Presto catalog name. $$ $$section ### Connection Options $(id="connectionOptions") - Additional connection options to build the URL that can be sent to service during the connection. - $$ $$section ### Connection Arguments $(id="connectionArguments") - Additional connection arguments such as security or protocol configs that can be sent to service during connection. - -$$ - -$$section -### Supports Database $(id="supportsDatabase") - -The source service supports the database concept in its hierarchy - -$$ +$$ \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Redshift.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Redshift.md index 3516f9d7be8..f6e82782e31 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Redshift.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Redshift.md @@ -1,80 +1,68 @@ # Redshift +In this section, we provide guides and references to use the Redshift connector. You can view the full documentation for Redshift [here](https://docs.open-metadata.org/connectors/database/redshift). -In this section, we provide guides and references to use the Redshift connector. - -# Requirements +## Requirements Redshift user must grant `SELECT` privilege on `SVV_TABLE_INFO` to fetch the metadata of tables and views. ```sql +-- Create a new user +-- More details https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_USER.html CREATE USER test_user with PASSWORD 'password'; + +-- Grant SELECT on table GRANT SELECT ON TABLE svv_table_info to test_user; ``` -If you plan on running the profiler and quality tests you need to make sure your user has `SELECT` privilege on the tables you wish to run those workflows against. For more information visit [here](https://docs.aws.amazon.com/redshift/latest/dg/c_visibility-of-data.html). +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). -You can find further information on the Redshift connector in the [docs](https://docs.open-metadata.org/connectors/database/redshift). +### Usage & Lineage +For the usage and lineage workflow, the user will need `SELECT` privilege on `STL_QUERY` table. You can find more information on the usage workflow [here](https://docs.open-metadata.org/connectors/ingestion/workflows/usage) and the lineage workflow [here](https://docs.open-metadata.org/connectors/ingestion/workflows/lineage). ## Connection Details - $$section ### Scheme $(id="scheme") - -SQLAlchemy driver scheme options +SQLAlchemy driver scheme options. If you are unsure about this setting, you can use the default value. $$ $$section ### Username $(id="username") - -Username to connect to Redshift. This user should have privileges to read all the metadata in Redshift. +Username to connect to Redshift. This user should have access to `SVV_TABLE_INFO` to extract metadata. Other workflows may require different permissions -- refer to the section above for more information. $$ $$section ### Password $(id="password") - Password to connect to Redshift. $$ $$section ### Host Port $(id="hostPort") - Host and port of the Redshift service. $$ $$section ### Database $(id="database") -Initial Redshift database to connect to. If you want to ingest all databases, set `ingestAllDatabases` to true. +Initial Redshift database to connect to. If you want to ingest all databases, set `ingestAllDatabases` to true. This should be specified as a string in the format 'hostname:port'. +**Example**: `localhost:5439`, `host.docker.internal:5439` $$ $$section ### Ingest All Databases $(id="ingestAllDatabases") - If ticked, the workflow will be able to ingest all database in the cluster. If not ticked, the workflow will only ingest tables from the database set above. $$ $$section -### Ssl Mode $(id="sslMode") - +### SSL Mode $(id="sslMode") SSL Mode to connect to redshift database. E.g, prefer, verify-ca etc. $$ $$section ### Connection Options $(id="connectionOptions") - Additional connection options to build the URL that can be sent to service during the connection. - $$ $$section ### Connection Arguments $(id="connectionArguments") - Additional connection arguments such as security or protocol configs that can be sent to service during connection. - -$$ - -$$section -### Supports Database $(id="supportsDatabase") - -The source service supports the database concept in its hierarchy - -$$ +$$ \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/SingleStore.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/SingleStore.md index 226f739a9cd..4088877e03f 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/SingleStore.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/SingleStore.md @@ -1,65 +1,68 @@ # SingleStore +In this section, we provide guides and references to use the SingleStore connector. You can view the full documentation for SingleStore [here](https://docs.open-metadata.org/connectors/database/singlestore). -In this section, we provide guides and references to use the SingleStore connector. +## Requirements +To extract metadata the user used in the connection needs to have access to the `INFORMATION_SCHEMA`. By default a user can see only the rows in the `INFORMATION_SCHEMA` that correspond to objects for which the user has the proper access privileges. -# Requirements - -You can find further information on the Kafka connector in the [docs](https://docs.open-metadata.org/connectors/database/singlestore). +```SQL +-- Create user. +-- More details https://docs.singlestore.com/managed-service/en/reference/sql-reference/security-management-commands/create-user.html +CREATE USER [@] IDENTIFIED BY ''; +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a database +GRANT SELECT ON world.* TO ''; + +-- Grant select on a specific object +GRANT SELECT ON world.hello TO ''; +``` + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). ## Connection Details - $$section ### Scheme $(id="scheme") - -SQLAlchemy driver scheme options. - +SQLAlchemy driver scheme options. If you are unsure about this setting, you can use the default value. $$ $$section ### Username $(id="username") - -Username to connect to SingleStore. This user should have privileges to read all the metadata in MySQL. - +Username to connect to SingleStore. This user should have access to the `INFORMATION_SCHEMA` to extract metadata. Other workflows may require different permissions -- refer to the section above for more information. $$ $$section ### Password $(id="password") - Password to connect to SingleStore. - $$ $$section ### Host Port $(id="hostPort") - -Host and port of the SingleStore service. - +Host and port of the SingleStore service. This should be specified as a string in the format 'hostname:port'. +**Example**: `localhost:3306`, `host.docker.internal:3306` $$ $$section ### Database Name $(id="databaseName") - -Optional name to give to the database in OpenMetadata. If left blank, we will use default as the database name. - +In OpenMetadata, the Database Service hierarchy works as follow: +``` +Database Service > Database > Schema > Table +``` +In the case of SingleStore, we won't have a Database as such. If you'd like to see your data in a database named something other than `default`, you can specify the name in this field. $$ $$section ### Database Schema $(id="databaseSchema") - -databaseSchema of the data source. This is optional parameter, if you would like to restrict the metadata reading to a single databaseSchema. When left blank, OpenMetadata Ingestion attempts to scan all the databaseSchema. - +This is an optional parameter. When set, the value will be used to restrict the metadata reading to a single database (corresponding to the value passed in this field). When left blank, OpenMetadata will scan all the databases. $$ $$section ### Connection Options $(id="connectionOptions") - Additional connection options to build the URL that can be sent to service during the connection. - $$ $$section ### Connection Arguments $(id="connectionArguments") - Additional connection arguments such as security or protocol configs that can be sent to service during connection. - $$ diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Trino.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Trino.md index c9839438775..413ec8837a4 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Trino.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Trino.md @@ -1,86 +1,67 @@ # Trino +In this section, we provide guides and references to use the Trino connector. You can view the full documentation for Trino [here](https://docs.open-metadata.org/connectors/database/trino). -In this section, we provide guides and references to use the Trino connector. +## Requirements +To extract metadata, the user needs to have `SELECT` permission on the following tables: +- `information_schema.schemata` +- `information_schema.columns` +- `information_schema.tables` +- `information_schema.views` +- `system.metadata.table_comments` -# Requirements - -You can find further information on the Kafka connector in the [docs](https://docs.open-metadata.org/connectors/database/trino). +Access to resources will be based on the user access permission to access specific data sources. More information regarding access and security can be found in the Trino documentation [here](https://trino.io/docs/current/security.html). + +### Profiler & Data Quality +Executing the profiler worflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). ## Connection Details - $$section ### Scheme $(id="scheme") - -SQLAlchemy driver scheme options. - +SQLAlchemy driver scheme options. If you are unsure about this setting, you can use the default value. $$ $$section ### Username $(id="username") - -Username to connect to Trino. This user should have privileges to read all the metadata in Trino. - +Username to connect to Trino. This user should have `SELECT` permission on the `SYSTEM.METADATA` and `INFORMATION_SCHEMA` - see the section above for more details. $$ $$section ### Password $(id="password") - Password to connect to Trino. - $$ $$section ### Host Port $(id="hostPort") - -Host and port of the Trino service. - +Host and port of the Trino service. This should be specified as a string in the format 'hostname:port'. +**Example**: `localhost:8080`, `host.docker.internal:8080` $$ $$section ### Catalog $(id="catalog") - -Catalog of the data source. - +Catalog of the data source. $$ $$section ### Database Schema $(id="databaseSchema") - -databaseSchema of the data source. This is optional parameter, if you would like to restrict the metadata reading to a single databaseSchema. When left blank, OpenMetadata Ingestion attempts to scan all the databaseSchema. - +This is an optional parameter. When set, the value will be used to restrict the metadata reading to a single database (corresponding to the value passed in this field). When left blank, OpenMetadata will scan all the databases. $$ $$section ### Proxies $(id="proxies") - Proxies for the connection to Trino data source - $$ $$section ### Params $(id="params") - URL parameters for connection to the Trino data source - $$ $$section ### Connection Options $(id="connectionOptions") - Additional connection options to build the URL that can be sent to service during the connection. - $$ $$section ### Connection Arguments $(id="connectionArguments") - Additional connection arguments such as security or protocol configs that can be sent to service during connection. - -$$ - -$$section -### Supports Database $(id="supportsDatabase") - -The source service supports the database concept in its hierarchy - $$ \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/workflows/profiler.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/workflows/profiler.md new file mode 100644 index 00000000000..f3fbf5b6c6d --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/workflows/profiler.md @@ -0,0 +1,29 @@ +# Profiler +This workflow allows you to profile your table assets an gain insight into their structure (e.g. of metrics computed: `max`, `min`, `mean`, etc. The full list can be found [here](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler/metrics)). We recommend to check the [best practices](https://docs.open-metadata.org/connectors/ingestion/workflows/profiler#profiler-best-practices) before creating a profiler workflow. + +## Properties +### Database Filter Pattern $(id="databaseFilterPattern") +Regex to only fetch databases that matches the pattern. + +### Schema Filter Pattern $(id="schemaFilterPattern") +Regex to only fetch schema that matches the pattern. + +### Table Filter Pattern $(id="tableFilterPattern") +Regex exclude tables that matches the pattern. + +### Process PII Sensitive $(id="processPiiSensitive") +Optional configuration to automatically tag columns that might contain sensitive information. If `generateSampleData` is enabled, OpenMetadata will leverage machine learning to infer which column may contain PII sensitive data. If disabled, OpenMetadata will infer from the column name. + +### Profile Sample $(id="profileSample") +Percentage of data or number of rows to use when sampling tables. If left as is, the profiler will run against the entire table. + +### Profile Sample Type $(id="profileSampleType") +Profile sample type can be set to either: +* percentage: this will use a percentage to sample sample the table (e.g. table has 100 rows and we set sample percentage tp 50%, the profiler will use 50 random rows to compute the metrics) +* row count: this will use a number of rows to sample the table (e.g. table has 100 rows and we set row count to 10, the profiler will use 10 random rows to compute the metrics) + +### Thread Count $(id="threadCount") +Number of thread that will be used when computing the profiler metrics. A number set to high can have negative effect on performance. We recommend to use the default value unless you have a good understanding of multithreading. + +### Timeout in Seconds $(id="timeoutSeconds") +This will set the duration a profiling job against a table should wait before interrupting its execution and moving on to profiling the next table. It is important to note that the profiler will wait for the hanging query to terminiate before killing the execution. If there is a risk for your profiling job to hang, it is important to also set a query/connection timeout on your database engine. The default value for the profiler timeout is 12-hours. \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Mlmodel/Mlflow.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Mlmodel/Mlflow.md index 2641bbcef3a..72850a740a9 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Mlmodel/Mlflow.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Mlmodel/Mlflow.md @@ -1,23 +1,19 @@ -# Mlflow - -In this section, we provide guides and references to use the Mlflow connector. - -# Requirements - -You can find further information on the Kafka connector in the [docs](https://docs.open-metadata.org/connectors/mlmodel/mlflow). +# MLflow +In this section, we provide guides and references to use the MLflow connector. You can view the full documentation for MLflow [here](https://docs.open-metadata.org/connectors/ml-model/mlflow). +## Requirements +To extract metadata, OpenMetadata needs two elements: +- **Tracking URI**: Address of local or remote tracking server. More information on the MLFlow documentation [here](https://www.mlflow.org/docs/latest/tracking.html#where-runs-are-recorded) +- **Registry URI**: Address of local or remote model registry server. ## Connection Details - $$section ### Tracking Uri $(id="trackingUri") - -Mlflow Experiment tracking URI. E.g., http://localhost:5000 - +Mlflow Experiment tracking URI. +**Example**: http://localhost:5000 $$ $$section ### Registry Uri $(id="registryUri") - -Mlflow Model registry backend. E.g., mysql+pymysql://mlflow:password@localhost:3307/experiments - -$$ +Mlflow Model registry backend. +**Example**: mysql+pymysql://mlflow:password@localhost:3307/experiments +$$ \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Pipeline/Nifi.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Pipeline/Nifi.md index 7a889b6f44d..51e2d1aac9f 100644 --- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Pipeline/Nifi.md +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Pipeline/Nifi.md @@ -1,30 +1,52 @@ # Nifi +In this section, we provide guides and references to use the Nifi connector. You can view the full documentation for Nifi [here](https://docs.open-metadata.org/connectors/pipeline/nifi). -In this section, we provide guides and references to use the Nifi connector. - -# Requirements - -You can find further information on the Kafka connector in the [docs](https://docs.open-metadata.org/connectors/pipeline/nifi). +## Requirements +OpenMetadata supports 2 types of connection for the Nifi connector: +- **basic authentication**: use username/password to authenticate to Nifi. +- **client certificate authentication**: use CA, client certificate and client key files to authenticate ## Connection Details - $$section ### Host Port $(id="hostPort") - -Pipeline Service Management/UI URI. - +Pipeline Service Management/UI URI. This should be specified as a string in the format 'hostname:port'. +**Example**: `localhost:8443`, `host.docker.internal:8443` $$ $$section ### Nifi Config $(id="nifiConfig") - -We support username/password or client certificate authentication - +OpenMetadata supports basic authentication (username/password) or client certificate authentication. See requirement section for more details. $$ $$section -### Nifi Config $(id="nifiConfig") - -We support username/password or client certificate authentication - +### Username $(id="username") +Username to connect to Nifi. This user should be able to send request to the Nifi API and access the `Resources` endpoint. $$ + +$$section +### Password $(id="password") +Password to connect to Nifi. +$$ + +$$section +### Verify SSL $(id="basicAuthentication.verifySSL") +Whether SSL verification should be perform when authenticating. +$$ + +$$section +### Certificate Authority Path $(id="certificateAuthorityPath") +Path to the certificate authority (CA) file. This is the certificate used to store and issue your digital certificate. This is an optional parameter. If omitted SSL verification will be skipped; this can present some sever security issue. +**important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. +$$ + +$$section +### Client Certificate Path $(id="clientCertificatePath") +Path to the certificate client file. +**important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. +$$ + +$$section +### Client Key Path $(id="clientkeyPath") +Path to the client key file. +**important**: This file should be accessible from where the ingestion workflow is running. For example, if you are using OpenMetadata Ingestion Docker container, this file should be in this container. +$$ \ No newline at end of file