From 29a0c5a5706a229dd4b3026d2c06b00f76ee6434 Mon Sep 17 00:00:00 2001 From: Artem Goncharov Date: Fri, 13 Dec 2019 12:11:37 +0100 Subject: [PATCH] Add get_osc_show_columns_for_sdk_resource function Move get_osc_show_columns_for_sdk_resource function, which is currently present in OSC (network and future image) here, to allow usage in separate plugins. Change-Id: Ib63cdb49caa639adb92d998053aae8a07da731cb --- osc_lib/tests/utils/test_utils.py | 45 ++++++++++++++++++ osc_lib/utils/__init__.py | 47 +++++++++++++++++++ .../notes/add_sdk_utils-d0c338eba682f2c8.yaml | 5 ++ 3 files changed, 97 insertions(+) create mode 100644 releasenotes/notes/add_sdk_utils-d0c338eba682f2c8.yaml diff --git a/osc_lib/tests/utils/test_utils.py b/osc_lib/tests/utils/test_utils.py index b6bdbf6..82b8b46 100644 --- a/osc_lib/tests/utils/test_utils.py +++ b/osc_lib/tests/utils/test_utils.py @@ -843,3 +843,48 @@ class TestAssertItemEqual(test_utils.TestCommand): format_columns.ListColumn(['x', 'y', 'z'])] ] self.assertListItemEqual(expected, actual) + + +class TestSDKUtils(test_utils.TestCase): + + def setUp(self): + super(TestSDKUtils, self).setUp() + + def _test_get_osc_show_columns_for_sdk_resource( + self, sdk_resource, column_map, + expected_display_columns, expected_attr_columns): + display_columns, attr_columns = \ + utils.get_osc_show_columns_for_sdk_resource( + sdk_resource, column_map) + self.assertEqual(expected_display_columns, display_columns) + self.assertEqual(expected_attr_columns, attr_columns) + + def test_get_osc_show_columns_for_sdk_resource_empty(self): + self._test_get_osc_show_columns_for_sdk_resource( + {}, {}, tuple(), tuple()) + + def test_get_osc_show_columns_for_sdk_resource_empty_map(self): + self._test_get_osc_show_columns_for_sdk_resource( + {'foo': 'foo1'}, {}, + ('foo',), ('foo',)) + + def test_get_osc_show_columns_for_sdk_resource_empty_data(self): + self._test_get_osc_show_columns_for_sdk_resource( + {}, {'foo': 'foo_map'}, + ('foo_map',), ('foo_map',)) + + def test_get_osc_show_columns_for_sdk_resource_map(self): + self._test_get_osc_show_columns_for_sdk_resource( + {'foo': 'foo1'}, {'foo': 'foo_map'}, + ('foo_map',), ('foo',)) + + def test_get_osc_show_columns_for_sdk_resource_map_dup(self): + self._test_get_osc_show_columns_for_sdk_resource( + {'foo': 'foo1', 'foo_map': 'foo1'}, {'foo': 'foo_map'}, + ('foo_map',), ('foo',)) + + def test_get_osc_show_columns_for_sdk_resource_map_full(self): + self._test_get_osc_show_columns_for_sdk_resource( + {'foo': 'foo1', 'bar': 'bar1'}, + {'foo': 'foo_map', 'new': 'bar'}, + ('bar', 'foo_map'), ('bar', 'foo')) diff --git a/osc_lib/utils/__init__.py b/osc_lib/utils/__init__.py index 8d11ca5..9467601 100644 --- a/osc_lib/utils/__init__.py +++ b/osc_lib/utils/__init__.py @@ -713,3 +713,50 @@ def wait_for_status(status_f, callback(progress) time.sleep(sleep_time) return retval + + +def get_osc_show_columns_for_sdk_resource( + sdk_resource, + osc_column_map, + invisible_columns=None +): + """Get and filter the display and attribute columns for an SDK resource. + + Common utility function for preparing the output of an OSC show command. + Some of the columns may need to get renamed, others made invisible. + + :param sdk_resource: An SDK resource + :param osc_column_map: A hash of mappings for display column names + :param invisible_columns: A list of invisible column names + + :returns: Two tuples containing the names of the display and attribute + columns + """ + + if getattr(sdk_resource, 'allow_get', None) is not None: + resource_dict = sdk_resource.to_dict( + body=True, headers=False, ignore_none=False) + else: + resource_dict = sdk_resource + + # Build the OSC column names to display for the SDK resource. + attr_map = {} + display_columns = list(resource_dict.keys()) + invisible_columns = [] if invisible_columns is None else invisible_columns + for col_name in invisible_columns: + if col_name in display_columns: + display_columns.remove(col_name) + for sdk_attr, osc_attr in osc_column_map.items(): + if sdk_attr in display_columns: + attr_map[osc_attr] = sdk_attr + display_columns.remove(sdk_attr) + if osc_attr not in display_columns: + display_columns.append(osc_attr) + sorted_display_columns = sorted(display_columns) + + # Build the SDK attribute names for the OSC column names. + attr_columns = [] + for column in sorted_display_columns: + new_column = attr_map[column] if column in attr_map else column + attr_columns.append(new_column) + return tuple(sorted_display_columns), tuple(attr_columns) diff --git a/releasenotes/notes/add_sdk_utils-d0c338eba682f2c8.yaml b/releasenotes/notes/add_sdk_utils-d0c338eba682f2c8.yaml new file mode 100644 index 0000000..04130c2 --- /dev/null +++ b/releasenotes/notes/add_sdk_utils-d0c338eba682f2c8.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Integrate get_osc_show_columns_for_sdk_resource function to ease showing + SDK resources.