This is an automated email from the ASF dual-hosted git repository.

yzheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git


The following commit(s) were added to refs/heads/main by this push:
     new 61a954ca CLI: add subcommand access for principals (#1019)
61a954ca is described below

commit 61a954ca9ce996d43db56a6438036a29db746143
Author: MonkeyCanCode <[email protected]>
AuthorDate: Sun Feb 23 18:51:13 2025 -0600

    CLI: add subcommand access for principals (#1019)
    
    * Access subcommand access for principals
    
    * Access subcommand access for principals
---
 regtests/client/python/cli/command/principals.py   | 47 ++++++++++++++++++++++
 regtests/client/python/cli/constants.py            |  1 +
 regtests/client/python/cli/options/option_tree.py  |  3 +-
 .../in-dev/unreleased/command-line-interface.md    | 19 +++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/regtests/client/python/cli/command/principals.py 
b/regtests/client/python/cli/command/principals.py
index 2de58fde..20c49374 100644
--- a/regtests/client/python/cli/command/principals.py
+++ b/regtests/client/python/cli/command/principals.py
@@ -16,6 +16,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+import json
 from dataclasses import dataclass
 from typing import Dict, Optional, List
 
@@ -35,6 +36,7 @@ class PrincipalsCommand(Command):
 
     Example commands:
         * ./polaris principals create user
+        * ./polaris principals access user
         * ./polaris principals list
         * ./polaris principals list --principal-role filter-to-this-role
     """
@@ -48,6 +50,22 @@ class PrincipalsCommand(Command):
     set_properties: Dict[str, StrictStr]
     remove_properties: List[str]
 
+    def _get_catalogs(self, api: PolarisDefaultApi):
+        for catalog in api.list_catalogs().catalogs:
+            yield catalog.to_dict()['name']
+    
+    def _get_principal_roles(self, api: PolarisDefaultApi):
+        for principal_role in 
api.list_principal_roles_assigned(self.principal_name).roles:
+            yield principal_role.to_dict()['name']
+    
+    def _get_catalog_roles(self, api: PolarisDefaultApi, principal_role_name: 
str, catalog_name: str):
+        for catalog_role in 
api.list_catalog_roles_for_principal_role(principal_role_name, 
catalog_name).roles:
+            yield catalog_role.to_dict()['name']
+    
+    def _get_privileges(self, api: PolarisDefaultApi, catalog_name: str, 
catalog_role_name: str):
+        for grant in api.list_grants_for_catalog_role(catalog_name, 
catalog_role_name).grants:
+            yield grant.to_dict()
+
     def validate(self):
         pass
 
@@ -93,5 +111,34 @@ class PrincipalsCommand(Command):
                 properties=new_properties
             )
             api.update_principal(self.principal_name, request)
+        elif self.principals_subcommand == Subcommands.ACCESS:
+            principal = 
api.get_principal(self.principal_name).to_dict()['name']
+            principal_roles = self._get_principal_roles(api)
+
+            # Initialize the result structure
+            result = {
+                'principal': principal,
+                'principal_roles': []
+            }
+            
+            # Construct the result structure for each principal role
+            for principal_role in principal_roles:
+                role_data = {
+                    'name': principal_role,
+                    'catalog_roles': []
+                }
+                # For each catalog role, get associated privileges
+                for catalog in self._get_catalogs(api):
+                    catalog_roles = self._get_catalog_roles(api, 
principal_role, catalog)
+                    for catalog_role in catalog_roles:
+                        catalog_data = {
+                            'name': catalog_role,
+                            'catalog': catalog,
+                            'privileges': []
+                        }
+                        catalog_data['privileges'] = 
list(self._get_privileges(api, catalog_data['catalog'], catalog_role))
+                        role_data['catalog_roles'].append(catalog_data)
+                result['principal_roles'].append(role_data)
+            print(json.dumps(result))
         else:
             raise Exception(f"{self.principals_subcommand} is not supported in 
the CLI")
diff --git a/regtests/client/python/cli/constants.py 
b/regtests/client/python/cli/constants.py
index 6dce2b07..1fae549d 100644
--- a/regtests/client/python/cli/constants.py
+++ b/regtests/client/python/cli/constants.py
@@ -80,6 +80,7 @@ class Subcommands:
     VIEW = 'view'
     GRANT = 'grant'
     REVOKE = 'revoke'
+    ACCESS = 'access'
 
 
 class Actions:
diff --git a/regtests/client/python/cli/options/option_tree.py 
b/regtests/client/python/cli/options/option_tree.py
index 2510193e..9d25ec05 100644
--- a/regtests/client/python/cli/options/option_tree.py
+++ b/regtests/client/python/cli/options/option_tree.py
@@ -123,7 +123,8 @@ class OptionTree:
                 Option(Subcommands.UPDATE, args=[
                     Argument(Arguments.SET_PROPERTY, str, Hints.SET_PROPERTY, 
allow_repeats=True),
                     Argument(Arguments.REMOVE_PROPERTY, str, 
Hints.REMOVE_PROPERTY, allow_repeats=True),
-                ], input_name=Arguments.PRINCIPAL)
+                ], input_name=Arguments.PRINCIPAL),
+                Option(Subcommands.ACCESS, input_name=Arguments.PRINCIPAL),
             ]),
             Option(Commands.PRINCIPAL_ROLES, 'manage principal roles', 
children=[
                 Option(Subcommands.CREATE, args=[
diff --git a/site/content/in-dev/unreleased/command-line-interface.md 
b/site/content/in-dev/unreleased/command-line-interface.md
index c9a6045b..20078f1e 100644
--- a/site/content/in-dev/unreleased/command-line-interface.md
+++ b/site/content/in-dev/unreleased/command-line-interface.md
@@ -256,6 +256,7 @@ The `principals` command is used to manage principals 
within Polaris.
 4. list
 5. rotate-credentials
 6. update
+7. access
 
 #### create
 
@@ -372,6 +373,24 @@ polaris principals update --property key=value --property 
other_key=other_value
 polaris principals update --property are_other_keys_removed=yes some_user
 ```
 
+#### access
+
+The `access` subcommand retrieves entities relation about a principal.
+
+```
+input: polaris principals access --help
+options:
+  access
+    Positional arguments:
+      principal
+```
+
+##### Examples
+
+```
+polaris principals access quickstart_user
+```
+
 ### Principal Roles
 
 The `principal-roles` command is used to create, discover, and manage 
principal roles within Polaris. Additionally, this command can identify 
principals or catalog roles associated with a principal role, and can be used 
to grant a principal role to a principal.

Reply via email to