264 lines
8.1 KiB
C++
264 lines
8.1 KiB
C++
#ifndef RDS_VPC_H
|
|
#define RDS_VPC_H
|
|
|
|
#include <iostream>
|
|
#include <unistd.h>
|
|
#include "testconnections.h"
|
|
#include <jansson.h>
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
#endif // RDS_VPC_H
|