Skip to content

Commit 8928792

Browse files
authored
[Containerapp] az containerapp session stop: Add stop session feature (#9140)
1 parent 72c7889 commit 8928792

9 files changed

Lines changed: 24714 additions & 3 deletions

‎src/containerapp/HISTORY.rst‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ upcoming
1010
* 'az containerapp up': support for `--kind` parameter
1111
* 'az containerapp env premium-ingress': Deprecate `--min-replicas` and `--max-replicas` parameters, use workload profile scale instead.
1212
* 'az containerapp sessionpool create/update': Support `--probe-yaml`
13+
* 'az containerapp session stop': Support stop session for custom container sessions
1314

1415
1.2.0b3
1516
++++++

‎src/containerapp/azext_containerapp/_clients.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,6 +1513,23 @@ def extract_path_from_filename(path, filename):
15131513
return path.rstrip("/") + "/" + path_in_filename.lstrip('/'), filename
15141514

15151515

1516+
class SessionCustomContainerPreviewClient():
1517+
# pylint: disable=too-few-public-methods
1518+
session_dp_api_version = "2025-02-02-preview" # may be different from ACA CP
1519+
1520+
@classmethod
1521+
def stop_session(cls, cmd, identifier, session_pool_endpoint):
1522+
url_fmt = "{}/.management/stopSession?identifier={}&api-version={}"
1523+
request_url = url_fmt.format(
1524+
session_pool_endpoint,
1525+
identifier,
1526+
cls.session_dp_api_version)
1527+
1528+
r = send_raw_request(cmd.cli_ctx, "POST", request_url, resource=SESSION_RESOURCE)
1529+
1530+
return r.text
1531+
1532+
15161533
class DotNetComponentPreviewClient():
15171534
api_version = PREVIEW_API_VERSION
15181535

‎src/containerapp/azext_containerapp/_help.py‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2058,12 +2058,22 @@
20582058
az containerapp sessionpool list -g MyResourceGroup
20592059
"""
20602060

2061-
# code interpreter commands
2061+
# Session Commands
20622062
helps['containerapp session'] = """
20632063
type: group
20642064
short-summary: Commands to manage sessions.To learn more about individual commands under each subgroup run containerapp session [subgroup name] --help.
20652065
"""
20662066

2067+
helps['containerapp session stop'] = """
2068+
type: command
2069+
short-summary: Stop a custom container session.
2070+
examples:
2071+
- name: Stop a custom container session.
2072+
text: |
2073+
az containerapp session stop -n MySessionPool -g MyResourceGroup --identifier MySession
2074+
"""
2075+
2076+
# code interpreter commands
20672077
helps['containerapp session code-interpreter'] = """
20682078
type: group
20692079
short-summary: Commands to interact with and manage code interpreter sessions.

‎src/containerapp/azext_containerapp/_params.py‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,10 +479,16 @@ def load_arguments(self, _):
479479
c.argument('registry_user', validator=validate_registry_user, options_list=['--registry-username'], help="The username to log in to container registry.")
480480
c.argument('registry_identity', validator=validate_registry_user, help="The managed identity with which to authenticate to the Azure Container Registry (instead of username/password). Use 'system' for a system-assigned identity, use a resource ID for a user-assigned identity. The managed identity should have been assigned acrpull permissions on the ACR before deployment (use 'az role assignment create --role acrpull ...').")
481481

482-
# sessions code interpreter commands
483-
with self.argument_context('containerapp session code-interpreter') as c:
482+
# sessions commands
483+
with self.argument_context('containerapp session') as c:
484484
c.argument('name', options_list=['--name', '-n'], help="The Session Pool name.")
485485
c.argument('resource_group_name', arg_type=resource_group_name_type, id_part=None)
486+
487+
with self.argument_context('containerapp session stop') as c:
488+
c.argument('identifier', options_list=['--identifier', '-i'], help="The Session Identifier")
489+
490+
# sessions code interpreter commands
491+
with self.argument_context('containerapp session code-interpreter') as c:
486492
c.argument('identifier', options_list=['--identifier', '-i'], help="The Session Identifier")
487493
c.argument('session_pool_location', help="The location of the session pool")
488494

‎src/containerapp/azext_containerapp/commands.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,9 @@ def load_command_table(self, args):
262262
g.custom_command('update', 'update_session_pool', supports_no_wait=True)
263263
g.custom_command('delete', 'delete_session_pool', confirmation=True, supports_no_wait=True)
264264

265+
with self.command_group('containerapp session') as g:
266+
g.custom_command('stop', 'stop_session_custom_container', is_preview=True)
267+
265268
with self.command_group('containerapp session code-interpreter') as g:
266269
g.custom_command('execute', 'execute_session_code_interpreter', supports_no_wait=True)
267270
g.custom_command('upload-file', 'upload_session_code_interpreter', supports_no_wait=True)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# coding=utf-8
2+
# --------------------------------------------------------------------------------------------
3+
# Copyright (c) Microsoft Corporation. All rights reserved.
4+
# Licensed under the MIT License. See License.txt in the project root for license information.
5+
# --------------------------------------------------------------------------------------------
6+
# pylint: disable=line-too-long, broad-except, logging-format-interpolation
7+
8+
9+
from knack.log import get_logger
10+
from typing import Any, Dict
11+
12+
from azure.cli.core.azclierror import ValidationError
13+
from azure.cli.core.commands import AzCliCommand
14+
from azure.cli.command_modules.containerapp.base_resource import BaseResource
15+
from azure.cli.command_modules.containerapp._utils import safe_get
16+
from ._clients import SessionPoolPreviewClient
17+
18+
from ._models import SessionCodeInterpreterExecution as SessionCodeInterpreterExecutionPreviewModel
19+
from ._client_factory import handle_raw_exception
20+
from .containerapp_sessionpool_decorator import ContainerType
21+
22+
logger = get_logger(__name__)
23+
24+
25+
class SessionCustomContainerPreviewDecorator(BaseResource):
26+
def __init__(self, cmd: AzCliCommand, client: Any, raw_parameters: Dict, models: str):
27+
super().__init__(cmd, client, raw_parameters, models)
28+
self.session_code_interpreter_def = SessionCodeInterpreterExecutionPreviewModel
29+
self.session_pool_client = SessionPoolPreviewClient
30+
31+
def get_argument_name(self):
32+
return self.get_param('name')
33+
34+
def get_argument_resource_group_name(self):
35+
return self.get_param('resource_group_name')
36+
37+
def get_argument_identifier(self):
38+
return self.get_param('identifier')
39+
40+
def get_sessionpool(self):
41+
return self.session_pool_client.show(cmd=self.cmd,
42+
resource_group_name=self.get_argument_resource_group_name(),
43+
name=self.get_argument_name())
44+
45+
46+
class SessionCustomContainerCommandsPreviewDecorator(SessionCustomContainerPreviewDecorator):
47+
def stop_session(self):
48+
try:
49+
existing_pool_def = self.get_sessionpool()
50+
if safe_get(existing_pool_def, "properties", "containerType").lower() != ContainerType.CustomContainer.name.lower():
51+
raise ValidationError("Stop session operation is only supported for session pools with type 'CustomContainer'.")
52+
53+
return self.client.stop_session(
54+
cmd=self.cmd,
55+
identifier=self.get_argument_identifier(),
56+
session_pool_endpoint=existing_pool_def["properties"]["poolManagementEndpoint"])
57+
except Exception as e:
58+
handle_raw_exception(e)

‎src/containerapp/azext_containerapp/custom.py‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
)
9292
from .containerapp_sessionpool_decorator import SessionPoolPreviewDecorator, SessionPoolCreateDecorator, SessionPoolUpdateDecorator
9393
from .containerapp_session_code_interpreter_decorator import SessionCodeInterpreterCommandsPreviewDecorator
94+
from .containerapp_session_custom_container_decorator import SessionCustomContainerCommandsPreviewDecorator
9495
from .containerapp_job_registry_decorator import ContainerAppJobRegistryPreviewSetDecorator
9596
from .containerapp_env_maintenance_config_decorator import ContainerAppEnvMaintenanceConfigPreviewDecorator
9697
from .dotnet_component_decorator import DotNetComponentDecorator
@@ -111,6 +112,7 @@
111112
JavaComponentPreviewClient,
112113
SessionPoolPreviewClient,
113114
SessionCodeInterpreterPreviewClient,
115+
SessionCustomContainerPreviewClient,
114116
DotNetComponentPreviewClient,
115117
MaintenanceConfigPreviewClient,
116118
HttpRouteConfigPreviewClient,
@@ -3349,6 +3351,25 @@ def delete_file_session_code_interpreter(cmd,
33493351
return r
33503352

33513353

3354+
# session custom container commands
3355+
def stop_session_custom_container(cmd,
3356+
name,
3357+
resource_group_name,
3358+
identifier):
3359+
raw_parameters = locals()
3360+
session_custom_container_decorator = SessionCustomContainerCommandsPreviewDecorator(
3361+
cmd=cmd,
3362+
client=SessionCustomContainerPreviewClient,
3363+
raw_parameters=raw_parameters,
3364+
models=CONTAINER_APPS_SDK_MODELS
3365+
)
3366+
session_custom_container_decorator.register_provider(CONTAINER_APPS_RP)
3367+
3368+
r = session_custom_container_decorator.stop_session()
3369+
3370+
return r
3371+
3372+
33523373
def list_dotnet_components(cmd, environment_name, resource_group_name):
33533374
raw_parameters = locals()
33543375
dotnet_component_decorator = DotNetComponentDecorator(

0 commit comments

Comments
 (0)