Thanks for the thoughtful reviews, Jens, Jarek, Kaxil, Jason, and Pierre!
This PR is now merged. The follow up I will be working on:

1. Migrate all providers to have a `conn-fields` section in the provider
spec.

2. API server decoupling - slightly bigger effort, we want to come up with
a
solution so the API server doesn't need providers installed at all.

Thanks & Regards,
Amogh Desai


On Thu, Jan 29, 2026 at 6:17 PM Amogh Desai <[email protected]> wrote:

> Hello Folks,
>
> Was not able to get to the comments on this one sooner, but I finally got
> to it and
> have addressed reviewers comments as well as added a tool here that can
> ease
> the migration effort for *all providers* and their *hooks*.
>
> Hoping to get some more eyes on this.
>
> Thanks & Regards,
> Amogh Desai
>
>
> On Mon, Jan 19, 2026 at 11:58 AM Amogh Desai <[email protected]>
> wrote:
>
>> Thanks for your inputs Jarek and Jens.
>>
>> Yes, all of what you said makes sense in terms of auth managers, secrets
>> backends.
>> The providers list API just provides basic information like this:
>>
>>     {
>>       "package_name": "apache-airflow-providers-airbyte",
>>       "description": "Airbyte https://airbyte.com/";,
>>       "version": "5.3.1",
>>       "documentation_url": "
>> https://airflow.apache.org/docs/apache-airflow-providers-airbyte/5.3.1";
>>     },
>>
>> For each provider. This information can probably be retrieved pretty
>> easily using either the yaml itself
>> or add it to the DB if needed, I think we can be done without having to
>> write to the DB.
>>
>> I have the north star in my mind as I think about the refractors :)
>>
>> Jens - yes, jsonschema turned out to be a better way to do this and I
>> updated my PR for that very reason.
>>
>> I would love to get a few more reviews on that PR :)
>>
>> Thanks & Regards,
>> Amogh Desai
>>
>>
>> On Sat, Jan 17, 2026 at 1:22 AM Jens Scheffler <[email protected]>
>> wrote:
>>
>>> +100 still - especially on the JSON schema thing.
>>>
>>> JSON schema was once decided to be the base of Params and the very first
>>> AIP-50 trigger form built on it and such evolved the todays trigger UI
>>> as well. All is internally transferred as JSON Schema. So great that you
>>> catched-up on this, a custom schema would have been bad. Also this
>>> allows for future extension and added validation which we might not
>>> support today in Trigger Form - can be plugged with more features in the
>>> future.
>>>
>>> On 16.01.26 15:23, Jarek Potiuk wrote:
>>> >> There are a few more reasons why API server will continue to need the
>>> > ProvidersManager:
>>> >
>>> > Yeah, I was aware we likely have a few more things I forgot, but this
>>> idea
>>> > extends to those nicely:
>>> >
>>> > 1. Auth Managers -> I consider this as an api-server plugin :), or
>>> possibly
>>> > separate (apache-airlfow-auth-manager) type of distribution (again this
>>> > will work nicely with "shared" library")
>>> > 2. Secrets Backends -> not sure if that is needed for api-server (maybe
>>> > just for configuration retrieval? ) this again can be a plugin - or
>>> > separate (apache-airflow-secrets-backend)
>>> > 3. Providers List Endpoint: maybe we should get rid of this?  >
>>> Eventually
>>> > this should be part of the same Triggerer DB storage - > triggerer
>>> > should store in the DB list of providers installed - already what we
>>> > currently have in api-server is kinda wrong - because even now
>>> potentially
>>> > we can have different providers installed on api-server and different
>>> in
>>> > workers/triggers - and only those installed in api-server will show up,
>>> > swtiching it to reading from DB that will be updated by Triggerrer
>>> (also
>>> > including team_id as there might be different sets of providers for
>>> > different teams) - will make it "correct" (eventually).
>>> >
>>> > But Yeah. We definitely can defer any of that to be done later, if we
>>> do
>>> > not find it "easier" to do it together - absolutely no pressure there,
>>> just
>>> > wanted to make sure the "North star" is quite commonly agreed, so that
>>> we
>>> > know where we are going :). We can definitely proceed with the current
>>> POC
>>> > "as is"
>>> >
>>> > J.
>>> >
>>> >
>>> > On Fri, Jan 16, 2026 at 11:11 AM Amogh Desai <[email protected]>
>>> wrote:
>>> >
>>> >> Thanks for the suggestion for using jsonschema!
>>> >>
>>> >> I updated the implementation to use jsonschema instead of the custom
>>> >> format. Now the structure looks like this for example:
>>> >>
>>> >> conn-fields:
>>> >>    timeout:
>>> >>      label: "Connection Timeout"
>>> >>      description: "Timeout in seconds"
>>> >>      schema:
>>> >>        type: integer
>>> >>        minimum: 1
>>> >>        maximum: 300
>>> >>        default: 30
>>> >>
>>> >> As for the concerns regarding GCP (14 fields including string, int,
>>> >> boolean, and password), I tested it and it
>>> >> works well (updated on PR). The code now uses schema object for all
>>> >> jsonschema validation properties like min, max, pattern,
>>> >> enum, etc while keeping UI metadata like label, description,
>>> sensitive or
>>> >> not at the top level. This aligns
>>> >> better with the react UI which already expects this format.
>>> >>
>>> >> Thanks & Regards,
>>> >> Amogh Desai
>>> >>
>>> >>
>>> >> On Fri, Jan 16, 2026 at 12:50 PM Amogh Desai <[email protected]>
>>> >> wrote:
>>> >>
>>> >>> Ash -
>>> >>>
>>> >>> Good catch on the GCP concern. I checked it and this is what it uses:
>>> >>>
>>> >>>      @classmethod
>>> >>>      def get_connection_form_widgets(cls) -> dict[str, Any]:
>>> >>>          """Return connection widgets to add to connection form."""
>>> >>>          from flask_appbuilder.fieldwidgets import
>>> BS3PasswordFieldWidget,
>>> >>> BS3TextFieldWidget
>>> >>>          from flask_babel import lazy_gettext
>>> >>>          from wtforms import BooleanField, IntegerField,
>>> PasswordField,
>>> >>> StringField
>>> >>>          from wtforms.validators import NumberRange
>>> >>>
>>> >>>          return {
>>> >>>              "project": StringField(lazy_gettext("Project Id"),
>>> >>> widget=BS3TextFieldWidget()),
>>> >>>              "key_path": StringField(lazy_gettext("Keyfile Path"),
>>> >>> widget=BS3TextFieldWidget()),
>>> >>>              "keyfile_dict": PasswordField(lazy_gettext("Keyfile
>>> JSON"),
>>> >>> widget=BS3PasswordFieldWidget()),
>>> >>>              "credential_config_file": StringField(
>>> >>>                  lazy_gettext("Credential Configuration File"),
>>> >>> widget=BS3TextFieldWidget()
>>> >>>              ),
>>> >>>              "scope": StringField(lazy_gettext("Scopes (comma
>>> >> separated)"),
>>> >>> widget=BS3TextFieldWidget()),
>>> >>>              "key_secret_name": StringField(
>>> >>>                  lazy_gettext("Keyfile Secret Name (in GCP Secret
>>> >>> Manager)"), widget=BS3TextFieldWidget()
>>> >>>              ),
>>> >>>              "key_secret_project_id": StringField(
>>> >>>                  lazy_gettext("Keyfile Secret Project Id (in GCP
>>> Secret
>>> >>> Manager)"), widget=BS3TextFieldWidget()
>>> >>>              ),
>>> >>>              "num_retries": IntegerField(
>>> >>>                  lazy_gettext("Number of Retries"),
>>> >>>                  validators=[NumberRange(min=0)],
>>> >>>                  widget=BS3TextFieldWidget(),
>>> >>>                  default=5,
>>> >>>              ),
>>> >>>              "impersonation_chain": StringField(
>>> >>>                  lazy_gettext("Impersonation Chain"),
>>> >>> widget=BS3TextFieldWidget()
>>> >>>              ),
>>> >>>              "idp_issuer_url": StringField(
>>> >>>                  lazy_gettext("IdP Token Issue URL (Client
>>> Credentials
>>> >>> Grant Flow)"),
>>> >>>                  widget=BS3TextFieldWidget(),
>>> >>>              ),
>>> >>>              "client_id": StringField(
>>> >>>                  lazy_gettext("Client ID (Client Credentials Grant
>>> >> Flow)"),
>>> >>> widget=BS3TextFieldWidget()
>>> >>>              ),
>>> >>>              "client_secret": StringField(
>>> >>>                  lazy_gettext("Client Secret (Client Credentials
>>> Grant
>>> >>> Flow)"),
>>> >>>                  widget=BS3PasswordFieldWidget(),
>>> >>>              ),
>>> >>>              "idp_extra_parameters": StringField(
>>> >>>                  lazy_gettext("IdP Extra Request Parameters"),
>>> >>> widget=BS3TextFieldWidget()
>>> >>>              ),
>>> >>>              "is_anonymous": BooleanField(
>>> >>>                  lazy_gettext("Anonymous credentials (ignores all
>>> other
>>> >>> settings)"), default=False
>>> >>>              ),
>>> >>>          }
>>> >>>
>>> >>>      @classmethod
>>> >>>      def get_ui_field_behaviour(cls) -> dict[str, Any]:
>>> >>>          """Return custom field behaviour."""
>>> >>>          return {
>>> >>>              "hidden_fields": ["host", "schema", "login", "password",
>>> >>> "port", "extra"],
>>> >>>              "relabeling": {},
>>> >>>          }
>>> >>>
>>> >>> All of these are covered by my schema.
>>> >>>
>>> >>> Also checked what the react UI supports and:
>>> >>>
>>> >>> I checked what the react UI supports as of now and this is what I
>>> found:
>>> >>>
>>> >>> string - Text input
>>> >>> integer - Number input
>>> >>> number - Number input
>>> >>> boolean - Checkbox
>>> >>> object - JSON object editor
>>> >>> array - Array input
>>> >>>
>>> >>> String Formats:
>>> >>> format: "password" - Masked password field
>>> >>> format: "multiline" - Textarea
>>> >>> format: "date" - Date picker
>>> >>> format: "date-time" - DateTime picker
>>> >>> format: "time" - Time picker
>>> >>>
>>> >>> Array Types
>>> >>>
>>> >>> This all comes from a field selector logic:
>>> >>>
>>> >>
>>> https://github.com/apache/airflow/blob/main/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldSelector.tsx#L58-L92
>>> >>> .
>>> >>>
>>> >>> Fields are selected based on
>>> >>> - `schema.type` (string, integer, boolean, array, object)
>>> >>> - `schema.format` (password, multiline, date, date-time, time, email,
>>> >> url)
>>> >>> - `schema.enum` (if present, dropdown select)
>>> >>>
>>> >>> So essentially anything with a type, format, and enum defined can be
>>> >>> handled by react UI. That said, maybe I should
>>> >>> try and adopt using jsonschema format here.
>>> >>>
>>> >>> Thanks & Regards,
>>> >>> Amogh Desai
>>> >>>
>>> >>>
>>> >>> On Fri, Jan 16, 2026 at 12:36 PM Amogh Desai <[email protected]>
>>> >>> wrote:
>>> >>>
>>> >>>> Jarek -
>>> >>>>
>>> >>>> Re backcompat, yeah, I already have the fallback in place in my
>>> POC. The
>>> >>>> discovery code
>>> >>>> will first try to load the metadata from yaml, and if it fails to
>>> do so,
>>> >>>> it will use the *python method*
>>> >>>> flow to discover the metadata.
>>> >>>>
>>> >>>> Re the bigger vision about API servers without providers, I love
>>> where
>>> >>>> you are going with this, but
>>> >>>> I think we need to split up the tasks because we aren't there yet.
>>> Let
>>> >> me
>>> >>>> explain -
>>> >>>>
>>> >>>> Your idea to discover providers via triggerer, store in DB and API
>>> >> server
>>> >>>> reads from DB might work
>>> >>>> for connection forms, but there are a few more reasons why API
>>> server
>>> >>>> will continue to need the
>>> >>>> ProvidersManager:
>>> >>>>
>>> >>>> 1. Auth Managers
>>> >>>> 2. Secrets Backends
>>> >>>> 3. Providers List Endpoint: maybe we should get rid of this? IDK
>>> who the
>>> >>>> consumer of this endpoint is
>>> >>>>
>>> >>>> So the API server without Providers thing is harder than just
>>> connection
>>> >>>> forms and we aren't there yet
>>> >>>> until we figure out the 3 points from above.
>>> >>>>
>>> >>>> I suggest we do this instead:
>>> >>>>
>>> >>>> Phase 1: Connection forms from YAML to establish foundation for the
>>> >> future
>>> >>>> Phase 2: The DB storage phase - decide if Triggerer / who populates
>>> in
>>> >> DB
>>> >>>> (Maybe not triggerer because we do not want it to have DB access
>>> >>>> eventually)
>>> >>>>
>>> >>>> Does that sound reasonable? What do you think?
>>> >>>>
>>> >>>>
>>> >>>> Thanks & Regards,
>>> >>>> Amogh Desai
>>> >>>>
>>> >>>>
>>> >>>> On Fri, Jan 16, 2026 at 4:46 AM Jarek Potiuk <[email protected]>
>>> wrote:
>>> >>>>
>>> >>>>>> One main thing was assuming that all providers need to be
>>> available
>>> >> on
>>> >>>>>> Scheduler (? I think that changed?) that there the connection form
>>> >>>>>>   definitons are persisted to DB such that the API server
>>> directly can
>>> >>>>>> read from there - no need to install providers on API Server!
>>> >>>>> I think Triggerer is better than Scheduler to persist connection
>>> >>>>> definition
>>> >>>>> to the DB. Essentially Triggerer is the only component that needs
>>> DB
>>> >>>>> access
>>> >>>>> and also needs to have providers installed. Any of the providers
>>> might
>>> >>>>> implement Triggers and they are very tightly coupled with "Hooks"
>>> and
>>> >>>>> "Operators".  Scheduler only really needs **scheduler plugins**
>>> >>>>> (Timetables
>>> >>>>> and such) and **executors** (which we eventually want to split-off
>>> from
>>> >>>>> current "worker" providers). It does not need "worker providers".
>>> >>>>>
>>> >>>>> IMHO in many discussions of ours this long term plan / vision is
>>> most
>>> >>>>> appealing:
>>> >>>>>
>>> >>>>> * api-server: only needs distributions that are "ui plugins" (no
>>> >>>>> providers)
>>> >>>>> * scheduler only needs distributions that are "scheduler plugins"
>>> (e.g.
>>> >>>>> timetables) and "executors"
>>> >>>>> * worker only needs "worker/triggerer providers" (i.e. hooks and
>>> >>>>> operators
>>> >>>>> essentially) and "worker plugins" (e.g. macros)
>>> >>>>> * triggerer only needs "worker/triggerer providers" (as in
>>> workers) -
>>> >>>>> possibly "triggerer plugins" if we ever have a need to have them
>>> >>>>>
>>> >>>>> Eventually, optionally, each of those should ("api-server",
>>> >> "scheduler",
>>> >>>>> "worker", "triggerer") should be a separate distribution. Each
>>> with its
>>> >>>>> own
>>> >>>>> dependencies. But this one only makes sense if we find that those
>>> >>>>> dependencies could be very different between those - it's likely
>>> this
>>> >>>>> will
>>> >>>>> not happen, because dependency-set for each of those "components"
>>> will
>>> >> be
>>> >>>>> very close. when we finalize the current task-sdk isolation work.
>>> >>>>>
>>> >>>>> Of course we cannot do it all at once and it will take quite some
>>> time
>>> >> to
>>> >>>>> get there.
>>> >>>>>
>>> >>>>> But I think we should have it as a "North Star" that we should
>>> look at
>>> >>>>> when
>>> >>>>> we make any "architecture" decisions.  And every decision we make
>>> >> should
>>> >>>>> bring us closer to this "North Star".
>>> >>>>>
>>> >>>>> Also - just to note - with the "shared" libraries concept we
>>> already
>>> >>>>> have,
>>> >>>>> and with "uv workspace" in our monorepo - we have ALL the
>>> mechanisms
>>> >>>>> needed
>>> >>>>> to make it happen. And to do it in a very maintainable way with
>>> very
>>> >>>>> little
>>> >>>>> overhead and virtually no change in regular development workflow.
>>> For
>>> >>>>> example the shared libraries concept might be used to share common
>>> code
>>> >>>>> for
>>> >>>>> both: apache-airflow-providers-cncf-kubernetes (worker provider -
>>> KPO
>>> >>>>> essentially - installable for worker and triggerer) and (future)
>>> >>>>> apache-airflow-executors-cncf-kubernetes (executor installable for
>>> >>>>> scheduler). Same for amazon worker provider/executor split and edge
>>> >>>>> worker
>>> >>>>> provider/executor split. All that is doable.
>>> >>>>>
>>> >>>>> J.
>>> >>>>>
>>> >>>>>
>>> >>>>>
>>> >>>>> On Thu, Jan 15, 2026 at 10:23 PM Jens Scheffler <
>>> [email protected]>
>>> >>>>> wrote:
>>> >>>>>
>>> >>>>>> Also +100 from my side.
>>> >>>>>>
>>> >>>>>> We discussed exactly this in a Airflow 3 dev call, I was looking
>>> for
>>> >>>>> the
>>> >>>>>> notes... that was when we discussed about the component split in
>>> the
>>> >>>>>> future. Found a reference in
>>> >>>>>>
>>> >>>>>>
>>> >>
>>> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=308153072#Airflow3Devcall:MeetingNotes-22August2024
>>> >>>>>> ```
>>> >>>>>>
>>> >>>>>> **Plan for Decoupling Providers's Connections metadata from FAB
>>> (Jens
>>> >>>>>> Scheffler <https://cwiki.apache.org/confluence/display/~jscheffl
>>> >)**
>>> >>>>>>
>>> >>>>>>    * Jens created this draft PR
>>> >>>>>>      <https://github.com/apache/airflow/pull/41656> with the POC
>>> for
>>> >> it
>>> >>>>>>      and presented it on the call.
>>> >>>>>>    * Jarek <https://cwiki.apache.org/confluence/display/~potiuk>
>>> >>>>> proposed
>>> >>>>>>      the idea of dumping the JSON/YAML with connection fields in
>>> the
>>> >>>>>>      Database or loading it via package metadata so we don't load
>>> all
>>> >>>>> the
>>> >>>>>>      dependencies on the webserver.
>>> >>>>>>    * We will need some plan for external providers on how they can
>>> >>>>> define
>>> >>>>>>      connections or register them.
>>> >>>>>>    * The POC successfully proved that we can separate the
>>> connection
>>> >>>>>>      metadata from FAB
>>> >>>>>>    * /*Action Item*/: Jens
>>> >>>>>>      <https://cwiki.apache.org/confluence/display/~jscheffl> to
>>> >> create
>>> >>>>> a
>>> >>>>>>      GitHub issue for decoupling the Connection metadata from FAB
>>> >>>>>>
>>> >>>>>> ```
>>> >>>>>>
>>> >>>>>> Also on Sep 19th 2024 we had an overview which pieces of the
>>> >> providers
>>> >>>>>> are needed where:
>>> >>>>>>
>>> >>>>>>
>>> >>>>>>
>>> >>
>>> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=308153072#Airflow3Devcall:MeetingNotes-19September2024
>>> >>>>>> Follow-up was notes in Github ticket:
>>> >>>>>> https://github.com/apache/airflow/issues/42016
>>> >>>>>>
>>> >>>>>>
>>> >>>>>> One main thing was assuming that all providers need to be
>>> available
>>> >> on
>>> >>>>>> Scheduler (? I think that changed?) that there the connection form
>>> >>>>>> definitons are persisted to DB such that the API server directly
>>> can
>>> >>>>>> read from there - no need to install providers on API Server!
>>> >>>>>>
>>> >>>>>> Looking forward for the contribution... I assume no VOTE needed
>>> :-D
>>> >>>>>>
>>> >>>>>> Jens
>>> >>>>>>
>>> >>>>>> On 1/15/26 15:52, Ash Berlin-Taylor wrote:
>>> >>>>>>> As an idea/structure I think its certainly the right way to go —
>>> >> not
>>> >>>>>> needing the code, not the instantiated widget classes, to (I
>>> suspect)
>>> >>>>> throw
>>> >>>>>> them away in the new React UI certainly seems like a silly idea
>>> now.
>>> >>>>>>> In your POC I don’t think you have got the ability to have the
>>> >> extra
>>> >>>>>> fields that, for instance, Google Cloud connection has yet though.
>>> >>>>>>> As for the schema we need to express: I’d say we should look at
>>> >> what
>>> >>>>> the
>>> >>>>>> react UI currently supports?
>>> >>>>>>> -ash
>>> >>>>>>>
>>> >>>>>>>> On 15 Jan 2026, at 14:07, Amogh Desai<[email protected]>
>>> >> wrote:
>>> >>>>>>>> Hi All,
>>> >>>>>>>>
>>> >>>>>>>> I wanted to get feedback on something I have been twiddling
>>> with.
>>> >>>>> For
>>> >>>>>>>> context, the API server has to import
>>> >>>>>>>> every single hook class from all providers just to render
>>> >> connection
>>> >>>>>> forms
>>> >>>>>>>> in the UI. This is because the UI
>>> >>>>>>>> metadata (what fields to show, labels, validators, etc.) are
>>> >> living
>>> >>>>> in
>>> >>>>>>>> python functions like `get_connection_form_widgets()`
>>> >>>>>>>> and `get_ui_field_behaviour()` which are defined on the hook
>>> >>>>> classes.
>>> >>>>>>>> This means:
>>> >>>>>>>> - API server startup imports 100+ hook classes it might not
>>> >> actually
>>> >>>>>> need
>>> >>>>>>>> - Slower startup due to heavier memory footprint
>>> >>>>>>>> - Poor client-server separation (why does the API server need to
>>> >>>>> know
>>> >>>>>> about
>>> >>>>>>>> pyodbc just to show a UI form?)
>>> >>>>>>>>
>>> >>>>>>>> My proposal
>>> >>>>>>>>
>>> >>>>>>>> Moving the UI metadata from python code to something static /
>>> >>>>>> declarative
>>> >>>>>>>> like yaml. I want to add this information
>>> >>>>>>>> in the provider.yaml file that every provider already has. For
>>> >>>>> example -
>>> >>>>>>>> class PostgresHook(BaseHook):
>>> >>>>>>>>      @classmethod
>>> >>>>>>>>      def get_ui_field_behaviour(cls) -> dict[str, Any]:
>>> >>>>>>>>          return {
>>> >>>>>>>>              "hidden_fields": [],
>>> >>>>>>>>              "relabeling": {
>>> >>>>>>>>                  "schema": "Database",
>>> >>>>>>>>              },
>>> >>>>>>>>          }
>>> >>>>>>>>
>>> >>>>>>>> Will become:
>>> >>>>>>>>
>>> >>>>>>>> connection-types:
>>> >>>>>>>>    - connection-type: postgres
>>> >>>>>>>>      hook-class-name:
>>> >>>>>> airflow.providers.postgres.hooks.postgres.PostgresHook
>>> >>>>>>>>      ui-field-behaviour:
>>> >>>>>>>>        hidden-fields: []
>>> >>>>>>>>        relabeling:
>>> >>>>>>>>          schema: "Database"
>>> >>>>>>>>
>>> >>>>>>>>      conn-fields:
>>> >>>>>>>>        sslmode:
>>> >>>>>>>>          type: string
>>> >>>>>>>>          label: SSL Mode
>>> >>>>>>>>          enum: ["disable", "prefer", "require"]
>>> >>>>>>>>          default: "prefer"
>>> >>>>>>>>
>>> >>>>>>>>        timeout:
>>> >>>>>>>>          type: integer
>>> >>>>>>>>          label: Timeout
>>> >>>>>>>>          range: [1, 300]
>>> >>>>>>>>          default: 30
>>> >>>>>>>>
>>> >>>>>>>> The schema will now consist of two new sections:
>>> >>>>>>>>
>>> >>>>>>>> 1. ui-field-behaviour
>>> >>>>>>>> - Used to customize the standard connection fields (host, port,
>>> >>>>> login,
>>> >>>>>> etc.)
>>> >>>>>>>> - hidden-fields: Hide some fields
>>> >>>>>>>> - relabeling: Change labels for some fields (like schema ->
>>> >> Database
>>> >>>>>> above)
>>> >>>>>>>> - placeholders: Show hints in the form (port 5432 for example)
>>> >>>>>>>>
>>> >>>>>>>> 2. conn-fields
>>> >>>>>>>> - Can be used to define custom fields stored in Connection.extra
>>> >>>>>>>> - You can define inline validators like enum, range, pattern,
>>> >>>>>> min-length,
>>> >>>>>>>> max-length
>>> >>>>>>>> - Will support the standard wtforms string, integer, boolean,
>>> >> number
>>> >>>>>> types
>>> >>>>>>>> As for why this schema was chosen, check the comparison with
>>> >>>>>> alternative in
>>> >>>>>>>> the PR
>>> >>>>>>>> desc:https://github.com/apache/airflow/pull/60410
>>> >>>>>>>>
>>> >>>>>>>>
>>> >>>>>>>> Current Status
>>> >>>>>>>>
>>> >>>>>>>> I have a POC in:https://github.com/apache/airflow/pull/60410
>>> >> where
>>> >>>>> I
>>> >>>>>> chose
>>> >>>>>>>> two pilot providers of
>>> >>>>>>>> varying difficulty: HTTP and SMTP (HTTP is easy, just a vanilla
>>> >>>>> form but
>>> >>>>>>>> SMTP has some hidden fields).
>>> >>>>>>>>
>>> >>>>>>>>
>>> >>>>>>>> Benefits this will offer
>>> >>>>>>>>
>>> >>>>>>>> - Once complete, the API server won't import any hook classes
>>> for
>>> >> UI
>>> >>>>>>>> rendering leading to faster startup
>>> >>>>>>>> - Provider dependencies don't affect API server
>>> >>>>>>>> - YAML is easier to read/write than python functions for form
>>> >>>>> metadata
>>> >>>>>>>> Would love feedback on:
>>> >>>>>>>> 1. Schema design - does it cover your use cases?
>>> >>>>>>>> 2. Any missing field types or validators?
>>> >>>>>>>>
>>> >>>>>>>> The goal is to get the pilot providers in so we can start
>>> >> migrating
>>> >>>>>>>> providers incrementally. Old way still
>>> >>>>>>>> works, so no rush for everyone to migrate at once.
>>> >>>>>>>>
>>> >>>>>>>> Thoughts?
>>> >>>>>>>>
>>> >>>>>>>> Thanks & Regards,
>>> >>>>>>>> Amogh Desai
>>> >>>>>>>
>>> >> ---------------------------------------------------------------------
>>> >>>>>>> To unsubscribe, e-mail:[email protected]
>>> >>>>>>> For additional commands, e-mail:[email protected]
>>> >>>>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>

Reply via email to