Skip to content
Merged
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
5 changes: 5 additions & 0 deletions src/azure-cli/azure/cli/command_modules/sql/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -1133,6 +1133,11 @@ def load_arguments(self, _):
help='Type of secondary to create.'
' Allowed values include: Geo, Named.')

c.argument('partner_sub_id',
options_list=['--partner-sub-id'],
help='Subscription id to create the new replica in.'
' If unspecified, defaults to the origin subscription id.')

with self.argument_context('sql db replica set-primary') as c:
c.argument('database_name',
help='Name of the database to fail over.')
Expand Down
14 changes: 9 additions & 5 deletions src/azure-cli/azure/cli/command_modules/sql/_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# --------------------------------------------------------------------------------------------


def get_sql_management_client(cli_ctx):
def get_sql_management_client(cli_ctx, subscription_id=None):
from azure.cli.core.commands.client_factory import get_mgmt_service_client
from azure.mgmt.sql import SqlManagementClient
from msrest.authentication import Authentication
Expand All @@ -20,6 +20,10 @@ def get_sql_management_client(cli_ctx):
base_url=sql_rm_override,
credentials=Authentication()) # No authentication

# Cross-subscription scenario.
if subscription_id is not None:
return get_mgmt_service_client(cli_ctx, SqlManagementClient, subscription_id=subscription_id)

# Normal production scenario.
return get_mgmt_service_client(cli_ctx, SqlManagementClient)

Expand All @@ -28,8 +32,8 @@ def get_sql_capabilities_operations(cli_ctx, _):
return get_sql_management_client(cli_ctx).capabilities


def get_sql_databases_operations(cli_ctx, _):
return get_sql_management_client(cli_ctx).databases
def get_sql_databases_operations(cli_ctx, _, subscription_id=None):
return get_sql_management_client(cli_ctx, subscription_id).databases


def get_sql_database_operations_operations(cli_ctx, _):
Expand Down Expand Up @@ -148,8 +152,8 @@ def get_sql_managed_instance_keys_operations(cli_ctx, _):
return get_sql_management_client(cli_ctx).managed_instance_keys


def get_sql_servers_operations(cli_ctx, _):
return get_sql_management_client(cli_ctx).servers
def get_sql_servers_operations(cli_ctx, _, subscription_id=None):
return get_sql_management_client(cli_ctx, subscription_id).servers


def get_sql_server_usages_operations(cli_ctx, _):
Expand Down
51 changes: 37 additions & 14 deletions src/azure-cli/azure/cli/command_modules/sql/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
get_sql_managed_database_restore_details_operations,
get_sql_replication_links_operations,
get_sql_elastic_pools_operations,
get_sql_databases_operations,
)


Expand All @@ -104,12 +105,12 @@
###############################################


def _get_server_location(cli_ctx, server_name, resource_group_name):
def _get_server_location(cli_ctx, server_name, resource_group_name, subscription_id=None):
'''
Returns the location (i.e. Azure region) that the specified server is in.
'''

server_client = get_sql_servers_operations(cli_ctx, None)
server_client = get_sql_servers_operations(cli_ctx, None, subscription_id)
# pylint: disable=no-member
return server_client.get(
server_name=server_name,
Expand Down Expand Up @@ -955,19 +956,22 @@ class DatabaseIdentity: # pylint: disable=too-few-public-methods
database resource id.
'''

def __init__(self, cli_ctx, database_name, server_name, resource_group_name):

def __init__(self, cli_ctx, database_name, server_name, resource_group_name, subscription_id=None):
from azure.cli.core.commands.client_factory import get_subscription_id
self.database_name = database_name
self.server_name = server_name
self.resource_group_name = resource_group_name
self.cli_ctx = cli_ctx
if subscription_id is not None:
self.subscription_id = subscription_id
else:
self.subscription_id = get_subscription_id(self.cli_ctx)

def id(self):
from urllib.parse import quote
from azure.cli.core.commands.client_factory import get_subscription_id

return '/subscriptions/{}/resourceGroups/{}/providers/Microsoft.Sql/servers/{}/databases/{}'.format(
quote(get_subscription_id(self.cli_ctx)),
quote(self.subscription_id),
quote(self.resource_group_name),
quote(self.server_name),
quote(self.database_name))
Expand Down Expand Up @@ -1024,7 +1028,8 @@ def _validate_elastic_pool_id(
cli_ctx,
elastic_pool_id,
server_name,
resource_group_name):
resource_group_name,
subscription_id=None):
'''
Validates elastic_pool_id is either None or a valid resource id.

Expand All @@ -1039,9 +1044,12 @@ def _validate_elastic_pool_id(
from azure.mgmt.core.tools import resource_id, is_valid_resource_id
from azure.cli.core.commands.client_factory import get_subscription_id

if subscription_id is None:
subscription_id = get_subscription_id(cli_ctx)

if elastic_pool_id and not is_valid_resource_id(elastic_pool_id):
return resource_id(
subscription=get_subscription_id(cli_ctx),
subscription=subscription_id,
resource_group=resource_group_name,
namespace='Microsoft.Sql',
type='servers',
Expand Down Expand Up @@ -1146,7 +1154,8 @@ def _db_dw_create(
kwargs['location'] = _get_server_location(
cli_ctx,
server_name=dest_db.server_name,
resource_group_name=dest_db.resource_group_name)
resource_group_name=dest_db.resource_group_name,
subscription_id=dest_db.subscription_id)

# Set create mode properties
if source_db:
Expand All @@ -1168,7 +1177,8 @@ def _db_dw_create(
cli_ctx,
kwargs['elastic_pool_id'],
dest_db.server_name,
dest_db.resource_group_name)
dest_db.resource_group_name,
dest_db.subscription_id)

# Expand maintenance configuration id if needed
kwargs['maintenance_configuration_id'] = _complete_maintenance_configuration_id(
Expand Down Expand Up @@ -1401,6 +1411,7 @@ def db_create_replica(
partner_server_name,
partner_database_name=None,
partner_resource_group_name=None,
partner_sub_id=None,
secondary_type=None,
no_wait=False,
assign_identity=False,
Expand All @@ -1418,6 +1429,10 @@ def db_create_replica(
# Determine optional values
partner_resource_group_name = partner_resource_group_name or resource_group_name
partner_database_name = partner_database_name or database_name
if partner_sub_id is not None:
partner_client = get_sql_databases_operations(cmd.cli_ctx, None, partner_sub_id)
else:
partner_client = client

# Set create mode
kwargs['create_mode'] = CreateMode.SECONDARY
Expand All @@ -1435,18 +1450,26 @@ def db_create_replica(
# Check backup storage redundancy configurations
location = _get_server_location(cmd.cli_ctx,
server_name=partner_server_name,
resource_group_name=partner_resource_group_name)
resource_group_name=partner_resource_group_name,
subscription_id=partner_sub_id)
if _should_show_backup_storage_redundancy_warnings(location):
if not kwargs['requested_backup_storage_redundancy']:
_backup_storage_redundancy_take_source_warning()
if kwargs['requested_backup_storage_redundancy'] == 'Geo':
_backup_storage_redundancy_specify_geo_warning()

primary_database = DatabaseIdentity(cmd.cli_ctx, database_name, server_name, resource_group_name)
secondary_database = DatabaseIdentity(cmd.cli_ctx,
partner_database_name,
partner_server_name,
partner_resource_group_name,
partner_sub_id)

return _db_dw_create(
cmd.cli_ctx,
client,
DatabaseIdentity(cmd.cli_ctx, database_name, server_name, resource_group_name),
DatabaseIdentity(cmd.cli_ctx, partner_database_name, partner_server_name, partner_resource_group_name),
partner_client,
primary_database,
secondary_database,
no_wait,
secondary_type=secondary_type,
assign_identity=assign_identity,
Expand Down
Loading
Loading