From dd21b7aa0b71b40d59bc10e77361b94d266ed33d Mon Sep 17 00:00:00 2001 From: tengqm Date: Fri, 29 Jul 2016 02:15:56 -0400 Subject: [PATCH] Update senlinclient for new sdk version This patch fixes problem found after sdk version 0.9.1 which includes a new implementation of senlin cluster resources. Change-Id: I67b265731f34080df85233dac09c1256f43aecdb --- releasenotes/source/conf.py | 4 +- senlinclient/common/utils.py | 2 +- senlinclient/shell.py | 4 +- senlinclient/tests/unit/v1/test_action.py | 4 +- senlinclient/tests/unit/v1/test_build_info.py | 4 +- senlinclient/tests/unit/v1/test_cluster.py | 15 ++++--- .../tests/unit/v1/test_cluster_policy.py | 7 ++-- senlinclient/tests/unit/v1/test_event.py | 12 +++--- senlinclient/tests/unit/v1/test_node.py | 14 +++---- senlinclient/tests/unit/v1/test_policy.py | 14 +++---- .../tests/unit/v1/test_policy_type.py | 14 ++----- senlinclient/tests/unit/v1/test_profile.py | 31 +++++++------- .../tests/unit/v1/test_profile_type.py | 17 ++------ senlinclient/tests/unit/v1/test_receiver.py | 14 +++---- senlinclient/tests/unit/v1/test_shell.py | 9 ++-- senlinclient/v1/action.py | 8 ++-- senlinclient/v1/build_info.py | 9 ++-- senlinclient/v1/client.py | 8 ++++ senlinclient/v1/cluster.py | 5 ++- senlinclient/v1/cluster_policy.py | 8 ++-- senlinclient/v1/event.py | 14 +++---- senlinclient/v1/node.py | 10 ++--- senlinclient/v1/policy_type.py | 5 ++- senlinclient/v1/profile_type.py | 5 ++- senlinclient/v1/receiver.py | 5 ++- senlinclient/v1/shell.py | 42 +++++++++++++++---- tox.ini | 1 + 27 files changed, 157 insertions(+), 128 deletions(-) diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py index 5a2629fd..ca940a79 100644 --- a/releasenotes/source/conf.py +++ b/releasenotes/source/conf.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +import pbr.version + # Senlin Release Notes documentation build configuration file, created by # sphinx-quickstart on Tue Nov 3 17:40:50 2015. # @@ -63,7 +65,7 @@ copyright = u'2015, Senlin Developers' # built documents. # # The short X.Y version. -import pbr.version + senlin_version = pbr.version.VersionInfo('python-muranoclient') # The full version, including alpha/beta/rc tags. release = senlin_version.version_string_with_vcs() diff --git a/senlinclient/common/utils.py b/senlinclient/common/utils.py index bbdd52e3..d30890bd 100644 --- a/senlinclient/common/utils.py +++ b/senlinclient/common/utils.py @@ -240,7 +240,7 @@ def process_stack_spec(spec): new_spec = { # TODO(Qiming): add context support 'disable_rollback': spec.get('disable_rollback', True), - 'context': spec.get('context', {}), + 'context': spec.get('context', {}), 'parameters': spec.get('parameters', {}), 'timeout': spec.get('timeout', 60), 'template': template, diff --git a/senlinclient/shell.py b/senlinclient/shell.py index 59549825..64969c90 100644 --- a/senlinclient/shell.py +++ b/senlinclient/shell.py @@ -181,8 +181,8 @@ class SenlinShell(object): raise exc.CommandError(msg) # project name or ID is needed, or else sdk may find the wrong project - if (not (args.project_id or args.project_name or args.tenant_id - or args.tenant_name)): + if (not (args.project_id or args.project_name or args.tenant_id or + args.tenant_name)): if not (args.user_id): msg = _('Either project/tenant ID or project/tenant name ' 'must be specified, or else Senlin cannot know ' diff --git a/senlinclient/tests/unit/v1/test_action.py b/senlinclient/tests/unit/v1/test_action.py index 21927dc4..a419c253 100644 --- a/senlinclient/tests/unit/v1/test_action.py +++ b/senlinclient/tests/unit/v1/test_action.py @@ -159,7 +159,7 @@ class TestActionList(TestAction): class TestActionShow(TestAction): - get_response = { + response = { "action": "CLUSTER_DELETE", "cause": "RPC Request", "context": {}, @@ -184,7 +184,7 @@ class TestActionShow(TestAction): super(TestActionShow, self).setUp() self.cmd = osc_action.ShowAction(self.app, None) self.mock_client.get_action = mock.Mock( - return_value=sdk_action.Action(attrs=self.get_response)) + return_value=sdk_action.Action(**self.response)) def test_action_show(self): arglist = ['my_action'] diff --git a/senlinclient/tests/unit/v1/test_build_info.py b/senlinclient/tests/unit/v1/test_build_info.py index ba787742..d49344c8 100644 --- a/senlinclient/tests/unit/v1/test_build_info.py +++ b/senlinclient/tests/unit/v1/test_build_info.py @@ -12,7 +12,7 @@ import mock -from openstack.cluster.v1 import build_info as sdk_build_info +from openstack.cluster.v1 import build_info as sbi from senlinclient.tests.unit.v1 import fakes from senlinclient.v1 import build_info as osc_build_info @@ -33,7 +33,7 @@ class TestBuildInfo(fakes.TestClusteringv1): self.cmd = osc_build_info.BuildInfo(self.app, None) self.mock_client = self.app.client_manager.clustering self.mock_client.get_build_info = mock.Mock( - return_value=sdk_build_info.BuildInfo(None, self.response)) + return_value=sbi.BuildInfo(**self.response['build_info'])) def test_build_info(self): arglist = [] diff --git a/senlinclient/tests/unit/v1/test_cluster.py b/senlinclient/tests/unit/v1/test_cluster.py index 6495ea06..c0e68756 100644 --- a/senlinclient/tests/unit/v1/test_cluster.py +++ b/senlinclient/tests/unit/v1/test_cluster.py @@ -147,7 +147,7 @@ class TestClusterList(TestCluster): class TestClusterShow(TestCluster): - get_response = {"cluster": { + response = {"cluster": { "created_at": "2015-02-11T15:13:20", "data": {}, "desired_capacity": 0, @@ -174,8 +174,7 @@ class TestClusterShow(TestCluster): super(TestClusterShow, self).setUp() self.cmd = osc_cluster.ShowCluster(self.app, None) self.mock_client.get_cluster = mock.Mock( - return_value=sdk_cluster.Cluster( - attrs=self.get_response['cluster'])) + return_value=sdk_cluster.Cluster(**self.response['cluster'])) def test_cluster_show(self): arglist = ['my_cluster'] @@ -231,9 +230,9 @@ class TestClusterCreate(TestCluster): super(TestClusterCreate, self).setUp() self.cmd = osc_cluster.CreateCluster(self.app, None) self.mock_client.create_cluster = mock.Mock( - return_value=sdk_cluster.Cluster(attrs=self.response['cluster'])) + return_value=sdk_cluster.Cluster(**self.response['cluster'])) self.mock_client.get_cluster = mock.Mock( - return_value=sdk_cluster.Cluster(attrs=self.response['cluster'])) + return_value=sdk_cluster.Cluster(**self.response['cluster'])) def test_cluster_create_defaults(self): arglist = ['test_cluster', '--profile', 'mystack'] @@ -301,11 +300,11 @@ class TestClusterUpdate(TestCluster): super(TestClusterUpdate, self).setUp() self.cmd = osc_cluster.UpdateCluster(self.app, None) self.mock_client.update_cluster = mock.Mock( - return_value=sdk_cluster.Cluster(attrs=self.response['cluster'])) + return_value=sdk_cluster.Cluster(**self.response['cluster'])) self.mock_client.get_cluster = mock.Mock( - return_value=sdk_cluster.Cluster(attrs=self.response['cluster'])) + return_value=sdk_cluster.Cluster(**self.response['cluster'])) self.mock_client.find_cluster = mock.Mock( - return_value=sdk_cluster.Cluster(attrs=self.response['cluster'])) + return_value=sdk_cluster.Cluster(**self.response['cluster'])) def test_cluster_update_defaults(self): arglist = ['--name', 'new_cluster', '--metadata', 'nk1=nv1;nk2=nv2', diff --git a/senlinclient/tests/unit/v1/test_cluster_policy.py b/senlinclient/tests/unit/v1/test_cluster_policy.py index c0345528..568617fd 100644 --- a/senlinclient/tests/unit/v1/test_cluster_policy.py +++ b/senlinclient/tests/unit/v1/test_cluster_policy.py @@ -12,7 +12,7 @@ import mock -from openstack.cluster.v1 import cluster_policy as sdk_cluster_policy +from openstack.cluster.v1 import cluster_policy as scp from senlinclient.tests.unit.v1 import fakes from senlinclient.v1 import cluster_policy as osc_cluster_policy @@ -76,7 +76,7 @@ class TestClusterPolicyList(TestClusterPolicy): class TestClusterPolicyShow(TestClusterPolicy): - get_response = {"cluster_policy": { + response = {"cluster_policy": { "cluster_id": "7d85f602-a948-4a30-afd4-e84f47471c15", "cluster_name": "my_cluster", "enabled": True, @@ -90,8 +90,7 @@ class TestClusterPolicyShow(TestClusterPolicy): super(TestClusterPolicyShow, self).setUp() self.cmd = osc_cluster_policy.ClusterPolicyShow(self.app, None) self.mock_client.get_cluster_policy = mock.Mock( - return_value=sdk_cluster_policy.ClusterPolicy(None, - self.get_response)) + return_value=scp.ClusterPolicy(**self.response['cluster_policy'])) def test_cluster_policy_show(self): arglist = ['--policy', 'my_policy', 'my_cluster'] diff --git a/senlinclient/tests/unit/v1/test_event.py b/senlinclient/tests/unit/v1/test_event.py index 7cd2f6a4..0014107d 100644 --- a/senlinclient/tests/unit/v1/test_event.py +++ b/senlinclient/tests/unit/v1/test_event.py @@ -60,7 +60,7 @@ class TestEventList(TestEvent): super(TestEventList, self).setUp() self.cmd = osc_event.ListEvent(self.app, None) self.mock_client.events = mock.Mock( - return_value=sdk_event.Event(None, {})) + return_value=[sdk_event.Event(**self.response['events'][0])]) def test_event_list_defaults(self): arglist = [] @@ -95,8 +95,7 @@ class TestEventList(TestEvent): self.assertEqual(self.columns, columns) def test_event_list_sort_invalid_key(self): - self.mock_client.events = mock.Mock( - return_value=self.response) + self.mock_client.events = mock.Mock(return_value=self.response) kwargs = copy.deepcopy(self.defaults) kwargs['sort'] = 'bad_key' arglist = ['--sort', 'bad_key'] @@ -106,8 +105,7 @@ class TestEventList(TestEvent): self.cmd.take_action, parsed_args) def test_event_list_sort_invalid_direction(self): - self.mock_client.events = mock.Mock( - return_value=self.response) + self.mock_client.events = mock.Mock(return_value=self.response) kwargs = copy.deepcopy(self.defaults) kwargs['sort'] = 'name:bad_direction' arglist = ['--sort', 'name:bad_direction'] @@ -136,7 +134,7 @@ class TestEventList(TestEvent): class TestEventShow(TestEvent): - get_response = {"event": { + response = {"event": { "action": "create", "cluster_id": 'null', "id": "2d255b9c-8f36-41a2-a137-c0175ccc29c3", @@ -155,7 +153,7 @@ class TestEventShow(TestEvent): super(TestEventShow, self).setUp() self.cmd = osc_event.ShowEvent(self.app, None) self.mock_client.get_event = mock.Mock( - return_value=sdk_event.Event(None, self.get_response)) + return_value=sdk_event.Event(**self.response['event'])) def test_event_show(self): arglist = ['my_event'] diff --git a/senlinclient/tests/unit/v1/test_node.py b/senlinclient/tests/unit/v1/test_node.py index 6bfdadaf..a412fd3f 100644 --- a/senlinclient/tests/unit/v1/test_node.py +++ b/senlinclient/tests/unit/v1/test_node.py @@ -144,7 +144,7 @@ class TestNodeList(TestNode): class TestNodeShow(TestNode): - get_response = {"node": { + response = {"node": { "cluster_id": None, "created_at": "2015-02-10T12:03:16", "data": {}, @@ -171,7 +171,7 @@ class TestNodeShow(TestNode): super(TestNodeShow, self).setUp() self.cmd = osc_node.ShowNode(self.app, None) self.mock_client.get_node = mock.Mock( - return_value=sdk_node.Node(attrs=self.get_response['node'])) + return_value=sdk_node.Node(**self.response['node'])) def test_node_show(self): arglist = ['my_node'] @@ -230,9 +230,9 @@ class TestNodeCreate(TestNode): super(TestNodeCreate, self).setUp() self.cmd = osc_node.CreateNode(self.app, None) self.mock_client.create_node = mock.Mock( - return_value=sdk_node.Node(attrs=self.response['node'])) + return_value=sdk_node.Node(**self.response['node'])) self.mock_client.get_node = mock.Mock( - return_value=sdk_node.Node(attrs=self.response['node'])) + return_value=sdk_node.Node(**self.response['node'])) def test_node_create_defaults(self): arglist = ['my_node', '--profile', 'mystack'] @@ -305,11 +305,11 @@ class TestNodeUpdate(TestNode): super(TestNodeUpdate, self).setUp() self.cmd = osc_node.UpdateNode(self.app, None) self.mock_client.update_node = mock.Mock( - return_value=sdk_node.Node(attrs=self.response['node'])) + return_value=sdk_node.Node(**self.response['node'])) self.mock_client.get_node = mock.Mock( - return_value=sdk_node.Node(attrs=self.response['node'])) + return_value=sdk_node.Node(**self.response['node'])) self.mock_client.find_node = mock.Mock( - return_value=sdk_node.Node(attrs=self.response['node'])) + return_value=sdk_node.Node(**self.response['node'])) def test_node_update_defaults(self): arglist = ['--name', 'new_node', '--metadata', 'nk1=nv1;nk2=nv2', diff --git a/senlinclient/tests/unit/v1/test_policy.py b/senlinclient/tests/unit/v1/test_policy.py index 350a7d96..079a74b7 100644 --- a/senlinclient/tests/unit/v1/test_policy.py +++ b/senlinclient/tests/unit/v1/test_policy.py @@ -141,7 +141,7 @@ class TestPolicyList(TestPolicy): class TestPolicyShow(TestPolicy): - get_response = {"policy": { + response = {"policy": { "created_at": "2015-03-02T07:40:31", "data": {}, "domain": 'null', @@ -170,7 +170,7 @@ class TestPolicyShow(TestPolicy): super(TestPolicyShow, self).setUp() self.cmd = osc_policy.ShowPolicy(self.app, None) self.mock_client.get_policy = mock.Mock( - return_value=sdk_policy.Policy(attrs=self.get_response['policy'])) + return_value=sdk_policy.Policy(**self.response['policy'])) def test_policy_show(self): arglist = ['sp001'] @@ -230,9 +230,9 @@ class TestPolicyCreate(TestPolicy): super(TestPolicyCreate, self).setUp() self.cmd = osc_policy.CreatePolicy(self.app, None) self.mock_client.create_policy = mock.Mock( - return_value=sdk_policy.Policy(attrs=self.response['policy'])) + return_value=sdk_policy.Policy(**self.response['policy'])) self.mock_client.get_policy = mock.Mock( - return_value=sdk_policy.Policy(attrs=self.response['policy'])) + return_value=sdk_policy.Policy(**self.response['policy'])) def test_policy_create_defaults(self): arglist = ['my_policy', '--spec-file', self.spec_path] @@ -274,11 +274,11 @@ class TestPolicyUpdate(TestPolicy): super(TestPolicyUpdate, self).setUp() self.cmd = osc_policy.UpdatePolicy(self.app, None) self.mock_client.update_policy = mock.Mock( - return_value=sdk_policy.Policy(attrs=self.response['policy'])) + return_value=sdk_policy.Policy(**self.response['policy'])) self.mock_client.get_policy = mock.Mock( - return_value=sdk_policy.Policy(attrs=self.response['policy'])) + return_value=sdk_policy.Policy(**self.response['policy'])) self.mock_client.find_policy = mock.Mock( - return_value=sdk_policy.Policy(attrs=self.response['policy'])) + return_value=sdk_policy.Policy(**self.response['policy'])) def test_policy_update_defaults(self): arglist = ['--name', 'new_policy', '9f779ddf'] diff --git a/senlinclient/tests/unit/v1/test_policy_type.py b/senlinclient/tests/unit/v1/test_policy_type.py index 956dc164..aac5c6fc 100644 --- a/senlinclient/tests/unit/v1/test_policy_type.py +++ b/senlinclient/tests/unit/v1/test_policy_type.py @@ -29,15 +29,9 @@ class TestPolicyType(fakes.TestClusteringv1): class TestPolicyTypeList(TestPolicyType): expected_columns = ['name'] list_response = [ - sdk_policy_type.PolicyType({'name': 'BBB', - 'schema': { - 'foo': 'bar'}}), - sdk_policy_type.PolicyType({'name': 'AAA', - 'schema': { - 'foo': 'bar'}}), - sdk_policy_type.PolicyType({'name': 'CCC', - 'schema': { - 'foo': 'bar'}}), + sdk_policy_type.PolicyType(name='BBB', schema={'foo': 'bar'}), + sdk_policy_type.PolicyType(name='AAA', schema={'foo': 'bar'}), + sdk_policy_type.PolicyType(name='CCC', schema={'foo': 'bar'}), ] expected_rows = [ ['AAA'], @@ -71,7 +65,7 @@ class TestPolicyTypeShow(TestPolicyType): super(TestPolicyTypeShow, self).setUp() self.cmd = osc_policy_type.PolicyTypeShow(self.app, None) self.mock_client.get_policy_type = mock.Mock( - return_value=sdk_policy_type.PolicyType(self.response) + return_value=sdk_policy_type.PolicyType(**self.response) ) def test_policy_type_show(self): diff --git a/senlinclient/tests/unit/v1/test_profile.py b/senlinclient/tests/unit/v1/test_profile.py index d84e0d02..5b4d0a4d 100644 --- a/senlinclient/tests/unit/v1/test_profile.py +++ b/senlinclient/tests/unit/v1/test_profile.py @@ -30,7 +30,7 @@ class TestProfile(fakes.TestClusteringv1): class TestProfileShow(TestProfile): - get_response = {"profile": { + response = {"profile": { "created_at": "2015-03-01T14:28:25", "domain": 'false', "id": "7fa885cd-fa39-4531-a42d-780af95c84a4", @@ -92,8 +92,7 @@ class TestProfileShow(TestProfile): super(TestProfileShow, self).setUp() self.cmd = osc_profile.ShowProfile(self.app, None) self.mock_client.get_profile = mock.Mock( - return_value=sdk_profile.Profile( - attrs=self.get_response['profile'])) + return_value=sdk_profile.Profile(**self.response['profile'])) utils.get_dict_properties = mock.Mock(return_value='') def test_profile_show(self): @@ -305,13 +304,15 @@ class TestProfileCreate(TestProfile): "updated_at": None, "user": "2d7aca950f3e465d8ef0c81720faf6ff"}} - defaults = {"spec": { - "version": 1.0, - "type": "os.nova.server", - "properties": { - "flavor": 1, - "name": "cirros_server", - "image": "cirros-0.3.4-x86_64-uec"} + defaults = { + "spec": { + "version": 1.0, + "type": "os.nova.server", + "properties": { + "flavor": 1, + "name": "cirros_server", + "image": "cirros-0.3.4-x86_64-uec" + }, }, "name": "my_profile", "metadata": {} @@ -321,9 +322,9 @@ class TestProfileCreate(TestProfile): super(TestProfileCreate, self).setUp() self.cmd = osc_profile.CreateProfile(self.app, None) self.mock_client.create_profile = mock.Mock( - return_value=sdk_profile.Profile(attrs=self.response['profile'])) + return_value=sdk_profile.Profile(**self.response['profile'])) self.mock_client.get_profile = mock.Mock( - return_value=sdk_profile.Profile(attrs=self.response['profile'])) + return_value=sdk_profile.Profile(**self.response['profile'])) utils.get_dict_properties = mock.Mock(return_value='') def test_profile_create_defaults(self): @@ -376,11 +377,11 @@ class TestProfileUpdate(TestProfile): super(TestProfileUpdate, self).setUp() self.cmd = osc_profile.UpdateProfile(self.app, None) self.mock_client.update_profile = mock.Mock( - return_value=sdk_profile.Profile(attrs=self.response['profile'])) + return_value=sdk_profile.Profile(**self.response['profile'])) self.mock_client.get_profile = mock.Mock( - return_value=sdk_profile.Profile(attrs=self.response['profile'])) + return_value=sdk_profile.Profile(**self.response['profile'])) self.mock_client.find_profile = mock.Mock( - return_value=sdk_profile.Profile(attrs=self.response['profile'])) + return_value=sdk_profile.Profile(**self.response['profile'])) utils.get_dict_properties = mock.Mock(return_value='') def test_profile_update_defaults(self): diff --git a/senlinclient/tests/unit/v1/test_profile_type.py b/senlinclient/tests/unit/v1/test_profile_type.py index 5a1fa0fa..9a5aa393 100644 --- a/senlinclient/tests/unit/v1/test_profile_type.py +++ b/senlinclient/tests/unit/v1/test_profile_type.py @@ -29,18 +29,9 @@ class TestProfileType(fakes.TestClusteringv1): class TestProfileTypeList(TestProfileType): expected_columns = ['name'] list_response = [ - sdk_profile_type.ProfileType({'name': 'BBB', - 'schema': { - 'foo': 'bar'}} - ), - sdk_profile_type.ProfileType({'name': 'AAA', - 'schema': { - 'foo': 'bar'}} - ), - sdk_profile_type.ProfileType({'name': 'CCC', - 'schema': { - 'foo': 'bar'}} - ), + sdk_profile_type.ProfileType(name='BBB', schema={'foo': 'bar'}), + sdk_profile_type.ProfileType(name='AAA', schema={'foo': 'bar'}), + sdk_profile_type.ProfileType(name='CCC', schema={'foo': 'bar'}), ] expected_rows = [ ['AAA'], @@ -74,7 +65,7 @@ class TestProfileTypeShow(TestProfileType): super(TestProfileTypeShow, self).setUp() self.cmd = osc_profile_type.ProfileTypeShow(self.app, None) self.mock_client.get_profile_type = mock.Mock( - return_value=sdk_profile_type.ProfileType(self.response) + return_value=sdk_profile_type.ProfileType(**self.response) ) def test_profile_type_show(self): diff --git a/senlinclient/tests/unit/v1/test_receiver.py b/senlinclient/tests/unit/v1/test_receiver.py index 053bdc79..6c141755 100644 --- a/senlinclient/tests/unit/v1/test_receiver.py +++ b/senlinclient/tests/unit/v1/test_receiver.py @@ -67,8 +67,7 @@ class TestReceiverList(TestReceiver): def setUp(self): super(TestReceiverList, self).setUp() self.cmd = osc_receiver.ListReceiver(self.app, None) - self.mock_client.receivers = mock.Mock( - return_value=self.response) + self.mock_client.receivers = mock.Mock(return_value=self.response) def test_receiver_list_defaults(self): arglist = [] @@ -172,9 +171,8 @@ class TestReceiverShow(TestReceiver): def setUp(self): super(TestReceiverShow, self).setUp() self.cmd = osc_receiver.ShowReceiver(self.app, None) - self.mock_client.get_receiver = mock.Mock( - return_value=sdk_receiver.Receiver( - attrs=self.get_response['receiver'])) + x_receiver = sdk_receiver.Receiver(**self.get_response['receiver']) + self.mock_client.get_receiver = mock.Mock(return_value=x_receiver) def test_receiver_show(self): arglist = ['my_receiver'] @@ -231,11 +229,9 @@ class TestReceiverCreate(TestReceiver): super(TestReceiverCreate, self).setUp() self.cmd = osc_receiver.CreateReceiver(self.app, None) self.mock_client.create_receiver = mock.Mock( - return_value=sdk_receiver.Receiver( - attrs=self.response['receiver'])) + return_value=sdk_receiver.Receiver(**self.response['receiver'])) self.mock_client.get_receiver = mock.Mock( - return_value=sdk_receiver.Receiver( - attrs=self.response['receiver'])) + return_value=sdk_receiver.Receiver(**self.response['receiver'])) def test_receiver_create(self): arglist = ['my_receiver', '--action', 'CLUSTER_SCALE_OUT', diff --git a/senlinclient/tests/unit/v1/test_shell.py b/senlinclient/tests/unit/v1/test_shell.py index e2d1ef22..28596a4b 100644 --- a/senlinclient/tests/unit/v1/test_shell.py +++ b/senlinclient/tests/unit/v1/test_shell.py @@ -66,8 +66,9 @@ class ShellTest(testtools.TestCase): 'api': utils.json_formatter, 'engine': utils.json_formatter, } - mock_print.assert_called_once_with(result, formatters=formatters) - self.assertTrue(service.get_build_info.called) + mock_print.assert_called_once_with(result.to_dict(), + formatters=formatters) + service.get_build_info.assert_called_once_with() @mock.patch.object(utils, 'print_list') def test_do_profile_type_list(self, mock_print): @@ -1104,7 +1105,7 @@ class ShellTest(testtools.TestCase): sh._show_node(service, node_id, show_details=False) - service.get_node.assert_called_once_with(node_id, args=None) + service.get_node.assert_called_once_with(node_id, details=False) mock_print.assert_called_once_with(data, formatters=formatters) @mock.patch.object(sh, '_show_node') @@ -1232,7 +1233,7 @@ class ShellTest(testtools.TestCase): def test_do_event_list(self, mock_print): service = mock.Mock() fields = ['id', 'timestamp', 'obj_type', 'obj_id', 'obj_name', - 'action', 'status', 'status_reason', 'level'] + 'action', 'status', 'level', 'cluster_id'] args = { 'sort': 'timestamp:asc', 'limit': 20, diff --git a/senlinclient/v1/action.py b/senlinclient/v1/action.py index 2ab4a3a4..5f176eec 100644 --- a/senlinclient/v1/action.py +++ b/senlinclient/v1/action.py @@ -104,7 +104,8 @@ class ListAction(lister.Lister): return ( columns, - (utils.get_item_properties(a, columns, formatters=formatters) + (utils.get_item_properties(a.to_dict(), columns, + formatters=formatters) for a in actions) ) @@ -141,6 +142,7 @@ class ShowAction(show.ShowOne): 'depends_on': senlin_utils.list_formatter, 'depended_by': senlin_utils.list_formatter, } - columns = sorted(list(six.iterkeys(action))) - return columns, utils.get_dict_properties(action.to_dict(), columns, + data = action.to_dict() + columns = sorted(list(six.iterkeys(data))) + return columns, utils.get_dict_properties(data, columns, formatters=formatters) diff --git a/senlinclient/v1/build_info.py b/senlinclient/v1/build_info.py index 9de5dca8..af0100d3 100644 --- a/senlinclient/v1/build_info.py +++ b/senlinclient/v1/build_info.py @@ -13,7 +13,6 @@ """Clustering v1 build_info action implementations""" import logging -import six from cliff import show from openstackclient.common import utils @@ -40,6 +39,10 @@ class BuildInfo(show.ShowOne): 'api': senlin_utils.json_formatter, 'engine': senlin_utils.json_formatter, } - columns = sorted(list(six.iterkeys(result))) - return columns, utils.get_dict_properties(result.to_dict(), columns, + data = { + 'api': result.api, + 'engine': result.engine, + } + columns = ['api', 'engine'] + return columns, utils.get_dict_properties(data, columns, formatters=formatters) diff --git a/senlinclient/v1/client.py b/senlinclient/v1/client.py index 4667fa9e..444dfe72 100644 --- a/senlinclient/v1/client.py +++ b/senlinclient/v1/client.py @@ -263,6 +263,14 @@ class Client(object): """ return self.service.cluster_update_policy(cluster, policy, **attrs) + def cluster_collect(self, cluster, path): + """Resize cluster + + Doc link: + http://developer.openstack.org/api-ref-clustering-v1.html#clusterAction + """ + return self.service.cluster_collect(cluster, path) + def check_cluster(self, cluster, **params): """Check cluster's health status diff --git a/senlinclient/v1/cluster.py b/senlinclient/v1/cluster.py index ebb0a6dc..dca6842c 100644 --- a/senlinclient/v1/cluster.py +++ b/senlinclient/v1/cluster.py @@ -137,8 +137,9 @@ def _show_cluster(senlin_client, cluster_id): 'metadata': senlin_utils.json_formatter, 'nodes': senlin_utils.list_formatter } - columns = sorted(list(six.iterkeys(cluster))) - return columns, utils.get_dict_properties(cluster.to_dict(), columns, + data = cluster.to_dict() + columns = sorted(list(six.iterkeys(data))) + return columns, utils.get_dict_properties(data, columns, formatters=formatters) diff --git a/senlinclient/v1/cluster_policy.py b/senlinclient/v1/cluster_policy.py index e7462f26..9abf20f8 100644 --- a/senlinclient/v1/cluster_policy.py +++ b/senlinclient/v1/cluster_policy.py @@ -83,7 +83,8 @@ class ClusterPolicyList(lister.Lister): } return ( columns, - (utils.get_item_properties(p, columns, formatters=formatters) + (utils.get_item_properties(p.to_dict(), columns, + formatters=formatters) for p in policies) ) @@ -113,8 +114,9 @@ class ClusterPolicyShow(show.ShowOne): senlin_client = self.app.client_manager.clustering policy = senlin_client.get_cluster_policy(parsed_args.policy, parsed_args.cluster) - columns = sorted(list(six.iterkeys(policy))) - return columns, utils.get_dict_properties(policy.to_dict(), columns) + data = policy.to_dict() + columns = sorted(list(six.iterkeys(data))) + return columns, utils.get_dict_properties(data, columns) class ClusterPolicyUpdate(command.Command): diff --git a/senlinclient/v1/event.py b/senlinclient/v1/event.py index cc2ee8bc..68ade48c 100644 --- a/senlinclient/v1/event.py +++ b/senlinclient/v1/event.py @@ -99,11 +99,10 @@ class ListEvent(lister.Lister): formatters['obj_id'] = lambda x: x[:8] if x else '' events = senlin_client.events(**queries) - return ( - columns, - (utils.get_item_properties(e, columns, formatters=formatters) - for e in events) - ) + return (columns, + (utils.get_item_properties(e.to_dict(), columns, + formatters=formatters) + for e in events)) class ShowEvent(show.ShowOne): @@ -129,5 +128,6 @@ class ShowEvent(show.ShowOne): except sdk_exc.ResourceNotFound: raise exc.CommandError(_("Event not found: %s") % parsed_args.event) - columns = sorted(list(six.iterkeys(event))) - return columns, utils.get_dict_properties(event.to_dict(), columns) + data = event.to_dict() + columns = sorted(list(six.iterkeys(data))) + return columns, utils.get_dict_properties(data, columns) diff --git a/senlinclient/v1/node.py b/senlinclient/v1/node.py index 9e2ac63e..2627763f 100644 --- a/senlinclient/v1/node.py +++ b/senlinclient/v1/node.py @@ -158,12 +158,12 @@ def _show_node(senlin_client, node_id, show_details=False): 'metadata': senlin_utils.json_formatter, 'data': senlin_utils.json_formatter, } - if show_details and node: + data = node.to_dict() + if show_details: formatters['details'] = senlin_utils.nested_dict_formatter( - list(node['details'].keys()), ['property', 'value']) - - columns = sorted(list(six.iterkeys(node))) - return columns, utils.get_dict_properties(node.to_dict(), columns, + list(data['details'].keys()), ['property', 'value']) + columns = sorted(list(six.iterkeys(data))) + return columns, utils.get_dict_properties(data, columns, formatters=formatters) diff --git a/senlinclient/v1/policy_type.py b/senlinclient/v1/policy_type.py index 5df67d40..534ac13d 100644 --- a/senlinclient/v1/policy_type.py +++ b/senlinclient/v1/policy_type.py @@ -63,6 +63,7 @@ class PolicyTypeShow(format_utils.YamlFormat): except sdk_exc.ResourceNotFound: raise exc.CommandError(_('Policy Type not found: %s') % parsed_args.type_name) - rows = list(six.itervalues(res)) - columns = list(six.iterkeys(res)) + data = res.to_dict() + rows = list(six.itervalues(data)) + columns = list(six.iterkeys(data)) return columns, rows diff --git a/senlinclient/v1/profile_type.py b/senlinclient/v1/profile_type.py index 563dbd81..7dfbf3bd 100644 --- a/senlinclient/v1/profile_type.py +++ b/senlinclient/v1/profile_type.py @@ -63,6 +63,7 @@ class ProfileTypeShow(format_utils.YamlFormat): except sdk_exc.ResourceNotFound: raise exc.CommandError(_('Profile Type not found: %s') % parsed_args.type_name) - rows = list(six.itervalues(res)) - columns = list(six.iterkeys(res)) + data = res.to_dict() + rows = list(six.itervalues(data)) + columns = list(six.iterkeys(data)) return columns, rows diff --git a/senlinclient/v1/receiver.py b/senlinclient/v1/receiver.py index d8215bcf..98b1b9a9 100644 --- a/senlinclient/v1/receiver.py +++ b/senlinclient/v1/receiver.py @@ -142,8 +142,9 @@ def _show_receiver(senlin_client, receiver_id): 'params': senlin_utils.json_formatter, 'channel': senlin_utils.json_formatter, } - columns = sorted(list(six.iterkeys(receiver))) - return columns, utils.get_dict_properties(receiver.to_dict(), columns, + data = receiver.to_dict() + columns = sorted(list(six.iterkeys(data))) + return columns, utils.get_dict_properties(data, columns, formatters=formatters) diff --git a/senlinclient/v1/shell.py b/senlinclient/v1/shell.py index 6ef78e31..ce5ca7f6 100644 --- a/senlinclient/v1/shell.py +++ b/senlinclient/v1/shell.py @@ -36,7 +36,7 @@ def do_build_info(service, args=None): :param args: Additional command line arguments, if any. """ show_deprecated('senlin build-info', 'openstack cluster build info') - result = service.get_build_info() + result = service.get_build_info().to_dict() formatters = { 'api': utils.json_formatter, @@ -491,6 +491,33 @@ def do_cluster_create(service, args): _show_cluster(service, cluster.id) +@utils.arg('-p', '--path', metavar='', + help=_('A Json path string specifying the attribute to collect.')) +@utils.arg('-L', '--list', default=False, action="store_true", + help=_('Print a full list that contains both node ids and ' + 'attribute values instead of values only. Default is True.')) +@utils.arg('-F', '--full-id', default=False, action="store_true", + help=_('Print full IDs in list.')) +@utils.arg('id', metavar='', + help=_('Name or ID of cluster(s) to operate on.')) +def do_cluster_collect(service, args): + """Collect attributes across a cluster.""" + show_deprecated('senlin cluster-collect', 'openstack cluster collect') + + attrs = service.cluster_collect(args.id, args.path) + if args.list: + fields = ['node_id', 'value'] + formatters = { + 'value': utils.json_formatter + } + if not args.full_id: + formatters['node_id'] = lambda x: x.node_id[:8] + utils.print_list(attrs, fields, formatters=formatters) + else: + for attr in attrs: + print(attr.value) + + @utils.arg('id', metavar='', nargs='+', help=_('Name or ID of cluster(s) to delete.')) def do_cluster_delete(service, args): @@ -624,7 +651,7 @@ def do_cluster_node_del(service, args): @utils.arg('-t', '--min-step', metavar='', type=int, help=_('An integer specifying the number of nodes for adjustment ' 'when is specified.')) -@utils.arg('-s', '--strict', action='store_true', default=False, +@utils.arg('-s', '--strict', action='store_true', default=False, help=_('A boolean specifying whether the resize should be ' 'performed on a best-effort basis when the new capacity ' 'may go beyond size constraints.')) @@ -910,9 +937,8 @@ def do_node_list(service, args): def _show_node(service, node_id, show_details=False): """Show detailed info about the specified node.""" - args = {'show_details': True} if show_details else None try: - node = service.get_node(node_id, args=args) + node = service.get_node(node_id, details=show_details) except sdk_exc.ResourceNotFound: raise exc.CommandError(_('Node not found: %s') % node_id) @@ -923,7 +949,7 @@ def _show_node(service, node_id, show_details=False): data = node.to_dict() if show_details: formatters['details'] = utils.nested_dict_formatter( - list(node['details'].keys()), ['property', 'value']) + list(data['details'].keys()), ['property', 'value']) utils.print_dict(data, formatters=formatters) @@ -1203,7 +1229,7 @@ def do_event_list(service, args): """List events.""" show_deprecated('senlin event-list', 'openstack cluster event list') fields = ['id', 'timestamp', 'obj_type', 'obj_id', 'obj_name', 'action', - 'status', 'status_reason', 'level'] + 'status', 'level', 'cluster_id'] queries = { 'sort': args.sort, 'limit': args.limit, @@ -1218,6 +1244,8 @@ def do_event_list(service, args): if not args.full_id: formatters['id'] = lambda x: x.id[:8] formatters['obj_id'] = lambda x: x.obj_id[:8] if x.obj_id else '' + formatters['cluster_id'] = (lambda x: x.cluster_id[:8] + if x.cluster_id else '') events = service.events(**queries) utils.print_list(events, fields, formatters=formatters) @@ -1282,7 +1310,7 @@ def do_action_list(service, args): formatters['depended_by'] = f_depby else: formatters['id'] = lambda x: x.id[:8] - formatters['target'] = lambda x: x.target[:8] + formatters['target'] = lambda x: x.target_id[:8] f_depon = lambda x: '\n'.join(a[:8] for a in x.depends_on) f_depby = lambda x: '\n'.join(a[:8] for a in x.depended_by) formatters['depends_on'] = f_depon diff --git a/tox.ini b/tox.ini index 23c94bb9..54674bf1 100644 --- a/tox.ini +++ b/tox.ini @@ -35,6 +35,7 @@ commands= commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html [flake8] +ignore = D100,D101,D102,D103,D104,D105,D200,D201,D202,D204,D205,D300,D301,D400,D401 show-source = True exclude=.venv,.git,.tox,dist,*openstack/common*,*lib/python*,*egg,build max-complexity=20