Skip to content

Commit f43b509

Browse files
[SQL] Introduced changes to cli commands to support self-server restore of sql logical server (#32245)
1 parent 241e787 commit f43b509

25 files changed

+22365
-4
lines changed

src/azure-cli/azure/cli/command_modules/sql/_format.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,39 @@ def elastic_pool_transform(result):
266266
return result
267267

268268

269+
#####
270+
# sql deleted-server transformers for json
271+
#####
272+
273+
274+
def deleted_server_list_transform(results):
275+
'''
276+
Transforms the json response for a list of deleted servers.
277+
'''
278+
return [deleted_server_transform(r) for r in results]
279+
280+
281+
def deleted_server_transform(result):
282+
'''
283+
Transforms the json response for a deleted server.
284+
Parses original_id to extract subscription ID, resource group, and server name.
285+
'''
286+
if result.original_id:
287+
try:
288+
# Parse original_id format:
289+
# /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Sql/servers/{name}
290+
parts = result.original_id.split('/')
291+
if len(parts) >= 9:
292+
result.subscription_id = parts[2]
293+
result.resource_group = parts[4]
294+
result.name = parts[8]
295+
except (ValueError, IndexError):
296+
# If parsing fails, just continue without adding the fields
297+
pass
298+
299+
return result
300+
301+
269302
#####
270303
# sql elastic-pool table formatters
271304
#####

src/azure-cli/azure/cli/command_modules/sql/_help.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,6 +1605,10 @@
16051605
text: az sql server create -l westus -g mygroup -n myserver -u myadminuser -p myadminpassword --tags key1=value1 key2=value2
16061606
- name: Create a server with disabled public network access to server.
16071607
text: az sql server create -l westus -g mygroup -n myserver -u myadminuser -p myadminpassword -e false
1608+
- name: Create a server with soft delete enabled with 7 days retention.
1609+
text: az sql server create -l westus -g mygroup -n myserver -u myadminuser -p myadminpassword --soft-delete-retention-days 7
1610+
- name: Create a server with soft delete protection (using short alias).
1611+
text: az sql server create -l westus -g mygroup -n myserver -u myadminuser -p myadminpassword --sdrd 5
16081612
- name: Create a server without SQL Admin, with AD admin and AD Only enabled.
16091613
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
16101614
- name: Create a server without SQL Admin, with AD admin, AD Only enabled, User ManagedIdenties and Identity Type is SystemAssigned,UserAssigned.
@@ -1619,6 +1623,45 @@
16191623
--identity-type UserAssigned --pid /subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testumi
16201624
"""
16211625

1626+
helps['sql server restore'] = """
1627+
type: command
1628+
short-summary: Restore a deleted SQL server.
1629+
long-summary: >
1630+
Restores a soft-deleted SQL server to the resource group where it was originally located.
1631+
The server must have been deleted with soft delete enabled and within the retention period.
1632+
parameters:
1633+
- name: --name -n
1634+
short-summary: Name of the deleted server to restore.
1635+
- name: --resource-group -g
1636+
short-summary: Name of the resource group where the server was originally located.
1637+
- name: --location -l
1638+
short-summary: Location where the deleted server was originally located.
1639+
examples:
1640+
- name: Restore a deleted server to its original resource group.
1641+
text: az sql server restore -g myresourcegroup -n myserver -l westus2
1642+
"""
1643+
1644+
helps['sql server deleted-server'] = """
1645+
type: group
1646+
short-summary: Gets details of deleted SQL servers.
1647+
"""
1648+
1649+
helps['sql server deleted-server show'] = """
1650+
type: command
1651+
short-summary: Get the details of a deleted SQL server in a specific location.
1652+
examples:
1653+
- name: Get details of a deleted server by name and location.
1654+
text: az sql server deleted-server show --name myserver --location westus2
1655+
"""
1656+
1657+
helps['sql server deleted-server list'] = """
1658+
type: command
1659+
short-summary: List all deleted SQL servers in a specific location.
1660+
examples:
1661+
- name: List all deleted servers in a specific location.
1662+
text: az sql server deleted-server list --location westus2
1663+
"""
1664+
16221665
helps['sql server dns-alias'] = """
16231666
type: group
16241667
short-summary: Manage a server's DNS aliases.
@@ -1804,6 +1847,12 @@
18041847
- name: Update a server. (autogenerated)
18051848
text: az sql server update --admin-password myadminpassword --name MyAzureSQLServer --resource-group MyResourceGroup
18061849
crafted: true
1850+
- name: Enable soft delete protection with 7-day retention.
1851+
text: az sql server update --name MyAzureSQLServer --resource-group MyResourceGroup --soft-delete-retention-days 7
1852+
- name: Modify soft delete retention period (using short alias).
1853+
text: az sql server update -n MyAzureSQLServer -g MyResourceGroup --sdrd 3
1854+
- name: Disable soft delete protection.
1855+
text: az sql server update --name MyAzureSQLServer --resource-group MyResourceGroup --soft-delete-retention-days 0
18071856
- name: Update a server with User Managed Identies and Identity Type is SystemAssigned,UserAssigned.
18081857
text: az sql server update -g myResourceGroup -n myServer -i \\
18091858
--user-assigned-identity-id /subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testumi \\

src/azure-cli/azure/cli/command_modules/sql/_params.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@
7373
create_args_for_complex_type,
7474
validate_managed_instance_storage_size,
7575
validate_backup_storage_redundancy,
76-
validate_subnet
76+
validate_subnet,
77+
validate_soft_delete_retention_days
7778
)
7879

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

1918+
c.argument('soft_delete_retention_days',
1919+
options_list=['--soft-delete-retention-days', '--sdrd'],
1920+
type=int,
1921+
validator=validate_soft_delete_retention_days,
1922+
is_preview=True,
1923+
help='Specify the number of days to retain soft deleted server (0-7). '
1924+
'Set to 0 to disable soft delete. '
1925+
'Set to 1-7 days to enable soft delete with the specified retention period. '
1926+
'During the retention period, the server can be restored using '
1927+
'az sql server restore.')
1928+
19171929
with self.argument_context('sql server create') as c:
19181930
c.argument('location',
19191931
arg_type=get_location_type_with_default_from_resource_group(self.cli_ctx))
@@ -1960,11 +1972,26 @@ def _configure_security_policy_storage_params(arg_ctx):
19601972
c.argument('administrator_login_password',
19611973
help='The administrator login password.')
19621974

1975+
c.argument('soft_delete_retention_days',
1976+
options_list=['--soft-delete-retention-days', '--sdrd'],
1977+
type=int,
1978+
validator=validate_soft_delete_retention_days,
1979+
is_preview=True,
1980+
help='Specify the number of days to retain soft deleted server (0-7). '
1981+
'Set to 0 to disable soft delete. '
1982+
'Set to 1-7 days to enable soft delete with the specified retention period.')
1983+
19631984
with self.argument_context('sql server show') as c:
19641985
c.argument('expand_ad_admin',
19651986
options_list=['--expand-ad-admin'],
19661987
help='Expand the Active Directory Administrator for the server.')
19671988

1989+
with self.argument_context('sql server restore') as c:
1990+
c.argument('location',
1991+
arg_type=get_location_type(self.cli_ctx),
1992+
required=True,
1993+
help='Location where the deleted server was originally located.')
1994+
19681995
with self.argument_context('sql server list') as c:
19691996
c.argument('expand_ad_admin',
19701997
options_list=['--expand-ad-admin'],
@@ -2285,6 +2312,25 @@ def _configure_security_policy_storage_params(arg_ctx):
22852312
help='Managed Instance name.',
22862313
arg_group='List By Instance')
22872314

2315+
###############################################
2316+
# sql server deleted-server #
2317+
###############################################
2318+
2319+
with self.argument_context('sql server deleted-server') as c:
2320+
c.argument('server_name', options_list=['--name', '-n'], help='Name of the deleted server.')
2321+
c.argument('location', arg_type=get_location_type(self.cli_ctx),
2322+
help='Location where the deleted server was originally located.')
2323+
2324+
with self.argument_context('sql server deleted-server show') as c:
2325+
c.argument('location', arg_type=get_location_type(self.cli_ctx),
2326+
required=True,
2327+
help='Location where the deleted server was originally located.')
2328+
2329+
with self.argument_context('sql server deleted-server list') as c:
2330+
c.argument('location', arg_type=get_location_type(self.cli_ctx),
2331+
required=True,
2332+
help='Location where the deleted servers were originally located.')
2333+
22882334
###############################################
22892335
# sql managed instance #
22902336
###############################################

src/azure-cli/azure/cli/command_modules/sql/_util.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,7 @@ def get_sql_managed_database_ledger_digest_uploads_operations(cli_ctx, _):
262262

263263
def get_sql_managed_database_move_operations(cli_ctx, _):
264264
return get_sql_management_client(cli_ctx).managed_database_move_operations
265+
266+
267+
def get_sql_deleted_servers_operations(cli_ctx, _):
268+
return get_sql_management_client(cli_ctx).deleted_servers

src/azure-cli/azure/cli/command_modules/sql/_validators.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# --------------------------------------------------------------------------------------------
55

66
from azure.cli.core.util import CLIError
7+
from azure.cli.core.azclierror import InvalidArgumentValueError
78

89
# Important note: if cmd validator exists, then individual param validators will not be
910
# executed. See C:\git\azure-cli\env\lib\site-packages\knack\invocation.py `def _validation`
@@ -138,3 +139,20 @@ def validate_managed_instance_storage_size(namespace):
138139
pass
139140
else:
140141
raise CLIError('incorrect usage: --storage must be specified in increments of 32 GB')
142+
143+
144+
###############################################
145+
# sql server #
146+
###############################################
147+
148+
149+
def validate_soft_delete_retention_days(namespace):
150+
'''
151+
Validates that soft_delete_retention_days is within the allowed range of 0-7 days.
152+
'''
153+
if namespace.soft_delete_retention_days is not None:
154+
value = namespace.soft_delete_retention_days
155+
if not isinstance(value, int) or value < 0 or value > 7:
156+
raise InvalidArgumentValueError(
157+
'The value for --soft-delete-retention-days must be an integer between 0 and 7.',
158+
'Specify 0 to disable soft delete, or 1-7 to set the retention period in days.')

src/azure-cli/azure/cli/command_modules/sql/commands.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
db_transform,
1111
db_table_format,
1212
db_edition_table_format,
13+
deleted_server_list_transform,
14+
deleted_server_transform,
1315
elastic_pool_list_transform,
1416
elastic_pool_transform,
1517
elastic_pool_table_format,
@@ -40,6 +42,7 @@
4042
get_sql_database_threat_detection_policies_operations,
4143
get_sql_database_transparent_data_encryptions_operations,
4244
get_sql_database_usages_operations,
45+
get_sql_deleted_servers_operations,
4346
get_sql_elastic_pools_operations,
4447
get_sql_elastic_pool_operations_operations,
4548
get_sql_encryption_protectors_operations,
@@ -572,6 +575,10 @@ def load_command_table(self, _):
572575
g.custom_command('create', 'server_create',
573576
table_transformer=server_table_format,
574577
supports_no_wait=True)
578+
g.custom_command('restore', 'server_restore',
579+
table_transformer=server_table_format,
580+
supports_no_wait=True,
581+
is_preview=True)
575582
g.command('delete', 'begin_delete',
576583
confirmation=True)
577584
g.custom_show_command('show', 'server_get',
@@ -776,6 +783,23 @@ def load_command_table(self, _):
776783
g.custom_show_command('show', 'server_trust_group_get')
777784
g.custom_command('list', 'server_trust_group_list')
778785

786+
###############################################
787+
# sql server deleted-server #
788+
###############################################
789+
790+
deleted_servers_operations = CliCommandType(
791+
operations_tmpl='azure.mgmt.sql.operations#DeletedServersOperations.{}',
792+
client_factory=get_sql_deleted_servers_operations)
793+
794+
with self.command_group('sql server deleted-server', deleted_servers_operations,
795+
client_factory=get_sql_deleted_servers_operations) as g:
796+
g.custom_show_command('show', 'deleted_server_show',
797+
transform=deleted_server_transform,
798+
is_preview=True)
799+
g.custom_command('list', 'deleted_server_list',
800+
transform=deleted_server_list_transform,
801+
is_preview=True)
802+
779803
###############################################
780804
# sql managed instance #
781805
###############################################

0 commit comments

Comments
 (0)