158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * @file auroramon.cpp test of Aurora RDS monitor
 | |
|  * - create RDS cluster
 | |
|  * - find 'writer' node and uses 'maxadmin' to check that this node is "Master, Running"
 | |
|  * - do forced failover
 | |
|  * - find 'writer' again and repeat check
 | |
|  * - destroy RDS cluster
 | |
|  */
 | |
| 
 | |
| 
 | |
| #include "testconnections.h"
 | |
| #include "execute_cmd.h"
 | |
| #include "rds_vpc.h"
 | |
| 
 | |
| int set_endspoints(RDS * cluster)
 | |
| {
 | |
| 
 | |
|     json_t *endpoint;
 | |
|     long long int port;
 | |
|     const char * IP;
 | |
|     char p[64];
 | |
|     size_t i;
 | |
|     char cmd[1024];
 | |
| 
 | |
|     json_t * endpoints = cluster->get_endpoints();
 | |
|     if (endpoints == NULL)
 | |
|     {
 | |
|         return -1;
 | |
|     }
 | |
| 
 | |
|     json_array_foreach(endpoints, i, endpoint)
 | |
|     {
 | |
|         port = json_integer_value(json_object_get(endpoint, "Port"));
 | |
|         IP = json_string_value(json_object_get(endpoint, "Address"));
 | |
|         printf("host: %s \t port: %lld\n", IP, port);
 | |
|         sprintf(cmd, "node_%03d_network", (int) i);
 | |
|         setenv(cmd, IP, 1);
 | |
|         sprintf(cmd, "node_%03d_port", (int) i);
 | |
|         sprintf(p, "%lld", port);
 | |
|         setenv(cmd, p, 1);
 | |
|     }
 | |
| 
 | |
|     setenv("node_password", "skysqlrds", 1);
 | |
|     setenv("maxscales->user_name", "skysql", 1);
 | |
|     setenv("maxscales->password", "skysqlrds", 1);
 | |
|     setenv("no_nodes_check", "yes", 1);
 | |
|     setenv("no_backend_log_copy", "yes", 1);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| void compare_masters(TestConnections* Test, RDS * cluster)
 | |
| {
 | |
|     const char * aurora_master;
 | |
|     cluster->get_writer(&aurora_master);
 | |
|     Test->tprintf("Aurora writer node: %s\n", aurora_master);
 | |
|     char maxadmin_status[1024];
 | |
|     int i;
 | |
|     char cmd[1024];
 | |
|     for (i = 0; i < Test->repl->N; i++)
 | |
|     {
 | |
|         sprintf(cmd, "show server server%d", i + 1);
 | |
|         Test->maxscales->get_maxadmin_param(0, cmd, (char *) "Status:", &maxadmin_status[0]);
 | |
|         Test->tprintf("Server%d status %s\n", i + 1, maxadmin_status);
 | |
|         sprintf(cmd, "node%03d", i);
 | |
|         if (strcmp(aurora_master, cmd) == 0)
 | |
|         {
 | |
|             if (strcmp(maxadmin_status, "Master, Running"))
 | |
|             {
 | |
|                 Test->tprintf("Maxadmin reports node%03d is a Master as expected", i);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 Test->add_result(1, "Server node%03d status is not 'Master, Running'', it is '%s'", i, maxadmin_status);
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             if (strcmp(maxadmin_status, "Slave, Running"))
 | |
|             {
 | |
|                 Test->tprintf("Maxadmin reports node%03d is a Slave as expected", i);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 Test->add_result(1, "Server node%03d status is not 'Slave, Running'', it is '%s'", i, maxadmin_status);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|     }
 | |
| }
 | |
| 
 | |
| int main(int argc, char *argv[])
 | |
| {
 | |
|     RDS * cluster = new RDS((char *) "auroratest");
 | |
| 
 | |
|     if (cluster->create_rds_db(4) != 0)
 | |
|     {
 | |
|         printf("Error RDS creation\n");
 | |
|         return 1;
 | |
|     }
 | |
|     cluster->wait_for_nodes(4);
 | |
| 
 | |
| 
 | |
|     if (set_endspoints(cluster) != 0)
 | |
|     {
 | |
|         printf("Error getting RDS endpoints\n");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     TestConnections * Test = new TestConnections(argc, argv);
 | |
|     Test->set_timeout(30);
 | |
| 
 | |
|     compare_masters(Test, cluster);
 | |
| 
 | |
|     Test->set_timeout(30);
 | |
|     Test->tprintf("Executing a query through readwritesplit before failover");
 | |
|     Test->maxscales->connect_rwsplit(0);
 | |
|     Test->try_query(Test->maxscales->conn_rwsplit[0][0], "show processlist");
 | |
|     char server_id[1024];
 | |
|     Test->tprintf("Get aurora_server_id\n");
 | |
|     find_field(Test->maxscales->conn_rwsplit[0][0], "select @@aurora_server_id;", "server_id", &server_id[0]);
 | |
|     Test->maxscales->close_rwsplit(0);
 | |
|     Test->tprintf("server_id before failover: %s\n", server_id);
 | |
| 
 | |
|     Test->stop_timeout();
 | |
|     Test->tprintf("Performing cluster failover\n");
 | |
| 
 | |
|     Test->add_result(cluster->do_failover(), "Failover failed\n");
 | |
| 
 | |
|     Test->tprintf("Failover done\n");
 | |
| 
 | |
|     // Do the failover here and wait until it is over
 | |
|     //sleep(10);
 | |
| 
 | |
|     Test->set_timeout(30);
 | |
|     Test->tprintf("Executing a query through readwritesplit after failover");
 | |
|     Test->maxscales->connect_rwsplit(0);
 | |
|     Test->try_query(Test->maxscales->conn_rwsplit[0][0], "show processlist");
 | |
|     Test->tprintf("Get aurora_server_id\n");
 | |
|     find_field(Test->maxscales->conn_rwsplit[0][0], "select @@aurora_server_id;", "server_id", &server_id[0]);
 | |
|     Test->maxscales->close_rwsplit(0);
 | |
|     Test->tprintf("server_id after failover: %s\n", server_id);
 | |
| 
 | |
|     compare_masters(Test, cluster);
 | |
| 
 | |
| 
 | |
|     //Test->check_maxscale_alive(0);
 | |
| 
 | |
| 
 | |
|     Test->stop_timeout();
 | |
|     cluster->delete_rds_cluster();
 | |
| 
 | |
|     int rval = Test->global_result;
 | |
|     delete Test;
 | |
|     return rval;
 | |
| }
 | 
