Skip to content

Commit 71b1cac

Browse files
authored
[RDBMS] az postgres flexible-server create/db create: Add validation for database name (#31392)
1 parent 8910a5f commit 71b1cac

File tree

3 files changed

+34
-6
lines changed

3 files changed

+34
-6
lines changed

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,11 +261,24 @@ def _flexible_server_params(command_group):
261261
arg_group='Authentication'
262262
)
263263

264+
database_name_create_arg_type = CLIArgumentType(
265+
metavar='NAME',
266+
options_list=['--database-name', '-d'],
267+
id_part='child_name_1',
268+
help='The name of the database to be created when provisioning the database server. '
269+
'Database name must begin with a letter (a-z) or underscore (_). Subsequent characters '
270+
'in a name can be letters, digits (0-9), or underscores. Database name length must be less '
271+
'than 32 characters.',
272+
local_context_attribute=LocalContextAttribute(
273+
name='database_name',
274+
actions=[LocalContextAction.SET],
275+
scopes=['{} flexible-server'.format(command_group)]))
276+
264277
database_name_arg_type = CLIArgumentType(
265278
metavar='NAME',
266279
options_list=['--database-name', '-d'],
267280
id_part='child_name_1',
268-
help='The name of the database to be created when provisioning the database server',
281+
help='The name of the database',
269282
local_context_attribute=LocalContextAttribute(
270283
name='database_name',
271284
actions=[LocalContextAction.GET, LocalContextAction.SET],
@@ -641,7 +654,7 @@ def _flexible_server_params(command_group):
641654
c.argument('zone', zone_arg_type)
642655
c.argument('tags', tags_type)
643656
c.argument('standby_availability_zone', arg_type=standby_availability_zone_arg_type)
644-
c.argument('database_name', arg_type=database_name_arg_type)
657+
c.argument('database_name', arg_type=database_name_create_arg_type)
645658
c.argument('yes', arg_type=yes_arg_type)
646659

647660
with self.argument_context('{} flexible-server list'.format(command_group)) as c:
@@ -824,6 +837,10 @@ def _flexible_server_params(command_group):
824837
argument_context_string = '{} flexible-server db {}'.format(command_group, scope)
825838
with self.argument_context(argument_context_string) as c:
826839
c.argument('server_name', options_list=['--server-name', '-s'], arg_type=server_name_arg_type)
840+
841+
for scope in ['delete', 'list', 'show', 'update']:
842+
argument_context_string = '{} flexible-server db {}'.format(command_group, scope)
843+
with self.argument_context(argument_context_string) as c:
827844
c.argument('database_name', arg_type=database_name_arg_type)
828845

829846
with self.argument_context('{} flexible-server db list'.format(command_group)) as c:
@@ -832,6 +849,7 @@ def _flexible_server_params(command_group):
832849
with self.argument_context('{} flexible-server db create'.format(command_group)) as c:
833850
c.argument('charset', help='The charset of the database. The default value is UTF8')
834851
c.argument('collation', help='The collation of the database.')
852+
c.argument('database_name', arg_type=database_name_create_arg_type)
835853

836854
with self.argument_context('{} flexible-server db delete'.format(command_group)) as c:
837855
c.argument('yes', arg_type=yes_arg_type)

src/azure-cli/azure/cli/command_modules/rdbms/flexible_server_custom_postgres.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from .validators import pg_arguments_validator, validate_server_name, validate_and_format_restore_point_in_time, \
4242
validate_postgres_replica, validate_georestore_network, pg_byok_validator, validate_migration_runtime_server, \
4343
validate_resource_group, check_resource_group, validate_citus_cluster, cluster_byok_validator, validate_backup_name, \
44-
validate_virtual_endpoint_name_availability
44+
validate_virtual_endpoint_name_availability, validate_database_name
4545

4646
logger = get_logger(__name__)
4747
DEFAULT_DB_NAME = 'flexibleserverdb'
@@ -87,6 +87,7 @@ def flexible_server_create(cmd, client,
8787

8888
pg_arguments_validator(db_context,
8989
server_name=server_name,
90+
database_name=database_name,
9091
location=location,
9192
tier=tier, sku_name=sku_name,
9293
storage_gb=storage_gb,
@@ -891,6 +892,7 @@ def _create_database(db_context, cmd, resource_group_name, server_name, database
891892

892893

893894
def database_create_func(cmd, client, resource_group_name, server_name, database_name=None, charset=None, collation=None):
895+
validate_database_name(database_name)
894896
validate_resource_group(resource_group_name)
895897
validate_citus_cluster(cmd, resource_group_name, server_name)
896898

src/azure-cli/azure/cli/command_modules/rdbms/validators.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -305,15 +305,16 @@ def _mysql_iops_validator(iops, auto_io_scaling, instance):
305305
logger.warning("The server has enabled the auto scale iops. So the iops will be ignored.")
306306

307307

308-
def pg_arguments_validator(db_context, location, tier, sku_name, storage_gb, server_name=None, zone=None,
309-
standby_availability_zone=None, high_availability=None, subnet=None, public_access=None,
310-
version=None, instance=None, geo_redundant_backup=None,
308+
def pg_arguments_validator(db_context, location, tier, sku_name, storage_gb, server_name=None, database_name=None,
309+
zone=None, standby_availability_zone=None, high_availability=None, subnet=None,
310+
public_access=None, version=None, instance=None, geo_redundant_backup=None,
311311
byok_identity=None, byok_key=None, backup_byok_identity=None, backup_byok_key=None,
312312
auto_grow=None, performance_tier=None,
313313
storage_type=None, iops=None, throughput=None, create_cluster=None, cluster_size=None,
314314
password_auth=None, active_directory_auth=None, microsoft_entra_auth=None,
315315
admin_name=None, admin_id=None, admin_type=None):
316316
validate_server_name(db_context, server_name, 'Microsoft.DBforPostgreSQL/flexibleServers')
317+
validate_database_name(database_name)
317318
is_create = not instance
318319
if is_create:
319320
list_location_capability_info = get_postgres_location_capability_info(
@@ -989,3 +990,10 @@ def validate_backup_name(backup_name):
989990
# check if backup_name exceeds 128 characters
990991
if len(backup_name) > 128:
991992
raise CLIError('Backup name cannot exceed 128 characters.')
993+
994+
995+
def validate_database_name(database_name):
996+
if database_name is not None and not re.match(r'^[a-zA-Z_][a-zA-Z0-9_]{0,30}$', database_name):
997+
raise ValidationError("Database name must begin with a letter (a-z) or underscore (_). "
998+
"Subsequent characters in a name can be letters, digits (0-9), or underscores. "
999+
"Database name length must be less than 32 characters.")

0 commit comments

Comments
 (0)