Skip to content

Commit 7682cc2

Browse files
MB-52177 Relax 'cluster_init_check' for 'ssl-manage'
Change-Id: I3ee747d449361b7c295514722e327de4071f5819 Reviewed-on: https://review.couchbase.org/c/couchbase-cli/+/174956 Well-Formed: Restriction Checker Tested-by: Build Bot <build@couchbase.com> Reviewed-by: James Lee <james.lee@couchbase.com>
1 parent 5dfc1f8 commit 7682cc2

2 files changed

Lines changed: 64 additions & 9 deletions

File tree

cbmgr.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3428,9 +3428,6 @@ def __init__(self):
34283428

34293429
@rest_initialiser(version_check=True)
34303430
def execute(self, opts):
3431-
if not (opts.cluster_ca or opts.cluster_cert or opts.delete_ca or opts.upload_cert):
3432-
check_cluster_initialized(self.rest)
3433-
34343431
if opts.regenerate is not None:
34353432
try:
34363433
open(opts.regenerate, 'a', encoding="utf-8").close()
@@ -3481,16 +3478,20 @@ def val_or_unknown(ca, key):
34813478

34823479
elif opts.load_ca:
34833480
nodes_data, errors = self.rest.pools('nodes')
3484-
_exit_if_errors(errors)
3485-
loaded_none = True
3486-
for node in nodes_data['nodes']:
3487-
hostname = f'http://{node["hostname"]}'
3481+
if errors and errors[0] == 'unknown pool':
3482+
hostnames = [self.rest.hostname]
3483+
else:
3484+
_exit_if_errors(errors)
3485+
scheme = 'http'
34883486
if opts.ssl:
3489-
hostname = f'https://{node["hostname"]}'
3487+
scheme = 'https'
3488+
hostnames = [f'{scheme}://{n["hostname"]}' for n in nodes_data['nodes']]
3489+
loaded_none = True
3490+
for hostname in hostnames:
34903491
_, errors = self.rest.load_cluster_ca(hostname)
34913492
if not errors:
34923493
loaded_none = False
3493-
print(f'{node["hostname"]}: Successfully load CA from inbox/CA')
3494+
print(f'{hostname}: Successfully load CA from inbox/CA')
34943495
# If a CA is not loaded ns_server returns a error, this error is handled and the next node is tried
34953496
elif "Couldn't load CA certificate" in errors[0]:
34963497
break

test/test_cli.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,6 +1559,15 @@ def test_cluster_ca_load(self):
15591559
self.assertIn('localhost', self.str_output)
15601560
self.assertIn('127.0.0.1', self.str_output)
15611561

1562+
def test_cluster_ca_load_not_init(self):
1563+
self.server_args['/pools/nodes'] = 'unknown pool'
1564+
self.server_args['override-status'] = 400
1565+
self.server_args['init'] = False
1566+
self.no_error_run(self.command + ['--cluster-ca-load'], self.server_args)
1567+
self.assertIn('POST:/node/controller/loadTrustedCAs', self.server.trace)
1568+
self.assertIn('127.0.0.1', self.str_output)
1569+
self.assertIn('Successfully load CA from inbox/CA', self.str_output)
1570+
15621571
def test_cluster_ca_delete(self):
15631572
self.no_error_run(self.command + ['--cluster-ca-delete', '0'], self.server_args)
15641573
self.assertIn('DELETE:/pools/default/trustedCAs/0', self.server.trace)
@@ -1612,18 +1621,47 @@ def test_node_cert_info(self):
16121621
self.assertIn(f'GET:/pools/default/certificate/node/{host}:{port}', self.server.trace)
16131622
self.assertIn('127.0.0.1', self.str_output)
16141623

1624+
def test_node_cert_info_not_init(self):
1625+
self.server_args['init'] = False
1626+
certificate = {'warnings': [{'message': 'Out-of-the-box certificates are self-signed. To further secure your '
1627+
'system, you must create new X.509 certificates signed by a trusted '
1628+
'CA.'}],
1629+
'subject': f'CN=Couchbase Server Node ({host})',
1630+
'expires': '2049-12-31T23:59:59.000Z',
1631+
'type': 'generated',
1632+
'pem': '-----BEGIN CERTIFICATE-----\nCert String\n-----END CERTIFICATE-----\n',
1633+
'privateKeyPassphrase': {}}
1634+
self.server_args[f'/pools/default/certificate/node/{host}:{port}'] = certificate
1635+
self.no_error_run(self.command + ['--node-cert-info'], self.server_args)
1636+
self.assertIn(f'GET:/pools/default/certificate/node/{host}:{port}', self.server.trace)
1637+
self.assertIn('127.0.0.1', self.str_output)
1638+
16151639
def test_regenerate_cert(self):
16161640
self.server_args['/controller/regenerateCertificate'] = 'This is a cert'
16171641
self.no_error_run(self.command + ['--regenerate-cert', 'node1.pem'], self.server_args)
16181642
os.remove('node1.pem')
16191643
self.assertIn('POST:/controller/regenerateCertificate', self.server.trace)
16201644
self.assertIn('Certificate regenerate and copied to `node1.pem`', self.str_output)
16211645

1646+
def test_regenerate_cert_not_init(self):
1647+
self.server_args['init'] = False
1648+
self.server_args['/controller/regenerateCertificate'] = 'This is a cert'
1649+
self.no_error_run(self.command + ['--regenerate-cert', 'node1.pem'], self.server_args)
1650+
os.remove('node1.pem')
1651+
self.assertIn('POST:/controller/regenerateCertificate', self.server.trace)
1652+
self.assertIn('Certificate regenerate and copied to `node1.pem`', self.str_output)
1653+
16221654
def test_set_node_certificate(self):
16231655
self.no_error_run(self.command + ['--set-node-certificate'], self.server_args)
16241656
self.assertIn('POST:/node/controller/reloadCertificate', self.server.trace)
16251657
self.assertIn('Node certificate set', self.str_output)
16261658

1659+
def test_set_node_certificate_not_init(self):
1660+
self.server_args['init'] = False
1661+
self.no_error_run(self.command + ['--set-node-certificate'], self.server_args)
1662+
self.assertIn('POST:/node/controller/reloadCertificate', self.server.trace)
1663+
self.assertIn('Node certificate set', self.str_output)
1664+
16271665
def test_set_node_certificate_with_pkey_settings(self):
16281666
pkey_settings_file = tempfile.NamedTemporaryFile(delete=False)
16291667
pkey_settings_file.write(b'{"type":"plain","password":"asdf"}')
@@ -1642,12 +1680,28 @@ def test_set_client_auth(self):
16421680
self.assertIn('POST:/settings/clientCertAuth', self.server.trace)
16431681
self.assertIn('SSL client auth updated', self.str_output)
16441682

1683+
def test_set_client_auth_not_init(self):
1684+
self.server_args['init'] = False
1685+
client_json = tempfile.NamedTemporaryFile(delete=False)
1686+
client_json.write(b'{"name":"json"}')
1687+
client_json.close()
1688+
self.no_error_run(self.command + ['--set-client-auth', client_json.name], self.server_args)
1689+
self.assertIn('POST:/settings/clientCertAuth', self.server.trace)
1690+
self.assertIn('SSL client auth updated', self.str_output)
1691+
16451692
def test_client_auth(self):
16461693
self.server_args['/settings/clientCertAuth'] = {'prefixes': [], 'state': 'disable'}
16471694
self.no_error_run(self.command + ['--client-auth'], self.server_args)
16481695
self.assertIn('GET:/settings/clientCertAuth', self.server.trace)
16491696
self.assertIn('prefixes', self.str_output)
16501697

1698+
def test_client_auth_not_init(self):
1699+
self.server_args['init'] = False
1700+
self.server_args['/settings/clientCertAuth'] = {'prefixes': [], 'state': 'disable'}
1701+
self.no_error_run(self.command + ['--client-auth'], self.server_args)
1702+
self.assertIn('GET:/settings/clientCertAuth', self.server.trace)
1703+
self.assertIn('prefixes', self.str_output)
1704+
16511705

16521706
class TestUserManage(CommandTest):
16531707
def setUp(self):

0 commit comments

Comments
 (0)