
commit 48a0b902b67da46f1eed4afa687bdcb56b59d02f Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Mon Dec 16 15:35:07 2019 +0200 Increase timouts in the mxs173_trottle_filter test commit 81d8083a89421a8004b8024d480ae0f35d715b86 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Mon Dec 16 14:19:39 2019 +0200 Increase timeouts in max1071_maxrow test commit e1039c6132f0e9274b8801165f3f905ede7c9421 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Mon Dec 16 00:06:53 2019 +0200 Remove hardcoded 'home/vagrant/' from all maxscale.cnf in system tests commit 28c8029e060afdcf5159bf802b13dcd5e484d9f1 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sun Dec 15 21:31:34 2019 +0200 Use private IP for Galera congiguration in maxscale-system-tests commit 66dc36cbf43a5fb92465df31e1295e82865be1fc Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sun Dec 15 09:06:28 2019 +0200 Fix typos in fwf_*.cpp commit 44c7a4384ddf39596c0254c955aeb6c008a00a35 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sun Dec 15 09:05:26 2019 +0200 Fix typos in fwf_*.cpp commit 2649017611908a8b0d27090f49722947ac31c4f4 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sun Dec 15 09:03:41 2019 +0200 Fix typos in fwf_*.cpp commit 5cc87658523e8496eaab17700be8a821af5b0cde Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sat Dec 14 23:54:53 2019 +0200 Fix typo in fwf_copy_rules.cpp commit fb1accc36cb9d79691469f63cb4535f3bc38dedd Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sat Dec 14 23:52:51 2019 +0200 More hardcoded 'vagrant' removals commit 77e49d474b4abe767629ff87b01f08137773d761 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sat Dec 14 23:35:09 2019 +0200 Fix hardcoded 'vagrant' user in fwf* tests Several firewall filter tests has hardcoded 'vagrant' as a user name for access user on the VM. Changed to node->access_user. commit ed5ab1487f37822db6a7478f76c0f3652776c389 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sat Dec 14 22:50:35 2019 +0200 Fix IP vs IP_private Many tests use IP instead of IP_private which makes them failed in the AWS or GCloud environment. The same applies to get_conn_num() etc functions. commit 0558aac23d303a675dc12d05b1766e698753b444 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Thu Aug 15 12:02:01 2019 +0300 fix IP -> IP_private for some mysqlmon* testst commit 5d9c70970d970eb995c8774d0088bd1c54ab76fe Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Sat Dec 14 20:20:51 2019 +0200 Replace IP to IP_private in the maxscale-system-tests commit b06cf3329af59ff100748691991213fe639f29e6 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Tue Nov 19 11:52:33 2019 +0200 Remove spaces from value which were read from *_network_config MDBCI can put spaces around values in the *_network_config file which can cause ssh connection failures in the tests. To fix it removing all spaces from all values which were read from *_network_config commit b3904f019847ef1db9d4ec9714ad9ef869fa0b01 Author: Timofey Turenko <timofey.turenko@mariadb.com> Date: Thu Dec 12 23:36:31 2019 +0200 Increate default timeout for all system tests
450 lines
10 KiB
C++
450 lines
10 KiB
C++
#include "nodes.h"
|
|
#include <string>
|
|
#include <cstring>
|
|
#include <iostream>
|
|
#include <future>
|
|
#include <functional>
|
|
#include <algorithm>
|
|
#include <signal.h>
|
|
|
|
#include "envv.h"
|
|
|
|
Nodes::Nodes()
|
|
{
|
|
}
|
|
|
|
bool Nodes::check_node_ssh(int node)
|
|
{
|
|
bool res = true;
|
|
|
|
if (ssh_node(node, "ls > /dev/null", false) != 0)
|
|
{
|
|
std::cout << "Node " << node << " is not available" << std::endl;
|
|
res = false;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
bool Nodes::check_nodes()
|
|
{
|
|
std::vector<std::future<bool>> f;
|
|
|
|
for (int i = 0; i < N; i++)
|
|
{
|
|
f.push_back(std::async(std::launch::async, &Nodes::check_node_ssh, this, i));
|
|
}
|
|
|
|
return std::all_of(f.begin(), f.end(), std::mem_fn(&std::future<bool>::get));
|
|
}
|
|
|
|
void Nodes::generate_ssh_cmd(char* cmd, int node, const char* ssh, bool sudo)
|
|
{
|
|
if (strcmp(IP[node], "127.0.0.1") == 0)
|
|
{
|
|
if (sudo)
|
|
{
|
|
sprintf(cmd,
|
|
"%s %s",
|
|
access_sudo[node],
|
|
ssh);
|
|
}
|
|
else
|
|
{
|
|
sprintf(cmd, "%s", ssh);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
if (sudo)
|
|
{
|
|
sprintf(cmd,
|
|
"ssh -i %s -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet %s@%s '%s %s\'",
|
|
sshkey[node],
|
|
access_user[node],
|
|
IP[node],
|
|
access_sudo[node],
|
|
ssh);
|
|
}
|
|
else
|
|
{
|
|
sprintf(cmd,
|
|
"ssh -i %s -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet %s@%s '%s'",
|
|
sshkey[node],
|
|
access_user[node],
|
|
IP[node],
|
|
ssh);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
char* Nodes::ssh_node_output_f(int node, bool sudo, int* exit_code, const char* format, ...)
|
|
{
|
|
va_list valist;
|
|
|
|
va_start(valist, format);
|
|
int message_len = vsnprintf(NULL, 0, format, valist);
|
|
va_end(valist);
|
|
|
|
if (message_len < 0)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
char* sys = (char*)malloc(message_len + 1);
|
|
|
|
va_start(valist, format);
|
|
vsnprintf(sys, message_len + 1, format, valist);
|
|
va_end(valist);
|
|
|
|
char* result = ssh_node_output(node, sys, sudo, exit_code);
|
|
free(sys);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
char* Nodes::ssh_node_output(int node, const char* ssh, bool sudo, int* exit_code)
|
|
{
|
|
char* cmd = (char*)malloc(strlen(ssh) + 1024);
|
|
|
|
generate_ssh_cmd(cmd, node, ssh, sudo);
|
|
|
|
FILE* output = popen(cmd, "r");
|
|
|
|
if (output == NULL)
|
|
{
|
|
printf("Error opening ssh %s\n", strerror(errno));
|
|
return NULL;
|
|
}
|
|
char buffer[1024];
|
|
size_t rsize = sizeof(buffer);
|
|
char* result = (char*)calloc(rsize, sizeof(char));
|
|
|
|
while (fgets(buffer, sizeof(buffer), output))
|
|
{
|
|
result = (char*)realloc(result, sizeof(buffer) + rsize);
|
|
rsize += sizeof(buffer);
|
|
strcat(result, buffer);
|
|
}
|
|
|
|
free(cmd);
|
|
int code = pclose(output);
|
|
if (WIFEXITED(code))
|
|
{
|
|
* exit_code = WEXITSTATUS(code);
|
|
}
|
|
else
|
|
{
|
|
* exit_code = 256;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
int Nodes::ssh_node(int node, const char* ssh, bool sudo)
|
|
{
|
|
char* cmd = (char*)malloc(strlen(ssh) + 1024);
|
|
|
|
if (strcmp(IP[node], "127.0.0.1") == 0)
|
|
{
|
|
printf("starting bash\n");
|
|
sprintf(cmd, "bash");
|
|
}
|
|
else
|
|
{
|
|
sprintf(cmd,
|
|
"ssh -i %s -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet %s@%s%s",
|
|
sshkey[node],
|
|
access_user[node],
|
|
IP[node],
|
|
verbose ? "" : " > /dev/null");
|
|
}
|
|
|
|
if (verbose)
|
|
{
|
|
std::cout << ssh << std::endl;
|
|
}
|
|
|
|
int rc = 1;
|
|
FILE* in = popen(cmd, "w");
|
|
|
|
if (in)
|
|
{
|
|
if (sudo)
|
|
{
|
|
fprintf(in, "sudo su -\n");
|
|
fprintf(in, "cd /home/%s\n", access_user[node]);
|
|
}
|
|
|
|
fprintf(in, "%s\n", ssh);
|
|
rc = pclose(in);
|
|
}
|
|
|
|
|
|
free(cmd);
|
|
|
|
if (WIFEXITED(rc))
|
|
{
|
|
return WEXITSTATUS(rc);
|
|
}
|
|
else if (WIFSIGNALED(rc) && WTERMSIG(rc) == SIGHUP)
|
|
{
|
|
// SIGHUP appears to happen for SSH connections
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
std::cout << strerror(errno) << std::endl;
|
|
return 256;
|
|
}
|
|
}
|
|
|
|
int Nodes::ssh_node_f(int node, bool sudo, const char* format, ...)
|
|
{
|
|
va_list valist;
|
|
|
|
va_start(valist, format);
|
|
int message_len = vsnprintf(NULL, 0, format, valist);
|
|
va_end(valist);
|
|
|
|
if (message_len < 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
char* sys = (char*)malloc(message_len + 1);
|
|
|
|
va_start(valist, format);
|
|
vsnprintf(sys, message_len + 1, format, valist);
|
|
va_end(valist);
|
|
int result = ssh_node(node, sys, sudo);
|
|
free(sys);
|
|
return result;
|
|
}
|
|
|
|
int Nodes::copy_to_node(int i, const char* src, const char* dest)
|
|
{
|
|
if (i >= N)
|
|
{
|
|
return 1;
|
|
}
|
|
char sys[strlen(src) + strlen(dest) + 1024];
|
|
|
|
if (strcmp(IP[i], "127.0.0.1") == 0)
|
|
{
|
|
sprintf(sys,
|
|
"cp %s %s",
|
|
src,
|
|
dest);
|
|
}
|
|
else
|
|
{
|
|
sprintf(sys,
|
|
"scp -q -r -i %s -o UserKnownHostsFile=/dev/null "
|
|
"-o StrictHostKeyChecking=no -o LogLevel=quiet %s %s@%s:%s",
|
|
sshkey[i],
|
|
src,
|
|
access_user[i],
|
|
IP[i],
|
|
dest);
|
|
}
|
|
if (verbose)
|
|
{
|
|
printf("%s\n", sys);
|
|
}
|
|
|
|
return system(sys);
|
|
}
|
|
|
|
|
|
int Nodes::copy_to_node_legacy(const char* src, const char* dest, int i)
|
|
{
|
|
|
|
return copy_to_node(i, src, dest);
|
|
}
|
|
|
|
int Nodes::copy_from_node(int i, const char* src, const char* dest)
|
|
{
|
|
if (i >= N)
|
|
{
|
|
return 1;
|
|
}
|
|
char sys[strlen(src) + strlen(dest) + 1024];
|
|
if (strcmp(IP[i], "127.0.0.1") == 0)
|
|
{
|
|
sprintf(sys,
|
|
"cp %s %s",
|
|
src,
|
|
dest);
|
|
}
|
|
else
|
|
{
|
|
sprintf(sys,
|
|
"scp -q -r -i %s -o UserKnownHostsFile=/dev/null "
|
|
"-o StrictHostKeyChecking=no -o LogLevel=quiet %s@%s:%s %s",
|
|
sshkey[i],
|
|
access_user[i],
|
|
IP[i],
|
|
src,
|
|
dest);
|
|
}
|
|
if (verbose)
|
|
{
|
|
printf("%s\n", sys);
|
|
}
|
|
|
|
return system(sys);
|
|
}
|
|
|
|
int Nodes::copy_from_node_legacy(const char* src, const char* dest, int i)
|
|
{
|
|
return copy_from_node(i, src, dest);
|
|
}
|
|
|
|
int Nodes::read_basic_env()
|
|
{
|
|
char env_name[64];
|
|
|
|
sprintf(env_name, "%s_user", prefix);
|
|
user_name = readenv(env_name, "skysql");
|
|
|
|
sprintf(env_name, "%s_password", prefix);
|
|
password = readenv(env_name, "skysql");
|
|
|
|
N = get_N();
|
|
|
|
if ((N > 0) && (N < 255))
|
|
{
|
|
for (int i = 0; i < N; i++)
|
|
{
|
|
// reading IPs
|
|
sprintf(env_name, "%s_%03d_network", prefix, i);
|
|
IP[i] = strdup(get_nc_item(env_name).c_str());
|
|
|
|
// reading private IPs
|
|
sprintf(env_name, "%s_%03d_private_ip", prefix, i);
|
|
IP_private[i] = strdup(get_nc_item(env_name).c_str());
|
|
if (IP_private[i] == NULL)
|
|
{
|
|
IP_private[i] = IP[i];
|
|
}
|
|
setenv(env_name, IP_private[i], 1);
|
|
|
|
// reading IPv6
|
|
sprintf(env_name, "%s_%03d_network6", prefix, i);
|
|
IP6[i] = strdup(get_nc_item(env_name).c_str());
|
|
if (IP6[i] == NULL)
|
|
{
|
|
IP6[i] = IP[i];
|
|
}
|
|
setenv(env_name, IP6[i], 1);
|
|
|
|
//reading sshkey
|
|
sprintf(env_name, "%s_%03d_keyfile", prefix, i);
|
|
sshkey[i] = strdup(get_nc_item(env_name).c_str());
|
|
|
|
|
|
sprintf(env_name, "%s_%03d_whoami", prefix, i);
|
|
access_user[i] = strdup(get_nc_item(env_name).c_str());
|
|
if (access_user[i] == NULL)
|
|
{
|
|
access_user[i] = (char *) "vagrant";
|
|
}
|
|
setenv(env_name, access_user[i], 1);
|
|
|
|
sprintf(env_name, "%s_%03d_access_sudo", prefix, i);
|
|
access_sudo[i] = readenv(env_name, " sudo ");
|
|
|
|
if (strcmp(access_user[i], "root") == 0)
|
|
{
|
|
access_homedir[i] = (char *) "/root/";
|
|
}
|
|
else
|
|
{
|
|
access_homedir[i] = (char *) malloc(strlen(access_user[i]) + 9);
|
|
sprintf(access_homedir[i], "/home/%s/", access_user[i]);
|
|
}
|
|
|
|
sprintf(env_name, "%s_%03d_hostname", prefix, i);
|
|
hostname[i] = strdup(get_nc_item(env_name).c_str());
|
|
if ((hostname[i] == NULL) || (strcmp(hostname[i], "") == 0))
|
|
{
|
|
hostname[i] = IP_private[i];
|
|
}
|
|
setenv(env_name, hostname[i], 1);
|
|
|
|
sprintf(env_name, "%s_%03d_start_vm_command", prefix, i);
|
|
start_vm_command[i] = readenv(env_name, "curr_dir=`pwd`; cd %s/%s;vagrant resume %s_%03d ; cd $curr_dir",
|
|
getenv("MDBCI_VM_PATH"), getenv("name"), prefix, i);
|
|
setenv(env_name, start_vm_command[i], 1);
|
|
|
|
sprintf(env_name, "%s_%03d_stop_vm_command", prefix, i);
|
|
stop_vm_command[i] = readenv(env_name, "curr_dir=`pwd`; cd %s/%s;vagrant suspend %s_%03d ; cd $curr_dir",
|
|
getenv("MDBCI_VM_PATH"), getenv("name"), prefix, i);
|
|
setenv(env_name, stop_vm_command[i], 1);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
const char* Nodes::ip(int i) const
|
|
{
|
|
return use_ipv6 ? IP6[i] : IP[i];
|
|
}
|
|
|
|
std::string Nodes::get_nc_item(const char* item_name)
|
|
{
|
|
size_t start = network_config.find(item_name);
|
|
if (start == std::string::npos)
|
|
{
|
|
return "";
|
|
}
|
|
|
|
size_t end = network_config.find("\n", start);
|
|
size_t equal = network_config.find("=", start);
|
|
if (end == std::string::npos)
|
|
{
|
|
end = network_config.length();
|
|
}
|
|
if (equal == std::string::npos)
|
|
{
|
|
return "";
|
|
}
|
|
|
|
std::string str = network_config.substr(equal + 1, end - equal - 1);
|
|
str.erase(remove(str.begin(), str.end(), ' '), str.end());
|
|
|
|
setenv(item_name, str.c_str(), 1);
|
|
|
|
return str;
|
|
}
|
|
|
|
int Nodes::get_N()
|
|
{
|
|
int N = 0;
|
|
char item[strlen(prefix) + 13];
|
|
do
|
|
{
|
|
sprintf(item, "%s_%03d_network", prefix, N);
|
|
N++;
|
|
}
|
|
while (network_config.find(item) != std::string::npos);
|
|
sprintf(item, "%s_N", prefix);
|
|
setenv(item, std::to_string(N).c_str(), 1);
|
|
return N - 1 ;
|
|
}
|
|
|
|
int Nodes::start_vm(int node)
|
|
{
|
|
return (system(start_vm_command[node]));
|
|
}
|
|
|
|
int Nodes::stop_vm(int node)
|
|
{
|
|
return (system(stop_vm_command[node]));
|
|
}
|