provider_command.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. # Licensed to the Apache Software Foundation (ASF) under one
  2. # or more contributor license agreements. See the NOTICE file
  3. # distributed with this work for additional information
  4. # regarding copyright ownership. The ASF licenses this file
  5. # to you under the Apache License, Version 2.0 (the
  6. # "License"); you may not use this file except in compliance
  7. # with the License. You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing,
  12. # software distributed under the License is distributed on an
  13. # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  14. # KIND, either express or implied. See the License for the
  15. # specific language governing permissions and limitations
  16. # under the License.
  17. """Providers sub-commands."""
  18. from __future__ import annotations
  19. import sys
  20. import re2
  21. from airflow.cli.simple_table import AirflowConsole
  22. from airflow.providers_manager import ProvidersManager
  23. from airflow.utils.cli import suppress_logs_and_warning
  24. from airflow.utils.providers_configuration_loader import providers_configuration_loaded
  25. ERROR_IMPORTING_HOOK = "Error when importing hook!"
  26. def _remove_rst_syntax(value: str) -> str:
  27. return re2.sub("[`_<>]", "", value.strip(" \n."))
  28. @suppress_logs_and_warning
  29. @providers_configuration_loaded
  30. def provider_get(args):
  31. """Get a provider info."""
  32. providers = ProvidersManager().providers
  33. if args.provider_name in providers:
  34. provider_version = providers[args.provider_name].version
  35. provider_info = providers[args.provider_name].data
  36. if args.full:
  37. provider_info["description"] = _remove_rst_syntax(provider_info["description"])
  38. AirflowConsole().print_as(
  39. data=[provider_info],
  40. output=args.output,
  41. )
  42. else:
  43. AirflowConsole().print_as(
  44. data=[{"Provider": args.provider_name, "Version": provider_version}], output=args.output
  45. )
  46. else:
  47. raise SystemExit(f"No such provider installed: {args.provider_name}")
  48. @suppress_logs_and_warning
  49. @providers_configuration_loaded
  50. def providers_list(args):
  51. """List all providers at the command line."""
  52. AirflowConsole().print_as(
  53. data=list(ProvidersManager().providers.values()),
  54. output=args.output,
  55. mapper=lambda x: {
  56. "package_name": x.data["package-name"],
  57. "description": _remove_rst_syntax(x.data["description"]),
  58. "version": x.version,
  59. },
  60. )
  61. @suppress_logs_and_warning
  62. @providers_configuration_loaded
  63. def hooks_list(args):
  64. """List all hooks at the command line."""
  65. AirflowConsole().print_as(
  66. data=list(ProvidersManager().hooks.items()),
  67. output=args.output,
  68. mapper=lambda x: {
  69. "connection_type": x[0],
  70. "class": x[1].hook_class_name if x[1] else ERROR_IMPORTING_HOOK,
  71. "conn_id_attribute_name": x[1].connection_id_attribute_name if x[1] else ERROR_IMPORTING_HOOK,
  72. "package_name": x[1].package_name if x[1] else ERROR_IMPORTING_HOOK,
  73. "hook_name": x[1].hook_name if x[1] else ERROR_IMPORTING_HOOK,
  74. },
  75. )
  76. @suppress_logs_and_warning
  77. @providers_configuration_loaded
  78. def triggers_list(args):
  79. AirflowConsole().print_as(
  80. data=ProvidersManager().trigger,
  81. output=args.output,
  82. mapper=lambda x: {
  83. "package_name": x.package_name,
  84. "class": x.trigger_class_name,
  85. "integration_name": x.integration_name,
  86. },
  87. )
  88. @suppress_logs_and_warning
  89. @providers_configuration_loaded
  90. def notifications_list(args):
  91. AirflowConsole().print_as(
  92. data=ProvidersManager().notification,
  93. output=args.output,
  94. mapper=lambda x: {
  95. "notification_class_name": x,
  96. },
  97. )
  98. @suppress_logs_and_warning
  99. @providers_configuration_loaded
  100. def connection_form_widget_list(args):
  101. """List all custom connection form fields at the command line."""
  102. AirflowConsole().print_as(
  103. data=sorted(ProvidersManager().connection_form_widgets.items()),
  104. output=args.output,
  105. mapper=lambda x: {
  106. "connection_parameter_name": x[0],
  107. "class": x[1].hook_class_name,
  108. "package_name": x[1].package_name,
  109. "field_type": x[1].field.field_class.__name__,
  110. },
  111. )
  112. @suppress_logs_and_warning
  113. @providers_configuration_loaded
  114. def connection_field_behaviours(args):
  115. """List field behaviours."""
  116. AirflowConsole().print_as(
  117. data=list(ProvidersManager().field_behaviours),
  118. output=args.output,
  119. mapper=lambda x: {
  120. "field_behaviours": x,
  121. },
  122. )
  123. @suppress_logs_and_warning
  124. @providers_configuration_loaded
  125. def extra_links_list(args):
  126. """List all extra links at the command line."""
  127. AirflowConsole().print_as(
  128. data=ProvidersManager().extra_links_class_names,
  129. output=args.output,
  130. mapper=lambda x: {
  131. "extra_link_class_name": x,
  132. },
  133. )
  134. @suppress_logs_and_warning
  135. @providers_configuration_loaded
  136. def logging_list(args):
  137. """List all log task handlers at the command line."""
  138. AirflowConsole().print_as(
  139. data=list(ProvidersManager().logging_class_names),
  140. output=args.output,
  141. mapper=lambda x: {
  142. "logging_class_name": x,
  143. },
  144. )
  145. @suppress_logs_and_warning
  146. @providers_configuration_loaded
  147. def secrets_backends_list(args):
  148. """List all secrets backends at the command line."""
  149. AirflowConsole().print_as(
  150. data=list(ProvidersManager().secrets_backend_class_names),
  151. output=args.output,
  152. mapper=lambda x: {
  153. "secrets_backend_class_name": x,
  154. },
  155. )
  156. @suppress_logs_and_warning
  157. @providers_configuration_loaded
  158. def auth_backend_list(args):
  159. """List all API auth backend modules at the command line."""
  160. AirflowConsole().print_as(
  161. data=list(ProvidersManager().auth_backend_module_names),
  162. output=args.output,
  163. mapper=lambda x: {
  164. "api_auth_backend_module": x,
  165. },
  166. )
  167. @suppress_logs_and_warning
  168. @providers_configuration_loaded
  169. def auth_managers_list(args):
  170. """List all auth managers at the command line."""
  171. AirflowConsole().print_as(
  172. data=list(ProvidersManager().auth_managers),
  173. output=args.output,
  174. mapper=lambda x: {
  175. "auth_managers_module": x,
  176. },
  177. )
  178. @suppress_logs_and_warning
  179. @providers_configuration_loaded
  180. def executors_list(args):
  181. """List all executors at the command line."""
  182. AirflowConsole().print_as(
  183. data=list(ProvidersManager().executor_class_names),
  184. output=args.output,
  185. mapper=lambda x: {
  186. "executor_class_names": x,
  187. },
  188. )
  189. @suppress_logs_and_warning
  190. @providers_configuration_loaded
  191. def config_list(args):
  192. """List all configurations at the command line."""
  193. AirflowConsole().print_as(
  194. data=list(ProvidersManager().provider_configs),
  195. output=args.output,
  196. mapper=lambda x: {
  197. "provider_config": x,
  198. },
  199. )
  200. @suppress_logs_and_warning
  201. def lazy_loaded(args):
  202. """
  203. Informs if providers manager has been initialized too early.
  204. If provider is initialized, shows the stack trace and exit with error code 1.
  205. """
  206. import rich
  207. if ProvidersManager.initialized():
  208. rich.print(
  209. "\n[red]ProvidersManager was initialized during CLI parsing. This should not happen.\n",
  210. file=sys.stderr,
  211. )
  212. rich.print(
  213. "\n[yellow]Please make sure no Providers Manager initialization happens during CLI parsing.\n",
  214. file=sys.stderr,
  215. )
  216. rich.print("Stack trace where it has been initialized:\n", file=sys.stderr)
  217. rich.print(ProvidersManager.initialization_stack_trace(), file=sys.stderr)
  218. sys.exit(1)
  219. else:
  220. rich.print("[green]All ok. Providers Manager was not initialized during the CLI parsing.")
  221. sys.exit(0)