blob: 4e6bdda7ac34bb1b45c8c26299ab303042498f23 [file]
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from __future__ import annotations
import random
import string
import pytest
from airflow import models
from airflow.api.common.experimental import pool as pool_api
from airflow.exceptions import AirflowBadRequest, PoolNotFound
from airflow.models.pool import Pool
from airflow.utils.session import create_session
from tests.test_utils.db import clear_db_pools
@pytest.mark.filterwarnings("ignore::DeprecationWarning")
class TestPool:
USER_POOL_COUNT = 2
TOTAL_POOL_COUNT = USER_POOL_COUNT + 1 # including default_pool
def setup_method(self):
clear_db_pools()
self.pools = [Pool.get_default_pool()]
for i in range(self.USER_POOL_COUNT):
name = f"experimental_{i + 1}"
pool = models.Pool(
pool=name,
slots=i,
description=name,
)
self.pools.append(pool)
with create_session() as session:
session.add_all(self.pools)
def test_get_pool(self):
pool = pool_api.get_pool(name=self.pools[0].pool)
assert pool.pool == self.pools[0].pool
def test_get_pool_non_existing(self):
with pytest.raises(PoolNotFound, match="^Pool 'test' doesn't exist$"):
pool_api.get_pool(name="test")
def test_get_pool_bad_name(self):
for name in ("", " "):
with pytest.raises(AirflowBadRequest, match="^Pool name shouldn't be empty$"):
pool_api.get_pool(name=name)
def test_get_pools(self):
pools = sorted(pool_api.get_pools(), key=lambda p: p.pool)
assert pools[0].pool == self.pools[0].pool
assert pools[1].pool == self.pools[1].pool
def test_create_pool(self):
pool = pool_api.create_pool(name="foo", slots=5, description="")
assert pool.pool == "foo"
assert pool.slots == 5
assert pool.description == ""
with create_session() as session:
assert session.query(models.Pool).count() == self.TOTAL_POOL_COUNT + 1
def test_create_pool_existing(self):
pool = pool_api.create_pool(name=self.pools[0].pool, slots=5, description="")
assert pool.pool == self.pools[0].pool
assert pool.slots == 5
assert pool.description == ""
with create_session() as session:
assert session.query(models.Pool).count() == self.TOTAL_POOL_COUNT
def test_create_pool_bad_name(self):
for name in ("", " "):
with pytest.raises(AirflowBadRequest, match="^Pool name shouldn't be empty$"):
pool_api.create_pool(
name=name,
slots=5,
description="",
)
def test_create_pool_name_too_long(self):
long_name = "".join(random.choices(string.ascii_lowercase, k=300))
column_length = models.Pool.pool.property.columns[0].type.length
with pytest.raises(
AirflowBadRequest, match="^Pool name can't be more than %d characters$" % column_length
):
pool_api.create_pool(
name=long_name,
slots=5,
description="",
)
def test_create_pool_bad_slots(self):
with pytest.raises(AirflowBadRequest, match="^Bad value for `slots`: foo$"):
pool_api.create_pool(
name="foo",
slots="foo",
description="",
)
def test_delete_pool(self):
pool = pool_api.delete_pool(name=self.pools[-1].pool)
assert pool.pool == self.pools[-1].pool
with create_session() as session:
assert session.query(models.Pool).count() == self.TOTAL_POOL_COUNT - 1
def test_delete_pool_non_existing(self):
with pytest.raises(pool_api.PoolNotFound, match="^Pool 'test' doesn't exist$"):
pool_api.delete_pool(name="test")
def test_delete_pool_bad_name(self):
for name in ("", " "):
with pytest.raises(AirflowBadRequest, match="^Pool name shouldn't be empty$"):
pool_api.delete_pool(name=name)
def test_delete_default_pool_not_allowed(self):
with pytest.raises(AirflowBadRequest, match="^default_pool cannot be deleted$"):
pool_api.delete_pool(Pool.DEFAULT_POOL_NAME)