Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/containerapp/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ upcoming
* 'az containerapp env create': Set identity only when `--mi-system-assigned` or `--mi-user-assigned` is specified.
* 'az containerapp env create': Set identity only when `--system-assigned` or `--user-assigned` is specified.
* 'az containerapp up': Support deploying Azure AI Foundry model to Container App with `--model-registry`, `--model-name`, `--model-version`.
* 'az containerapp sessionpool update': Support `--mi-system-assigned`, `--mi-user-assigned` and `--registry-identity`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the difference between parameters --registry-identity with --mi-system-assigned and --mi-user-assigned?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--registry-identity is for pull-image from ACR registry
--mi-system-assigned and --mi-user-assigned are used by container, to call other azure service
In API view, --mi-system-assigned and --mi-user-assigned need set to managedIdentity lifecycle.
--registry-identity is inside the registry credentials

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got it, thanks


1.1.0b4
++++++
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -415,11 +415,67 @@ def construct_payload(self):
(self.get_argument_managed_env() is not None and safe_get(self.existing_pool_def, "properties", "environmentId").lower() == self.get_argument_managed_env().lower())):
raise ValidationError("containerType and environmentId cannot be updated.")

self.set_up_managed_identity()
self.set_up_dynamic_configuration()
self.set_up_network_configuration()
self.set_up_scale_configuration()
self.set_up_secrets()
self.set_up_custom_container_template(safe_get(self.session_pool_def, "properties", "secrets"))
self.set_up_managed_identity_settings()

def set_up_managed_identity(self):
if self.get_argument_system_assigned() is not None or self.get_argument_user_assigned() is not None:
identity_def = deepcopy(ManagedServiceIdentity)
identity_def["type"] = "None"

assign_system_identity = self.get_argument_system_assigned()
if self.get_argument_user_assigned():
assign_user_identities = [x.lower() for x in self.get_argument_user_assigned()]
else:
assign_user_identities = []

identity = self.get_argument_registry_identity()
if identity:
if is_registry_msi_system(identity):
assign_system_identity = True
else:
assign_user_identities.append(self.get_argument_registry_identity())

if assign_system_identity and assign_user_identities:
identity_def["type"] = "SystemAssigned, UserAssigned"
elif assign_system_identity:
identity_def["type"] = "SystemAssigned"
elif assign_user_identities:
identity_def["type"] = "UserAssigned"

if assign_user_identities:
identity_def["userAssignedIdentities"] = {}
subscription_id = get_subscription_id(self.cmd.cli_ctx)

for r in assign_user_identities:
r = _ensure_identity_resource_id(subscription_id, self.get_argument_resource_group_name(), r)
identity_def["userAssignedIdentities"][r] = {} # pylint: disable=unsupported-assignment-operation

safe_set(self.session_pool_def, "identity", value=identity_def)

def set_up_managed_identity_settings(self):
managed_identity_settings = []
if self.get_argument_system_assigned():
managed_identity_setting = {
"identity": "system",
"lifecycle": "Main"
}
managed_identity_settings.append(managed_identity_setting)

if self.get_argument_user_assigned():
for x in self.get_argument_user_assigned():
managed_identity_setting = {
"identity": x.lower(),
"lifecycle": "Main"
}
managed_identity_settings.append(managed_identity_setting)
if managed_identity_settings:
safe_set(self.session_pool_def, "properties", "managedIdentitySettings", value=managed_identity_settings)

def set_up_dynamic_configuration(self):
if self.get_argument_cooldown_period_in_seconds() is not None:
Expand Down Expand Up @@ -489,15 +545,16 @@ def set_up_container(self, customer_container_template):
def set_up_registry_auth_configuration(self, secrets_def, customer_container_template):
if self.has_registry_change():
if safe_get(customer_container_template, "registryCredentials") is None:
if self.get_argument_registry_server() is None or (self.get_argument_registry_user() is None or self.get_argument_registry_pass() is None):
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)):
raise ValidationError("The existing registry credentials are empty. \n"
"Please provide --registry-server, --registry-username, and --registry-password to update the registry credentials. \n"
"If you want to use managed identity for registry, please use `az containerapp sessionpool create --registry-server myregistry.azurecr.io --registry-identity MyUserIdentityResourceId`.\n")
"Please provide --registry-server, --registry-username, --registry-password or --registry-identity to update the registry credentials. \n")
safe_set(customer_container_template, "registryCredentials", value={})
if self.get_argument_registry_server() is not None:
safe_set(customer_container_template, "registryCredentials", "server", value=self.get_argument_registry_server())
if self.get_argument_registry_user() is not None:
safe_set(customer_container_template, "registryCredentials", "username", value=self.get_argument_registry_user())
if self.get_argument_registry_identity() is not None:
safe_set(customer_container_template, "registryCredentials", "identity", value=self.get_argument_registry_identity())
if secrets_def is None:
secrets_def = []
if self.get_argument_registry_pass() is not None:
Expand Down Expand Up @@ -542,7 +599,8 @@ def has_container_change(self):
def has_registry_change(self):
return (self.get_argument_registry_server() is not None or
self.get_argument_registry_user() is not None or
self.get_argument_registry_pass() is not None)
self.get_argument_registry_pass() is not None or
self.get_argument_registry_identity() is not None)

def has_target_port_change(self):
return self.get_argument_target_port() is not None
5 changes: 4 additions & 1 deletion src/containerapp/azext_containerapp/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -3129,7 +3129,10 @@ def update_session_pool(cmd,
target_port=None,
registry_server=None,
registry_pass=None,
registry_user=None):
registry_user=None,
mi_user_assigned=None,
registry_identity=None,
mi_system_assigned=False):
raw_parameters = locals()
session_pool_decorator = SessionPoolUpdateDecorator(
cmd=cmd,
Expand Down
Loading
Loading