This is an automated email from the ASF dual-hosted git repository.
jasonliu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 29a0a99b58d [Part 3] Migrate connection UI metadata to YAML for more
providers (#62165)
29a0a99b58d is described below
commit 29a0a99b58d614afb7b34c9a3d5d3d53d7796821
Author: Amogh Desai <[email protected]>
AuthorDate: Thu Feb 19 21:17:27 2026 +0530
[Part 3] Migrate connection UI metadata to YAML for more providers (#62165)
---
providers/apprise/provider.yaml | 21 ++++++
.../airflow/providers/apprise/get_provider_info.py | 11 +++
providers/discord/provider.yaml | 7 ++
.../airflow/providers/discord/get_provider_info.py | 3 +
providers/opsgenie/provider.yaml | 8 ++
.../providers/opsgenie/get_provider_info.py | 4 +
providers/pagerduty/provider.yaml | 26 +++++++
.../providers/pagerduty/get_provider_info.py | 14 ++++
providers/slack/provider.yaml | 65 ++++++++++++++++
.../airflow/providers/slack/get_provider_info.py | 55 +++++++++++++-
providers/smtp/provider.yaml | 88 ++++++++++++++++++++++
.../airflow/providers/smtp/get_provider_info.py | 41 ++++++++++
providers/telegram/provider.yaml | 6 ++
.../providers/telegram/get_provider_info.py | 1 +
14 files changed, 349 insertions(+), 1 deletion(-)
diff --git a/providers/apprise/provider.yaml b/providers/apprise/provider.yaml
index 6c0b4b65fb4..eea2c146303 100644
--- a/providers/apprise/provider.yaml
+++ b/providers/apprise/provider.yaml
@@ -67,6 +67,27 @@ hooks:
connection-types:
- hook-class-name: airflow.providers.apprise.hooks.apprise.AppriseHook
connection-type: apprise
+ conn-fields:
+ config:
+ label: config
+ schema:
+ type:
+ - string
+ - 'null'
+ format: password
+ description: |
+ format example - {"path": "service url", "tag": "alerts"} or
+ [{"path": "service url", "tag": "alerts"}, {"path": "service url",
+ "tag": "alerts"}]
+ ui-field-behaviour:
+ hidden-fields:
+ - host
+ - schema
+ - login
+ - password
+ - port
+ - extra
+ relabeling: {}
notifications:
- airflow.providers.apprise.notifications.apprise.AppriseNotifier
diff --git
a/providers/apprise/src/airflow/providers/apprise/get_provider_info.py
b/providers/apprise/src/airflow/providers/apprise/get_provider_info.py
index d65b16bdbaa..ce0346c29b8 100644
--- a/providers/apprise/src/airflow/providers/apprise/get_provider_info.py
+++ b/providers/apprise/src/airflow/providers/apprise/get_provider_info.py
@@ -40,6 +40,17 @@ def get_provider_info():
{
"hook-class-name":
"airflow.providers.apprise.hooks.apprise.AppriseHook",
"connection-type": "apprise",
+ "conn-fields": {
+ "config": {
+ "label": "config",
+ "schema": {"type": ["string", "null"], "format":
"password"},
+ "description": 'format example - {"path": "service
url", "tag": "alerts"} or\n[{"path": "service url", "tag": "alerts"}, {"path":
"service url",\n"tag": "alerts"}]\n',
+ }
+ },
+ "ui-field-behaviour": {
+ "hidden-fields": ["host", "schema", "login", "password",
"port", "extra"],
+ "relabeling": {},
+ },
}
],
"notifications":
["airflow.providers.apprise.notifications.apprise.AppriseNotifier"],
diff --git a/providers/discord/provider.yaml b/providers/discord/provider.yaml
index 1afb2193107..17d6e246d5c 100644
--- a/providers/discord/provider.yaml
+++ b/providers/discord/provider.yaml
@@ -80,6 +80,13 @@ hooks:
connection-types:
- hook-class-name:
airflow.providers.discord.hooks.discord_webhook.DiscordWebhookHook
connection-type: discord
+ conn-fields:
+ webhook_endpoint:
+ label: Webhook Endpoint
+ schema:
+ type:
+ - string
+ - 'null'
notifications:
- airflow.providers.discord.notifications.discord.DiscordNotifier
diff --git
a/providers/discord/src/airflow/providers/discord/get_provider_info.py
b/providers/discord/src/airflow/providers/discord/get_provider_info.py
index 9c029773361..04521b10150 100644
--- a/providers/discord/src/airflow/providers/discord/get_provider_info.py
+++ b/providers/discord/src/airflow/providers/discord/get_provider_info.py
@@ -50,6 +50,9 @@ def get_provider_info():
{
"hook-class-name":
"airflow.providers.discord.hooks.discord_webhook.DiscordWebhookHook",
"connection-type": "discord",
+ "conn-fields": {
+ "webhook_endpoint": {"label": "Webhook Endpoint",
"schema": {"type": ["string", "null"]}}
+ },
}
],
"notifications":
["airflow.providers.discord.notifications.discord.DiscordNotifier"],
diff --git a/providers/opsgenie/provider.yaml b/providers/opsgenie/provider.yaml
index 51cd8a54e6c..edddfddbcba 100644
--- a/providers/opsgenie/provider.yaml
+++ b/providers/opsgenie/provider.yaml
@@ -81,6 +81,14 @@ hooks:
connection-types:
- hook-class-name:
airflow.providers.opsgenie.hooks.opsgenie.OpsgenieAlertHook
connection-type: opsgenie
+ ui-field-behaviour:
+ hidden-fields:
+ - port
+ - schema
+ - login
+ - extra
+ relabeling:
+ password: Opsgenie API Key
notifications:
- airflow.providers.opsgenie.notifications.opsgenie.OpsgenieNotifier
diff --git
a/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py
b/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py
index 4f37bdece39..a74e1065c30 100644
--- a/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py
+++ b/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py
@@ -48,6 +48,10 @@ def get_provider_info():
{
"hook-class-name":
"airflow.providers.opsgenie.hooks.opsgenie.OpsgenieAlertHook",
"connection-type": "opsgenie",
+ "ui-field-behaviour": {
+ "hidden-fields": ["port", "schema", "login", "extra"],
+ "relabeling": {"password": "Opsgenie API Key"},
+ },
}
],
"notifications":
["airflow.providers.opsgenie.notifications.opsgenie.OpsgenieNotifier"],
diff --git a/providers/pagerduty/provider.yaml
b/providers/pagerduty/provider.yaml
index ab65f1ee09c..ec1be318e01 100644
--- a/providers/pagerduty/provider.yaml
+++ b/providers/pagerduty/provider.yaml
@@ -75,8 +75,34 @@ integrations:
connection-types:
- hook-class-name: airflow.providers.pagerduty.hooks.pagerduty.PagerdutyHook
connection-type: pagerduty
+ conn-fields:
+ routing_key:
+ label: Routing Key
+ schema:
+ type:
+ - string
+ - 'null'
+ format: password
+ ui-field-behaviour:
+ hidden-fields:
+ - port
+ - login
+ - schema
+ - host
+ - extra
+ relabeling:
+ password: Pagerduty API token
- hook-class-name:
airflow.providers.pagerduty.hooks.pagerduty_events.PagerdutyEventsHook
connection-type: pagerduty_events
+ ui-field-behaviour:
+ hidden-fields:
+ - port
+ - login
+ - schema
+ - host
+ - extra
+ relabeling:
+ password: Pagerduty Integration key
hooks:
- integration-name: Pagerduty
diff --git
a/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py
b/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py
index 5b7eed842ac..89cd71ea355 100644
--- a/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py
+++ b/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py
@@ -38,10 +38,24 @@ def get_provider_info():
{
"hook-class-name":
"airflow.providers.pagerduty.hooks.pagerduty.PagerdutyHook",
"connection-type": "pagerduty",
+ "conn-fields": {
+ "routing_key": {
+ "label": "Routing Key",
+ "schema": {"type": ["string", "null"], "format":
"password"},
+ }
+ },
+ "ui-field-behaviour": {
+ "hidden-fields": ["port", "login", "schema", "host",
"extra"],
+ "relabeling": {"password": "Pagerduty API token"},
+ },
},
{
"hook-class-name":
"airflow.providers.pagerduty.hooks.pagerduty_events.PagerdutyEventsHook",
"connection-type": "pagerduty_events",
+ "ui-field-behaviour": {
+ "hidden-fields": ["port", "login", "schema", "host",
"extra"],
+ "relabeling": {"password": "Pagerduty Integration key"},
+ },
},
],
"hooks": [
diff --git a/providers/slack/provider.yaml b/providers/slack/provider.yaml
index 7697b89abf9..2c3b995b7ab 100644
--- a/providers/slack/provider.yaml
+++ b/providers/slack/provider.yaml
@@ -134,8 +134,73 @@ transfers:
connection-types:
- hook-class-name: airflow.providers.slack.hooks.slack.SlackHook
connection-type: slack
+ ui-field-behaviour:
+ hidden-fields:
+ - login
+ - port
+ - host
+ - schema
+ - extra
+ relabeling:
+ password: Slack API Token
+ placeholders:
+ password: REPLACE ME WITH A SLACK ACCESS TOKEN
+ timeout: '30'
+ base_url: https://www.slack.com/api/
+ proxy: http://localhost:9000
+ conn-fields:
+ timeout:
+ label: Timeout
+ schema:
+ type:
+ - integer
+ - 'null'
+ description: Optional. Max seconds to wait for Slack API response.
+ base_url:
+ label: Base URL
+ schema:
+ type:
+ - string
+ - 'null'
+ description: Optional. A string representing the Slack API base URL.
+ proxy:
+ label: Proxy
+ schema:
+ type:
+ - string
+ - 'null'
+ description: Optional. Proxy to make the Slack API call.
- hook-class-name:
airflow.providers.slack.hooks.slack_webhook.SlackWebhookHook
connection-type: slackwebhook
+ ui-field-behaviour:
+ hidden-fields:
+ - login
+ - port
+ - extra
+ relabeling:
+ host: Slack Webhook Endpoint
+ password: Webhook Token
+ placeholders:
+ schema: https
+ host: hooks.slack.com/services
+ password: T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
+ timeout: '30'
+ proxy: http://localhost:9000
+ conn-fields:
+ timeout:
+ label: Timeout
+ schema:
+ type:
+ - integer
+ - 'null'
+ description: Optional. Max seconds to wait for Slack Incoming Webhook
response.
+ proxy:
+ label: Proxy
+ schema:
+ type:
+ - string
+ - 'null'
+ description: Optional. Proxy to make the Slack Incoming Webhook call.
notifications:
- airflow.providers.slack.notifications.slack.SlackNotifier
diff --git a/providers/slack/src/airflow/providers/slack/get_provider_info.py
b/providers/slack/src/airflow/providers/slack/get_provider_info.py
index bf8d16eae96..e7306f1f075 100644
--- a/providers/slack/src/airflow/providers/slack/get_provider_info.py
+++ b/providers/slack/src/airflow/providers/slack/get_provider_info.py
@@ -80,10 +80,63 @@ def get_provider_info():
},
],
"connection-types": [
- {"hook-class-name":
"airflow.providers.slack.hooks.slack.SlackHook", "connection-type": "slack"},
+ {
+ "hook-class-name":
"airflow.providers.slack.hooks.slack.SlackHook",
+ "connection-type": "slack",
+ "ui-field-behaviour": {
+ "hidden-fields": ["login", "port", "host", "schema",
"extra"],
+ "relabeling": {"password": "Slack API Token"},
+ "placeholders": {
+ "password": "REPLACE ME WITH A SLACK ACCESS TOKEN",
+ "timeout": "30",
+ "base_url": "https://www.slack.com/api/",
+ "proxy": "http://localhost:9000",
+ },
+ },
+ "conn-fields": {
+ "timeout": {
+ "label": "Timeout",
+ "schema": {"type": ["integer", "null"]},
+ "description": "Optional. Max seconds to wait for
Slack API response.",
+ },
+ "base_url": {
+ "label": "Base URL",
+ "schema": {"type": ["string", "null"]},
+ "description": "Optional. A string representing the
Slack API base URL.",
+ },
+ "proxy": {
+ "label": "Proxy",
+ "schema": {"type": ["string", "null"]},
+ "description": "Optional. Proxy to make the Slack API
call.",
+ },
+ },
+ },
{
"hook-class-name":
"airflow.providers.slack.hooks.slack_webhook.SlackWebhookHook",
"connection-type": "slackwebhook",
+ "ui-field-behaviour": {
+ "hidden-fields": ["login", "port", "extra"],
+ "relabeling": {"host": "Slack Webhook Endpoint",
"password": "Webhook Token"},
+ "placeholders": {
+ "schema": "https",
+ "host": "hooks.slack.com/services",
+ "password":
"T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX",
+ "timeout": "30",
+ "proxy": "http://localhost:9000",
+ },
+ },
+ "conn-fields": {
+ "timeout": {
+ "label": "Timeout",
+ "schema": {"type": ["integer", "null"]},
+ "description": "Optional. Max seconds to wait for
Slack Incoming Webhook response.",
+ },
+ "proxy": {
+ "label": "Proxy",
+ "schema": {"type": ["string", "null"]},
+ "description": "Optional. Proxy to make the Slack
Incoming Webhook call.",
+ },
+ },
},
],
"notifications": [
diff --git a/providers/smtp/provider.yaml b/providers/smtp/provider.yaml
index f617c9a1978..a1c3e50d6d8 100644
--- a/providers/smtp/provider.yaml
+++ b/providers/smtp/provider.yaml
@@ -81,6 +81,94 @@ hooks:
connection-types:
- hook-class-name: airflow.providers.smtp.hooks.smtp.SmtpHook
connection-type: smtp
+ conn-fields:
+ from_email:
+ label: From email
+ schema:
+ type:
+ - string
+ - 'null'
+ timeout:
+ label: Connection timeout
+ schema:
+ type:
+ - integer
+ - 'null'
+ default: 30
+ retry_limit:
+ label: Number of Retries
+ schema:
+ type:
+ - integer
+ - 'null'
+ default: 5
+ disable_tls:
+ label: Disable TLS
+ schema:
+ type:
+ - boolean
+ - 'null'
+ default: false
+ disable_ssl:
+ label: Disable SSL
+ schema:
+ type:
+ - boolean
+ - 'null'
+ default: false
+ subject_template:
+ label: Path to the subject template
+ schema:
+ type:
+ - string
+ - 'null'
+ html_content_template:
+ label: Path to the html content template
+ schema:
+ type:
+ - string
+ - 'null'
+ auth_type:
+ label: Auth Type
+ schema:
+ type:
+ - string
+ - 'null'
+ default: basic
+ enum:
+ - basic
+ - oauth2
+ description: basic or oauth2
+ access_token:
+ label: Access Token
+ schema:
+ type:
+ - string
+ - 'null'
+ client_id:
+ label: Client ID
+ schema:
+ type:
+ - string
+ - 'null'
+ client_secret:
+ label: Client Secret
+ schema:
+ type:
+ - string
+ - 'null'
+ tenant_id:
+ label: Tenant ID
+ schema:
+ type:
+ - string
+ - 'null'
+ scope:
+ label: Scope
+ schema:
+ type:
+ - string
+ - 'null'
ui-field-behaviour:
hidden-fields: ['schema', 'extra']
relabeling: {}
diff --git a/providers/smtp/src/airflow/providers/smtp/get_provider_info.py
b/providers/smtp/src/airflow/providers/smtp/get_provider_info.py
index bcfaaffc53e..f8665d3df25 100644
--- a/providers/smtp/src/airflow/providers/smtp/get_provider_info.py
+++ b/providers/smtp/src/airflow/providers/smtp/get_provider_info.py
@@ -50,6 +50,47 @@ def get_provider_info():
{
"hook-class-name":
"airflow.providers.smtp.hooks.smtp.SmtpHook",
"connection-type": "smtp",
+ "conn-fields": {
+ "from_email": {"label": "From email", "schema": {"type":
["string", "null"]}},
+ "timeout": {
+ "label": "Connection timeout",
+ "schema": {"type": ["integer", "null"], "default": 30},
+ },
+ "retry_limit": {
+ "label": "Number of Retries",
+ "schema": {"type": ["integer", "null"], "default": 5},
+ },
+ "disable_tls": {
+ "label": "Disable TLS",
+ "schema": {"type": ["boolean", "null"], "default":
False},
+ },
+ "disable_ssl": {
+ "label": "Disable SSL",
+ "schema": {"type": ["boolean", "null"], "default":
False},
+ },
+ "subject_template": {
+ "label": "Path to the subject template",
+ "schema": {"type": ["string", "null"]},
+ },
+ "html_content_template": {
+ "label": "Path to the html content template",
+ "schema": {"type": ["string", "null"]},
+ },
+ "auth_type": {
+ "label": "Auth Type",
+ "schema": {
+ "type": ["string", "null"],
+ "default": "basic",
+ "enum": ["basic", "oauth2"],
+ },
+ "description": "basic or oauth2",
+ },
+ "access_token": {"label": "Access Token", "schema":
{"type": ["string", "null"]}},
+ "client_id": {"label": "Client ID", "schema": {"type":
["string", "null"]}},
+ "client_secret": {"label": "Client Secret", "schema":
{"type": ["string", "null"]}},
+ "tenant_id": {"label": "Tenant ID", "schema": {"type":
["string", "null"]}},
+ "scope": {"label": "Scope", "schema": {"type": ["string",
"null"]}},
+ },
"ui-field-behaviour": {
"hidden-fields": ["schema", "extra"],
"relabeling": {},
diff --git a/providers/telegram/provider.yaml b/providers/telegram/provider.yaml
index cc23e6ef4f2..0caa2a5f438 100644
--- a/providers/telegram/provider.yaml
+++ b/providers/telegram/provider.yaml
@@ -78,6 +78,12 @@ operators:
connection-types:
- hook-class-name: airflow.providers.telegram.hooks.telegram.TelegramHook
connection-type: telegram
+ ui-field-behaviour:
+ hidden-fields:
+ - schema
+ - extra
+ - login
+ - port
hooks:
- integration-name: Telegram
diff --git
a/providers/telegram/src/airflow/providers/telegram/get_provider_info.py
b/providers/telegram/src/airflow/providers/telegram/get_provider_info.py
index 682142a6aaa..18ba5b1c1b4 100644
--- a/providers/telegram/src/airflow/providers/telegram/get_provider_info.py
+++ b/providers/telegram/src/airflow/providers/telegram/get_provider_info.py
@@ -45,6 +45,7 @@ def get_provider_info():
{
"hook-class-name":
"airflow.providers.telegram.hooks.telegram.TelegramHook",
"connection-type": "telegram",
+ "ui-field-behaviour": {"hidden-fields": ["schema", "extra",
"login", "port"]},
}
],
"hooks": [