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
22 changes: 22 additions & 0 deletions linter_exclusions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,28 @@ codespace plan create:
default_sku_name:
rule_exclusions:
- option_length_too_long
containerapp env create:
parameters:
infrastructure_subnet_resource_id:
rule_exclusions:
- option_length_too_long
instrumentation_key:
rule_exclusions:
- option_length_too_long
platform_reserved_dns_ip:
rule_exclusions:
- option_length_too_long
containerapp github-action add:
parameters:
service_principal_client_id:
rule_exclusions:
- option_length_too_long
service_principal_client_secret:
rule_exclusions:
- option_length_too_long
service_principal_tenant_id:
rule_exclusions:
- option_length_too_long
costmanagement export create:
parameters:
definition_dataset_configuration:
Expand Down
27 changes: 23 additions & 4 deletions src/containerapp/azext_containerapp/_clients.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ def poll(cmd, request_url, poll_if_status): # pylint: disable=inconsistent-retu
except Exception as e: # pylint: disable=broad-except
animation.flush()

if not poll_if_status == "scheduledfordelete": # Catch "not found" errors if polling for delete
delete_statuses = ["scheduledfordelete", "cancelled"]

if poll_if_status not in delete_statuses: # Catch "not found" errors if polling for delete
raise e


Expand Down Expand Up @@ -127,7 +129,7 @@ def update(cls, cmd, resource_group_name, name, container_app_envelope, no_wait=
return r.json()

@classmethod
def delete(cls, cmd, resource_group_name, name):
def delete(cls, cmd, resource_group_name, name, no_wait=False):
management_hostname = cmd.cli_ctx.cloud.endpoints.resource_manager
api_version = NEW_API_VERSION
sub_id = get_subscription_id(cmd.cli_ctx)
Expand All @@ -141,8 +143,25 @@ def delete(cls, cmd, resource_group_name, name):

r = send_raw_request(cmd.cli_ctx, "DELETE", request_url)

if r.status_code == 202:
logger.warning('Containerapp successfully deleted')
if no_wait:
return # API doesn't return JSON (it returns no content)
elif r.status_code in [200, 201, 202, 204]:
url_fmt = "{}/subscriptions/{}/resourceGroups/{}/providers/Microsoft.App/containerApps/{}?api-version={}"
request_url = url_fmt.format(
management_hostname.strip('/'),
sub_id,
resource_group_name,
name,
api_version)

if r.status_code == 202:
from azure.cli.core.azclierror import ResourceNotFoundError
try:
poll(cmd, request_url, "cancelled")
except ResourceNotFoundError:
pass
logger.warning('Containerapp successfully deleted')


@classmethod
def show(cls, cmd, resource_group_name, name):
Expand Down
2 changes: 1 addition & 1 deletion src/containerapp/azext_containerapp/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def load_command_table(self, _):
g.custom_command('list', 'list_containerapp', table_transformer=transform_containerapp_list_output)
g.custom_command('create', 'create_containerapp', supports_no_wait=True, exception_handler=ex_handler_factory())
g.custom_command('update', 'update_containerapp', supports_no_wait=True, exception_handler=ex_handler_factory())
g.custom_command('delete', 'delete_containerapp', confirmation=True, exception_handler=ex_handler_factory())
g.custom_command('delete', 'delete_containerapp', supports_no_wait=True, confirmation=True, exception_handler=ex_handler_factory())

with self.command_group('containerapp env') as g:
g.custom_show_command('show', 'show_managed_environment')
Expand Down
44 changes: 25 additions & 19 deletions src/containerapp/azext_containerapp/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,13 @@

from urllib.parse import urlparse
from azure.cli.command_modules.appservice.custom import (_get_acr_cred)
from azure.cli.core.azclierror import (RequiredArgumentMissingError, ValidationError, ResourceNotFoundError, CLIInternalError, InvalidArgumentValueError)
from azure.cli.core.azclierror import (
RequiredArgumentMissingError,
ValidationError,
ResourceNotFoundError,
CLIError,
CLIInternalError,
InvalidArgumentValueError)
from azure.cli.core.commands.client_factory import get_subscription_id
from knack.log import get_logger

Expand Down Expand Up @@ -122,7 +128,7 @@ def update_containerapp_yaml(cmd, name, resource_group_name, file_name, from_rev
if from_revision:
try:
r = ContainerAppClient.show_revision(cmd=cmd, resource_group_name=resource_group_name, container_app_name=name, name=from_revision)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)
_update_revision_env_secretrefs(r["properties"]["template"]["containers"], name)
current_containerapp_def["properties"]["template"] = r["properties"]["template"]
Expand Down Expand Up @@ -694,7 +700,7 @@ def show_containerapp(cmd, name, resource_group_name):

try:
return ContainerAppClient.show(cmd=cmd, resource_group_name=resource_group_name, name=name)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand All @@ -709,16 +715,16 @@ def list_containerapp(cmd, resource_group_name=None):
containerapps = ContainerAppClient.list_by_resource_group(cmd=cmd, resource_group_name=resource_group_name)

return containerapps
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


def delete_containerapp(cmd, name, resource_group_name):
def delete_containerapp(cmd, name, resource_group_name, no_wait=False):
_validate_subscription_registered(cmd, "Microsoft.App")

try:
return ContainerAppClient.delete(cmd=cmd, name=name, resource_group_name=resource_group_name)
except CLIInternalError as e:
return ContainerAppClient.delete(cmd=cmd, name=name, resource_group_name=resource_group_name, no_wait=no_wait)
except CLIError as e:
handle_raw_exception(e)


Expand Down Expand Up @@ -809,7 +815,7 @@ def show_managed_environment(cmd, name, resource_group_name):

try:
return ManagedEnvironmentClient.show(cmd=cmd, resource_group_name=resource_group_name, name=name)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand All @@ -824,7 +830,7 @@ def list_managed_environments(cmd, resource_group_name=None):
managed_envs = ManagedEnvironmentClient.list_by_resource_group(cmd=cmd, resource_group_name=resource_group_name)

return managed_envs
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand All @@ -833,7 +839,7 @@ def delete_managed_environment(cmd, name, resource_group_name, no_wait=False):

try:
return ManagedEnvironmentClient.delete(cmd=cmd, name=name, resource_group_name=resource_group_name, no_wait=no_wait)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand Down Expand Up @@ -994,7 +1000,7 @@ def show_managed_identity(cmd, name, resource_group_name):

try:
r = ContainerAppClient.show(cmd=cmd, resource_group_name=resource_group_name, name=name)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)

try:
Expand Down Expand Up @@ -1061,7 +1067,7 @@ def create_or_update_github_action(cmd,
if e.data and e.data['message']:
error_msg += " Error: {}".format(e.data['message'])
raise CLIInternalError(error_msg) from e
except CLIInternalError as clierror:
except CLIError as clierror:
raise clierror
except Exception:
# If exception due to github package missing, etc just continue without validating the repo and rely on api validation
Expand Down Expand Up @@ -1179,7 +1185,7 @@ def delete_github_action(cmd, name, resource_group_name, token=None, login_with_
if e.data and e.data['message']:
error_msg += " Error: {}".format(e.data['message'])
raise CLIInternalError(error_msg) from e
except CLIInternalError as clierror:
except CLIError as clierror:
raise clierror
except Exception:
# If exception due to github package missing, etc just continue without validating the repo and rely on api validation
Expand All @@ -1196,7 +1202,7 @@ def delete_github_action(cmd, name, resource_group_name, token=None, login_with_
def list_revisions(cmd, name, resource_group_name):
try:
return ContainerAppClient.list_revisions(cmd=cmd, resource_group_name=resource_group_name, name=name)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand All @@ -1206,7 +1212,7 @@ def show_revision(cmd, resource_group_name, revision_name, name=None):

try:
return ContainerAppClient.show_revision(cmd=cmd, resource_group_name=resource_group_name, container_app_name=name, name=revision_name)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand All @@ -1216,7 +1222,7 @@ def restart_revision(cmd, resource_group_name, revision_name, name=None):

try:
return ContainerAppClient.restart_revision(cmd=cmd, resource_group_name=resource_group_name, container_app_name=name, name=revision_name)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand All @@ -1226,7 +1232,7 @@ def activate_revision(cmd, resource_group_name, revision_name, name=None):

try:
return ContainerAppClient.activate_revision(cmd=cmd, resource_group_name=resource_group_name, container_app_name=name, name=revision_name)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand All @@ -1236,7 +1242,7 @@ def deactivate_revision(cmd, resource_group_name, revision_name, name=None):

try:
return ContainerAppClient.deactivate_revision(cmd=cmd, resource_group_name=resource_group_name, container_app_name=name, name=revision_name)
except CLIInternalError as e:
except CLIError as e:
handle_raw_exception(e)


Expand Down Expand Up @@ -1289,7 +1295,7 @@ def copy_revision(cmd,
if from_revision:
try:
r = ContainerAppClient.show_revision(cmd=cmd, resource_group_name=resource_group_name, container_app_name=name, name=from_revision)
except CLIInternalError as e:
except CLIError as e:
# Error handle the case where revision not found?
handle_raw_exception(e)

Expand Down