Skip to content

Commit f78260a

Browse files
Add support for account and entity permissions endpoints
1 parent 7606f23 commit f78260a

File tree

5 files changed

+131
-0
lines changed

5 files changed

+131
-0
lines changed

linode_api4/groups/iam.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,49 @@ def entities(self, *filters):
9696
return self.client._get_and_filter(
9797
LinodeEntity, *filters, endpoint="/entities"
9898
)
99+
100+
def account_permissions_get(self, username):
101+
"""
102+
Returns the account-level permissions for the specified user.
103+
104+
This is intended to be called off of the :any:`LinodeClient`
105+
class, like this::
106+
107+
permissions_account = client.account_permissions_get("myusername")
108+
109+
API Documentation: TODO
110+
111+
:param username: The username to get permissions for.
112+
:type username: str
113+
114+
:returns: The account-level permissions for the user.
115+
:rtype: List[str]
116+
"""
117+
return self.client.get(
118+
f"/iam/users/{username}/permissions/account",
119+
)
120+
121+
def entity_permissions_get(self, username, entity_type, entity_id):
122+
"""
123+
Returns the entity-level permissions for the specified user on a specific entity.
124+
125+
This is intended to be called off of the :any:`LinodeClient`
126+
class, like this::
127+
128+
permissions_entity = client.entity_permissions_get("myusername", "linode", 123456)
129+
130+
API Documentation: TODO
131+
132+
:param username: The username to get permissions for.
133+
:type username: str
134+
:param entity_type: The type of entity (e.g., "linode", "firewall").
135+
:type entity_type: str
136+
:param entity_id: The ID of the specific entity.
137+
:type entity_id: int
138+
139+
:returns: The entity-level permissions for the user on the specified entity.
140+
:rtype: List[str]
141+
"""
142+
return self.client.get(
143+
f"/iam/users/{username}/permissions/{entity_type}/{entity_id}"
144+
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
"list_events",
3+
"list_entities",
4+
"view_account_settings",
5+
"view_invoice_item",
6+
"cancel_account",
7+
"create_vpc"
8+
]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
"generate_linode_lish_token_remote",
3+
"rebuild_linode",
4+
"shutdown_linode",
5+
"create_linode_config_profile",
6+
"rescue_linode",
7+
"list_linode_volumes"
8+
]

test/integration/models/iam/iam_test.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,35 @@ def test_list_entities(test_linode_client):
5858
assert hasattr(entity, "type")
5959
else:
6060
pytest.skip("No entities found in IAM response.")
61+
62+
63+
def test_get_account_permissions(test_linode_client):
64+
client = test_linode_client
65+
username = client.profile().username
66+
67+
account_permissions = client.iam.account_permissions_get(username)
68+
69+
if len(account_permissions) > 0:
70+
assert len(account_permissions) > 0
71+
else:
72+
pytest.skip("No account permissions found for the user.")
73+
74+
75+
def test_get_entity_permissions(test_linode_client):
76+
client = test_linode_client
77+
username = client.profile().username
78+
79+
entities = client.iam.entities()
80+
if len(entities) > 0:
81+
entity = entities[0]
82+
entity_permissions = client.iam.entity_permissions_get(
83+
username, entity.type, entity.id
84+
)
85+
if len(entity_permissions) > 0:
86+
assert len(entity_permissions) > 0
87+
else:
88+
pytest.skip(
89+
"No entity permissions found for the user and chosen entity."
90+
)
91+
else:
92+
pytest.skip("No entities found in IAM response.")

test/unit/groups/iam_test.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,3 +240,40 @@ def test_role_permissions_user_set(self):
240240
self.assertEqual(
241241
m.call_data["entity_access"][1]["roles"], ["firewall_admin"]
242242
)
243+
244+
def test_account_permissions_get(self):
245+
"""
246+
Test that account permissions can be properly retrieved for a user
247+
"""
248+
permissions_account = self.client.iam.account_permissions_get(
249+
"myusername"
250+
)
251+
252+
# Add assertions based on your fixture data
253+
self.assertEqual(len(permissions_account), 6)
254+
self.assertEqual(permissions_account[0], "list_events")
255+
self.assertEqual(permissions_account[1], "list_entities")
256+
self.assertEqual(permissions_account[2], "view_account_settings")
257+
self.assertEqual(permissions_account[3], "view_invoice_item")
258+
self.assertEqual(permissions_account[4], "cancel_account")
259+
self.assertEqual(permissions_account[5], "create_vpc")
260+
261+
def test_entity_permissions_get(self):
262+
"""
263+
Test that entity permissions can be properly retrieved for a user
264+
and given entity type and id
265+
"""
266+
permissions_entity = self.client.iam.entity_permissions_get(
267+
"myusername", "linode", 1
268+
)
269+
270+
# Add assertions based on your fixture data
271+
self.assertEqual(len(permissions_entity), 6)
272+
self.assertEqual(
273+
permissions_entity[0], "generate_linode_lish_token_remote"
274+
)
275+
self.assertEqual(permissions_entity[1], "rebuild_linode")
276+
self.assertEqual(permissions_entity[2], "shutdown_linode")
277+
self.assertEqual(permissions_entity[3], "create_linode_config_profile")
278+
self.assertEqual(permissions_entity[4], "rescue_linode")
279+
self.assertEqual(permissions_entity[5], "list_linode_volumes")

0 commit comments

Comments
 (0)