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
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from azure.cli.core import ModExtensionSuppress
from azure.cli.core.commands import CliCommandType
from azure.cli.core.profiles import ResourceType
from azure.cli.command_modules.postgresql._util import PostgreSQLArgumentContext
from azure.cli.command_modules.postgresql.utils._util import PostgreSQLArgumentContext
from azure.cli.command_modules.postgresql.flexible_server_commands import load_flexibleserver_command_table
from azure.cli.command_modules.postgresql._params import load_arguments
import azure.cli.command_modules.postgresql._help # pylint: disable=unused-import
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------


# pylint: disable=too-many-instance-attributes, too-few-public-methods
class DbContext:
"""Database context class for PostgreSQL flexible server operations.

This class serves as a context container for various database-related configurations,
factory functions, and clients used throughout PostgreSQL command operations.
"""

def __init__(self, cmd=None, azure_sdk=None, logging_name=None, cf_firewall=None, cf_db=None,
cf_availability=None, cf_private_dns_zone_suffix=None,
command_group=None, server_client=None, location=None):
"""
Initialize DbContext with configuration and factory parameters.

Args:
cmd: Azure CLI command context
azure_sdk: Azure SDK module (e.g., postgresqlflexibleservers)
logging_name: Name to use for logging (e.g., 'PostgreSQL')
cf_firewall: Client factory for firewall rules
cf_db: Client factory for databases
cf_availability: Client factory for resource availability checks
cf_private_dns_zone_suffix: Client factory for private DNS zone suffixes
command_group: The command group name (e.g., 'postgres')
server_client: The server management client
location: Azure region location
"""
self.cmd = cmd
self.azure_sdk = azure_sdk
self.cf_firewall = cf_firewall
self.cf_availability = cf_availability
self.cf_private_dns_zone_suffix = cf_private_dns_zone_suffix
self.logging_name = logging_name
self.cf_db = cf_db
self.command_group = command_group
self.server_client = server_client
self.location = location
10 changes: 4 additions & 6 deletions src/azure-cli/azure/cli/command_modules/postgresql/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,20 @@
# pylint: disable=too-many-statements

from knack.arguments import CLIArgumentType

from argcomplete.completers import FilesCompleter
from azure.cli.core.commands.parameters import (
tags_type, get_location_type,
get_enum_type, file_type,
resource_group_name_type,
get_three_state_flag)
from azure.cli.command_modules.postgresql.validators import public_access_validator, maintenance_window_validator, ip_address_validator, \
from azure.cli.command_modules.postgresql.utils._flexible_server_util import get_current_time
from azure.cli.command_modules.postgresql.utils._util import get_autonomous_tuning_settings_map
from azure.cli.command_modules.postgresql.utils.validators import public_access_validator, maintenance_window_validator, ip_address_validator, \
retention_validator, validate_identity, validate_byok_identity, validate_identities, \
virtual_endpoint_name_validator, node_count_validator, postgres_firewall_rule_name_validator, \
db_renaming_cluster_validator
from azure.cli.core.local_context import LocalContextAttribute, LocalContextAction

from .randomname.generate import generate_username
from ._flexible_server_util import get_current_time
from argcomplete.completers import FilesCompleter
from ._util import get_autonomous_tuning_settings_map


def load_arguments(self, _): # pylint: disable=too-many-statements, too-many-locals
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

# pylint: disable=unused-argument, line-too-long
from azure.cli.core.commands.client_factory import get_subscription_id
from azure.cli.core.util import CLIError
from knack.log import get_logger
from .._client_factory import (
cf_postgres_flexible_tuning_options,
get_postgresql_flexible_management_client)
from ..utils._flexible_server_location_capabilities_util import (
get_postgres_location_capability_info,
get_postgres_server_capability_info)
from ..utils._util import get_autonomous_tuning_settings_map
from ..utils.validators import validate_resource_group
from .parameter_commands import _update_parameters, flexible_parameter_update

logger = get_logger(__name__)


def index_tuning_update(cmd, client, resource_group_name, server_name, index_tuning_enabled):
validate_resource_group(resource_group_name)
source = "user-override"

if index_tuning_enabled == "True":
list_capability_info = get_postgres_server_capability_info(cmd, resource_group_name, server_name, is_offer_restriction_check_required=True)
autonomous_tuning_supported = list_capability_info['autonomous_tuning_supported']
if not autonomous_tuning_supported:
raise CLIError("Index tuning is not supported for the server.")

logger.warning("Enabling index tuning for the server.")
configuration_name = "index_tuning.mode"
value = "report"
_update_parameters(cmd, client, server_name, configuration_name, resource_group_name, source, value)
configuration_name = "pg_qs.query_capture_mode"
query_capture_mode_configuration = client.get(resource_group_name, server_name, configuration_name)

if query_capture_mode_configuration.value.lower() == "none":
value = "all"
_update_parameters(cmd, client, server_name, configuration_name, resource_group_name, source, value)
logger.warning("Index tuning is enabled for the server.")
else:
logger.warning("Disabling index tuning for the server.")
configuration_name = "index_tuning.mode"
value = "off"
_update_parameters(cmd, client, server_name, configuration_name, resource_group_name, source, value)
logger.warning("Index tuning is disabled for the server.")


def index_tuning_show(client, resource_group_name, server_name):
validate_resource_group(resource_group_name)
index_tuning_configuration = client.get(resource_group_name, server_name, "index_tuning.mode")
query_capture_mode_configuration = client.get(resource_group_name, server_name, "pg_qs.query_capture_mode")

if index_tuning_configuration.value.lower() == "report" and query_capture_mode_configuration.value.lower() != "none":
logger.warning("Index tuning is enabled for the server.")
else:
logger.warning("Index tuning is disabled for the server.")


def index_tuning_settings_list(cmd, client, resource_group_name, server_name):
validate_resource_group(resource_group_name)
index_tuning_configurations_map_values = get_autonomous_tuning_settings_map().values()
configurations_list = client.list_by_server(resource_group_name, server_name)

# Filter the list based on the values in the dictionary
index_tuning_settings = [setting for setting in configurations_list if setting.name in index_tuning_configurations_map_values]

return index_tuning_settings


def index_tuning_settings_get(cmd, client, resource_group_name, server_name, setting_name):
validate_resource_group(resource_group_name)
index_tuning_configurations_map = get_autonomous_tuning_settings_map()
index_tuning_configuration_name = index_tuning_configurations_map[setting_name]

return client.get(
resource_group_name=resource_group_name,
server_name=server_name,
configuration_name=index_tuning_configuration_name)


def index_tuning_settings_set(client, resource_group_name, server_name, setting_name, value=None):
source = "user-override" if value else None
tuning_settings = get_autonomous_tuning_settings_map()
configuration_name = tuning_settings[setting_name]
return flexible_parameter_update(client, server_name, configuration_name, resource_group_name, source, value)


def index_tuning_recommendations_list(cmd, resource_group_name, server_name, recommendation_type=None):
validate_resource_group(resource_group_name)
tuning_options_client = cf_postgres_flexible_tuning_options(cmd.cli_ctx, None)

return tuning_options_client.list_recommendations(
resource_group_name=resource_group_name,
server_name=server_name,
tuning_option="index",
recommendation_type=recommendation_type
)


def autonomous_tuning_update(cmd, client, resource_group_name, server_name, autonomous_tuning_enabled):
validate_resource_group(resource_group_name)
source = "user-override"

if autonomous_tuning_enabled == "True":
subscription = get_subscription_id(cmd.cli_ctx)
postgres_source_client = get_postgresql_flexible_management_client(cmd.cli_ctx, subscription)
source_server_object = postgres_source_client.servers.get(resource_group_name, server_name)
location = ''.join(source_server_object.location.lower().split())
list_location_capability_info = get_postgres_location_capability_info(cmd, location, is_offer_restriction_check_required=True)
autonomous_tuning_supported = list_location_capability_info['autonomous_tuning_supported']
if not autonomous_tuning_supported:
raise CLIError("Autonomous tuning is not supported for the server.")

logger.warning("Enabling autonomous tuning for the server.")
configuration_name = "index_tuning.mode"
value = "report"
_update_parameters(cmd, client, server_name, configuration_name, resource_group_name, source, value)
configuration_name = "pg_qs.query_capture_mode"
query_capture_mode_configuration = client.get(resource_group_name, server_name, configuration_name)

if query_capture_mode_configuration.value.lower() == "none":
value = "all"
_update_parameters(cmd, client, server_name, configuration_name, resource_group_name, source, value)
logger.warning("Autonomous tuning is enabled for the server.")
else:
logger.warning("Disabling autonomous tuning for the server.")
configuration_name = "index_tuning.mode"
value = "off"
_update_parameters(cmd, client, server_name, configuration_name, resource_group_name, source, value)
logger.warning("Autonomous tuning is disabled for the server.")


def autonomous_tuning_show(client, resource_group_name, server_name):
validate_resource_group(resource_group_name)
autonomous_tuning_configuration = client.get(resource_group_name, server_name, "index_tuning.mode")
query_capture_mode_configuration = client.get(resource_group_name, server_name, "pg_qs.query_capture_mode")

if autonomous_tuning_configuration.value.lower() == "report" and query_capture_mode_configuration.value.lower() != "none":
logger.warning("Autonomous tuning is enabled for the server.")
else:
logger.warning("Autonomous tuning is disabled for the server.")


def autonomous_tuning_settings_list(cmd, client, resource_group_name, server_name):
validate_resource_group(resource_group_name)
autonomous_tuning_configurations_map_values = get_autonomous_tuning_settings_map().values()
configurations_list = client.list_by_server(resource_group_name, server_name)

# Filter the list based on the values in the dictionary
autonomous_tuning_settings = [setting for setting in configurations_list if setting.name in autonomous_tuning_configurations_map_values]

return autonomous_tuning_settings


def autonomous_tuning_settings_get(cmd, client, resource_group_name, server_name, setting_name):
validate_resource_group(resource_group_name)
autonomous_tuning_configurations_map = get_autonomous_tuning_settings_map()
autonomous_tuning_configuration_name = autonomous_tuning_configurations_map[setting_name]

return client.get(
resource_group_name=resource_group_name,
server_name=server_name,
configuration_name=autonomous_tuning_configuration_name)


def autonomous_tuning_settings_set(client, resource_group_name, server_name, setting_name, value=None):
source = "user-override" if value else None
tuning_settings = get_autonomous_tuning_settings_map()
configuration_name = tuning_settings[setting_name]
return flexible_parameter_update(client, server_name, configuration_name, resource_group_name, source, value)


def autonomous_tuning_index_recommendations_list(cmd, resource_group_name, server_name, recommendation_type=None):
validate_resource_group(resource_group_name)
tuning_options_client = cf_postgres_flexible_tuning_options(cmd.cli_ctx, None)

return tuning_options_client.list_recommendations(
resource_group_name=resource_group_name,
server_name=server_name,
tuning_option="index",
recommendation_type=recommendation_type
)


def autonomous_tuning_table_recommendations_list(cmd, resource_group_name, server_name, recommendation_type=None):
validate_resource_group(resource_group_name)
tuning_options_client = cf_postgres_flexible_tuning_options(cmd.cli_ctx, None)

return tuning_options_client.list_recommendations(
resource_group_name=resource_group_name,
server_name=server_name,
tuning_option="table",
recommendation_type=recommendation_type
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

# pylint: disable=unused-argument, line-too-long
from azure.cli.core.util import user_confirmation
from knack.log import get_logger
from ..utils.validators import validate_resource_group, validate_backup_name

logger = get_logger(__name__)


def backup_create_func(client, resource_group_name, server_name, backup_name):
validate_resource_group(resource_group_name)
validate_backup_name(backup_name)

return client.begin_create(
resource_group_name,
server_name,
backup_name)


def ltr_precheck_func(client, resource_group_name, server_name, backup_name):
validate_resource_group(resource_group_name)

return client.check_prerequisites(
resource_group_name=resource_group_name,
server_name=server_name,
parameters={"backupSettings": {"backupName": backup_name}}
)


def ltr_start_func(client, resource_group_name, server_name, backup_name, sas_url):
validate_resource_group(resource_group_name)

parameters = {
"backupSettings": {
"backupName": backup_name
},
"targetDetails": {
"sasUriList": [sas_url]
}
}

return client.begin_start(
resource_group_name=resource_group_name,
server_name=server_name,
parameters=parameters
)


def backup_delete_func(client, resource_group_name, server_name, backup_name, yes=False):
validate_resource_group(resource_group_name)

if not yes:
user_confirmation(
"Are you sure you want to delete the backup '{0}' in server '{1}'".format(backup_name, server_name), yes=yes)

return client.begin_delete(
resource_group_name,
server_name,
backup_name)
Loading
Loading