Skip to content

Commit af54e9d

Browse files
authored
{AKS} Fix role assignment failure when using azure-cli version >= 2.77.0. (#9267)
1 parent 2ebf49e commit af54e9d

File tree

4 files changed

+12
-103
lines changed

4 files changed

+12
-103
lines changed

src/aks-preview/HISTORY.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ To release a new version, please select a new version number (usually plus 1 to
1111

1212
Pending
1313
+++++++
14+
15+
18.0.0b42
16+
+++++++
17+
* Fix role assignment failure when using azure-cli version >= `2.77.0`.
1418
* Add option `Flatcar` to `--os-sku` for `az aks nodepool add` and `az aks nodepool update`.
1519

1620
18.0.0b41

src/aks-preview/azext_aks_preview/_roleassignments.py

Lines changed: 4 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -3,103 +3,8 @@
33
# Licensed under the MIT License. See License.txt in the project root for license information.
44
# --------------------------------------------------------------------------------------------
55

6-
import time
7-
import uuid
8-
9-
from azure.cli.command_modules.acs._client_factory import (
10-
get_auth_management_client,
6+
# pylint: disable=unused-import
7+
from azure.cli.command_modules.acs._roleassignments import (
8+
add_role_assignment,
9+
add_role_assignment_executor,
1110
)
12-
from azure.cli.command_modules.acs._graph import resolve_object_id
13-
from azure.cli.command_modules.acs._roleassignments import build_role_scope, resolve_role_id
14-
from azure.cli.core.azclierror import AzCLIError
15-
from azure.cli.core.profiles import ResourceType, get_sdk
16-
from azure.core.exceptions import HttpResponseError, ResourceExistsError
17-
from knack.log import get_logger
18-
19-
logger = get_logger(__name__)
20-
21-
# pylint: disable=protected-access
22-
23-
24-
# temp workaround for the breaking change caused by default API version bump of the auth SDK
25-
def add_role_assignment(cmd, role, service_principal_msi_id, is_service_principal=True, delay=2, scope=None):
26-
return _add_role_assignment_new(cmd, role, service_principal_msi_id, is_service_principal, delay, scope)
27-
28-
29-
# TODO(fuming): remove and replaced by import from azure.cli.command_modules.acs once dependency bumped to 2.47.0
30-
def _add_role_assignment_executor_new(cmd, role, assignee, resource_group_name=None, scope=None, resolve_assignee=True):
31-
factory = get_auth_management_client(cmd.cli_ctx, scope)
32-
assignments_client = factory.role_assignments
33-
definitions_client = factory.role_definitions
34-
35-
# FIXME: is this necessary?
36-
if assignments_client._config is None:
37-
raise AzCLIError("Assignments client config is undefined.")
38-
39-
scope = build_role_scope(resource_group_name, scope, assignments_client._config.subscription_id)
40-
41-
# XXX: if role is uuid, this function's output cannot be used as role assignment defintion id
42-
# ref: https://github.com/Azure/azure-cli/issues/2458
43-
role_id = resolve_role_id(role, scope, definitions_client)
44-
45-
# If the cluster has service principal resolve the service principal client id to get the object id,
46-
# if not use MSI object id.
47-
object_id = resolve_object_id(cmd.cli_ctx, assignee) if resolve_assignee else assignee
48-
49-
assignment_name = uuid.uuid4()
50-
custom_headers = None
51-
52-
RoleAssignmentCreateParameters = get_sdk(
53-
cmd.cli_ctx,
54-
ResourceType.MGMT_AUTHORIZATION,
55-
"RoleAssignmentCreateParameters",
56-
mod="models",
57-
operation_group="role_assignments",
58-
)
59-
if cmd.supported_api_version(min_api="2018-01-01-preview", resource_type=ResourceType.MGMT_AUTHORIZATION):
60-
parameters = RoleAssignmentCreateParameters(role_definition_id=role_id, principal_id=object_id,
61-
principal_type=None)
62-
return assignments_client.create(scope, assignment_name, parameters, headers=custom_headers)
63-
64-
# for backward compatibility
65-
RoleAssignmentProperties = get_sdk(
66-
cmd.cli_ctx,
67-
ResourceType.MGMT_AUTHORIZATION,
68-
"RoleAssignmentProperties",
69-
mod="models",
70-
operation_group="role_assignments",
71-
)
72-
properties = RoleAssignmentProperties(role_definition_id=role_id, principal_id=object_id)
73-
return assignments_client.create(scope, assignment_name, properties, headers=custom_headers)
74-
75-
76-
# TODO(fuming): remove and replaced by import from azure.cli.command_modules.acs once dependency bumped to 2.47.0
77-
def _add_role_assignment_new(cmd, role, service_principal_msi_id, is_service_principal=True, delay=2, scope=None):
78-
# AAD can have delays in propagating data, so sleep and retry
79-
hook = cmd.cli_ctx.get_progress_controller(True)
80-
hook.add(message="Waiting for AAD role to propagate", value=0, total_val=1.0)
81-
logger.info("Waiting for AAD role to propagate")
82-
for x in range(0, 10):
83-
hook.add(message="Waiting for AAD role to propagate", value=0.1 * x, total_val=1.0)
84-
try:
85-
# TODO: break this out into a shared utility library
86-
_add_role_assignment_executor_new(
87-
cmd,
88-
role,
89-
service_principal_msi_id,
90-
scope=scope,
91-
resolve_assignee=is_service_principal,
92-
)
93-
break
94-
except HttpResponseError as ex:
95-
if isinstance(ex, ResourceExistsError) or "The role assignment already exists." in ex.message:
96-
break
97-
logger.info(ex.message)
98-
except Exception as ex: # pylint: disable=broad-except
99-
logger.error(str(ex))
100-
time.sleep(delay + delay * x)
101-
else:
102-
return False
103-
hook.add(message="AAD role propagation done", value=1.0, total_val=1.0)
104-
logger.info("AAD role propagation done")
105-
return True

src/aks-preview/azext_aks_preview/managed_cluster_decorator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
)
7474
from azext_aks_preview._roleassignments import (
7575
add_role_assignment,
76-
_add_role_assignment_executor_new
76+
add_role_assignment_executor
7777
)
7878
from azext_aks_preview.agentpool_decorator import (
7979
AKSPreviewAgentPoolAddDecorator,
@@ -212,7 +212,7 @@ def external_functions(self) -> SimpleNamespace:
212212
] = ensure_azure_monitor_profile_prerequisites
213213
# temp workaround for the breaking change caused by default API version bump of the auth SDK
214214
external_functions["add_role_assignment"] = add_role_assignment
215-
external_functions["_add_role_assignment_executor_new"] = _add_role_assignment_executor_new
215+
external_functions["add_role_assignment_executor"] = add_role_assignment_executor
216216
# azure container storage functions
217217
external_functions[
218218
"perform_enable_azure_container_storage_v1"
@@ -4227,7 +4227,7 @@ def postprocessing_after_mc_created(self, cluster: ManagedCluster) -> None:
42274227
except Exception as e: # pylint: disable=broad-except
42284228
logger.warning("Could not get signed in user: %s", str(e))
42294229
else:
4230-
self.context.external_functions._add_role_assignment_executor_new( # type: ignore # pylint: disable=protected-access
4230+
self.context.external_functions.add_role_assignment_executor( # type: ignore # pylint: disable=protected-access
42314231
self.cmd,
42324232
"Azure Kubernetes Service RBAC Cluster Admin",
42334233
user["id"],

src/aks-preview/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from setuptools import find_packages, setup
1111

12-
VERSION = "18.0.0b41"
12+
VERSION = "18.0.0b42"
1313

1414
CLASSIFIERS = [
1515
"Development Status :: 4 - Beta",

0 commit comments

Comments
 (0)