Skip to content
Open
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
33 changes: 33 additions & 0 deletions src/azure-cli/azure/cli/command_modules/sql/_format.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,39 @@ def elastic_pool_transform(result):
return result


#####
# sql deleted-server transformers for json
#####


def deleted_server_list_transform(results):
'''
Transforms the json response for a list of deleted servers.
'''
return [deleted_server_transform(r) for r in results]


def deleted_server_transform(result):
'''
Transforms the json response for a deleted server.
Parses original_id to extract subscription ID, resource group, and server name.
'''
if result.original_id:
try:
# Parse original_id format:
# /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Sql/servers/{name}
parts = result.original_id.split('/')
if len(parts) >= 9:
result.subscription_id = parts[2]
result.resource_group = parts[4]
result.name = parts[8]
Comment on lines +288 to +294
Copy link
Member

Choose a reason for hiding this comment

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

You can leverage parse_resource_id() from azure.mgmt.core.tools. No need to implement by yourself

except (ValueError, IndexError):
# If parsing fails, just continue without adding the fields
pass

return result


#####
# sql elastic-pool table formatters
#####
Expand Down
49 changes: 49 additions & 0 deletions src/azure-cli/azure/cli/command_modules/sql/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -1605,6 +1605,10 @@
text: az sql server create -l westus -g mygroup -n myserver -u myadminuser -p myadminpassword --tags key1=value1 key2=value2
- name: Create a server with disabled public network access to server.
text: az sql server create -l westus -g mygroup -n myserver -u myadminuser -p myadminpassword -e false
- name: Create a server with soft delete enabled with 7 days retention.
text: az sql server create -l westus -g mygroup -n myserver -u myadminuser -p myadminpassword --soft-delete-retention-days 7
- name: Create a server with soft delete protection (using short alias).
text: az sql server create -l westus -g mygroup -n myserver -u myadminuser -p myadminpassword --sdrd 5
- name: Create a server without SQL Admin, with AD admin and AD Only enabled.
text: az sql server create --enable-ad-only-auth --external-admin-principal-type User --external-admin-name myUserName --external-admin-sid c5e964e2-6bb2-1111-1111-3b16ec0e1234 -g myResourceGroup -n myServer
- name: Create a server without SQL Admin, with AD admin, AD Only enabled, User ManagedIdenties and Identity Type is SystemAssigned,UserAssigned.
Expand All @@ -1619,6 +1623,45 @@
--identity-type UserAssigned --pid /subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testumi
"""

helps['sql server restore'] = """
type: command
short-summary: Restore a deleted SQL server.
long-summary: >
Restores a soft-deleted SQL server to the resource group where it was originally located.
The server must have been deleted with soft delete enabled and within the retention period.
parameters:
- name: --name -n
short-summary: Name of the deleted server to restore.
- name: --resource-group -g
short-summary: Name of the resource group where the server was originally located.
- name: --location -l
short-summary: Location where the deleted server was originally located.
examples:
- name: Restore a deleted server to its original resource group.
text: az sql server restore -g myresourcegroup -n myserver -l westus2
"""

helps['sql server deleted-server'] = """
type: group
short-summary: Gets details of deleted SQL servers.
"""

helps['sql server deleted-server show'] = """
type: command
short-summary: Get the details of a deleted SQL server in a specific location.
examples:
- name: Get details of a deleted server by name and location.
text: az sql server deleted-server show --name myserver --location westus2
"""

helps['sql server deleted-server list'] = """
type: command
short-summary: List all deleted SQL servers in a specific location.
examples:
- name: List all deleted servers in a specific location.
text: az sql server deleted-server list --location westus2
"""

helps['sql server dns-alias'] = """
type: group
short-summary: Manage a server's DNS aliases.
Expand Down Expand Up @@ -1804,6 +1847,12 @@
- name: Update a server. (autogenerated)
text: az sql server update --admin-password myadminpassword --name MyAzureSQLServer --resource-group MyResourceGroup
crafted: true
- name: Enable soft delete protection with 7-day retention.
text: az sql server update --name MyAzureSQLServer --resource-group MyResourceGroup --soft-delete-retention-days 7
- name: Modify soft delete retention period (using short alias).
text: az sql server update -n MyAzureSQLServer -g MyResourceGroup --sdrd 3
- name: Disable soft delete protection.
text: az sql server update --name MyAzureSQLServer --resource-group MyResourceGroup --soft-delete-retention-days 0
- name: Update a server with User Managed Identies and Identity Type is SystemAssigned,UserAssigned.
text: az sql server update -g myResourceGroup -n myServer -i \\
--user-assigned-identity-id /subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testumi \\
Expand Down
48 changes: 47 additions & 1 deletion src/azure-cli/azure/cli/command_modules/sql/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
create_args_for_complex_type,
validate_managed_instance_storage_size,
validate_backup_storage_redundancy,
validate_subnet
validate_subnet,
validate_soft_delete_retention_days
)

#####
Expand Down Expand Up @@ -1914,6 +1915,17 @@ def _configure_security_policy_storage_params(arg_ctx):
options_list=['--federated-client-id', '--fid'],
help='The federated client id used in cross tenant CMK scenario.')

c.argument('soft_delete_retention_days',
options_list=['--soft-delete-retention-days', '--sdrd'],
type=int,
validator=validate_soft_delete_retention_days,
is_preview=True,
help='Specify the number of days to retain soft deleted server (0-7). '
'Set to 0 to disable soft delete. '
'Set to 1-7 days to enable soft delete with the specified retention period. '
'During the retention period, the server can be restored using '
'az sql server restore.')

with self.argument_context('sql server create') as c:
c.argument('location',
arg_type=get_location_type_with_default_from_resource_group(self.cli_ctx))
Expand Down Expand Up @@ -1960,11 +1972,26 @@ def _configure_security_policy_storage_params(arg_ctx):
c.argument('administrator_login_password',
help='The administrator login password.')

c.argument('soft_delete_retention_days',
options_list=['--soft-delete-retention-days', '--sdrd'],
type=int,
validator=validate_soft_delete_retention_days,
is_preview=True,
help='Specify the number of days to retain soft deleted server (0-7). '
'Set to 0 to disable soft delete. '
'Set to 1-7 days to enable soft delete with the specified retention period.')

with self.argument_context('sql server show') as c:
c.argument('expand_ad_admin',
options_list=['--expand-ad-admin'],
help='Expand the Active Directory Administrator for the server.')

with self.argument_context('sql server restore') as c:
c.argument('location',
arg_type=get_location_type(self.cli_ctx),
required=True,
help='Location where the deleted server was originally located.')

with self.argument_context('sql server list') as c:
c.argument('expand_ad_admin',
options_list=['--expand-ad-admin'],
Expand Down Expand Up @@ -2285,6 +2312,25 @@ def _configure_security_policy_storage_params(arg_ctx):
help='Managed Instance name.',
arg_group='List By Instance')

###############################################
# sql server deleted-server #
###############################################

with self.argument_context('sql server deleted-server') as c:
c.argument('server_name', options_list=['--name', '-n'], help='Name of the deleted server.')
c.argument('location', arg_type=get_location_type(self.cli_ctx),
help='Location where the deleted server was originally located.')

with self.argument_context('sql server deleted-server show') as c:
c.argument('location', arg_type=get_location_type(self.cli_ctx),
required=True,
help='Location where the deleted server was originally located.')

with self.argument_context('sql server deleted-server list') as c:
c.argument('location', arg_type=get_location_type(self.cli_ctx),
required=True,
help='Location where the deleted servers were originally located.')

###############################################
# sql managed instance #
###############################################
Expand Down
4 changes: 4 additions & 0 deletions src/azure-cli/azure/cli/command_modules/sql/_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,3 +262,7 @@ def get_sql_managed_database_ledger_digest_uploads_operations(cli_ctx, _):

def get_sql_managed_database_move_operations(cli_ctx, _):
return get_sql_management_client(cli_ctx).managed_database_move_operations


def get_sql_deleted_servers_operations(cli_ctx, _):
return get_sql_management_client(cli_ctx).deleted_servers
18 changes: 18 additions & 0 deletions src/azure-cli/azure/cli/command_modules/sql/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
# --------------------------------------------------------------------------------------------

from azure.cli.core.util import CLIError
from azure.cli.core.azclierror import InvalidArgumentValueError

# Important note: if cmd validator exists, then individual param validators will not be
# executed. See C:\git\azure-cli\env\lib\site-packages\knack\invocation.py `def _validation`
Expand Down Expand Up @@ -138,3 +139,20 @@ def validate_managed_instance_storage_size(namespace):
pass
else:
raise CLIError('incorrect usage: --storage must be specified in increments of 32 GB')


###############################################
# sql server #
###############################################


def validate_soft_delete_retention_days(namespace):
'''
Validates that soft_delete_retention_days is within the allowed range of 0-7 days.
'''
if namespace.soft_delete_retention_days is not None:
value = namespace.soft_delete_retention_days
if not isinstance(value, int) or value < 0 or value > 7:
raise InvalidArgumentValueError(
'The value for --soft-delete-retention-days must be an integer between 0 and 7.',
'Specify 0 to disable soft delete, or 1-7 to set the retention period in days.')
24 changes: 24 additions & 0 deletions src/azure-cli/azure/cli/command_modules/sql/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
db_transform,
db_table_format,
db_edition_table_format,
deleted_server_list_transform,
deleted_server_transform,
elastic_pool_list_transform,
elastic_pool_transform,
elastic_pool_table_format,
Expand Down Expand Up @@ -40,6 +42,7 @@
get_sql_database_threat_detection_policies_operations,
get_sql_database_transparent_data_encryptions_operations,
get_sql_database_usages_operations,
get_sql_deleted_servers_operations,
get_sql_elastic_pools_operations,
get_sql_elastic_pool_operations_operations,
get_sql_encryption_protectors_operations,
Expand Down Expand Up @@ -572,6 +575,10 @@ def load_command_table(self, _):
g.custom_command('create', 'server_create',
table_transformer=server_table_format,
supports_no_wait=True)
g.custom_command('restore', 'server_restore',
table_transformer=server_table_format,
supports_no_wait=True,
is_preview=True)
g.command('delete', 'begin_delete',
confirmation=True)
g.custom_show_command('show', 'server_get',
Expand Down Expand Up @@ -776,6 +783,23 @@ def load_command_table(self, _):
g.custom_show_command('show', 'server_trust_group_get')
g.custom_command('list', 'server_trust_group_list')

###############################################
# sql server deleted-server #
###############################################

deleted_servers_operations = CliCommandType(
operations_tmpl='azure.mgmt.sql.operations#DeletedServersOperations.{}',
client_factory=get_sql_deleted_servers_operations)

with self.command_group('sql server deleted-server', deleted_servers_operations,
client_factory=get_sql_deleted_servers_operations) as g:
g.custom_show_command('show', 'deleted_server_show',
transform=deleted_server_transform,
is_preview=True)
g.custom_command('list', 'deleted_server_list',
transform=deleted_server_list_transform,
is_preview=True)

###############################################
# sql managed instance #
###############################################
Expand Down
Loading