Skip to content

Commit b6f0d2c

Browse files
najianNan Jiang
andauthored
Support identity in session update command (Azure#8772)
* Support identity in session update command * update history.rst * fix --------- Co-authored-by: Nan Jiang <naji@microsoft.com>
1 parent 837a1f0 commit b6f0d2c

File tree

5 files changed

+9941
-5990
lines changed

5 files changed

+9941
-5990
lines changed

src/containerapp/HISTORY.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ upcoming
1111
* 'az containerapp env create': Set identity only when `--mi-system-assigned` or `--mi-user-assigned` is specified.
1212
* 'az containerapp env create': Set identity only when `--system-assigned` or `--user-assigned` is specified.
1313
* 'az containerapp up': Support deploying Azure AI Foundry model to Container App with `--model-registry`, `--model-name`, `--model-version`.
14+
* 'az containerapp sessionpool update': Support `--mi-system-assigned`, `--mi-user-assigned` and `--registry-identity`
1415

1516
1.1.0b4
1617
++++++

src/containerapp/azext_containerapp/containerapp_sessionpool_decorator.py

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -415,11 +415,67 @@ def construct_payload(self):
415415
(self.get_argument_managed_env() is not None and safe_get(self.existing_pool_def, "properties", "environmentId").lower() == self.get_argument_managed_env().lower())):
416416
raise ValidationError("containerType and environmentId cannot be updated.")
417417

418+
self.set_up_managed_identity()
418419
self.set_up_dynamic_configuration()
419420
self.set_up_network_configuration()
420421
self.set_up_scale_configuration()
421422
self.set_up_secrets()
422423
self.set_up_custom_container_template(safe_get(self.session_pool_def, "properties", "secrets"))
424+
self.set_up_managed_identity_settings()
425+
426+
def set_up_managed_identity(self):
427+
if self.get_argument_system_assigned() is not None or self.get_argument_user_assigned() is not None:
428+
identity_def = deepcopy(ManagedServiceIdentity)
429+
identity_def["type"] = "None"
430+
431+
assign_system_identity = self.get_argument_system_assigned()
432+
if self.get_argument_user_assigned():
433+
assign_user_identities = [x.lower() for x in self.get_argument_user_assigned()]
434+
else:
435+
assign_user_identities = []
436+
437+
identity = self.get_argument_registry_identity()
438+
if identity:
439+
if is_registry_msi_system(identity):
440+
assign_system_identity = True
441+
else:
442+
assign_user_identities.append(self.get_argument_registry_identity())
443+
444+
if assign_system_identity and assign_user_identities:
445+
identity_def["type"] = "SystemAssigned, UserAssigned"
446+
elif assign_system_identity:
447+
identity_def["type"] = "SystemAssigned"
448+
elif assign_user_identities:
449+
identity_def["type"] = "UserAssigned"
450+
451+
if assign_user_identities:
452+
identity_def["userAssignedIdentities"] = {}
453+
subscription_id = get_subscription_id(self.cmd.cli_ctx)
454+
455+
for r in assign_user_identities:
456+
r = _ensure_identity_resource_id(subscription_id, self.get_argument_resource_group_name(), r)
457+
identity_def["userAssignedIdentities"][r] = {} # pylint: disable=unsupported-assignment-operation
458+
459+
safe_set(self.session_pool_def, "identity", value=identity_def)
460+
461+
def set_up_managed_identity_settings(self):
462+
managed_identity_settings = []
463+
if self.get_argument_system_assigned():
464+
managed_identity_setting = {
465+
"identity": "system",
466+
"lifecycle": "Main"
467+
}
468+
managed_identity_settings.append(managed_identity_setting)
469+
470+
if self.get_argument_user_assigned():
471+
for x in self.get_argument_user_assigned():
472+
managed_identity_setting = {
473+
"identity": x.lower(),
474+
"lifecycle": "Main"
475+
}
476+
managed_identity_settings.append(managed_identity_setting)
477+
if managed_identity_settings:
478+
safe_set(self.session_pool_def, "properties", "managedIdentitySettings", value=managed_identity_settings)
423479

424480
def set_up_dynamic_configuration(self):
425481
if self.get_argument_cooldown_period_in_seconds() is not None:
@@ -489,15 +545,16 @@ def set_up_container(self, customer_container_template):
489545
def set_up_registry_auth_configuration(self, secrets_def, customer_container_template):
490546
if self.has_registry_change():
491547
if safe_get(customer_container_template, "registryCredentials") is None:
492-
if self.get_argument_registry_server() is None or (self.get_argument_registry_user() is None or self.get_argument_registry_pass() is None):
548+
if self.get_argument_registry_server() is None or (self.get_argument_registry_identity() is None and (self.get_argument_registry_user() is None or self.get_argument_registry_pass() is None)):
493549
raise ValidationError("The existing registry credentials are empty. \n"
494-
"Please provide --registry-server, --registry-username, and --registry-password to update the registry credentials. \n"
495-
"If you want to use managed identity for registry, please use `az containerapp sessionpool create --registry-server myregistry.azurecr.io --registry-identity MyUserIdentityResourceId`.\n")
550+
"Please provide --registry-server, --registry-username, --registry-password or --registry-identity to update the registry credentials. \n")
496551
safe_set(customer_container_template, "registryCredentials", value={})
497552
if self.get_argument_registry_server() is not None:
498553
safe_set(customer_container_template, "registryCredentials", "server", value=self.get_argument_registry_server())
499554
if self.get_argument_registry_user() is not None:
500555
safe_set(customer_container_template, "registryCredentials", "username", value=self.get_argument_registry_user())
556+
if self.get_argument_registry_identity() is not None:
557+
safe_set(customer_container_template, "registryCredentials", "identity", value=self.get_argument_registry_identity())
501558
if secrets_def is None:
502559
secrets_def = []
503560
if self.get_argument_registry_pass() is not None:
@@ -542,7 +599,8 @@ def has_container_change(self):
542599
def has_registry_change(self):
543600
return (self.get_argument_registry_server() is not None or
544601
self.get_argument_registry_user() is not None or
545-
self.get_argument_registry_pass() is not None)
602+
self.get_argument_registry_pass() is not None or
603+
self.get_argument_registry_identity() is not None)
546604

547605
def has_target_port_change(self):
548606
return self.get_argument_target_port() is not None

src/containerapp/azext_containerapp/custom.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3129,7 +3129,10 @@ def update_session_pool(cmd,
31293129
target_port=None,
31303130
registry_server=None,
31313131
registry_pass=None,
3132-
registry_user=None):
3132+
registry_user=None,
3133+
mi_user_assigned=None,
3134+
registry_identity=None,
3135+
mi_system_assigned=False):
31333136
raw_parameters = locals()
31343137
session_pool_decorator = SessionPoolUpdateDecorator(
31353138
cmd=cmd,

0 commit comments

Comments
 (0)