modules/adminapi/mod_dba_cluster.h (161 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_MOD_DBA_CLUSTER_H_
#define MODULES_ADMINAPI_MOD_DBA_CLUSTER_H_
#include <memory>
#include <string>
#include "scripting/types.h"
#include "scripting/types_cpp.h"
#include "shellcore/shell_options.h"
#include "modules/adminapi/cluster/api_options.h"
#include "modules/adminapi/cluster/cluster_impl.h"
#include "modules/adminapi/cluster_set/api_options.h"
#include "modules/adminapi/common/common.h"
#include "modules/adminapi/common/group_replication_options.h"
#include "modules/adminapi/mod_dba_cluster_set.h"
#include "mysqlshdk/libs/db/connection_options.h"
namespace mysqlsh {
namespace dba {
/**
* \ingroup AdminAPI
* $(CLUSTER_BRIEF)
*
* $(CLUSTER_DETAIL)
*/
class Cluster : public std::enable_shared_from_this<Cluster>,
public shcore::Cpp_object_bridge {
public:
#if DOXYGEN_JS
String name; //!< $(CLUSTER_GETNAME_BRIEF)
Undefined addInstance(InstanceDef instance, Dictionary options);
Dictionary checkInstanceState(InstanceDef instance);
ClusterSet createClusterSet(String domainName, Dictionary options);
ClusterSet getClusterSet();
Dictionary describe();
Undefined disconnect();
Undefined dissolve(Dictionary options);
Undefined forceQuorumUsingPartitionOf(InstanceDef instance, String password);
String getName();
Dictionary listRouters(Dictionary options);
Dictionary rejoinInstance(InstanceDef instance, Dictionary options);
Undefined removeInstance(InstanceDef instance, Dictionary options);
Undefined rescan(Dictionary options);
Undefined resetRecoveryAccountsPassword(Dictionary options);
Dictionary status(Dictionary options);
Undefined switchToSinglePrimaryMode(InstanceDef instance);
Undefined switchToMultiPrimaryMode();
Undefined setPrimaryInstance(InstanceDef instance, Dictionary options);
Dictionary options(Dictionary options);
Undefined setOption(String option, String value);
Undefined setInstanceOption(InstanceDef instance, String option,
String value);
Boolean removeRouterMetadata(RouterDef routerDef);
Undefined setupAdminAccount(String user, Dictionary options);
Undefined setupRouterAccount(String user, Dictionary options);
Undefined fenceAllTraffic();
Undefined fenceWrites();
Undefined unfenceWrites();
#elif DOXYGEN_PY
str name; //!< $(CLUSTER_GETNAME_BRIEF)
None add_instance(InstanceDef instance, dict options);
dict check_instance_state(InstanceDef instance);
ClusterSet create_cluster_set(str domainName, dict options);
ClusterSet get_cluster_set();
dict describe();
None disconnect();
None dissolve(dict options);
None force_quorum_using_partition_of(InstanceDef instance, str password);
str get_name();
dict list_routers(dict options);
dict rejoin_instance(InstanceDef instance, dict options);
None remove_instance(InstanceDef instance, dict options);
None rescan(dict options);
None reset_recovery_accounts_password(dict options);
dict status(dict options);
None switch_to_single_primary_mode(InstanceDef instance);
None switch_to_multi_primary_mode();
None set_primary_instance(InstanceDef instance, dict options);
dict options(dict options);
None set_option(str option, str value);
None set_instance_option(InstanceDef instance, str option, str value);
bool remove_router_metadata(RouterDef routerDef);
None setup_admin_account(str user, dict options);
None setup_router_account(str user, dict options);
None fence_all_traffic();
None fence_writes();
None unfence_writes();
#endif
explicit Cluster(const std::shared_ptr<Cluster_impl> &impl);
virtual ~Cluster();
std::string class_name() const override { return "Cluster"; }
std::string &append_descr(std::string &s_out, int indent = -1,
int quote_strings = 0) const override;
void append_json(shcore::JSON_dumper &dumper) const override;
bool operator==(const Object_bridge &other) const override;
shcore::Value get_member(const std::string &prop) const override;
std::shared_ptr<Cluster_impl> impl() const { return m_impl; }
void assert_valid(const std::string &option_name) const;
void invalidate() { m_invalidated = true; }
void add_instance(const Connection_options &instance_def,
const shcore::Option_pack_ref<cluster::Add_instance_options>
&options = {});
void rejoin_instance(
const Connection_options &instance_def,
const shcore::Option_pack_ref<cluster::Rejoin_instance_options> &options =
{});
void remove_instance(
const Connection_options &instance_def,
const shcore::Option_pack_ref<cluster::Remove_instance_options> &options =
{});
shcore::Value get_replicaset(const shcore::Argument_list &args);
shcore::Value describe(void);
shcore::Value status(
const shcore::Option_pack_ref<cluster::Status_options> &options);
shcore::Dictionary_t list_routers(
const shcore::Option_pack_ref<List_routers_options> &options);
void dissolve(
const shcore::Option_pack_ref<Force_interactive_options> &options);
shcore::Value check_instance_state(const Connection_options &instance_def);
void rescan(const shcore::Option_pack_ref<cluster::Rescan_options> &options);
void reset_recovery_accounts_password(
const shcore::Option_pack_ref<Force_interactive_options> &options);
void force_quorum_using_partition_of(const Connection_options &instance_def,
const char *password = nullptr);
void disconnect();
void remove_router_metadata(const std::string &router_def);
void setup_admin_account(
const std::string &user,
const shcore::Option_pack_ref<Setup_account_options> &options);
void setup_router_account(
const std::string &user,
const shcore::Option_pack_ref<Setup_account_options> &options);
void switch_to_single_primary_mode(
const Connection_options &instance_def = Connection_options());
void switch_to_multi_primary_mode(void);
void set_primary_instance(
const Connection_options &instance_def,
const shcore::Option_pack_ref<cluster::Set_primary_instance_options>
&options = {});
shcore::Value options(
const shcore::Option_pack_ref<cluster::Options_options> &options);
void set_option(const std::string &option, const shcore::Value &value);
void set_instance_option(const Connection_options &instance_def,
const std::string &option,
const shcore::Value &value);
void fence_all_traffic();
void fence_writes();
void unfence_writes();
// ClusterSet
shcore::Value create_cluster_set(
const std::string &domain_name,
const shcore::Option_pack_ref<clusterset::Create_cluster_set_options>
&options);
std::shared_ptr<ClusterSet> get_cluster_set();
protected:
// Used shell options
void init();
private:
std::shared_ptr<Cluster_impl> m_impl;
bool m_invalidated = false;
template <typename TCallback>
auto execute_with_pool(TCallback &&f, bool interactive) {
// Invalidate the cached metadata state
impl()->get_metadata_storage()->invalidate_cached();
// Init the connection pool
Scoped_instance_pool ipool(
interactive,
Instance_pool::Auth_options(impl()->default_admin_credentials()));
return f();
}
};
} // namespace dba
} // namespace mysqlsh
#endif // MODULES_ADMINAPI_MOD_DBA_CLUSTER_H_