Skip to content

Commit bfa22c0

Browse files
authored
Added plugins command to airflowctl (#64935)
* Added plugins command into airflowctl * Add missing docstring to test
1 parent 7348e09 commit bfa22c0

8 files changed

Lines changed: 257 additions & 64 deletions

File tree

airflow-ctl-tests/tests/airflowctl_tests/test_airflowctl_commands.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ def date_param():
125125
"variables delete --variable-key=test_import_var_with_desc",
126126
# Version command
127127
"version --remote",
128+
# Plugins command
129+
"plugins list",
130+
"plugins list-import-errors",
128131
]
129132

130133
DATE_PARAM_1 = date_param()

airflow-ctl/docs/images/command_hashes.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
main:65249416abad6ad24c276fb44326ae15
1+
main:27a22c00dcf32e7a1a4f06672dc8e3c8
22
assets:b3ae2b933e54528bf486ff28e887804d
33
auth:d79e9c7d00c432bdbcbc2a86e2e32053
44
backfill:bbce9859a2d1ce054ad22db92dea8c05
@@ -11,4 +11,5 @@ pools:03fc7d948cbecf16ff8d640eb8f0ce43
1111
providers:1c0afb2dff31d93ab2934b032a2250ab
1212
variables:0354f8f4b0dde1c3771ed1568692c6ae
1313
version:31f4efdf8de0dbaaa4fac71ff7efecc3
14+
plugins:118ea0beda9b3935eedc67b0511f7e4a
1415
auth login:9fe2bb1dd5c602beea2eefb33a2b20a8

airflow-ctl/docs/images/output_main.svg

Lines changed: 67 additions & 63 deletions
Loading
Lines changed: 105 additions & 0 deletions
Loading

airflow-ctl/src/airflowctl/api/client.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
DagsOperations,
5353
JobsOperations,
5454
LoginOperations,
55+
PluginsOperations,
5556
PoolsOperations,
5657
ProvidersOperations,
5758
ServerResponseError,
@@ -434,6 +435,12 @@ def xcom(self):
434435
"""Operations related to XComs."""
435436
return XComOperations(self)
436437

438+
@lru_cache() # type: ignore[prop-decorator]
439+
@property
440+
def plugins(self):
441+
"""Operations related to plugins."""
442+
return PluginsOperations(self)
443+
437444

438445
# API Client Decorator for CLI Actions
439446
@contextlib.contextmanager

airflow-ctl/src/airflowctl/api/operations.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
ImportErrorCollectionResponse,
6060
ImportErrorResponse,
6161
JobCollectionResponse,
62+
PluginCollectionResponse,
63+
PluginImportErrorCollectionResponse,
6264
PoolBody,
6365
PoolCollectionResponse,
6466
PoolPatchBody,
@@ -893,3 +895,19 @@ def delete(
893895
return key
894896
except ServerResponseError as e:
895897
raise e
898+
899+
900+
class PluginsOperations(BaseOperations):
901+
"""Plugins operations."""
902+
903+
def list(self) -> PluginCollectionResponse | ServerResponseError:
904+
"""List all plugins from the API server."""
905+
return super().execute_list(path="plugins", data_model=PluginCollectionResponse)
906+
907+
def list_import_errors(self) -> PluginImportErrorCollectionResponse | ServerResponseError:
908+
"""List plugin import errors from the API server."""
909+
try:
910+
self.response = self.client.get("plugins/importErrors")
911+
return PluginImportErrorCollectionResponse.model_validate_json(self.response.content)
912+
except ServerResponseError as e:
913+
raise e

airflow-ctl/tests/airflow_ctl/api/test_operations.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@
7979
ImportErrorResponse,
8080
JobCollectionResponse,
8181
JobResponse,
82+
PluginCollectionResponse,
83+
PluginImportErrorCollectionResponse,
84+
PluginImportErrorResponse,
85+
PluginResponse,
8286
PoolBody,
8387
PoolCollectionResponse,
8488
PoolResponse,
@@ -1732,3 +1736,53 @@ def handle_request(request: httpx.Request) -> httpx.Response:
17321736
map_index=self.map_index,
17331737
)
17341738
assert response == self.key
1739+
1740+
1741+
class TestPluginsOperations:
1742+
plugin_response = PluginResponse(
1743+
name="test-plugin",
1744+
macros=[],
1745+
flask_blueprints=[],
1746+
fastapi_apps=[],
1747+
fastapi_root_middlewares=[],
1748+
external_views=[],
1749+
react_apps=[],
1750+
appbuilder_views=[],
1751+
appbuilder_menu_items=[],
1752+
global_operator_extra_links=[],
1753+
operator_extra_links=[],
1754+
source="test-source",
1755+
listeners=[],
1756+
timetables=[],
1757+
)
1758+
plugin_collection_response = PluginCollectionResponse(plugins=[plugin_response], total_entries=1)
1759+
plugin_import_error_response = PluginImportErrorResponse(
1760+
source="plugins/test_plugin.py", error="something went wrong"
1761+
)
1762+
plugin_import_error_collection_response = PluginImportErrorCollectionResponse(
1763+
import_errors=[plugin_import_error_response], total_entries=1
1764+
)
1765+
1766+
def test_list(self):
1767+
"""Test listing plugins"""
1768+
1769+
def handle_request(request: httpx.Request) -> httpx.Response:
1770+
assert request.url.path == ("/api/v2/plugins")
1771+
return httpx.Response(200, json=json.loads(self.plugin_collection_response.model_dump_json()))
1772+
1773+
client = make_api_client(transport=httpx.MockTransport(handle_request))
1774+
response = client.plugins.list()
1775+
assert response == self.plugin_collection_response
1776+
1777+
def test_list_import_errors(self):
1778+
"""Test listing plugin import errors"""
1779+
1780+
def handle_request(request: httpx.Request) -> httpx.Response:
1781+
assert request.url.path == "/api/v2/plugins/importErrors"
1782+
return httpx.Response(
1783+
200, json=json.loads(self.plugin_import_error_collection_response.model_dump_json())
1784+
)
1785+
1786+
client = make_api_client(transport=httpx.MockTransport(handle_request))
1787+
response = client.plugins.list_import_errors()
1788+
assert response == self.plugin_import_error_collection_response

scripts/in_container/run_capture_airflowctl_help.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"providers",
4848
"variables",
4949
"version",
50+
"plugins",
5051
]
5152

5253
SUBCOMMANDS = [

0 commit comments

Comments
 (0)