삽질/Airflow

airflow 2에서 variable, connection 등록자(소유자)만 보게 하기

maengis 2023. 6. 14. 18:37

postgresql 기준으로 아래처럼 owners 컬럼을 추가한다. (varchar 2000인 건, dag 테이블에 owners랑 동일하게 해서 그렇다. 나처럼 모델 파일 수정을 나중에 하는 경우에만 추가하면 된다. 모델 파일 수정하고 에어플로우를 띄우면 생성 되어 있음.)

alter table variable add column owners character varying(2000);
alter table connection add column owners character varying(2000);

 

airflow/models/variable.py

airflow/models/connection.py

위 두 개 파일에 owners를 추가한다. 코드 보면 대충 뭘 넣어야 될지 보임. 내 경우엔 웹에서만 부를 거라 접속자 정보 그냥 갖다 쓰게 함.

아래와 같은 느낌으로... 대략 보면 안다. 이걸 왜 모델에 넣어요? 라고 하기엔 나도 먹고 살기 힘드니까 편히 좀 살아 보려고 그랬다.

...
    owners = Column(String(2000))
...
        owners: str | None = None,
...
        super().__init__()

        if owners is None:
            if g.user.is_anonymous:
                user = 'anonymous'
            else:
                user = g.user.username
        else:
            user = owners

        self.conn_id = conn_id
        self.description = description
        self.owners = user
...

 

추가하고 웹에서 variable, connection 등록하면 추가한 owners에 등록한 사람 아이디가 들어간다.

이제 이것만 목록에서 보이게 해야 된다.

 

airflow/www/views.py 에 기본 필터를 추가 해야 함. 소스에 DagFilter라는 class가 이미 있다. 그거 아래 넣음.

class OwnersFilter(BaseFilter):
    """Filter using Owners"""

    def apply(self, query, func):
        if g.user.username == 'admin':
            return query
        return query.filter(self.model.owners.ilike(g.user.username, escape="\\"))

 

이제 소스에서 ConnectionModelView, VariableModelView라는 class를 찾아서 아래 코드 넣어줌.

base_filters = [["owners", OwnersFilter, lambda: []]]

 

OwnersFilter 코드 내용대로, 접속자가 admin이 아니면 자기꺼만 보인다.

flask appbuilder를 써본 적이 없어서 이게 도대체 어디 있나 찾다가 결국 flask appbuilder 소스까지 내려 받아서 본 뒤에 구조를 이해함. ㅠㅠ

반응형