Files
MaxScale/maxscale-system-test/script.cpp
Timofey Turenko 08616692a4 Fixed tests to be compatible with GCloud VMs
GCloud machines has more strict access rights settings. Derect calls of
'chmod' are needed to make all configuration files (e.g. 'fwf/rules') be
accessable by Maxscale.
2020-01-24 13:47:26 +02:00

244 lines
9.0 KiB
C++

/**
* @file script.cpp - test for running external script feature (MXS-121)
* - setup Maxscale to execute script on folowing events:
* - for MariaDB monitor: master_down,master_up, slave_up, server_down
* ,server_up,lost_master,lost_slave,new_master,new_slave
* - for Galera monitor: events=master_down,master_up, slave_up, server_down
* ,server_up,lost_master,lost_slave,new_master,new_slave,server_down,server_up,synced_down,synced_up
* - for Galera monitor set also 'disable_master_role_setting=true'
* - block master, unblock master, block node1, unblock node1
* - expect following as a script output:
* @verbatim
* --event=master_down --initiator=server1_IP:port
*--nodelist=server1_IP:port,server2_IP:port,server3_IP:port,server4_IP:port
* --event=master_up --initiator=server1_IP:port
*--nodelist=server1_IP:port,server2_IP:port,server3_IP:port,server4_IP:port
* --event=slave_up --initiator=server2_IP:port
*--nodelist=server1_IP:port,server2_IP:port,server3_IP:port,server4_IP:port
* @endverbatim
* - repeat test for Galera monitor: block node0, unblock node0, block node1, unblock node1
* - expect following as a script output:
* @verbatim
* --event=synced_down --initiator=gserver1_IP:port
*--nodelist=gserver1_IP:port,gserver2_IP:port,gserver3_IP:port,gserver4_IP:port
* --event=synced_down --initiator=gserver2_IP:port
*--nodelist=gserver1_IP:port,gserver2_IP:port,gserver3_IP:port,gserver4_IP:port
* --event=synced_up --initiator=gserver2_IP:port
*--nodelist=gserver1_IP:port,gserver2_IP:port,gserver3_IP:port,gserver4_IP:port
* @endverbatim
* - make script non-executable
* - block and unblock node1
* - check error log for 'The file cannot be executed: /home/$maxscales->access_user[0]/script.sh' error
* - check if Maxscale still alive
*/
#include <iostream>
#include "testconnections.h"
void test_script_monitor(TestConnections* Test, Mariadb_nodes* nodes, char* expected_filename)
{
Test->set_timeout(200);
Test->maxscales->ssh_node_f(0,
true,
"cd %s; truncate -s 0 script_output; \
chown maxscale:maxscale script_output; \
chmod a+rw script_output",
Test->maxscales->access_homedir[0]);
sleep(10);
Test->tprintf("Block master node");
nodes->block_node(0);
Test->tprintf("Sleeping");
sleep(10);
Test->tprintf("Unblock master node");
nodes->unblock_node(0);
Test->tprintf("Sleeping");
sleep(10);
Test->tprintf("Block node1");
nodes->block_node(1);
Test->tprintf("Sleeping");
sleep(10);
Test->tprintf("Unblock node1");
nodes->unblock_node(1);
Test->tprintf("Sleeping");
sleep(10);
Test->tprintf("Comparing results");
if (Test->maxscales->ssh_node_f(0,
false,
"diff %s/script_output %s",
Test->maxscales->access_homedir[0],
expected_filename) != 0)
{
Test->maxscales->ssh_node_f(0, true, "cat %s/script_output", Test->maxscales->access_homedir[0]);
Test->add_result(1, "Wrong script output!");
}
else
{
Test->tprintf("Script output is OK!");
}
}
int main(int argc, char* argv[])
{
TestConnections::require_galera(true);
TestConnections* Test = new TestConnections(argc, argv);
Test->set_timeout(100);
Test->tprintf("Creating script on Maxscale machine");
Test->maxscales->ssh_node_f(0,
false,
"%s rm -rf %s/script; mkdir %s/script; echo \"echo \\$* >> %s/script_output\" > %s/script/script.sh; \
chmod a+x %s/script/script.sh; chmod a+x %s; %s chown maxscale:maxscale %s/script -R",
Test->maxscales->access_sudo[0],
Test->maxscales->access_homedir[0],
Test->maxscales->access_homedir[0],
Test->maxscales->access_homedir[0],
Test->maxscales->access_homedir[0],
Test->maxscales->access_homedir[0],
Test->maxscales->access_homedir[0],
Test->maxscales->access_sudo[0],
Test->maxscales->access_homedir[0]);
Test->maxscales->restart_maxscale(0);
FILE* f;
f = fopen("script_output_expected", "w");
fprintf(f,
"--event=master_down --initiator=[%s]:%d --nodelist=[%s]:%d,[%s]:%d,[%s]:%d\n",
Test->repl->IP_private[0],
Test->repl->port[0],
Test->repl->IP_private[1],
Test->repl->port[1],
Test->repl->IP_private[2],
Test->repl->port[2],
Test->repl->IP_private[3],
Test->repl->port[3]);
fprintf(f,
"--event=master_up --initiator=[%s]:%d --nodelist=[%s]:%d,[%s]:%d,[%s]:%d,[%s]:%d\n",
Test->repl->IP_private[0],
Test->repl->port[0],
Test->repl->IP_private[0],
Test->repl->port[0],
Test->repl->IP_private[1],
Test->repl->port[1],
Test->repl->IP_private[2],
Test->repl->port[2],
Test->repl->IP_private[3],
Test->repl->port[3]);
fprintf(f,
"--event=slave_up --initiator=[%s]:%d --nodelist=[%s]:%d,[%s]:%d,[%s]:%d,[%s]:%d\n",
Test->repl->IP_private[1],
Test->repl->port[1],
Test->repl->IP_private[0],
Test->repl->port[0],
Test->repl->IP_private[1],
Test->repl->port[1],
Test->repl->IP_private[2],
Test->repl->port[2],
Test->repl->IP_private[3],
Test->repl->port[3]);
fclose(f);
f = fopen("script_output_expected_galera", "w");
fprintf(f,
"--event=synced_down --initiator=[%s]:%d --nodelist=[%s]:%d,[%s]:%d,[%s]:%d\n",
Test->galera->IP_private[0],
Test->galera->port[0],
Test->galera->IP_private[1],
Test->galera->port[1],
Test->galera->IP_private[2],
Test->galera->port[2],
Test->galera->IP_private[3],
Test->galera->port[3]);
fprintf(f,
"--event=synced_up --initiator=[%s]:%d --nodelist=[%s]:%d,[%s]:%d,[%s]:%d,[%s]:%d\n",
Test->galera->IP_private[0],
Test->galera->port[0],
Test->galera->IP_private[0],
Test->galera->port[0],
Test->galera->IP_private[1],
Test->galera->port[1],
Test->galera->IP_private[2],
Test->galera->port[2],
Test->galera->IP_private[3],
Test->galera->port[3]);
fprintf(f,
"--event=synced_down --initiator=[%s]:%d --nodelist=[%s]:%d,[%s]:%d,[%s]:%d\n",
Test->galera->IP_private[1],
Test->galera->port[1],
Test->galera->IP_private[0],
Test->galera->port[0],
Test->galera->IP_private[2],
Test->galera->port[2],
Test->galera->IP_private[3],
Test->galera->port[3]);
fprintf(f,
"--event=synced_up --initiator=[%s]:%d --nodelist=[%s]:%d,[%s]:%d,[%s]:%d,[%s]:%d\n",
Test->galera->IP_private[1],
Test->galera->port[1],
Test->galera->IP_private[0],
Test->galera->port[0],
Test->galera->IP_private[1],
Test->galera->port[1],
Test->galera->IP_private[2],
Test->galera->port[2],
Test->galera->IP_private[3],
Test->galera->port[3]);
fclose(f);
Test->tprintf("Copying expected script output to Maxscale machine");
char str[2048];
sprintf(str,
"scp -i %s -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet script_output_expected* %s@%s:%s/",
Test->maxscales->sshkey[0],
Test->maxscales->access_user[0],
Test->maxscales->IP[0],
Test->maxscales->access_homedir[0]);
Test->add_result(system(str), "Error copying script to VM");
sprintf(str, "%s/script_output_expected", Test->maxscales->access_homedir[0]);
test_script_monitor(Test, Test->repl, str);
sprintf(str, "%s/script_output_expected_galera", Test->maxscales->access_homedir[0]);
test_script_monitor(Test, Test->galera, str);
Test->set_timeout(200);
Test->tprintf("Making script non-executable");
Test->maxscales->ssh_node_f(0, true, "chmod a-x %s/script/script.sh", Test->maxscales->access_homedir[0]);
sleep(3);
Test->tprintf("Block node1");
Test->repl->block_node(1);
Test->tprintf("Sleeping");
sleep(10);
Test->tprintf("Unblock node1");
Test->repl->unblock_node(1);
sleep(15);
Test->tprintf("Cheching Maxscale logs");
Test->log_includes(0, "Cannot execute file");
Test->tprintf("checking if Maxscale is alive");
Test->check_maxscale_alive(0);
int rval = Test->global_result;
delete Test;
return rval;
}