Skip to content

Commit 8953be8

Browse files
committed
MB-51776 Add --use-client-cert flag to server-add
Optionally the --use-client-cert can be used instead of --server-add-username and --server-add-password. Change-Id: I7691dc30deeeb660ac315cdc0c7bc19bf29237b5 Reviewed-on: https://review.couchbase.org/c/couchbase-cli/+/225641 Reviewed-by: Matt Hall <[email protected]> Tested-by: Build Bot <[email protected]>
1 parent 5a2992c commit 8953be8

File tree

3 files changed

+61
-12
lines changed

3 files changed

+61
-12
lines changed

cbmgr.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2460,9 +2460,11 @@ def __init__(self):
24602460
group.add_argument("--server-add", dest="servers", metavar="<server_list>", required=True,
24612461
help="The list of servers to add")
24622462
group.add_argument("--server-add-username", dest="server_username", metavar="<username>",
2463-
required=True, help="The username for the server to add")
2463+
help="The username for the server to add")
24642464
group.add_argument("--server-add-password", dest="server_password", metavar="<password>",
2465-
required=True, help="The password for the server to add")
2465+
help="The password for the server to add")
2466+
group.add_argument("--use-client-cert", dest="use_client_cert", action="store_true",
2467+
help="Use client certificate for authentication")
24662468
group.add_argument("--group-name", dest="group_name", metavar="<name>",
24672469
help="The server group to add this server into")
24682470
group.add_argument("--services", dest="services", default="", metavar="<services>",
@@ -2472,6 +2474,14 @@ def __init__(self):
24722474

24732475
@rest_initialiser(cluster_init_check=True, version_check=True, enterprise_check=False)
24742476
def execute(self, opts):
2477+
if opts.use_client_cert:
2478+
if opts.server_username is not None or opts.server_password is not None:
2479+
_exit_if_errors(["cannot use --server-add-username and --server-add-password with --use-client-cert"])
2480+
else:
2481+
if opts.server_username is None or opts.server_password is None:
2482+
_exit_if_errors(
2483+
["provide either both --server-add-username and --server-add-password or the --use-client-cert flag"])
2484+
24752485
if not self.enterprise and opts.index_storage_mode == 'memopt':
24762486
_exit_if_errors(["memopt option for --index-storage-setting can only be configured on enterprise edition"])
24772487

@@ -2499,8 +2509,7 @@ def execute(self, opts):
24992509

25002510
servers = opts.servers.split(',')
25012511
for server in servers:
2502-
_, errors = self.rest.add_server(server, opts.group_name, opts.server_username, opts.server_password,
2503-
opts.services)
2512+
_, errors = self.rest.add_server(server, opts)
25042513
_exit_if_errors(errors)
25052514

25062515
_success("Server added")

cluster_manager.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -508,15 +508,20 @@ def get_add_node_uri(self, group_name):
508508

509509
return f'{self.hostname}{group["addNodeURI"]}', None
510510

511-
def add_server(self, add_server, group_name, username, password, services):
512-
uri, errors = self.get_add_node_uri(group_name)
511+
def add_server(self, add_server, opts):
512+
uri, errors = self.get_add_node_uri(opts.group_name)
513513
if errors:
514514
return None, errors
515515

516-
return self._post_form_encoded(
517-
uri,
518-
{"hostname": add_server, "user": username, "password": password, "services": services},
519-
)
516+
params = {"hostname": add_server, "services": opts.services}
517+
518+
if opts.use_client_cert:
519+
params["clientCertAuth"] = 'true'
520+
else:
521+
params["user"] = opts.server_username
522+
params["password"] = opts.server_password
523+
524+
return self._post_form_encoded(uri, params)
520525

521526
def readd_server(self, server):
522527
all_cluster_nodes_info, errors = self._get_all_cluster_nodes_info()

test/test_cli.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,8 +1248,9 @@ def test_rebalance_services(self):
12481248
class TestServerAdd(CommandTest):
12491249
def setUp(self):
12501250
self.command = ['couchbase-cli', 'server-add'] + cluster_connect_args
1251-
self.cmd_args = ['--server-add', 'some-host:6789', '--server-add-username', 'Administrator',
1252-
'--server-add-password', 'asdasd']
1251+
self.cmd_server_add_args = ['--server-add', 'some-host:6789']
1252+
self.cmd_basic_auth_args = ['--server-add-username', 'Administrator', '--server-add-password', 'asdasd']
1253+
self.cmd_args = self.cmd_server_add_args + self.cmd_basic_auth_args
12531254

12541255
self.server_args = {'enterprise': True, 'init': True, 'is_admin': True}
12551256
self.server_args['server-group'] = {'groups': [
@@ -1269,6 +1270,40 @@ def setUp(self):
12691270

12701271
super(TestServerAdd, self).setUp()
12711272

1273+
def test_server_add_use_client_cert(self):
1274+
self.no_error_run(self.command + self.cmd_server_add_args + ["--use-client-cert"], self.server_args)
1275+
self.assertIn('POST:/controller/addNode', self.server.trace)
1276+
expected_params = ['hostname=some-host%3A6789', 'clientCertAuth=true', 'services=kv']
1277+
self.rest_parameter_match(expected_params)
1278+
1279+
def test_server_add_use_client_cert_user_pass(self):
1280+
self.system_exit_run(self.command + self.cmd_args + ["--use-client-cert"], self.server_args)
1281+
self.assertIn(
1282+
'cannot use --server-add-username and --server-add-password with --use-client-cert',
1283+
self.str_output)
1284+
1285+
def test_server_add_no_auth(self):
1286+
self.system_exit_run(self.command + self.cmd_server_add_args, self.server_args)
1287+
self.assertIn(
1288+
'provide either both --server-add-username and --server-add-password or the --use-client-cert flag',
1289+
self.str_output)
1290+
1291+
def test_server_add_no_pass(self):
1292+
self.system_exit_run(self.command +
1293+
self.cmd_server_add_args +
1294+
['--server-add-username', 'Administrator'], self.server_args)
1295+
self.assertIn(
1296+
'provide either both --server-add-username and --server-add-password or the --use-client-cert flag',
1297+
self.str_output)
1298+
1299+
def test_server_add_no_user(self):
1300+
self.system_exit_run(self.command +
1301+
self.cmd_server_add_args +
1302+
['--server-add-password', 'asdasd'], self.server_args)
1303+
self.assertIn(
1304+
'provide either both --server-add-username and --server-add-password or the --use-client-cert flag',
1305+
self.str_output)
1306+
12721307
def test_server_add_basic(self):
12731308
self.no_error_run(self.command + self.cmd_args, self.server_args)
12741309
self.assertIn('POST:/controller/addNode', self.server.trace)

0 commit comments

Comments
 (0)