From b0f2d02787bafbf5d282c33f7ce535e556d5a206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Wed, 5 Jul 2017 13:14:32 +0300 Subject: [PATCH] MXS-1300: Add link/unlink command to MaxCtrl The link/unlink commands are similar to the add/remove commands in MaxAdmin but they link services and monitors to a list of servers instead of linking servers to a list of either services or monitors. This can reduce the number of required calls to alter the configuration while making the process easier for MaxCtrl to do via the REST API. Also fixed a false negative where a service alteration which results in a no-op would be counted as an error. --- client/maxctrl/lib/link.js | 47 +++++++++++++++++++++++++++++++++++ client/maxctrl/lib/unlink.js | 47 +++++++++++++++++++++++++++++++++++ client/maxctrl/maxctrl.js | 2 ++ server/core/config_runtime.cc | 3 +-- 4 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 client/maxctrl/lib/link.js create mode 100644 client/maxctrl/lib/unlink.js diff --git a/client/maxctrl/lib/link.js b/client/maxctrl/lib/link.js new file mode 100644 index 000000000..f5f3d4b8f --- /dev/null +++ b/client/maxctrl/lib/link.js @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016 MariaDB Corporation Ab + * + * Use of this software is governed by the Business Source License included + * in the LICENSE.TXT file and at www.mariadb.com/bsl11. + * + * Change Date: 2020-01-01 + * + * On the date above, in accordance with the Business Source License, use + * of this software will be governed by version 2 or later of the General + * Public License. + */ +require('../common.js')() + +function addServer(path, targets) { + doRequest(path, function(res) { + var servers =_.get(res, 'data.relationships.servers.data', []) + + targets.forEach(function(i){ + servers.push({id: i, type: 'servers'}) + }) + + // Update relationships and remove unnecessary parts + _.set(res, 'data.relationships.servers.data', servers) + delete res.data.attributes + + doRequest(path, null, {method: 'PATCH', body: res}) + }) +} + +exports.command = 'link ' +exports.desc = 'Link objects' +exports.handler = function() {} +exports.builder = function(yargs) { + yargs + .command('service ', 'Link servers to a service', {}, function(argv) { + addServer('services/' + argv.name, argv.server) + }) + .command('monitor ', 'Link servers to a monitor', {}, function(argv) { + addServer('monitors/' + argv.name, argv.server) + }) + .usage('Usage: link ') + .help() + .command('*', 'the default command', {}, () => { + console.log('Unknown command. See output of `help link` for a list of commands.') + }) +} diff --git a/client/maxctrl/lib/unlink.js b/client/maxctrl/lib/unlink.js new file mode 100644 index 000000000..0bd50abdc --- /dev/null +++ b/client/maxctrl/lib/unlink.js @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016 MariaDB Corporation Ab + * + * Use of this software is governed by the Business Source License included + * in the LICENSE.TXT file and at www.mariadb.com/bsl11. + * + * Change Date: 2020-01-01 + * + * On the date above, in accordance with the Business Source License, use + * of this software will be governed by version 2 or later of the General + * Public License. + */ +require('../common.js')() + +function removeServer(path, targets) { + doRequest(path, function(res) { + var servers =_.get(res, 'data.relationships.servers.data', []) + + _.remove(servers, function(i) { + return targets.indexOf(i.id) != -1 + }) + + // Update relationships and remove unnecessary parts + _.set(res, 'data.relationships.servers.data', servers) + delete res.data.attributes + + doRequest(path, null, {method: 'PATCH', body: res}) + }) +} + +exports.command = 'unlink ' +exports.desc = 'Unlink objects' +exports.handler = function() {} +exports.builder = function(yargs) { + yargs + .command('service ', 'Unlink servers from a service', {}, function(argv) { + removeServer('services/' + argv.name, argv.server) + }) + .command('monitor ', 'Unlink servers from a monitor', {}, function(argv) { + removeServer('monitors/' + argv.name, argv.server) + }) + .usage('Usage: unlink ') + .help() + .command('*', 'the default command', {}, () => { + console.log('Unknown command. See output of `help unlink` for a list of commands.') + }) +} diff --git a/client/maxctrl/maxctrl.js b/client/maxctrl/maxctrl.js index 60f65360e..268a3601b 100644 --- a/client/maxctrl/maxctrl.js +++ b/client/maxctrl/maxctrl.js @@ -58,6 +58,8 @@ program .command(require('./lib/disable.js')) .command(require('./lib/create.js')) .command(require('./lib/destroy.js')) + .command(require('./lib/link.js')) + .command(require('./lib/unlink.js')) .help() .demandCommand(1, 'At least one command is required') .command('*', 'the default command', {}, () => { diff --git a/server/core/config_runtime.cc b/server/core/config_runtime.cc index f81c52827..49fa3013e 100644 --- a/server/core/config_runtime.cc +++ b/server/core/config_runtime.cc @@ -1377,7 +1377,7 @@ bool runtime_alter_service_from_json(SERVICE* service, json_t* new_json) if (is_valid_resource_body(new_json) && object_to_server_relations(service->name, old_json.get(), new_json)) { - bool changed = false; + rval = true; json_t* parameters = mxs_json_pointer(new_json, MXS_JSON_PTR_PARAMETERS); json_t* old_parameters = mxs_json_pointer(old_json.get(), MXS_JSON_PTR_PARAMETERS); @@ -1395,7 +1395,6 @@ bool runtime_alter_service_from_json(SERVICE* service, json_t* new_json) } } - rval = true; const char* key; json_t* value;