modules/adminapi/common/common.h (447 lines of code) (raw):
/*
* Copyright (c) 2016, 2024, Oracle and/or its affiliates.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2.0,
* as published by the Free Software Foundation.
*
* This program is designed to work with certain software (including
* but not limited to OpenSSL) that is licensed under separate terms,
* as designated in a particular file or component or in included license
* documentation. The authors of MySQL hereby grant you an additional
* permission to link the program and your derivative works with the
* separately licensed software that they have either included with
* the program or referenced in the documentation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License, version 2.0, for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MODULES_ADMINAPI_COMMON_COMMON_H_
#define MODULES_ADMINAPI_COMMON_COMMON_H_
#include <array>
#include <functional>
#include <locale>
#include <map>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <string_view>
#include <vector>
#include "modules/adminapi/common/cluster_types.h"
#include "modules/adminapi/common/metadata_management_mysql.h"
#include "modules/mod_utils.h"
#include "mysqlshdk/libs/config/config.h"
#include "mysqlshdk/libs/db/connection_options.h"
#include "mysqlshdk/libs/mysql/replication.h"
#include "mysqlshdk/libs/utils/enumset.h"
#include "scripting/types.h"
namespace mysqlsh {
// Return how many iterations are needed for a given timeout in seconds using
// the given polling interval in milliseconds
inline int adjust_timeout(int timeout, int poll_interval) {
return (timeout * poll_interval) / 1000;
}
namespace dba {
class Instance;
struct Group_replication_options;
struct NewInstanceInfo {
std::string member_id;
std::string host;
int port;
std::string version;
};
struct MissingInstanceInfo {
std::string id;
std::string label;
std::string endpoint;
};
namespace TargetType {
enum Type {
Standalone = 1 << 0,
GroupReplication = 1 << 1,
InnoDBCluster = 1 << 2,
StandaloneWithMetadata = 1 << 3,
StandaloneInMetadata = 1 << 4,
AsyncReplicaSet = 1 << 5,
InnoDBClusterSet = 1 << 6,
InnoDBClusterSetOffline = 1 << 7,
AsyncReplication = 1 << 8,
Unknown = 1 << 9
};
} // namespace TargetType
namespace ManagedInstance {
enum State {
OnlineRW = 1 << 0,
OnlineRO = 1 << 1,
Recovering = 1 << 2,
Unreachable = 1 << 3,
Offline = 1 << 4,
Error = 1 << 5,
Missing = 1 << 6,
Any =
OnlineRO | OnlineRW | Recovering | Unreachable | Offline | Error | Missing
};
std::string describe(State state);
} // namespace ManagedInstance
namespace ReplicationQuorum {
enum class States {
All_online = 1 << 0,
Normal = 1 << 1,
Quorumless = 1 << 2,
Dead = 1 << 3,
};
using State = mysqlshdk::utils::Enum_set<States, States::Dead>;
} // namespace ReplicationQuorum
enum class MDS_actions { NONE, NOTE, WARN, RAISE_ERROR };
struct Metadata_state_action {
metadata::States state;
MDS_actions action;
};
typedef mysqlshdk::utils::Enum_set<Cluster_global_status,
Cluster_global_status::UNKNOWN>
Cluster_global_status_mask;
typedef mysqlshdk::utils::Enum_set<Cluster_status, Cluster_status::UNKNOWN>
Cluster_status_mask;
// Note that this structure may be initialized using initializer
// lists, so the order of the fields is very important
struct Function_availability {
mysqlshdk::utils::Version min_version;
int instance_config_state;
ReplicationQuorum::State cluster_status;
std::vector<Metadata_state_action> metadata_state_actions = {};
bool primary_required = true;
// Defines the global state in which the operation is allowed
// Empty indicates the operation is not allowed for instances in a cluster set
Cluster_global_status_mask cluster_set_state = {};
bool allowed_on_fenced = false;
};
struct Cluster_check_info {
// Server version from the instance from which the data was consulted
mysqlshdk::utils::Version source_version;
// The state of the cluster from the quorum point of view
// Supports multiple states i.e. Normal | All_online
ReplicationQuorum::State quorum;
// The configuration type of the instance from which the data was consulted
TargetType::Type source_type;
// The state of the instance from which the data was consulted
ManagedInstance::State source_state;
};
class cancel_sync : public std::exception {};
class MetadataStorage;
// Maximum Cluster Name length
inline constexpr const int k_cluster_name_max_length = 63;
inline constexpr const char k_cluster_name_allowed_chars[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-";
void SHCORE_PUBLIC parse_fully_qualified_cluster_name(
const std::string &name, std::string *out_domain,
std::string *out_partition, std::string *out_cluster_group);
void SHCORE_PUBLIC validate_cluster_name(const std::string &name,
Cluster_type cluster_type);
void SHCORE_PUBLIC validate_label(const std::string &lavel);
// Default names
inline constexpr const char k_default_domain_partition_name[] = "default";
inline constexpr const char k_default_domain_name[] = "mydb";
inline constexpr const char *k_replicaset_channel_name = "";
inline constexpr const char *k_clusterset_async_channel_name =
"clusterset_replication";
// TODO(alfredo) - all server configuration constants and general functions
// should be moved to repl_config.h
// common keys for group replication and clone configuration options
inline constexpr const char kExitStateAction[] = "exitStateAction";
inline constexpr const char kGrExitStateAction[] =
"group_replication_exit_state_action";
inline constexpr const char kGroupSeeds[] = "groupSeeds";
inline constexpr const char kGrGroupSeeds[] = "group_replication_group_seeds";
inline constexpr const char kIpWhitelist[] = "ipWhitelist";
inline constexpr const char kIpAllowlist[] = "ipAllowlist";
inline constexpr const char kGrIpWhitelist[] = "group_replication_ip_whitelist";
inline constexpr const char kGrIpAllowlist[] = "group_replication_ip_allowlist";
inline constexpr const char kLocalAddress[] = "localAddress";
inline constexpr const char kGrLocalAddress[] =
"group_replication_local_address";
inline constexpr const char kMemberWeight[] = "memberWeight";
inline constexpr const char kGrMemberWeight[] =
"group_replication_member_weight";
inline constexpr const char kExpelTimeout[] = "expelTimeout";
inline constexpr const char kGrExpelTimeout[] =
"group_replication_member_expel_timeout";
inline constexpr const char kFailoverConsistency[] = "failoverConsistency";
inline constexpr const char kGrFailoverConsistency[] =
"group_replication_consistency";
inline constexpr const char kConsistency[] = "consistency";
inline constexpr const char kGrConsistency[] = "group_replication_consistency";
inline constexpr const char kGroupName[] = "groupName";
inline constexpr const char kGrGroupName[] = "group_replication_group_name";
inline constexpr const char kMemberSslMode[] = "memberSslMode";
inline constexpr const char kGrMemberSslMode[] = "group_replication_ssl_mode";
inline constexpr const char kClusterName[] = "clusterName";
inline constexpr const char kAutoRejoinTries[] = "autoRejoinTries";
inline constexpr const char kGrAutoRejoinTries[] =
"group_replication_autorejoin_tries";
inline constexpr const char kManualStartOnBoot[] = "manualStartOnBoot";
inline constexpr const char kDisableClone[] = "disableClone";
inline constexpr const char kTags[] = "tags";
inline constexpr const char kGtidSetIsComplete[] = "gtidSetIsComplete";
inline constexpr const char kAdoptFromAR[] = "adoptFromAR";
inline constexpr const char kDryRun[] = "dryRun";
inline constexpr const char kInstanceLabel[] = "instanceLabel";
inline constexpr const char kSandboxDir[] = "sandboxDir";
inline constexpr const char kPortX[] = "portx";
inline constexpr const char kAllowRootFrom[] = "allowRootFrom";
inline constexpr const char kIgnoreSslError[] = "ignoreSslError";
inline constexpr const char kMysqldOptions[] = "mysqldOptions";
inline constexpr const char kMyCnfPath[] = "mycnfPath";
inline constexpr const char kVerifyMyCnf[] = "verifyMyCnf";
inline constexpr const char kOutputMycnfPath[] = "outputMycnfPath";
inline constexpr const char kInteractive[] = "interactive";
inline constexpr const char kClusterAdmin[] = "clusterAdmin";
inline constexpr const char kClusterAdminPassword[] = "clusterAdminPassword";
inline constexpr const char kClusterAdminCertIssuer[] =
"clusterAdminCertIssuer";
inline constexpr const char kClusterAdminCertSubject[] =
"clusterAdminCertSubject";
inline constexpr const char kClusterAdminPasswordExpiration[] =
"clusterAdminPasswordExpiration";
inline constexpr const char kRestart[] = "restart";
inline constexpr const char kClearReadOnly[] = "clearReadOnly";
inline constexpr const char kApplierWorkerThreads[] = "applierWorkerThreads";
inline constexpr const char kMultiPrimary[] = "multiPrimary";
inline constexpr const char kMultiMaster[] = "multiMaster";
inline constexpr const char kForce[] = "force";
inline constexpr const char kAdoptFromGR[] = "adoptFromGR";
inline constexpr const char kAddInstances[] = "addInstances";
inline constexpr const char kRemoveInstances[] = "removeInstances";
inline constexpr const char kRejoinInstances[] = "rejoinInstances";
inline constexpr const char kWaitRecovery[] = "waitRecovery";
inline constexpr const char kRecoveryProgress[] = "recoveryProgress";
inline constexpr const char kLabel[] = "label";
inline constexpr const char kExtended[] = "extended";
inline constexpr const char kQueryMembers[] = "queryMembers";
inline constexpr const char kOnlyUpgradeRequired[] = "onlyUpgradeRequired";
inline constexpr const char kUpdate[] = "update";
inline constexpr const char kUpdateTopologyMode[] = "updateTopologyMode";
inline constexpr const char kUpgradeCommProtocol[] = "upgradeCommProtocol";
inline constexpr const char kUpdateViewChangeUuid[] = "updateViewChangeUuid";
inline constexpr const char kRepairMetadata[] = "repairMetadata";
inline constexpr const char kAll[] = "all";
inline constexpr const char kTimeout[] = "timeout";
inline constexpr const char kInvalidateErrorInstances[] =
"invalidateErrorInstances";
inline constexpr const char kClusterSetReplicationSslMode[] =
"clusterSetReplicationSslMode";
inline constexpr const char kReplicationAllowedHost[] =
"replicationAllowedHost";
inline constexpr const char kCommunicationStack[] = "communicationStack";
inline constexpr const char kSwitchCommunicationStack[] =
"switchCommunicationStack";
inline constexpr const char kTransactionSizeLimit[] = "transactionSizeLimit";
inline constexpr const char kGrTransactionSizeLimit[] =
"group_replication_transaction_size_limit";
constexpr const char kRequireCertIssuer[] = "requireCertIssuer";
constexpr const char kRequireCertSubject[] = "requireCertSubject";
constexpr const char kPasswordExpiration[] = "passwordExpiration";
constexpr const char kMemberAuthType[] = "memberAuthType";
constexpr const char kCertIssuer[] = "certIssuer";
constexpr const char kCertSubject[] = "certSubject";
constexpr const char kReplicationSslMode[] = "replicationSslMode";
inline constexpr const char kPaxosSingleLeader[] = "paxosSingleLeader";
inline constexpr const int k_group_replication_members_limit = 9;
// Group Replication configuration option availability regarding MySQL Server
// version
struct Option_availability {
std::string option_variable;
mysqlshdk::utils::Version support_in_80;
mysqlshdk::utils::Version support_in_57;
};
/**
* Map of the global Cluster configuration options of the AdminAPI
* <sysvar, name>
*/
inline const std::map<std::string, std::string> k_global_cluster_options{
{kGroupName, kGrGroupName},
{kMemberSslMode, kGrMemberSslMode},
{kTransactionSizeLimit, kGrTransactionSizeLimit}};
/**
* Map of the supported global cluster configuration options in the
* AdminAPI <sysvar, name>
*/
// TODO(.) This and its dependencies must be moved out to a new user_options.h
inline const std::map<std::string, Option_availability>
k_global_cluster_supported_options{
{kExitStateAction,
{kGrExitStateAction, mysqlshdk::utils::Version("8.0.12"),
mysqlshdk::utils::Version("5.7.24")}},
{kMemberWeight,
{kGrMemberWeight, mysqlshdk::utils::Version("8.0.11"),
mysqlshdk::utils::Version("5.7.20")}},
{kExpelTimeout,
{kGrExpelTimeout, mysqlshdk::utils::Version("8.0.13"), {}}},
{kFailoverConsistency,
{kGrFailoverConsistency, mysqlshdk::utils::Version("8.0.14"), {}}},
{kConsistency,
{kGrConsistency, mysqlshdk::utils::Version("8.0.14"), {}}},
{kAutoRejoinTries,
{kGrAutoRejoinTries, mysqlshdk::utils::Version("8.0.16"), {}}},
{kTransactionSizeLimit, {kGrTransactionSizeLimit, {}, {}}},
{kIpAllowlist,
{kGrIpAllowlist, mysqlshdk::utils::Version("8.0.24"), {}}}};
struct Instance_definition {
int host_id;
int replicaset_id;
std::string uuid;
std::string label;
std::string role;
std::string state;
std::string endpoint;
std::string xendpoint;
std::string grendpoint;
bool operator==(const Instance_definition &other) const = delete;
};
enum class ConfigureInstanceAction {
UPDATE_SERVER_AND_CONFIG_DYNAMIC, // "server_update+config_update" - no
// restart
UPDATE_SERVER_AND_CONFIG_STATIC, // "config_update+restart" - restart
UPDATE_CONFIG, // "config_update" - no restart
UPDATE_SERVER_DYNAMIC, // "server_update" - no restart
UPDATE_SERVER_STATIC, // "server_update+restart" - restart
REMOVE_OPTION_RESTART, // "remove_opt+restart" - restart
RESTART, // "restart" - restart
UNDEFINED
};
// Recovery progress style:
// - 0 no wait and no progress
// - 1 wait without progress info
// - 2 wait with textual info only
// - 3 wait with progressbar
enum class Recovery_progress_style { NOWAIT, NOINFO, TEXTUAL, PROGRESSBAR };
std::string get_mysqlprovision_error_string(
const shcore::Value::Array_type_ref &errors);
// Cluster-wise SSL-modes
enum class Cluster_ssl_mode {
AUTO,
DISABLED,
REQUIRED,
VERIFY_CA,
VERIFY_IDENTITY,
NONE
};
inline constexpr const char *kClusterSSLModeAuto = "AUTO";
inline constexpr const char *kClusterSSLModeDisabled = "DISABLED";
inline constexpr const char *kClusterSSLModeRequired = "REQUIRED";
inline constexpr const char *kClusterSSLModeVerifyCA = "VERIFY_CA";
inline constexpr const char *kClusterSSLModeVerifyIdentity = "VERIFY_IDENTITY";
inline constexpr std::array<std::string_view, 5> kClusterSSLModeValues = {
kClusterSSLModeDisabled, kClusterSSLModeRequired, kClusterSSLModeVerifyCA,
kClusterSSLModeVerifyIdentity, kClusterSSLModeAuto};
std::string to_string(Cluster_ssl_mode ssl_mode);
Cluster_ssl_mode to_cluster_ssl_mode(std::string_view ssl_mode);
// Authentication type to use for the managed replication accounts
enum class Replication_auth_type {
PASSWORD,
CERT_ISSUER,
CERT_SUBJECT,
CERT_ISSUER_PASSWORD,
CERT_SUBJECT_PASSWORD
};
inline constexpr const char *kReplicationMemberAuthPassword = "PASSWORD";
inline constexpr const char *kReplicationMemberAuthCertIssuer = "CERT_ISSUER";
inline constexpr const char *kReplicationMemberAuthCertSubject = "CERT_SUBJECT";
inline constexpr const char *kReplicationMemberAuthCertIssuerPassword =
"CERT_ISSUER_PASSWORD";
inline constexpr const char *kReplicationMemberAuthCertSubjectPassword =
"CERT_SUBJECT_PASSWORD";
std::string to_string(Replication_auth_type auth);
Replication_auth_type to_replication_auth_type(std::string_view auth);
constexpr const char *kCommunicationStackMySQL = "MYSQL";
constexpr const char *kCommunicationStackXCom = "XCOM";
const std::set<std::string> kCommunicationStackValidValues = {
kCommunicationStackXCom, kCommunicationStackMySQL};
/**
* Map of the supported Cluster capabilities
*/
const std::map<std::string, std::set<std::string>>
k_cluster_supported_capabilities{
{kCommunicationStack, kCommunicationStackValidValues}};
/**
* Check if a setting is supported on the target instance
*
* @param version MySQL version of the target instance
* @param option the name of the option as defined in the AdminAPI.
* @param options_map the map with the Version restrictions for the options
* @return Boolean indicating if the target instance supports the option.
*
*/
bool is_option_supported(
const mysqlshdk::utils::Version &version, const std::string &option,
const std::map<std::string, Option_availability> &options_map);
/*
* Check the existence of replication filters and throws an exception if any
* are found.
*
* GR does not support filters:
* https://dev.mysql.com/doc/refman/8.0/en/replication-options-slave.html
* Global replication filters cannot be used on a MySQL server instance that
* is configured for Group Replication, because filtering transactions on some
* servers would make the group unable to reach agreement on a consistent
* state. Channel specific replication filters can be used on replication
* channels that are not directly involved with Group Replication, such as
* where a group member also acts as a replication slave to a master that is
* outside the group. They cannot be used on the group_replication_applier or
* group_replication_recovery channels.
*
* In AR, we also forbid filters in channels we manage.
*/
void validate_replication_filters(const mysqlshdk::mysql::IInstance &instance,
Cluster_type cluster_type);
void resolve_ssl_mode_option(const std::string &option,
const std::string &context,
const mysqlshdk::mysql::IInstance &instance,
Cluster_ssl_mode *ssl_mode);
void resolve_instance_ssl_mode_option(
const mysqlshdk::mysql::IInstance &instance,
const mysqlshdk::mysql::IInstance &pinstance,
Cluster_ssl_mode *member_ssl_mode);
void validate_instance_ssl_mode(Cluster_type type,
const mysqlshdk::mysql::IInstance &instance,
Cluster_ssl_mode ssl_mode);
void validate_instance_member_auth_type(
const mysqlshdk::mysql::IInstance &instance, bool is_replica_cluster,
Cluster_ssl_mode ssl_mode, std::string_view ssl_mode_option,
Replication_auth_type auth_type);
void validate_instance_member_auth_options(std::string_view context,
bool is_replica_cluster,
Replication_auth_type member_auth,
std::string_view cert_subject);
void validate_instance_member_auth_options(std::string_view context,
Replication_auth_type member_auth,
std::string_view cert_issuer,
std::string_view cert_subject);
std::vector<NewInstanceInfo> get_newly_discovered_instances(
const mysqlshdk::mysql::IInstance &group_server,
const std::shared_ptr<MetadataStorage> &metadata, Cluster_id cluster_id);
std::vector<MissingInstanceInfo> get_unavailable_instances(
const mysqlshdk::mysql::IInstance &group_server,
const std::shared_ptr<MetadataStorage> &metadata, Cluster_id cluster_id);
bool SHCORE_PUBLIC validate_cluster_group_name(
const mysqlshdk::mysql::IInstance &instance, const std::string &group_name);
bool validate_super_read_only(const mysqlshdk::mysql::IInstance &instance,
std::optional<bool> clear_read_only);
enum class Instance_rejoinability {
REJOINABLE,
NOT_MEMBER,
ONLINE,
RECOVERING
};
Instance_rejoinability validate_instance_rejoinable(
const mysqlshdk::mysql::IInstance &instance,
const std::shared_ptr<MetadataStorage> &metadata, Cluster_id cluster_id,
bool *out_uuid_mistmatch = nullptr);
bool is_sandbox(const mysqlshdk::mysql::IInstance &instance,
std::string *cnfPath = nullptr);
// AdminAPI interactive handling specific methods
std::string prompt_cnf_path(const mysqlshdk::mysql::IInstance &instance);
int prompt_menu(const std::vector<std::string> &options, int defopt);
void dump_table(const std::vector<std::string> &column_names,
const std::vector<std::string> &column_labels,
shcore::Value::Array_type_ref documents);
ConfigureInstanceAction get_configure_instance_action(
const shcore::Value::Map_type &opt_map);
void print_validation_results(const shcore::Value::Map_type_ref &result,
bool print_note = false);
/**
* Auxiliary function to get the reported host address (used in the Metadata).
*
* This function tries to connect to the instance to get the reported host
* information. If it fails to connect to the instance the connection address
* is used (returned).
*
* @param cnx_opts Connection options of the target instance.
* @param group_cnx_opts Connection options of the group session, used to set
* the login credentials if needed.
* @return the instance reported host address used in the metadata, or the
* given instance connection address if not able to connect to the
* instance.
*/
std::string get_report_host_address(
const mysqlshdk::db::Connection_options &cnx_opts,
const mysqlshdk::db::Connection_options &group_cnx_opts);
/**
* Creates a config object with a config_server_handler
*
* @param instance object pointing to the server to create the handler for.
* @param srv_cfg_handler_name the name of the handler.
* @param silent if true, print no warnings.
* @return a unique pointer to a config object.
*/
std::unique_ptr<mysqlshdk::config::Config> create_server_config(
mysqlshdk::mysql::IInstance *instance,
const std::string &srv_cfg_handler_name, bool silent = false);
/** Adds a config file handler to the config object
*
* @param cfg pointer to a config object
* @param handler_name name to be given to the config_file handler
* @param server_uuid of the instance the file belongs to
* @param mycnf_path path to the mycnf_path
* @param output_mycnf_path path to the output_cnf_path
*/
void add_config_file_handler(mysqlshdk::config::Config *cfg,
const std::string &handler_name,
const std::string &server_uuid,
const std::string &mycnf_path,
const std::string &output_mycnf_path);
/**
* Resolves Group Replication local address.
*
* If the host part is not specified for the local_address then use the
* instance report host (used by GR and the Metadata). If the port part is not
* specified for the local_address then use the instance connection port value
* * 10 + 1.
*
* The port cannot be greater than 65535. If it is when determined
* automatically using the formula "<port> * 10 + 1" then a random port number
* will be generated. If an invalid port value is specified (by the user) in
* the local_address then an error is issued.
*
* @param local_address Nullable string with the input local address value to
* resolve.
* @param communication_stack Nullable string with the GR communication stack
* to be used
* @param report_host String with the report host value of the instance (host
* used by GR and the Metadata).
* @param port integer with port used to connect to the instance.
* @param check_if_busy if true, checks whether there's already something
* binding the port.
* @param quiet if false, print verbose info about selected local_address
*
* @throw std::runtime_error if the port specified by the user is invalid or
* if it is already being used.
*/
std::string resolve_gr_local_address(
const std::optional<std::string> &local_address,
const std::optional<std::string> &communication_stack,
const std::string &report_host, int port, bool check_if_busy,
bool quiet = false);
struct Instance_gtid_info {
std::string server;
std::string gtid_executed;
};
/**
* Return list of instances that could become a PRIMARY.
*
* Given a list of instances with GTID set data, returns all instances that
* have the most transactions, except for those that have purged transactions
* needed by others.
*
* An exception will be thrown if any instance with a conflicting transaction
* set is found.
*
* @param server - a server in which GTID set operations will be evaluated.
* The server doesn't need to be related to the candidates being checked.
* @param gtid_info - a list of candidates instances with their
* @@GTID_EXECUTED data.
* @returns list of instances that could become a PRIMARY.
*/
std::vector<Instance_gtid_info> filter_primary_candidates(
const mysqlshdk::mysql::IInstance &server,
const std::vector<Instance_gtid_info> >id_info,
const std::function<bool(const Instance_gtid_info &,
const Instance_gtid_info &)> &on_conflit);
/**
* Ensures that the replication channel is either ON or OFF without errors.
*
* @throw shcore::Exception with errors detected.
*/
void validate_replication_channel_startup_status(
const mysqlshdk::mysql::Replication_channel &channel, bool *out_io_on,
bool *out_applier_on);
/**
* Waits for the given replication channel to start, throw exception if
* an error is detected.
*
* @param instance the replica instance
* @param channel_name name of the replication channel to check
*/
void check_replication_startup(const mysqlshdk::mysql::IInstance &instance,
const std::string &channel_name);
/*
* Synchronize transactions on target instance.
*
* Wait for gtid_set to be applied on the specified target instance. Function
* will monitor for replication errors on the named channel and throw an
* exception if an error is detected.
*
* @param target_instance instance to wait for transaction to be applied.
* @param gtid_set the transaction set to wait for
* @param channel_name the name of the channel to monitor
* @param timeout number of seconds to wait
* @param cancelable boolean to indicate if the operation is cancelable with
* SIGINT or not
*
* @throw RuntimeError if the timeout is reached when waiting for
* transactions to be applied or replication errors are detected.
*/
bool wait_for_gtid_set_safe(const mysqlshdk::mysql::IInstance &target_instance,
const std::string >id_set,
const std::string &channel_name, int timeout,
bool cancelable = false);
/*
* Synchronize transactions on target instance.
*
* Wait for gtid_set to be applied on the specified target instance. Function
* will monitor for replication errors on the named channel and throw an
* exception if an error is detected.
*
* @param target_instance instance to wait for transaction to be applied.
* @param gtid_set the transaction set to wait for
* @param channel_name the name of the channel to monitor
* @param timeout number of seconds to wait
* @param cancelable boolean to indicate if the operation is cancelable with
* SIGINT or not
*
* @throw RuntimeError if the timeout is reached when waiting for
* transactions to be applied or replication errors are detected.
*/
void wait_for_apply_retrieved_trx(
const mysqlshdk::mysql::IInstance &target_instance,
const std::string &channel_name, std::chrono::seconds timeout,
bool silent = true);
void execute_script(const std::shared_ptr<Instance> &group_server,
const std::string &script, const std::string &context);
std::vector<std::string> create_router_grants(
const std::string &username,
const mysqlshdk::utils::Version &metadata_version);
/*
* Standard warning/error generation in case a deprecated option in favor of
* other option
*
* @param deprecated_name name of the deprecated option.
* @param new_name name of the new option
* @param new_set boolean indicating if an option with the new name was
* already provided
* @param fall_back_to_new_option boolean value, defines the type of warning
* to be printed when old option is used:
* - true: indicates the new option will be set instead.
* - false: suggest the new option should be used instead.
* @param additional_info information to be included as part of the
* deprecation warning.
*/
void handle_deprecated_option(const std::string &deprecated_name,
const std::string &new_name, bool new_set = false,
bool fall_back_to_new_option = false,
const std::string &additional_info = "");
/**
* Returns the Type of instance represented by the indicated address.
*
* If the address is not provided, the check will be done using m_md_server
*
* @param metadata The MetadataStorage object
* @param target_instance The target instance
* @return An TargetType::Type representing the instance type
*/
TargetType::Type get_instance_type(
const MetadataStorage &metadata,
const mysqlshdk::mysql::IInstance &target_instance);
/**
* TODO
*
* @param metadata The MetadataStorage object
* @param group_server A pointer to the Instance that shall be used to
* obtain the Cluster status info. If null, the Metadata session will be used
* @param skip_version_check Boolean value to indicate whether the version
* check should be skipped or not
*
* @return A struct of type Cluster_check_info with the
* Cluster state information
*/
Cluster_check_info get_cluster_check_info(const MetadataStorage &metadata,
Instance *group_server = nullptr,
bool skip_version_check = true);
mysqlshdk::db::Ssl_options prepare_replica_ssl_options(
const mysqlshdk::mysql::IInstance &instance, Cluster_ssl_mode ssl_mode,
Replication_auth_type auth_type);
namespace cluster_topology_executor_ops {
/**
* Validate the options used in addInstance() and rejoinInstance()
*
* The function validates if the options used in
* addInstance()/rejoinInstance() are accepted according to the communication
* stack in use by the Cluster
*/
void validate_add_rejoin_options(Group_replication_options options,
const std::string &communication_stack);
bool is_member_auto_rejoining(
const std::shared_ptr<mysqlsh::dba::Instance> &target_instance);
void ensure_not_auto_rejoining(
const std::shared_ptr<mysqlsh::dba::Instance> &target_instance);
/**
* Check if the target instance supported the communication protocol in used
* by the Cluster
*/
void check_comm_stack_support(
const std::shared_ptr<mysqlsh::dba::Instance> &target_instance,
Group_replication_options *gr_options,
const std::string &communication_stack);
void ensure_instance_check_installed_schema_version(
const std::shared_ptr<mysqlsh::dba::Instance> &target_instance,
mysqlshdk::utils::Version lowest_cluster_version);
void log_used_gr_options(const Group_replication_options &gr_options);
/**
* Validate the use of IPv6 addresses on the localAddress of the
* target instance and check if the target instance supports usage of
* IPv6 on the localAddress values being used on the cluster instances.
*/
void validate_local_address_ip_compatibility(
const std::shared_ptr<mysqlsh::dba::Instance> &target_instance,
const std::string &local_address, const std::string &group_seeds,
mysqlshdk::utils::Version lowest_cluster_version);
} // namespace cluster_topology_executor_ops
} // namespace dba
} // namespace mysqlsh
#endif // MODULES_ADMINAPI_COMMON_COMMON_H_