From f6701f057eea9d6b609a6168a52e1a45afe909e2 Mon Sep 17 00:00:00 2001 From: Andrey Pavlov Date: Fri, 26 Feb 2016 16:13:36 +0300 Subject: Adding "health verification --show" CLI call * Health verification for cluster can be shown with "dataprocessing cluster verification CLUSTER --show" command * changing output for "dataprocessing cluster verification CLUSTER --start" command * adding unit tests for cluster verifications Partially-implements bp: cluster-verification Change-Id: If095845f04e8df38d5cc083d2b5e17ac630515cb --- saharaclient/osc/v1/clusters.py | 56 ++++++++++------- saharaclient/tests/unit/osc/v1/test_clusters.py | 84 ++++++++++++++++++++++++- 2 files changed, 116 insertions(+), 24 deletions(-) diff --git a/saharaclient/osc/v1/clusters.py b/saharaclient/osc/v1/clusters.py index 56ebab3..1602e14 100644 --- a/saharaclient/osc/v1/clusters.py +++ b/saharaclient/osc/v1/clusters.py @@ -45,14 +45,15 @@ def _format_cluster_output(data): def _prepare_health_checks(data): + additional_data = {} ver = data.get('verification', {}) additional_fields = ['verification_status'] - data['verification_status'] = ver.get('status', 'UNKNOWN') + additional_data['verification_status'] = ver.get('status', 'UNKNOWN') for check in ver.get('checks', []): row_name = "Health check (%s)" % check['name'] - data[row_name] = check['status'] + additional_data[row_name] = check['status'] additional_fields.append(row_name) - return data, additional_fields + return additional_data, additional_fields def _get_plugin_version(cluster_template, client): @@ -323,7 +324,8 @@ class ShowCluster(show.ShowOne): _format_cluster_output(data) fields = [] if parsed_args.verification: - data, fields = _prepare_health_checks(data) + ver_data, fields = _prepare_health_checks(data) + data.update(ver_data) fields.extend(CLUSTER_FIELDS) data = utils.prepare_data(data, fields) @@ -581,12 +583,18 @@ class VerificationUpdateCluster(show.ShowOne): metavar="", help="Name or ID of the cluster", ) - status = parser.add_mutually_exclusive_group() + status = parser.add_mutually_exclusive_group(required=True) status.add_argument( '--start', - action='store_true', - help='Start the cluster verification', - dest='is_start' + action='store_const', + const='START', + help='Start health verification for the cluster', + dest='status' + ) + status.add_argument( + '--show', + help='Show health of the cluster', + action='store_true' ) return parser @@ -594,20 +602,22 @@ class VerificationUpdateCluster(show.ShowOne): self.log.debug("take_action(%s)" % parsed_args) client = self.app.client_manager.data_processing - cluster_id = utils.get_resource_id( - client.clusters, parsed_args.cluster) - - if parsed_args.is_start: - status = 'START' + if parsed_args.show: + data = utils.get_resource( + client.clusters, parsed_args.cluster).to_dict() + ver_data, ver_fields = _prepare_health_checks(data) + data = utils.prepare_data(ver_data, ver_fields) + return self.dict2columns(data) else: - raise exceptions.CommandError("--start should be provided") - data = client.clusters.verification_update( - cluster_id, status).cluster - - data, fields = _prepare_health_checks(data) - fields.extend(CLUSTER_FIELDS) - - _format_cluster_output(data) - data = utils.prepare_data(data, fields) + cluster_id = utils.get_resource_id( + client.clusters, parsed_args.cluster) + client.clusters.verification_update( + cluster_id, parsed_args.status) + if parsed_args.status == 'START': + print_status = 'started' + sys.stdout.write( + 'Cluster "{cluster}" health verification has been ' + '{status}.'.format(cluster=parsed_args.cluster, + status=print_status)) - return self.dict2columns(data) + return {}, {} diff --git a/saharaclient/tests/unit/osc/v1/test_clusters.py b/saharaclient/tests/unit/osc/v1/test_clusters.py index b7f6a6a..ba48993 100644 --- a/saharaclient/tests/unit/osc/v1/test_clusters.py +++ b/saharaclient/tests/unit/osc/v1/test_clusters.py @@ -50,7 +50,18 @@ CLUSTER_INFO = { "neutron_management_network": "net_id", "user_keypair_id": "test", "status": 'Active', - "default_image_id": "img_id" + "default_image_id": "img_id", + 'verification': { + 'status': 'GREEN', + 'id': 'ver_id', + 'cluster_id': 'cluster_id', + 'checks': [ + { + 'status': 'GREEN', + 'name': 'Some check' + } + ] + } } CT_INFO = { @@ -287,6 +298,34 @@ class TestShowCluster(TestClusters): '0.1') self.assertEqual(expected_data, data) + def test_cluster_show_verification(self): + arglist = ['fake', '--verification'] + verifylist = [('cluster', 'fake'), ('verification', True)] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + # Check that correct arguments were passed + self.cl_mock.find_unique.assert_called_once_with(name='fake') + + # Check that columns are correct + expected_columns = ('Anti affinity', 'Cluster template id', + 'Description', 'Health check (some check)', 'Id', + 'Image', 'Is protected', 'Is public', 'Name', + 'Neutron management network', 'Node groups', + 'Plugin name', 'Status', 'Use autoconfig', + 'User keypair id', 'Verification status', + 'Version') + self.assertEqual(expected_columns, columns) + + # Check that data is correct + expected_data = ('', 'ct_id', 'Cluster template for tests', 'GREEN', + 'cluster_id', 'img_id', False, False, 'fake', + 'net_id', 'fakeng:2', 'fake', 'Active', True, 'test', + 'GREEN', '0.1') + self.assertEqual(expected_data, data) + class TestDeleteCluster(TestClusters): def setUp(self): @@ -464,3 +503,46 @@ class TestScaleCluster(TestClusters): 'node_group_template_id': 'new_id', 'name': 'new'} ]}) + + +class TestVerificationUpdateCluster(TestClusters): + def setUp(self): + super(TestVerificationUpdateCluster, self).setUp() + self.cl_mock.find_unique.return_value = api_cl.Cluster( + None, CLUSTER_INFO) + self.cl_mock.verification_update.return_value = api_cl.Cluster( + None, CLUSTER_INFO) + + # Command to test + self.cmd = osc_cl.VerificationUpdateCluster(self.app, None) + + def test_verification_show(self): + arglist = ['fake', '--show'] + verifylist = [('cluster', 'fake'), ('show', True)] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + # Check that correct arguments were passed + self.cl_mock.find_unique.assert_called_once_with(name='fake') + + # Check that columns are correct + expected_columns = ('Health check (some check)', 'Verification status') + self.assertEqual(expected_columns, columns) + + # Check that data is correct + expected_data = ('GREEN', 'GREEN') + self.assertEqual(expected_data, data) + + def test_verification_start(self): + arglist = ['fake', '--start'] + verifylist = [('cluster', 'fake'), ('status', 'START')] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + # Check that correct arguments were passed + self.cl_mock.verification_update.assert_called_once_with( + 'cluster_id', 'START') -- cgit v1.2.1