Skip to content

Commit b6e6bc0

Browse files
authored
[Key Vault] Reorder set_role_definition parameters (Azure#18743)
1 parent 817c91e commit b6e6bc0

File tree

5 files changed

+57
-39
lines changed

5 files changed

+57
-39
lines changed

sdk/keyvault/azure-keyvault-administration/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
# Release History
22

33
## 4.0.0b4 (Unreleased)
4+
### Added
5+
- `KeyVaultAccessControlClient.set_role_definition` accepts an optional
6+
`assignable_scopes` keyword-only argument
7+
8+
### Breaking Changes
9+
- Changed parameter order in `KeyVaultAccessControlClient.set_role_definition`.
10+
`permissions` is now an optional keyword-only argument
411

512

613
## 4.0.0b3 (2021-02-09)

sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_access_control_client.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@
1212

1313
if TYPE_CHECKING:
1414
# pylint:disable=ungrouped-imports
15-
from typing import Any, Iterable, Union
15+
from typing import Any, Optional, Union
1616
from uuid import UUID
1717
from azure.core.paging import ItemPaged
1818
from ._enums import KeyVaultRoleScope
19-
from ._models import KeyVaultPermission
2019

2120

2221
class KeyVaultAccessControlClient(KeyVaultClientBase):
@@ -41,7 +40,7 @@ def create_role_assignment(self, role_scope, role_definition_id, principal_id, *
4140
:param str principal_id: Azure Active Directory object ID of the principal which will be assigned the role. The
4241
principal can be a user, service principal, or security group.
4342
:keyword role_assignment_name: a name for the role assignment. Must be a UUID.
44-
:type role_assignment_name: str or uuid.UUID
43+
:paramtype role_assignment_name: str or uuid.UUID
4544
:rtype: KeyVaultRoleAssignment
4645
"""
4746
role_assignment_name = kwargs.pop("role_assignment_name", None) or uuid4()
@@ -113,48 +112,51 @@ def list_role_assignments(self, role_scope, **kwargs):
113112
)
114113

115114
@distributed_trace
116-
def set_role_definition(self, role_scope, permissions, **kwargs):
117-
# type: (Union[str, KeyVaultRoleScope], Iterable[KeyVaultPermission], **Any) -> KeyVaultRoleDefinition
115+
def set_role_definition(self, role_scope, role_definition_name=None, **kwargs):
116+
# type: (Union[str, KeyVaultRoleScope], Optional[Union[str, UUID]], **Any) -> KeyVaultRoleDefinition
118117
"""Creates or updates a custom role definition.
119118
120119
:param role_scope: scope of the role definition. :class:`KeyVaultRoleScope` defines common broad scopes.
121120
Specify a narrower scope as a string. Managed HSM only supports '/', or KeyVaultRoleScope.GLOBAL.
122121
:type role_scope: str or KeyVaultRoleScope
123-
:param permissions: the role definition's permissions. An empty list results in a role definition with no action
124-
permissions.
125-
:type permissions: Iterable[KeyVaultPermission]
126-
:keyword str role_name: the role's name. If unspecified when creating or updating a role definition, the role
127-
name will be set to an empty string.
128-
:keyword role_definition_name: the role definition's name. Must be a UUID.
122+
:param role_definition_name: the unique role definition name. Unless a UUID is provided, a new role definition
123+
will be created with a generated unique name. Providing the unique name of an existing role definition will
124+
update that role definition.
129125
:type role_definition_name: str or uuid.UUID
126+
:keyword str role_name: the role's display name. If unspecified when creating or updating a role definition, the
127+
role name will be set to an empty string.
130128
:keyword str description: a description of the role definition. If unspecified when creating or updating a role
131129
definition, the description will be set to an empty string.
130+
:keyword permissions: the role definition's permissions. If unspecified when creating or updating a role
131+
definition, the role definition will have no action permissions.
132+
:paramtype permissions: Iterable[KeyVaultPermission]
133+
:keyword assignable_scopes: the scopes for which the role definition can be assigned.
134+
:paramtype assignable_scopes: Iterable[str] or Iterable[KeyVaultRoleScope]
132135
:returns: The created or updated role definition
133136
:rtype: KeyVaultRoleDefinition
134137
"""
135-
role_definition_name = kwargs.pop("role_definition_name", None) or uuid4()
136-
137138
permissions = [
138139
self._client.role_definitions.models.Permission(
139140
actions=p.allowed_actions,
140141
not_actions=p.denied_actions,
141142
data_actions=p.allowed_data_actions,
142143
not_data_actions=p.denied_data_actions,
143144
)
144-
for p in permissions
145+
for p in kwargs.pop("permissions", None) or []
145146
]
146147

147148
properties = self._client.role_definitions.models.RoleDefinitionProperties(
148149
role_name=kwargs.pop("role_name", None),
149150
description=kwargs.pop("description", None),
150-
permissions=permissions
151+
permissions=permissions,
152+
assignable_scopes=kwargs.pop("assignable_scopes", None),
151153
)
152154
parameters = self._client.role_definitions.models.RoleDefinitionCreateParameters(properties=properties)
153155

154156
definition = self._client.role_definitions.create_or_update(
155157
vault_base_url=self._vault_url,
156158
scope=role_scope,
157-
role_definition_name=str(role_definition_name),
159+
role_definition_name=str(role_definition_name or uuid4()),
158160
parameters=parameters,
159161
**kwargs
160162
)

sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/aio/_access_control_client.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@
1313

1414
if TYPE_CHECKING:
1515
# pylint:disable=ungrouped-imports
16-
from typing import Any, Iterable, Union
16+
from typing import Any, Optional, Union
1717
from uuid import UUID
1818
from azure.core.async_paging import AsyncItemPaged
1919
from .._enums import KeyVaultRoleScope
20-
from .._models import KeyVaultPermission
2120

2221

2322
class KeyVaultAccessControlClient(AsyncKeyVaultClientBase):
@@ -43,7 +42,7 @@ async def create_role_assignment(
4342
:param str principal_id: Azure Active Directory object ID of the principal which will be assigned the role. The
4443
principal can be a user, service principal, or security group.
4544
:keyword role_assignment_name: a name for the role assignment. Must be a UUID.
46-
:type role_assignment_name: str or uuid.UUID
45+
:paramtype role_assignment_name: str or uuid.UUID
4746
:rtype: KeyVaultRoleAssignment
4847
"""
4948
role_assignment_name = kwargs.pop("role_assignment_name", None) or uuid4()
@@ -119,48 +118,54 @@ def list_role_assignments(
119118

120119
@distributed_trace_async
121120
async def set_role_definition(
122-
self, role_scope: "Union[str, KeyVaultRoleScope]", permissions: "Iterable[KeyVaultPermission]", **kwargs: "Any"
121+
self,
122+
role_scope: "Union[str, KeyVaultRoleScope]",
123+
role_definition_name: "Optional[Union[str, UUID]]" = None,
124+
**kwargs: "Any"
123125
) -> "KeyVaultRoleDefinition":
124126
"""Creates or updates a custom role definition.
125127
126128
:param role_scope: scope of the role definition. :class:`KeyVaultRoleScope` defines common broad scopes.
127129
Specify a narrower scope as a string. Managed HSM only supports '/', or KeyVaultRoleScope.GLOBAL.
128130
:type role_scope: str or KeyVaultRoleScope
129-
:param permissions: the role definition's permissions. An empty list results in a role definition with no action
130-
permissions.
131-
:type permissions: Iterable[KeyVaultPermission]
132-
:keyword str role_name: the role's name. If unspecified when creating or updating a role definition, the role
133-
name will be set to an empty string.
134-
:keyword role_definition_name: the role definition's name. Must be a UUID.
131+
:param role_definition_name: the unique role definition name. Unless a UUID is provided, a new role definition
132+
will be created with a generated unique name. Providing the unique name of an existing role definition will
133+
update that role definition.
135134
:type role_definition_name: str or uuid.UUID
135+
:keyword str role_name: the role's display name. If unspecified when creating or updating a role definition, the
136+
role name will be set to an empty string.
136137
:keyword str description: a description of the role definition. If unspecified when creating or updating a role
137138
definition, the description will be set to an empty string.
139+
:keyword permissions: the role definition's permissions. If unspecified when creating or updating a role
140+
definition, the role definition will have no action permissions.
141+
:paramtype permissions: Iterable[KeyVaultPermission]
142+
:keyword assignable_scopes: the scopes for which the role definition can be assigned.
143+
:paramtype assignable_scopes: Iterable[str] or Iterable[KeyVaultRoleScope]
138144
:returns: The created or updated role definition
139145
:rtype: KeyVaultRoleDefinition
140146
"""
141-
role_definition_name = kwargs.pop("role_definition_name", None) or uuid4()
142-
143147
permissions = [
144148
self._client.role_definitions.models.Permission(
145149
actions=p.allowed_actions,
146150
not_actions=p.denied_actions,
147151
data_actions=p.allowed_data_actions,
148152
not_data_actions=p.denied_data_actions,
149153
)
150-
for p in permissions
154+
for p in kwargs.pop("permissions", None) or []
151155
]
152156

153157
properties = self._client.role_definitions.models.RoleDefinitionProperties(
154158
role_name=kwargs.pop("role_name", None),
155159
description=kwargs.pop("description", None),
156-
permissions=permissions
160+
permissions=permissions,
161+
assignable_scopes=kwargs.pop("assignable_scopes", None),
157162
)
158163
parameters = self._client.role_definitions.models.RoleDefinitionCreateParameters(properties=properties)
159164

160165
definition = await self._client.role_definitions.create_or_update(
161166
vault_base_url=self._vault_url,
162167
scope=role_scope,
163-
role_definition_name=str(role_definition_name),
168+
role_definition_name=str(role_definition_name or uuid4()),
164169
parameters=parameters,
165170
**kwargs
166171
)

sdk/keyvault/azure-keyvault-administration/tests/test_access_control.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,30 +69,32 @@ def test_role_definitions(self):
6969
permissions = [KeyVaultPermission(allowed_data_actions=[KeyVaultDataAction.READ_HSM_KEY])]
7070
created_definition = client.set_role_definition(
7171
role_scope=scope,
72-
permissions=permissions,
73-
role_name=role_name,
7472
role_definition_name=definition_name,
75-
description="test"
73+
role_name=role_name,
74+
description="test",
75+
permissions=permissions
7676
)
7777
assert "/" in created_definition.assignable_scopes
7878
assert created_definition.role_name == role_name
7979
assert created_definition.name == definition_name
8080
assert created_definition.description == "test"
8181
assert len(created_definition.permissions) == 1
8282
assert created_definition.permissions[0].allowed_data_actions == [KeyVaultDataAction.READ_HSM_KEY]
83+
assert created_definition.assignable_scopes == [KeyVaultRoleScope.GLOBAL]
8384

8485
# update custom role definition
8586
permissions = [
8687
KeyVaultPermission(allowed_data_actions=[], denied_data_actions=[KeyVaultDataAction.READ_HSM_KEY])
8788
]
8889
updated_definition = client.set_role_definition(
89-
role_scope=scope, permissions=permissions, role_definition_name=definition_name
90+
role_scope=scope, role_definition_name=definition_name, permissions=permissions
9091
)
9192
assert updated_definition.role_name == ""
9293
assert updated_definition.description == ""
9394
assert len(updated_definition.permissions) == 1
9495
assert len(updated_definition.permissions[0].allowed_data_actions) == 0
9596
assert updated_definition.permissions[0].denied_data_actions == [KeyVaultDataAction.READ_HSM_KEY]
97+
assert updated_definition.assignable_scopes == [KeyVaultRoleScope.GLOBAL]
9698

9799
# assert that the created role definition isn't duplicated
98100
matching_definitions = [d for d in client.list_role_definitions(scope) if d.id == updated_definition.id]

sdk/keyvault/azure-keyvault-administration/tests/test_access_control_async.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,30 +79,32 @@ async def test_role_definitions(self):
7979
permissions = [KeyVaultPermission(allowed_data_actions=[KeyVaultDataAction.READ_HSM_KEY])]
8080
created_definition = await client.set_role_definition(
8181
role_scope=scope,
82-
permissions=permissions,
83-
role_name=role_name,
8482
role_definition_name=definition_name,
85-
description="test"
83+
role_name=role_name,
84+
description="test",
85+
permissions=permissions
8686
)
8787
assert "/" in created_definition.assignable_scopes
8888
assert created_definition.role_name == role_name
8989
assert created_definition.name == definition_name
9090
assert created_definition.description == "test"
9191
assert len(created_definition.permissions) == 1
9292
assert created_definition.permissions[0].allowed_data_actions == [KeyVaultDataAction.READ_HSM_KEY]
93+
assert created_definition.assignable_scopes == [KeyVaultRoleScope.GLOBAL]
9394

9495
# update custom role definition
9596
permissions = [
9697
KeyVaultPermission(allowed_data_actions=[], denied_data_actions=[KeyVaultDataAction.READ_HSM_KEY])
9798
]
9899
updated_definition = await client.set_role_definition(
99-
role_scope=scope, permissions=permissions, role_definition_name=definition_name
100+
role_scope=scope, role_definition_name=definition_name, permissions=permissions
100101
)
101102
assert updated_definition.role_name == ""
102103
assert updated_definition.description == ""
103104
assert len(updated_definition.permissions) == 1
104105
assert len(updated_definition.permissions[0].allowed_data_actions) == 0
105106
assert updated_definition.permissions[0].denied_data_actions == [KeyVaultDataAction.READ_HSM_KEY]
107+
assert updated_definition.assignable_scopes == [KeyVaultRoleScope.GLOBAL]
106108

107109
# assert that the created role definition isn't duplicated
108110
matching_definitions = []

0 commit comments

Comments
 (0)