Skip to content

Commit

Permalink
Bugfix: Sync Access Control defined in DAGs when running sync-perm
Browse files Browse the repository at this point in the history
fixes #13376
  • Loading branch information
kaxil committed Dec 29, 2020
1 parent bafd258 commit 6bdf0c2
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 13 deletions.
4 changes: 3 additions & 1 deletion airflow/cli/commands/sync_perm_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ def sync_perm(args):
# Add missing permissions for all the Base Views
appbuilder.add_permissions(update_perms=True)
print('Updating permission on all DAG views')
dags = DagBag(read_dags_from_db=True).dags.values()
dagbag = DagBag(read_dags_from_db=True)
dagbag.collect_dags_from_db()
dags = dagbag.dags.values()
for dag in dags:
appbuilder.sm.sync_perm_for_dag(dag.dag_id, dag.access_control)
25 changes: 13 additions & 12 deletions tests/cli/commands/test_sync_perm_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,18 @@ def setUpClass(cls):
@mock.patch("airflow.cli.commands.sync_perm_command.cached_app")
@mock.patch("airflow.cli.commands.sync_perm_command.DagBag")
def test_cli_sync_perm(self, dagbag_mock, mock_cached_app):
self.expect_dagbag_contains(
[
DAG('has_access_control', access_control={'Public': {permissions.ACTION_CAN_READ}}),
DAG('no_access_control'),
],
dagbag_mock,
)
dags = [
DAG('has_access_control', access_control={'Public': {permissions.ACTION_CAN_READ}}),
DAG('no_access_control'),
]

collect_dags_from_db_mock = mock.Mock()
dagbag = mock.Mock()

dagbag.dags = {dag.dag_id: dag for dag in dags}
dagbag.collect_dags_from_db = collect_dags_from_db_mock
dagbag_mock.return_value = dagbag

appbuilder = mock_cached_app.return_value.appbuilder
appbuilder.sm = mock.Mock()

Expand All @@ -51,6 +56,7 @@ def test_cli_sync_perm(self, dagbag_mock, mock_cached_app):
assert appbuilder.sm.sync_roles.call_count == 1

dagbag_mock.assert_called_once_with(read_dags_from_db=True)
collect_dags_from_db_mock.assert_called_once_with()
self.assertEqual(2, len(appbuilder.sm.sync_perm_for_dag.mock_calls))
appbuilder.sm.sync_perm_for_dag.assert_any_call(
'has_access_control', {'Public': {permissions.ACTION_CAN_READ}}
Expand All @@ -60,8 +66,3 @@ def test_cli_sync_perm(self, dagbag_mock, mock_cached_app):
None,
)
appbuilder.add_permissions.assert_called_once_with(update_perms=True)

def expect_dagbag_contains(self, dags, dagbag_mock):
dagbag = mock.Mock()
dagbag.dags = {dag.dag_id: dag for dag in dags}
dagbag_mock.return_value = dagbag

0 comments on commit 6bdf0c2

Please sign in to comment.