Allow servers to be removed from multiple objects

Since servers can be added to multiple objects, it only makes sense to be
able to remove them from multiple objects.
This commit is contained in:
Markus Makela 2016-11-15 23:36:59 +02:00
parent ae339f174c
commit 696d103ed0

View File

@ -802,35 +802,41 @@ struct subcommand addoptions[] =
static void telnetdRemoveUser(DCB *, char *user, char *password);
static void cmd_RemoveServer(DCB *dcb, void *a, void *b)
static void cmd_RemoveServer(DCB *dcb, SERVER *server, char *v1, char *v2, char *v3,
char *v4, char *v5, char *v6, char *v7, char *v8, char *v9,
char *v10, char *v11)
{
SERVER *server = (SERVER*)a;
char *name = (char*)b;
SERVICE *service = service_find(name);
MONITOR *monitor = monitor_find(name);
char *values[11] = {v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11};
const int items = sizeof(values) / sizeof(values[0]);
if (service || monitor)
for (int i = 0; i < items && values[i]; i++)
{
ss_dassert(service == NULL || monitor == NULL);
SERVICE *service = service_find(values[i]);
MONITOR *monitor = monitor_find(values[i]);
if (service)
if (service || monitor)
{
serviceRemoveBackend(service, server);
service_serialize_servers(service);
}
else if (monitor)
{
monitorRemoveServer(monitor, server);
monitor_serialize_servers(monitor);
}
ss_dassert(service == NULL || monitor == NULL);
const char *target = service ? "service" : "monitor";
MXS_NOTICE("Removed server '%s' from %s '%s'", server->unique_name, target, name);
dcb_printf(dcb, "Removed server '%s' from %s '%s'\n", server->unique_name, target, name);
}
else
{
dcb_printf(dcb, "No service or monitor with the name '%s'\n", name);
if (service)
{
serviceRemoveBackend(service, server);
service_serialize_servers(service);
}
else if (monitor)
{
monitorRemoveServer(monitor, server);
monitor_serialize_servers(monitor);
}
const char *target = service ? "service" : "monitor";
MXS_NOTICE("Removed server '%s' from %s '%s'", server->unique_name, target, values[i]);
dcb_printf(dcb, "Removed server '%s' from %s '%s'\n", server->unique_name, target, values[i]);
}
else
{
dcb_printf(dcb, "No service or monitor with the name '%s'\n", values[i]);
}
}
}
@ -849,11 +855,15 @@ struct subcommand removeoptions[] =
{ARG_TYPE_STRING, ARG_TYPE_STRING}
},
{
"server", 2, 2, cmd_RemoveServer,
"server", 2, 12, cmd_RemoveServer,
"Remove a server from a service or a monitor",
"Usage: remove server SERVER TARGET\n"
"The TARGET must be either a service or a monitor",
{ARG_TYPE_SERVER, ARG_TYPE_STRING}
"Usage: remove server SERVER TARGET...\n"
"The TARGET must be a list of service and monitor names\n"
"e.g. remove server my-db my-service 'Cluster Monitor'\n"
"A server can be removed from a maximum of 11 objects in one command",
{ARG_TYPE_SERVER, ARG_TYPE_STRING, ARG_TYPE_STRING, ARG_TYPE_STRING,
ARG_TYPE_STRING, ARG_TYPE_STRING, ARG_TYPE_STRING, ARG_TYPE_STRING,
ARG_TYPE_STRING, ARG_TYPE_STRING, ARG_TYPE_STRING, ARG_TYPE_STRING}
},
{
EMPTY_OPTION
@ -1125,41 +1135,38 @@ static void alterServer(DCB *dcb, SERVER *server, char *v1, char *v2, char *v3,
const int items = sizeof(values) / sizeof(values[0]);
CONFIG_CONTEXT *obj = NULL;
for (int i = 0; i < items; i++)
for (int i = 0; i < items && values[i]; i++)
{
if (values[i])
char *key = values[i];
char *value = strchr(key, '=');
if (value)
{
char *key = values[i];
char *value = strchr(key, '=');
*value++ = '\0';
if (value)
if (config_is_ssl_parameter(key))
{
*value++ = '\0';
if (config_is_ssl_parameter(key))
/**
* All the required SSL parameters must be defined at once to
* enable SSL for created servers. This removes the problem
* of partial configuration and allows a somewhat atomic
* operation.
*/
if ((obj == NULL && (obj = config_context_create(server->unique_name)) == NULL) ||
(!config_add_param(obj, key, value)))
{
/**
* All the required SSL parameters must be defined at once to
* enable SSL for created servers. This removes the problem
* of partial configuration and allows a somewhat atomic
* operation.
*/
if ((obj == NULL && (obj = config_context_create(server->unique_name)) == NULL) ||
(!config_add_param(obj, key, value)))
{
dcb_printf(dcb, "Internal error, see log for more details\n");
}
}
else if (!handle_alter_server(server, key, value))
{
dcb_printf(dcb, "Error: Bad key-value parameter: %s=%s\n", key, value);
dcb_printf(dcb, "Internal error, see log for more details\n");
}
}
else
else if (!handle_alter_server(server, key, value))
{
dcb_printf(dcb, "Error: not a key-value parameter: %s\n", values[i]);
dcb_printf(dcb, "Error: Bad key-value parameter: %s=%s\n", key, value);
}
}
else
{
dcb_printf(dcb, "Error: not a key-value parameter: %s\n", values[i]);
}
}
if (obj)
@ -1252,27 +1259,24 @@ static void alterMonitor(DCB *dcb, MONITOR *monitor, char *v1, char *v2, char *v
char *values[11] = {v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11};
const int items = sizeof(values) / sizeof(values[0]);
for (int i = 0; i < items; i++)
for (int i = 0; i < items && values[i]; i++)
{
if (values[i])
char *key = values[i];
char *value = strchr(key, '=');
if (value)
{
char *key = values[i];
char *value = strchr(key, '=');
*value++ = '\0';
if (value)
if (!handle_alter_monitor(monitor, key, value))
{
*value++ = '\0';
if (!handle_alter_monitor(monitor, key, value))
{
dcb_printf(dcb, "Error: Bad key-value parameter: %s=%s\n", key, value);
}
}
else
{
dcb_printf(dcb, "Error: not a key-value parameter: %s\n", values[i]);
dcb_printf(dcb, "Error: Bad key-value parameter: %s=%s\n", key, value);
}
}
else
{
dcb_printf(dcb, "Error: not a key-value parameter: %s\n", values[i]);
}
}
}