This is an automated email from the ASF dual-hosted git repository.
jerryshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new e4e66e446a [#3767] refactor(client-python): Share authorization
integration test setup (#11994)
e4e66e446a is described below
commit e4e66e446a07e993aa4df81c248c3d19fc8a8d4e
Author: Henry Chen <[email protected]>
AuthorDate: Mon Jul 27 15:04:26 2026 +0800
[#3767] refactor(client-python): Share authorization integration test setup
(#11994)
### What changes were proposed in this pull request?
- Add shared helpers in `IntegrationTestEnv` for authorization
configuration, external Gravitino detection, server start/restart
behavior, and metalake setup/cleanup.
- Add `AuthorizationIntegrationTestEnv` to share common authorization
integration test lifecycle.
- Update user, owner, group, and role integration tests to reuse the
shared setup helpers.
- Move group and role management tests onto the shared authorization
integration test base class.
### Why are the changes needed?
Several Python client authorization integration tests duplicated the
same authorization config setup, Gravitino server lifecycle handling,
and metalake setup/cleanup logic.
Centralizing this logic reduces duplicate test boilerplate and keeps the
authorization integration tests consistent while preserving their
existing behavior.
Related to #3767.
### Does this PR introduce *any* user-facing change?
No.
### How was this patch tested?
- `/private/tmp/gravitino-client-python-test-venv/bin/black
clients/client-python/tests/integration/integration_test_env.py
clients/client-python/tests/integration/test_user.py
clients/client-python/tests/integration/test_owner.py
clients/client-python/tests/integration/test_group_management.py
clients/client-python/tests/integration/test_role_management.py`
- `PYTHONPATH=. PYLINTHOME=/private/tmp/gravitino-pylint-cache
/private/tmp/gravitino-client-python-test-venv/bin/pylint
--rcfile=pylintrc --persistent=n
tests/integration/integration_test_env.py tests/integration/test_user.py
tests/integration/test_owner.py
tests/integration/test_group_management.py
tests/integration/test_role_management.py`
- Result: `10.00/10`
- `PYTHONPATH=.
/private/tmp/gravitino-client-python-test-venv/bin/python -m py_compile
tests/integration/integration_test_env.py tests/integration/test_user.py
tests/integration/test_owner.py
tests/integration/test_group_management.py
tests/integration/test_role_management.py`
- `git diff --check`
---------
Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: Jerry Shao <[email protected]>
---
.../tests/integration/integration_test_env.py | 64 ++++++++++++++++++++++
.../tests/integration/test_group_management.py | 56 +------------------
.../client-python/tests/integration/test_owner.py | 20 ++-----
.../tests/integration/test_role_management.py | 56 +------------------
.../client-python/tests/integration/test_user.py | 27 +--------
5 files changed, 76 insertions(+), 147 deletions(-)
diff --git a/clients/client-python/tests/integration/integration_test_env.py
b/clients/client-python/tests/integration/integration_test_env.py
index a4becd1ba9..6ea4367f10 100644
--- a/clients/client-python/tests/integration/integration_test_env.py
+++ b/clients/client-python/tests/integration/integration_test_env.py
@@ -184,6 +184,43 @@ class IntegrationTestEnv(unittest.TestCase):
else:
logger.warning("Failed to drop metalake %s", metalake_name)
+ @classmethod
+ def configure_authorization(
+ cls,
+ enabled: bool,
+ service_admins: str | None = "anonymous",
+ append: bool = True,
+ ):
+ cls._get_gravitino_home()
+ config = {"gravitino.authorization.enable": str(enabled).lower()}
+ if service_admins is not None:
+ config["gravitino.authorization.serviceAdmins"] = service_admins
+ conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
+ cls._reset_conf(config, conf_path)
+ if append:
+ cls._append_conf(config, conf_path)
+
+ @classmethod
+ def set_up_authorization_test_env(
+ cls, service_admins: str | None = "anonymous"
+ ) -> GravitinoAdminClient:
+ cls.configure_authorization(True, service_admins)
+ if cls.use_external_gravitino():
+ cls.restart_server()
+ else:
+ cls.setUpClass()
+ return GravitinoAdminClient(uri="http://localhost:8090")
+
+ @classmethod
+ def tear_down_authorization_test_env(
+ cls, service_admins: str | None = "anonymous", append: bool = True
+ ):
+ cls.configure_authorization(False, service_admins, append)
+ if cls.use_external_gravitino():
+ cls.restart_server()
+ else:
+ cls.tearDownClass()
+
@classmethod
def restart_server(cls):
logger.info("Restarting Gravitino server...")
@@ -297,3 +334,30 @@ class MetalakeTestMixin:
def clean_test_data(self):
self.gravitino_client =
self.create_gravitino_client(self.metalake_name)
self.drop_test_metalake(self.gravitino_admin_client,
self.metalake_name)
+
+
+class AuthorizationIntegrationTestEnv(IntegrationTestEnv):
+ """Provide common authorization integration test environment."""
+
+ _metalake_name: str = ""
+ _metalake_comment: str = ""
+ _gravitino_admin_client: GravitinoAdminClient = None
+ _gravitino_client: GravitinoClient = None
+
+ @classmethod
+ def setUpClass(cls):
+ cls._gravitino_admin_client = cls.set_up_authorization_test_env()
+
+ @classmethod
+ def tearDownClass(cls):
+ cls.tear_down_authorization_test_env()
+
+ def setUp(self):
+ self._gravitino_client = self.create_metalake_client(
+ self._gravitino_admin_client,
+ self._metalake_name,
+ comment=self._metalake_comment,
+ )
+
+ def tearDown(self):
+ self.drop_test_metalake(self._gravitino_admin_client,
self._metalake_name)
diff --git a/clients/client-python/tests/integration/test_group_management.py
b/clients/client-python/tests/integration/test_group_management.py
index 8917d63984..fe45f06ce8 100644
--- a/clients/client-python/tests/integration/test_group_management.py
+++ b/clients/client-python/tests/integration/test_group_management.py
@@ -15,68 +15,18 @@
# specific language governing permissions and limitations
# under the License.
-import logging
-import os
import uuid
-from gravitino import GravitinoAdminClient, GravitinoClient
from gravitino.exceptions.base import (
GroupAlreadyExistsException,
NoSuchGroupException,
)
-from tests.integration.integration_test_env import IntegrationTestEnv
+from tests.integration.integration_test_env import
AuthorizationIntegrationTestEnv
-logger = logging.getLogger(__name__)
-
-class TestGroupManagement(IntegrationTestEnv):
+class TestGroupManagement(AuthorizationIntegrationTestEnv):
_metalake_name: str = f"test_group_metalake_{uuid.uuid4().hex[:8]}"
- _gravitino_admin_client: GravitinoAdminClient = None
- _gravitino_client: GravitinoClient = None
-
- @classmethod
- def setUpClass(cls):
- cls._get_gravitino_home()
- conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
- auth_confs = {
- "gravitino.authorization.enable": "true",
- "gravitino.authorization.serviceAdmins": "anonymous",
- }
- cls._reset_conf(auth_confs, conf_path)
- cls._append_conf(auth_confs, conf_path)
- if cls.use_external_gravitino():
- cls.restart_server()
- else:
- super().setUpClass()
- cls._gravitino_admin_client =
GravitinoAdminClient(uri="http://localhost:8090")
-
- @classmethod
- def tearDownClass(cls):
- conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
- reset_confs = {
- "gravitino.authorization.enable": "false",
- "gravitino.authorization.serviceAdmins": "anonymous",
- }
- cls._reset_conf(reset_confs, conf_path)
- cls._append_conf(reset_confs, conf_path)
- if cls.use_external_gravitino():
- cls.restart_server()
- else:
- super().tearDownClass()
-
- def setUp(self):
- self._gravitino_admin_client.create_metalake(
- self._metalake_name, comment="test group management", properties={}
- )
- self._gravitino_client = GravitinoClient(
- uri="http://localhost:8090", metalake_name=self._metalake_name
- )
-
- def tearDown(self):
- try:
- self._gravitino_admin_client.drop_metalake(self._metalake_name,
force=True)
- except Exception: # pylint: disable=broad-except
- logger.warning("Failed to drop metalake %s", self._metalake_name)
+ _metalake_comment: str = "test group management"
def test_add_and_get_group(self):
added = self._gravitino_client.add_group("engineers")
diff --git a/clients/client-python/tests/integration/test_owner.py
b/clients/client-python/tests/integration/test_owner.py
index 38df29e151..63f89576b2 100644
--- a/clients/client-python/tests/integration/test_owner.py
+++ b/clients/client-python/tests/integration/test_owner.py
@@ -16,7 +16,6 @@
# under the License.
import logging
-import os
from random import randint
from gravitino import (
@@ -48,24 +47,13 @@ class TestOwner(MetalakeTestMixin, IntegrationTestEnv):
@classmethod
def setUpClass(cls):
- cls._get_gravitino_home()
- conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
- cls._reset_conf({"gravitino.authorization.enable": "true"}, conf_path)
- cls._append_conf({"gravitino.authorization.enable": "true"}, conf_path)
- if cls.use_external_gravitino():
- cls.restart_server()
- else:
- super().setUpClass()
- cls.gravitino_admin_client =
GravitinoAdminClient(uri="http://localhost:8090")
+ cls.gravitino_admin_client = cls.set_up_authorization_test_env(
+ service_admins=None
+ )
@classmethod
def tearDownClass(cls):
- conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
- cls._reset_conf({"gravitino.authorization.enable": "false"}, conf_path)
- if cls.use_external_gravitino():
- cls.restart_server()
- else:
- super().tearDownClass()
+ cls.tear_down_authorization_test_env(service_admins=None, append=False)
def create_catalog(self, catalog_name) -> Catalog:
return self.gravitino_client.create_catalog(
diff --git a/clients/client-python/tests/integration/test_role_management.py
b/clients/client-python/tests/integration/test_role_management.py
index 5486f8fa0c..7b221b8f18 100644
--- a/clients/client-python/tests/integration/test_role_management.py
+++ b/clients/client-python/tests/integration/test_role_management.py
@@ -15,70 +15,20 @@
# specific language governing permissions and limitations
# under the License.
-import logging
-import os
import uuid
-from gravitino import GravitinoAdminClient, GravitinoClient
from gravitino.api.authorization.privileges import Privileges
from gravitino.api.authorization.securable_objects import SecurableObjects
from gravitino.exceptions.base import (
NoSuchRoleException,
RoleAlreadyExistsException,
)
-from tests.integration.integration_test_env import IntegrationTestEnv
+from tests.integration.integration_test_env import
AuthorizationIntegrationTestEnv
-logger = logging.getLogger(__name__)
-
-class TestRoleManagement(IntegrationTestEnv):
+class TestRoleManagement(AuthorizationIntegrationTestEnv):
_metalake_name: str = f"test_role_metalake_{uuid.uuid4().hex[:8]}"
- _gravitino_admin_client: GravitinoAdminClient = None
- _gravitino_client: GravitinoClient = None
-
- @classmethod
- def setUpClass(cls):
- cls._get_gravitino_home()
- conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
- auth_confs = {
- "gravitino.authorization.enable": "true",
- "gravitino.authorization.serviceAdmins": "anonymous",
- }
- cls._reset_conf(auth_confs, conf_path)
- cls._append_conf(auth_confs, conf_path)
- if cls.use_external_gravitino():
- cls.restart_server()
- else:
- super().setUpClass()
- cls._gravitino_admin_client =
GravitinoAdminClient(uri="http://localhost:8090")
-
- @classmethod
- def tearDownClass(cls):
- conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
- reset_confs = {
- "gravitino.authorization.enable": "false",
- "gravitino.authorization.serviceAdmins": "anonymous",
- }
- cls._reset_conf(reset_confs, conf_path)
- cls._append_conf(reset_confs, conf_path)
- if cls.use_external_gravitino():
- cls.restart_server()
- else:
- super().tearDownClass()
-
- def setUp(self):
- self._gravitino_admin_client.create_metalake(
- self._metalake_name, comment="test role management", properties={}
- )
- self._gravitino_client = GravitinoClient(
- uri="http://localhost:8090", metalake_name=self._metalake_name
- )
-
- def tearDown(self):
- try:
- self._gravitino_admin_client.drop_metalake(self._metalake_name,
force=True)
- except Exception: # pylint: disable=broad-except
- logger.warning("Failed to drop metalake %s", self._metalake_name)
+ _metalake_comment: str = "test role management"
def test_create_and_get_role(self):
privileges = [Privileges.allow("USE_CATALOG")]
diff --git a/clients/client-python/tests/integration/test_user.py
b/clients/client-python/tests/integration/test_user.py
index 289d98726b..6388e47356 100644
--- a/clients/client-python/tests/integration/test_user.py
+++ b/clients/client-python/tests/integration/test_user.py
@@ -15,7 +15,6 @@
# specific language governing permissions and limitations
# under the License.
-import os
from random import randint
from gravitino import GravitinoAdminClient, GravitinoClient
@@ -35,33 +34,11 @@ class TestUser(MetalakeTestMixin, IntegrationTestEnv):
@classmethod
def setUpClass(cls):
- cls._get_gravitino_home()
- conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
- auth_confs = {
- "gravitino.authorization.enable": "true",
- "gravitino.authorization.serviceAdmins": "anonymous",
- }
- cls._reset_conf(auth_confs, conf_path)
- cls._append_conf(auth_confs, conf_path)
- if cls.use_external_gravitino():
- cls.restart_server()
- else:
- super().setUpClass()
- cls.gravitino_admin_client =
GravitinoAdminClient(uri="http://localhost:8090")
+ cls.gravitino_admin_client = cls.set_up_authorization_test_env()
@classmethod
def tearDownClass(cls):
- conf_path = os.path.join(cls.gravitino_home, "conf", "gravitino.conf")
- reset_confs = {
- "gravitino.authorization.enable": "false",
- "gravitino.authorization.serviceAdmins": "anonymous",
- }
- cls._reset_conf(reset_confs, conf_path)
- cls._append_conf(reset_confs, conf_path)
- if cls.use_external_gravitino():
- cls.restart_server()
- else:
- super().tearDownClass()
+ cls.tear_down_authorization_test_env()
def test_add_user(self):
user = self.gravitino_client.add_user("test_add_user")