Skip to content

Commit

Permalink
Disable default_pool delete on web ui (#21658)
Browse files Browse the repository at this point in the history
GitOrigin-RevId: df6058c862a910a99fbb86858502d9d93fdbe1e5
  • Loading branch information
chenglongyan authored and Cloud Composer Team committed Aug 30, 2022
1 parent 366a5a5 commit 09b52fa
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 3 deletions.
2 changes: 1 addition & 1 deletion airflow/api/common/experimental/pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def delete_pool(name, session=None):
raise AirflowBadRequest("Pool name shouldn't be empty")

if name == Pool.DEFAULT_POOL_NAME:
raise AirflowBadRequest("default_pool cannot be deleted")
raise AirflowBadRequest(f"{Pool.DEFAULT_POOL_NAME} cannot be deleted")

pool = session.query(Pool).filter_by(pool=name).first()
if pool is None:
Expand Down
19 changes: 18 additions & 1 deletion airflow/models/pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,23 @@ def get_default_pool(session: Session = NEW_SESSION):
"""
return Pool.get_pool(Pool.DEFAULT_POOL_NAME, session=session)

@staticmethod
@provide_session
def is_default_pool(id: int, session: Session = NEW_SESSION) -> bool:
"""
Check id if is the default_pool.
:param id: pool id
:param session: SQLAlchemy ORM Session
:return: True if id is default_pool, otherwise False
"""
return (
session.query(func.count(Pool.id))
.filter(Pool.id == id, Pool.pool == Pool.DEFAULT_POOL_NAME)
.scalar()
> 0
)

@staticmethod
@provide_session
def create_or_update_pool(name: str, slots: int, description: str, session: Session = NEW_SESSION):
Expand All @@ -107,7 +124,7 @@ def create_or_update_pool(name: str, slots: int, description: str, session: Sess
def delete_pool(name: str, session: Session = NEW_SESSION):
"""Delete pool by a given name."""
if name == Pool.DEFAULT_POOL_NAME:
raise AirflowException("default_pool cannot be deleted")
raise AirflowException(f"{Pool.DEFAULT_POOL_NAME} cannot be deleted")

pool = session.query(Pool).filter_by(pool=name).first()
if pool is None:
Expand Down
13 changes: 12 additions & 1 deletion airflow/www/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4135,13 +4135,24 @@ class PoolModelView(AirflowModelView):
def action_muldelete(self, items):
"""Multiple delete."""
if any(item.pool == models.Pool.DEFAULT_POOL_NAME for item in items):
flash("default_pool cannot be deleted", 'error')
flash(f"{models.Pool.DEFAULT_POOL_NAME} cannot be deleted", 'error')
self.update_redirect()
return redirect(self.get_redirect())
self.datamodel.delete_all(items)
self.update_redirect()
return redirect(self.get_redirect())

@expose("/delete/<pk>", methods=["GET", "POST"])
@has_access
def delete(self, pk):
"""Single delete."""
if models.Pool.is_default_pool(pk):
flash(f"{models.Pool.DEFAULT_POOL_NAME} cannot be deleted", 'error')
self.update_redirect()
return redirect(self.get_redirect())

return super().delete(pk)

def pool_link(self):
"""Pool link rendering."""
pool_id = self.get('pool')
Expand Down
6 changes: 6 additions & 0 deletions tests/models/test_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,3 +220,9 @@ def test_delete_pool_non_existing(self):
def test_delete_default_pool_not_allowed(self):
with pytest.raises(AirflowException, match="^default_pool cannot be deleted$"):
Pool.delete_pool(Pool.DEFAULT_POOL_NAME)

def test_is_default_pool(self):
pool = Pool.create_or_update_pool(name="not_default_pool", slots=1, description="test")
default_pool = Pool.get_default_pool()
assert not Pool.is_default_pool(id=pool.id)
assert Pool.is_default_pool(str(default_pool.id))

0 comments on commit 09b52fa

Please sign in to comment.