From 1ed63042815e1cf9d5596b1dc2411d25de0c633e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Mon, 6 Apr 2020 11:24:00 +0300 Subject: [PATCH] MXS-2954: Use correct object for PATCH The destination object instead of the source object was used. This caused the PATCH to be a no-op. Due to how the REST API behaves when it received parameters, the set of synced parameters must be filtered. The REST API should be more lenient towards alterations to parameters that don't actually change the value. --- maxctrl/lib/cluster.js | 22 +++++++++++++++++++++- maxctrl/test/cluster.js | 9 +++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/maxctrl/lib/cluster.js b/maxctrl/lib/cluster.js index 87bc14e55..1b3b4cc33 100644 --- a/maxctrl/lib/cluster.js +++ b/maxctrl/lib/cluster.js @@ -273,9 +273,29 @@ exports.builder = function(yargs) { promises.push(doAsyncRequest(host, i + '/' + j.id, null, {method: 'PATCH', body: {data: j}})) }) }) + + if (src['maxscale']) { + // TODO: Don't filter the altered parameters on the client side. The REST + // API should ignore no-op changes. + src['maxscale'].data.attributes.parameters = _.pick( + src['maxscale'].data.attributes.parameters, + ['auth_connect_timeout', + 'auth_read_timeout', + 'auth_write_timeout', + 'admin_auth', + 'admin_log_auth_failures', + 'passive', + 'ms_timestamp', + 'skip_permission_checks', + 'query_retries', + 'query_retry_timeout', + 'retain_last_statements', + 'dump_last_statements']) + } + // Do the same for individual resources endpoints.forEach(function(i) { - promises.push(doAsyncRequest(host, i, null, {method: 'PATCH', body: dest[i]})) + promises.push(doAsyncRequest(host, i, null, {method: 'PATCH', body: src[i]})) }) return Promise.all(promises) }) diff --git a/maxctrl/test/cluster.js b/maxctrl/test/cluster.js index 48a112a48..4f32b009f 100644 --- a/maxctrl/test/cluster.js +++ b/maxctrl/test/cluster.js @@ -156,6 +156,15 @@ describe('Cluster Command Internals', function() { describe('Cluster Sync', function() { before(startDoubleMaxScale) + it('sync global options', function() { + return doCommand('alter maxscale auth_connect_timeout 1234 --hosts ' + secondary_host) + .then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host, + 'maxscale')) + .then(function(res) { + res.data.attributes.parameters.auth_connect_timeout.should.equal(1234) + }) + }) + it('sync after server creation', function() { return doCommand('create server server5 127.0.0.1 3003 --hosts ' + secondary_host) .then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host,