Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Custom FAB actions no longer work #39144

Closed
1 of 2 tasks
jedcunningham opened this issue Apr 19, 2024 · 7 comments · Fixed by #39167 or #39421
Closed
1 of 2 tasks

Custom FAB actions no longer work #39144

jedcunningham opened this issue Apr 19, 2024 · 7 comments · Fixed by #39167 or #39421
Labels
kind:bug This is a clearly a bug provider:fab

Comments

@jedcunningham
Copy link
Member

jedcunningham commented Apr 19, 2024

Apache Airflow version

2.9.0

If "Other Airflow 2 version" selected, which one?

No response

What happened?

Before the auth manager/FAB transition in 2.9.0, plugins were able to include custom actions. This no longer works:

[2024-04-19T21:24:50.050+0000] {app.py:1744} ERROR - Exception on /testappbuilderbaseview/ [GET]                                                             
Traceback (most recent call last):                                                                                                                           
  File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 2529, in wsgi_app                                                              
    response = self.full_dispatch_request()                                                                                                                  
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                  
  File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1825, in full_dispatch_request                                                 
    rv = self.handle_user_exception(e)                                                                                                                       
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                       
  File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1823, in full_dispatch_request                                                 
    rv = self.dispatch_request()                                                                                                                             
         ^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                             
  File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1799, in dispatch_request                                                      
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)                                                                                 
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                 
  File "/home/airflow/.local/lib/python3.12/site-packages/airflow/providers/fab/auth_manager/decorators/auth.py", line 118, in decorated                     
    is_authorized=appbuilder.sm.check_authorization(permissions, dag_id),                                                                                    
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                     
  File "/home/airflow/.local/lib/python3.12/site-packages/airflow/providers/fab/auth_manager/security_manager/override.py", line 2305, in check_authorization
    elif not self.has_access(*perm):                                                                                                                         
             ^^^^^^^^^^^^^^^^^^^^^^                                                                                                                          
  File "/home/airflow/.local/lib/python3.12/site-packages/airflow/www/security_manager.py", line 142, in has_access                                          
    return is_authorized_method(action_name, resource_pk, user)                                                                                              
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                              
  File "/home/airflow/.local/lib/python3.12/site-packages/airflow/www/security_manager.py", line 340, in <lambda>                                            
    method=get_method_from_fab_action_map()[action],                                                                                                         
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^                                                                                                          
KeyError: 'can_do'                                                                                                                                           

What you think should happen instead?

Custom actions should continue to function.

How to reproduce

This is a simple plugin that reproduces the issue:

from airflow.plugins_manager import AirflowPlugin
from airflow.www.auth import has_access
from flask_appbuilder import expose, BaseView as AppBuilderBaseView


class TestAppBuilderBaseView(AppBuilderBaseView):
    default_view = "test"
    base_permissions = ['can_do']

    @expose("/")
    @has_access(
        [
            ("can_do", "TestAppBuilderBaseView"),
        ]
    )
    def test(self):
        return "hello"


v_appbuilder_view = TestAppBuilderBaseView()
v_appbuilder_package = {
    "name": "Test View",
    "category": "Test Plugin",
    "view": v_appbuilder_view,
}

class AirflowTestPlugin(AirflowPlugin):
    name = "test_plugin"
    appbuilder_views = [v_appbuilder_package]

Note that users with the new action + resource perm still face the above traceback.

Operating System

Debian (official image)

Versions of Apache Airflow Providers

apache-airflow-providers-fab==1.0.2

Deployment

Official Apache Airflow Helm Chart

Deployment details

No response

Anything else?

No response

Are you willing to submit PR?

  • Yes I am willing to submit a PR!

Code of Conduct

@jedcunningham jedcunningham added kind:bug This is a clearly a bug area:core needs-triage label for new issues that we didn't triage yet provider:fab and removed area:core needs-triage label for new issues that we didn't triage yet labels Apr 19, 2024
@potiuk
Copy link
Member

potiuk commented Apr 20, 2024

CC: @vincbeck

@vincbeck
Copy link
Contributor

I see the issue ... I hate plugins ... I'll work on a fix

@vincbeck
Copy link
Contributor

#39167

@tagoad
Copy link

tagoad commented May 1, 2024

is there a workaround for this until the fix is deployed? I can't run my dev environment locally

@vincbeck
Copy link
Contributor

vincbeck commented May 1, 2024

Besides removing the @has_access from the view you defined in your plugin, I dont see any. I am not saying this is something you should do. It really depends on your setup and who has access to your Airflow environment. By removing @has_access from a view, you let anyone has access to this page

@TJaniF
Copy link
Contributor

TJaniF commented May 1, 2024

is there a workaround for this until the fix is deployed? I can't run my dev environment locally

If you are referring to the Astro CLI local environment you can set AIRFLOW__ASTRONOMER__UPDATE_CHECK_INTERVAL=0 as a workaround (this works for the base Astro CLI, if you have custom plugins you would additionally have to implement the fix @vincbeck mentioned).

@jedcunningham
Copy link
Member Author

#39167 doesn't appear to actually fix this. PR incoming.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind:bug This is a clearly a bug provider:fab
Projects
None yet
5 participants