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")

Reply via email to