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
 |