Skip to content
Open
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ venv/
ENV/
env/
env27/
env3*/

# Spyder project settings
.spyderproject
Expand Down
8 changes: 8 additions & 0 deletions linter_exclusions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3504,3 +3504,11 @@ neon postgres organization:
neon postgres project:
rule_exclusions:
- require_wait_command_if_no_wait

cosmosdb sql softdeleted-database list:
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

i dont know why but i kept getting these errors, so i had to exclude

rule_exclusions:
- no_ids_for_list_commands

cosmosdb sql softdeleted-collection list:
rule_exclusions:
- no_ids_for_list_commands
7 changes: 7 additions & 0 deletions src/cosmosdb-preview/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
Release History
===============

1.7.0
+++++
* Add support for soft-deleted resource operations for SQL API
* New command group `az cosmosdb sql softdeleted-account` to list, show, delete (purge), and recover soft-deleted accounts
* New command group `az cosmosdb sql softdeleted-database` to list, show, delete (purge), and recover soft-deleted databases
* New command group `az cosmosdb sql softdeleted-container` to list, show, delete (purge), and recover soft-deleted containers

1.6.1
+++++
* Fix SQL container throughput update to preserve existing throughput buckets when not explicitly specified.
Expand Down
13 changes: 13 additions & 0 deletions src/cosmosdb-preview/azext_cosmosdb_preview/_client_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,16 @@ def cf_fleetspace_account(cli_ctx, _):

def cf_fleet_analytics(cli_ctx, _):
return cf_cosmosdb_preview(cli_ctx).fleet_analytics


# soft-deleted resources
def cf_softdeleted_database_accounts(cli_ctx, _):
return cf_cosmosdb_preview(cli_ctx).soft_deleted_database_accounts


def cf_softdeleted_sql_databases(cli_ctx, _):
return cf_cosmosdb_preview(cli_ctx).soft_deleted_sql_databases


def cf_softdeleted_sql_containers(cli_ctx, _):
return cf_cosmosdb_preview(cli_ctx).soft_deleted_sql_containers
128 changes: 128 additions & 0 deletions src/cosmosdb-preview/azext_cosmosdb_preview/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,8 @@
text: az cosmosdb update --capabilities EnableGremlin --name MyCosmosDBDatabaseAccount --resource-group MyResourceGroup
- name: Update an Azure Cosmos DB database account to enable materialized views.
text: az cosmosdb update --name MyCosmosDBDatabaseAccount --resource-group MyResourceGroup --enable-materialized-views true
- name: Enable soft deletion with 1440 minutes (24 hours) retention.
text: az cosmosdb update --name MyCosmosDBDatabaseAccount --resource-group MyResourceGroup --enable-soft-deletion true --sd-retention 1440 --min-purge-minutes 60
"""

# restore account
Expand Down Expand Up @@ -1844,3 +1846,129 @@
type: command
short-summary: Delete a Fleet Analytics resource from a Fleet.
"""

helps['cosmosdb softdeleted-account'] = """
type: group
short-summary: Manage soft-deleted Azure Cosmos DB accounts.
"""

helps['cosmosdb softdeleted-account list'] = """
type: command
short-summary: List soft-deleted Azure Cosmos DB accounts.
examples:
- name: List all soft-deleted Azure Cosmos DB accounts in a subscription.
text: |
az cosmosdb softdeleted-account list
- name: List soft-deleted Azure Cosmos DB accounts in a specific location.
text: |
az cosmosdb softdeleted-account list --location westus
"""

helps['cosmosdb softdeleted-account show'] = """
type: command
short-summary: Show details of a soft-deleted Azure Cosmos DB account.
examples:
- name: Show details of a soft-deleted Azure Cosmos DB account.
text: |
az cosmosdb softdeleted-account show --location westus --name MyAccount --resource-group MyResourceGroup
"""

helps['cosmosdb softdeleted-account delete'] = """
type: command
short-summary: Permanently delete a soft-deleted Azure Cosmos DB account.
examples:
- name: Permanently delete a soft-deleted Azure Cosmos DB account.
text: |
az cosmosdb softdeleted-account delete --location westus --name MyAccount --resource-group MyResourceGroup
"""

helps['cosmosdb softdeleted-account recover'] = """
type: command
short-summary: Recover a soft-deleted Azure Cosmos DB account.
examples:
- name: Recover a soft-deleted Azure Cosmos DB account.
text: |
az cosmosdb softdeleted-account recover --location westus --name MyAccount --resource-group MyResourceGroup
"""

helps['cosmosdb sql softdeleted-database'] = """
type: group
short-summary: Manage soft-deleted databases for Azure Cosmos DB SQL API.
"""

helps['cosmosdb sql softdeleted-database list'] = """
type: command
short-summary: List all soft-deleted databases for an Azure Cosmos DB account.
examples:
- name: List all soft-deleted databases for an Azure Cosmos DB account.
text: |
az cosmosdb sql softdeleted-database list --location westus --account-name MyAccount --resource-group MyResourceGroup
"""

helps['cosmosdb sql softdeleted-database show'] = """
type: command
short-summary: Show details of a soft-deleted database.
examples:
- name: Show details of a soft-deleted database.
text: |
az cosmosdb sql softdeleted-database show --location westus --account-name MyAccount --name MyDatabase --resource-group MyResourceGroup
"""

helps['cosmosdb sql softdeleted-database delete'] = """
type: command
short-summary: Permanently delete a soft-deleted database.
examples:
- name: Permanently delete a soft-deleted database.
text: |
az cosmosdb sql softdeleted-database delete --location westus --account-name MyAccount --name MyDatabase --resource-group MyResourceGroup
"""

helps['cosmosdb sql softdeleted-database recover'] = """
type: command
short-summary: Recover a soft-deleted database.
examples:
- name: Recover a soft-deleted database.
text: |
az cosmosdb sql softdeleted-database recover --location westus --account-name MyAccount --name MyDatabase --resource-group MyResourceGroup
"""

helps['cosmosdb sql softdeleted-container'] = """
type: group
short-summary: Manage soft-deleted containers for Azure Cosmos DB SQL API.
"""

helps['cosmosdb sql softdeleted-container list'] = """
type: command
short-summary: List all soft-deleted containers in a database.
examples:
- name: List all soft-deleted containers in a database.
text: |
az cosmosdb sql softdeleted-container list --location westus --account-name MyAccount --database-name MyDatabase --resource-group MyResourceGroup
"""

helps['cosmosdb sql softdeleted-container show'] = """
type: command
short-summary: Show details of a soft-deleted container.
examples:
- name: Show details of a soft-deleted container.
text: |
az cosmosdb sql softdeleted-container show --location westus --account-name MyAccount --database-name MyDatabase --name MyContainer --resource-group MyResourceGroup
"""

helps['cosmosdb sql softdeleted-container delete'] = """
type: command
short-summary: Permanently delete a soft-deleted container.
examples:
- name: Permanently delete a soft-deleted container.
text: |
az cosmosdb sql softdeleted-container delete --location westus --account-name MyAccount --database-name MyDatabase --name MyContainer --resource-group MyResourceGroup
"""

helps['cosmosdb sql softdeleted-container recover'] = """
type: command
short-summary: Recover a soft-deleted container.
examples:
- name: Recover a soft-deleted container.
text: |
az cosmosdb sql softdeleted-container recover --location westus --account-name MyAccount --database-name MyDatabase --name MyContainer --resource-group MyResourceGroup
"""
101 changes: 101 additions & 0 deletions src/cosmosdb-preview/azext_cosmosdb_preview/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,9 @@ def load_arguments(self, _):

with self.argument_context('cosmosdb update') as c:
c.argument('key_uri', help="The URI of the key vault", is_preview=True)
c.argument('soft_deletion_enabled', options_list=['--soft-deletion-enabled'], arg_type=get_three_state_flag(), help="Flag to enable or disable soft deletion on the account.", is_preview=True, arg_group='Soft Delete')
c.argument('soft_deletion_retention_period_in_minutes', options_list=['--soft-deletion-retention-period-in-minutes', '--sd-retention'], type=int, help="Soft deletion retention period in minutes. Must be at least equal to min_minutes_before_permanent_deletion_allowed.", is_preview=True, arg_group='Soft Delete')
Copy link

Copilot AI Nov 13, 2025

Choose a reason for hiding this comment

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

The help text for soft_deletion_retention_period_in_minutes states "Must be at least equal to min_minutes_before_permanent_deletion_allowed" but uses the internal parameter name. For better user experience, it should reference the user-facing option name: "Must be at least equal to --min-purge-minutes".

Suggested change
c.argument('soft_deletion_retention_period_in_minutes', options_list=['--soft-deletion-retention-period-in-minutes', '--sd-retention'], type=int, help="Soft deletion retention period in minutes. Must be at least equal to min_minutes_before_permanent_deletion_allowed.", is_preview=True, arg_group='Soft Delete')
c.argument('soft_deletion_retention_period_in_minutes', options_list=['--soft-deletion-retention-period-in-minutes', '--sd-retention'], type=int, help="Soft deletion retention period in minutes. Must be at least equal to --min-purge-minutes.", is_preview=True, arg_group='Soft Delete')

Copilot uses AI. Check for mistakes.
c.argument('min_minutes_before_permanent_deletion_allowed', options_list=['--min-minutes-before-permanent-deletion-allowed', '--min-purge-minutes'], type=int, help="Minimum minutes before permanent deletion is allowed for soft-deleted resources.", is_preview=True, arg_group='Soft Delete')

with self.argument_context('cosmosdb restore') as c:
c.argument('target_database_account_name', options_list=['--target-database-account-name', '-n'], help='Name of the new target Cosmos DB database account after the restore')
Expand Down Expand Up @@ -658,6 +661,11 @@ def load_arguments(self, _):
c.argument('database_name', database_name_type, required=True, help='Name of the CosmosDB database name')
c.argument('container_name', options_list=['--name', '-n'], required=True, help='Name of the CosmosDB collection')

# Sql container list
with self.argument_context('cosmosdb sql container list') as c:
c.argument('account_name', account_name_type, id_part=None, required=True, help='Name of the CosmosDB database account')
c.argument('database_name', database_name_type, required=True, help='Name of the CosmosDB database')

# mongodb collection partition merge
with self.argument_context('cosmosdb mongodb collection merge') as c:
c.argument('account_name', account_name_type, id_part=None, required=True, help='Name of the CosmosDB database account')
Expand All @@ -669,6 +677,27 @@ def load_arguments(self, _):
c.argument('account_name', account_name_type, id_part=None, required=True, help='Name of the CosmosDB database account')
c.argument('database_name', options_list=['--name', '-n'], required=True, help='Name of the CosmosDB database name')

# Sql database show
with self.argument_context('cosmosdb sql database show') as c:
c.argument('account_name', account_name_type, id_part=None, required=True, help='Name of the CosmosDB database account')
c.argument('database_name', options_list=['--name', '-n'], required=True, help='Name of the CosmosDB database')

# Sql database create
with self.argument_context('cosmosdb sql database create') as c:
c.argument('account_name', account_name_type, id_part=None, required=True, help='Name of the CosmosDB database account')
c.argument('database_name', options_list=['--name', '-n'], required=True, help='Database name')
c.argument('throughput', type=int, help='The throughput of SQL database (RU/s). Default value is 400')
c.argument('max_throughput', max_throughput_type)

# Sql database list
with self.argument_context('cosmosdb sql database list') as c:
c.argument('account_name', account_name_type, id_part=None, required=True, help='Name of the CosmosDB database account')

# Sql database delete
with self.argument_context('cosmosdb sql database delete') as c:
c.argument('account_name', account_name_type, id_part=None, required=True, help='Name of the CosmosDB database account')
c.argument('database_name', options_list=['--name', '-n'], required=True, help='Database name')

# mongodb database partition merge
with self.argument_context('cosmosdb mongodb database merge') as c:
c.argument('account_name', account_name_type, id_part=None, required=True, help='Name of the CosmosDB database account')
Expand Down Expand Up @@ -829,6 +858,78 @@ def load_arguments(self, _):
c.argument('scope', options_list=['--scope', '-s'], help="Data plane resource path at which this Role Assignment is being granted.")
c.argument('principal_id', options_list=['--principal-id', '-p'], help="AAD Object ID of the principal to which this Role Assignment is being granted.")

# Soft-deleted Account
with self.argument_context('cosmosdb softdeleted-account list') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the soft-deleted accounts.", required=True)
c.argument('resource_group_name', options_list=['--resource-group', '-g'], help="Name of the resource group. If provided, lists only soft-deleted accounts in that resource group.", required=False)

with self.argument_context('cosmosdb softdeleted-account show') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the soft-deleted account.", required=True)
c.argument('account_name', options_list=['--name', '-n'], help="Name of the soft-deleted Cosmos DB account.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

with self.argument_context('cosmosdb softdeleted-account delete') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the soft-deleted account.", required=True)
c.argument('account_name', options_list=['--name', '-n'], help="Name of the soft-deleted Cosmos DB account to purge.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

with self.argument_context('cosmosdb softdeleted-account recover') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the soft-deleted account.", required=True)
c.argument('account_name', options_list=['--name', '-n'], help="Name of the soft-deleted Cosmos DB account to recover.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

# Soft-deleted Database
with self.argument_context('cosmosdb sql softdeleted-database list') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the account.", required=True)
c.argument('account_name', options_list=['--account-name', '-a'], help="Name of the Cosmos DB account.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

with self.argument_context('cosmosdb sql softdeleted-database show') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the account.", required=True)
c.argument('account_name', options_list=['--account-name', '-a'], help="Name of the Cosmos DB account.", required=True)
c.argument('database_name', options_list=['--name', '-n'], help="Name of the soft-deleted database.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

with self.argument_context('cosmosdb sql softdeleted-database delete') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the account.", required=True)
c.argument('account_name', options_list=['--account-name', '-a'], help="Name of the Cosmos DB account.", required=True)
c.argument('database_name', options_list=['--name', '-n'], help="Name of the soft-deleted database to purge.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

with self.argument_context('cosmosdb sql softdeleted-database recover') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the account.", required=True)
c.argument('account_name', options_list=['--account-name', '-a'], help="Name of the Cosmos DB account.", required=True)
c.argument('database_name', options_list=['--name', '-n'], help="Name of the soft-deleted database to recover.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

# Soft-deleted Collection
with self.argument_context('cosmosdb sql softdeleted-container list') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the account.", required=True)
c.argument('account_name', options_list=['--account-name', '-a'], help="Name of the Cosmos DB account.", required=True)
c.argument('database_name', options_list=['--database-name', '-d'], help="Name of the database.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

with self.argument_context('cosmosdb sql softdeleted-container show') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the account.", required=True)
c.argument('account_name', options_list=['--account-name', '-a'], help="Name of the Cosmos DB account.", required=True)
c.argument('database_name', options_list=['--database-name', '-d'], help="Name of the database.", required=True)
c.argument('container_name', options_list=['--name', '-n'], help="Name of the soft-deleted container.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

with self.argument_context('cosmosdb sql softdeleted-container delete') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the account.", required=True)
c.argument('account_name', options_list=['--account-name', '-a'], help="Name of the Cosmos DB account.", required=True)
c.argument('database_name', options_list=['--database-name', '-d'], help="Name of the database.", required=True)
c.argument('container_name', options_list=['--name', '-n'], help="Name of the soft-deleted container to purge.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

with self.argument_context('cosmosdb sql softdeleted-container recover') as c:
c.argument('location', options_list=['--location', '-l'], help="Location of the account.", required=True)
c.argument('account_name', options_list=['--account-name', '-a'], help="Name of the Cosmos DB account.", required=True)
c.argument('database_name', options_list=['--database-name', '-d'], help="Name of the database.", required=True)
c.argument('container_name', options_list=['--name', '-n'], help="Name of the soft-deleted container to recover.", required=True)
c.argument('resource_group', options_list=['--resource-group', '-g'], help="Name of the resource group.", required=True)

# Cosmos DB Fleet
with self.argument_context('cosmosdb fleet') as c:
c.argument('resource_group', options_list=['--resource-group', '-g'], help='Name of the resource group.', required=True)
Expand Down
Loading
Loading