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": [

Reply via email to