|
23 | 23 | from azure.cli.core.azclierror import ClientRequestError, RequiredArgumentMissingError, ArgumentUsageError, InvalidArgumentValueError, ValidationError |
24 | 24 | from ._client_factory import get_mysql_flexible_management_client, cf_mysql_flexible_firewall_rules, cf_mysql_flexible_db, \ |
25 | 25 | cf_mysql_check_resource_availability, cf_mysql_check_resource_availability_without_location, cf_mysql_flexible_config, \ |
26 | | - cf_mysql_flexible_servers, cf_mysql_flexible_replica, cf_mysql_flexible_adadmin, cf_mysql_flexible_private_dns_zone_suffix_operations, cf_mysql_servers |
| 26 | + cf_mysql_flexible_servers, cf_mysql_flexible_replica, cf_mysql_flexible_adadmin, cf_mysql_flexible_private_dns_zone_suffix_operations, cf_mysql_servers, \ |
| 27 | + cf_mysql_firewall_rules |
27 | 28 | from ._util import resolve_poller, generate_missing_parameters, get_mysql_list_skus_info, generate_password, parse_maintenance_window, \ |
28 | 29 | replace_memory_optimized_tier, build_identity_and_data_encryption, get_identity_and_data_encryption, get_tenant_id, run_subprocess, \ |
29 | | - run_subprocess_get_output, fill_action_template, get_git_root_dir, get_single_to_flex_sku_mapping, GITHUB_ACTION_PATH |
| 30 | + run_subprocess_get_output, fill_action_template, get_git_root_dir, get_single_to_flex_sku_mapping, get_firewall_rules_from_paged_response, GITHUB_ACTION_PATH |
30 | 31 | from ._network import prepare_mysql_exist_private_dns_zone, prepare_mysql_exist_private_network, prepare_private_network, prepare_private_dns_zone, prepare_public_network |
31 | 32 | from ._validators import mysql_arguments_validator, mysql_auto_grow_validator, mysql_georedundant_backup_validator, mysql_restore_tier_validator, \ |
32 | 33 | mysql_retention_validator, mysql_sku_name_validator, mysql_storage_validator, validate_mysql_replica, validate_server_name, \ |
@@ -167,15 +168,16 @@ def database_delete_func(client, resource_group_name=None, server_name=None, dat |
167 | 168 | return result |
168 | 169 |
|
169 | 170 |
|
170 | | -def create_firewall_rule(db_context, cmd, resource_group_name, server_name, start_ip, end_ip): |
| 171 | +def create_firewall_rule(db_context, cmd, resource_group_name, server_name, start_ip, end_ip, firewall_rule_name=None): |
171 | 172 | # allow access to azure ip addresses |
172 | 173 | cf_firewall = db_context.cf_firewall # NOQA pylint: disable=unused-variable |
173 | 174 | firewall_client = cf_firewall(cmd.cli_ctx, None) |
174 | 175 | firewall = firewall_rule_create_func(cmd=cmd, |
175 | 176 | client=firewall_client, |
176 | 177 | resource_group_name=resource_group_name, |
177 | 178 | server_name=server_name, |
178 | | - start_ip_address=start_ip, end_ip_address=end_ip) |
| 179 | + start_ip_address=start_ip, end_ip_address=end_ip, |
| 180 | + firewall_rule_name=firewall_rule_name) |
179 | 181 | return firewall.result().name |
180 | 182 |
|
181 | 183 |
|
@@ -630,6 +632,13 @@ def flexible_server_import_create(cmd, client, |
630 | 632 | if start_ip != -1 and end_ip != -1: |
631 | 633 | firewall_name = create_firewall_rule(db_context, cmd, resource_group_name, server_name, start_ip, end_ip) |
632 | 634 |
|
| 635 | + # Migrating firewall rules from single server to flexible server |
| 636 | + if data_source_type.lower() == 'mysql_single' and create_mode.lower() == 'migrate': |
| 637 | + if network.public_network_access.lower() == 'disabled': |
| 638 | + logger.warning('Firewall rules cannot be migrated for private access enabled server.') |
| 639 | + else: |
| 640 | + migrate_firewall_rules_from_single_to_flex(db_context=db_context, cmd=cmd, source_server_id=source_server_id, target_server_name=server_name) |
| 641 | + |
633 | 642 | user = server_result.administrator_login |
634 | 643 | server_id = server_result.id |
635 | 644 | loc = server_result.location |
@@ -1878,6 +1887,25 @@ def flexible_server_export_create(cmd, client, resource_group_name, server_name, |
1878 | 1887 | return resolve_poller(client.begin_create(resource_group_name, server_name, parameters), cmd.cli_ctx, 'Create backup') |
1879 | 1888 |
|
1880 | 1889 |
|
| 1890 | +def migrate_firewall_rules_from_single_to_flex(db_context, cmd, source_server_id, target_server_name): |
| 1891 | + id_parts = parse_resource_id(source_server_id) |
| 1892 | + firewall_client = cf_mysql_firewall_rules(cmd.cli_ctx, _=None) |
| 1893 | + firewall_rules = get_firewall_rules_from_paged_response(firewall_client.list_by_server(id_parts['resource_group'], id_parts['name'])) |
| 1894 | + for rule in firewall_rules: |
| 1895 | + if not re.search(r'^[a-zA-Z0-9][-_a-zA-Z0-9]{0,79}(?<!-)$', rule.name): |
| 1896 | + logger.warning("Could not migrate firewall rule \'%s\' since firewall rule name can only contain 0-9, a-z, A-Z, \'-\' and \'_\'. " |
| 1897 | + "Additionally, the name of the firewall rule must be at least 1 character " |
| 1898 | + "and no more than 80 characters in length. ", rule.name) |
| 1899 | + continue |
| 1900 | + create_firewall_rule(db_context=db_context, |
| 1901 | + cmd=cmd, |
| 1902 | + resource_group_name=id_parts['resource_group'], |
| 1903 | + server_name=target_server_name, |
| 1904 | + start_ip=rule.start_ip_address, |
| 1905 | + end_ip=rule.end_ip_address, |
| 1906 | + firewall_rule_name=rule.name) |
| 1907 | + |
| 1908 | + |
1881 | 1909 | # pylint: disable=too-many-instance-attributes, too-few-public-methods, useless-object-inheritance |
1882 | 1910 | class DbContext(object): |
1883 | 1911 | def __init__(self, cmd=None, azure_sdk=None, logging_name=None, cf_firewall=None, cf_db=None, |
|
0 commit comments