#pragma once #include #include #include "testconnections.h" #include using namespace std; class RDS { public: /** * @brief RDS Constructor * @param cluster Name of cluster to create/destroy */ RDS(char* cluster); const char* get_instance_name(json_t* instance); /** * @brief get_cluster Executes 'rds describe-bd-clusters' and creates json object with info on cluster * Finds cluster with ID 'cluster_name_intern'. * Does not set any internal variables * @return JSON describption of cluster */ json_t* get_cluster(); /** * @brief get_cluster_descr Creates JSON cluster describtion from string representation * @param json String representation of cluster description * Does not set any internal variables * @return JSON describption of cluster */ json_t* get_cluster_descr(char* json); /** * @brief get_subnets_group_descr * @param json String representation of subnets grop description * Does not set any internal variables * @return JSON description of subnets group */ json_t* get_subnets_group_descr(char* json); /** * @brief get_cluster_nodes Extract list of nodes names from cluster JSON description * Uses 'cluster_intern' * Does not set any internal variables * @return JSON array of node names strings */ json_t* get_cluster_nodes(); /** * @brief get_cluster_nodes Extract list of nodes names from cluster JSON description * Does not set any internal variables * @param cluster JSON cluster description * @return JSON array of nodes names strings */ json_t* get_cluster_nodes(json_t* cluster); /** * @brief get_endpoints Gets list of endpoint (URLs) of cluster nodes * Sets 'cluster_intern' * @return JSON array of nodes endpoints (objects contaning Address and Port) */ json_t* get_endpoints(); /** * @brief get_subnets Extracts subnets IDs from subnets group * Uses 'subnets_group_name_intern' * Sets 'vpc_id_intern' and 'subnets_intern' * @return JSON array of node names strings */ json_t* get_subnets(); /** * @brief get_subnetgroup_name Extracts subnets grop ID from cluster description * Uses 'cluster_intern' * Sets 'subnets_group_name_intern' * If 'cluster_intern' is NULL function returns 'subnets_group_name_intern' value * @return name of subnets group */ const char* get_subnetgroup_name(); /** * @brief destroy_nodes Destroys nodes * @param node_names JSON array with nodes names * @return 0 in case of success */ int destroy_nodes(json_t* node_names); /** * @brief destroy_subnets Destoys subnets * Uses 'subnets_intern' to get subnets list * If 'subnets_intern' is not set it is needed to run: * - clustr_intern=get_cluster() * - get_subnetgroup_name() * - get_subnets() * @return 0 in case of success */ int destroy_subnets(); /** * @brief destroy_subnets_group Destroys subnets group * Uses 'subnets_group_name_intern' * If 'subnets_group_name_intern' it is needed to run: * - clustr_intern=get_cluster() * - get_subnetgroup_name() * @return 0 in case of success */ int destroy_subnets_group(); /** * @brief destroy_route_tables Destroys route tabele * Not needed to executed directly, route table is destroyed by destroy_vpc * Uses 'vpc_id_intern' * If 'vpc_id_intern' is not set it is needed to run: * - clustr_intern=get_cluster() * - get_subnetgroup_name() * - get_subnets() * @return 0 in case of success */ int destroy_route_tables(); // is needed? /** * @brief destroy_vpc Destroys VPC * Uses 'vpc_id_intern' * if 'vpc_id_intern' is not set it is needed to run: * - clustr_intern=get_cluster() * - get_subnetgroup_name() * - get_subnets() * @return 0 in case of success */ int destroy_vpc(); /** * @brief destroy_cluster Destroys RDS cluster * Uses 'cluster_name_intern' * @return 0 in case of success */ int destroy_cluster(); /** * @brief detach_and_destroy_gw Finds, detach and destroys internet gateways attached to VPC * Uses 'vpc_id_intern' * if 'vpc_id_intern' is not set it is needed to run: * - clustr_intern=get_cluster() * - get_subnetgroup_name() * - get_subnets() * @return 0 in case of success */ int detach_and_destroy_gw(); /** * @brief create_vpc Creates VPC * Sets 'vpc_id_intern' * @param vpc_id Pointer to variable to place VpcID * @return 0 in case of success */ int create_vpc(const char** vpc_id); /** * @brief create_subnet Creates subnet inside VPC * Adds element to 'subnets_intern' JSON array (creates it if it does not exist) * @param az Availability zone ID (e.g. 'eu-west-1a') * @param cidr CIDR block (e.g. '172.30.1.0/24') * @param subnet_id Pointer to variable to place SubnetID * @return 0 in case of success */ int create_subnet(const char* az, const char* cidr, const char** subnet_id); /** * @brief create_subnet_group Creates subnets group for RDS * Uses 'subnets_intern' * Sets 'subnets_group_name_intern' * @return 0 in case of success */ int create_subnet_group(); /** * @brief create_gw Creates internet gateway for vpc_id_intern * Uses 'vpc_id_intern' * Sests 'gw_intern' * @param gw_id Pointer to variable to place gateway ID * @return 0 in case of success */ int create_gw(const char** gw_id); /** * @brief configure_route_table Adds route to route tabele attched to VPC * Finds route table attached to VPC and adds route from internet to internet gateway * Uses 'vpc_id_intern' and 'gw_intern' * @param rt Pointer to variable to place route table ID which was found ond modified * @return 0 in case of success */ int configure_route_table(const char** rt); /** * @brief create_cluster Creates RDS cluster and instances * Also configures security group (opens port 3306) * Uses 'cluster_name_intern', 'N_intern' * Sets cluster_intern, sg_intern * @return 0 in case of success */ int create_cluster(); /** * @brief get_writer Find instance which have 'write' attribute * Uses cluster_name_intern * Calls 'aws rds describe-db-clusters' and does not use 'cluster_intern' * (but does not update 'cluster_intern') * @param writer_name Pointer to variable to place name of writer node * @return 0 in case of success */ int get_writer(const char** writer_name); /** * @brief create_rds_db Creates RDS DB cluster and all needed stuff (vpc, subnets, gateway, route table, *...) * If case of error tries to destry all created stuff * @param cluster_name Name of DB cluster * @param N Number of nodes * @return 0 in case if success */ int create_rds_db(int N); /** * @brief delete_rds_cluster Destroys RDS cluster, instances and VPC in which RDS cluster was located * Uses 'cluster_name_intern' * Tries to get all items IDs * @return 0 in case if success */ int delete_rds_cluster(); /** * @brief wait_for_nodes Waits until N nodes are in 'avalable' state * Uses 'cluster_name_intern' * Sets 'cluster_intern' * @param N Number of nodes expected to be active (can be less than number of nodes in cluster) * @return 0 in case if success */ int wait_for_nodes(size_t N); /** * @brief do_failover Does failover for RDS cluster * @return 0 in case if success */ int do_failover(); const char* cluster_name_intern; size_t N_intern; json_t* cluster_intern; const char* vpc_id_intern; json_t* subnets_intern; const char* subnets_group_name_intern; const char* rt_intern; const char* gw_intern; const char* sg_intern; };