From 5b30efba6fed7c70e5f0410a44eb7994ee6c9756 Mon Sep 17 00:00:00 2001 From: Darja Malyavkina Date: Mon, 3 Oct 2016 15:07:52 +0300 Subject: [PATCH] Add column 'glareType' in show artifact Change-Id: Id36a627cdd086f40fc79c18b06a77f56c4bad81a --- glareclient/osc/v1/artifacts.py | 55 ++++++++++++------ .../tests/unit/osc/v1/test_artifacts.py | 56 +++++++++---------- glareclient/v1/artifacts.py | 8 +++ 3 files changed, 72 insertions(+), 47 deletions(-) diff --git a/glareclient/osc/v1/artifacts.py b/glareclient/osc/v1/artifacts.py index 2df91d8..e482c86 100644 --- a/glareclient/osc/v1/artifacts.py +++ b/glareclient/osc/v1/artifacts.py @@ -19,10 +19,29 @@ from osc_lib.command import command from glareclient.common import utils as glare_utils from glareclient.osc.v1 import TypeMapperAction +from pprint import pformat +import six LOG = logging.getLogger(__name__) +def print_artifact(client, data, type_name): + schema = \ + client.artifacts.get_type_schema(type_name=type_name)['properties'] + + columns = ('field', 'value', 'glare type') + column_headers = [c.capitalize() for c in columns] + table = [] + + for key, value in six.iteritems(data): + if schema[key]['glareType'] == 'Blob': + value = pformat(value) + table.append((key, value, schema[key]['glareType'])) + + return (column_headers, + table) + + class ListArtifacts(command.Lister): """List of artifacts""" @@ -82,7 +101,7 @@ class ListArtifacts(command.Lister): table) -class ShowArtifact(command.ShowOne): +class ShowArtifact(command.Lister): """Show details artifact""" def get_parser(self, prog_name): @@ -103,12 +122,13 @@ class ShowArtifact(command.ShowOne): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact + data = client.artifacts.get(parsed_args.id, type_name=parsed_args.type_name) - return self.dict2columns(data) + return print_artifact(client, data, parsed_args.type_name) -class CreateArtifact(command.ShowOne): +class CreateArtifact(command.Lister): """Create a new artifact""" def get_parser(self, prog_name): @@ -153,10 +173,10 @@ class CreateArtifact(command.ShowOne): type_name=parsed_args.type_name, version=parsed_args.artifact_version, **prop) - return self.dict2columns(data) + return print_artifact(client, data, parsed_args.type_name) -class UpdateArtifact(command.ShowOne): +class UpdateArtifact(command.Lister): """Update the properties of the artifact""" def get_parser(self, prog_name): @@ -206,10 +226,10 @@ class UpdateArtifact(command.ShowOne): parsed_args.id, type_name=parsed_args.type_name, remove_props=parsed_args.remove_property, **prop) - return self.dict2columns(data) + return print_artifact(client, data, parsed_args.type_name) -class DeleteArtifact(command.ShowOne): +class DeleteArtifact(command.Command): """Delete the artifact""" def get_parser(self, prog_name): @@ -230,12 +250,11 @@ class DeleteArtifact(command.ShowOne): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - data = client.artifacts.delete(parsed_args.id, - type_name=parsed_args.type_name) - return self.dict2columns(data) + client.artifacts.delete(parsed_args.id, + type_name=parsed_args.type_name) -class ActivateArtifact(command.ShowOne): +class ActivateArtifact(command.Lister): """Activate the artifact""" def get_parser(self, prog_name): @@ -258,10 +277,10 @@ class ActivateArtifact(command.ShowOne): client = self.app.client_manager.artifact data = client.artifacts.activate( parsed_args.id, type_name=parsed_args.type_name) - return self.dict2columns(data) + return print_artifact(client, data, parsed_args.type_name) -class DeactivateArtifact(command.ShowOne): +class DeactivateArtifact(command.Lister): """Deactivate the artifact""" def get_parser(self, prog_name): @@ -284,10 +303,10 @@ class DeactivateArtifact(command.ShowOne): client = self.app.client_manager.artifact data = client.artifacts.deactivate(parsed_args.id, type_name=parsed_args.type_name) - return self.dict2columns(data) + return print_artifact(client, data, parsed_args.type_name) -class ReactivateArtifact(command.ShowOne): +class ReactivateArtifact(command.Lister): """Reactivate the artifact""" def get_parser(self, prog_name): @@ -310,10 +329,10 @@ class ReactivateArtifact(command.ShowOne): client = self.app.client_manager.artifact data = client.artifacts.reactivate(parsed_args.id, type_name=parsed_args.type_name) - return self.dict2columns(data) + return print_artifact(client, data, parsed_args.type_name) -class PublishArtifact(command.ShowOne): +class PublishArtifact(command.Lister): """Publish the artifact""" def get_parser(self, prog_name): @@ -336,7 +355,7 @@ class PublishArtifact(command.ShowOne): client = self.app.client_manager.artifact data = client.artifacts.publish(parsed_args.id, type_name=parsed_args.type_name) - return self.dict2columns(data) + return print_artifact(client, data, parsed_args.type_name) class TypeList(command.Lister): diff --git a/glareclient/tests/unit/osc/v1/test_artifacts.py b/glareclient/tests/unit/osc/v1/test_artifacts.py index 07e80c3..e59c2f2 100644 --- a/glareclient/tests/unit/osc/v1/test_artifacts.py +++ b/glareclient/tests/unit/osc/v1/test_artifacts.py @@ -29,6 +29,8 @@ class TestArtifacts(fakes.TestArtifacts): self.artifact_mock = \ self.app.client_manager.artifact.artifacts self.http = mock.MagicMock() + self.COLUMNS = set(['id', 'name', 'owner', + 'status', 'version', 'visibility']) class TestListArtifacts(TestArtifacts): @@ -108,20 +110,20 @@ class TestShowArtifacts(TestArtifacts): # Command to test self.cmd = osc_art.ShowArtifact(self.app, None) - self.COLUMNS = ('id', 'name', 'owner', - 'status', 'version', 'visibility') def test_artifact_show(self): arglist = ['sample_artifact', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba'] verify = [('type_name', 'sample_artifact')] - COLUMNS = ('blob', 'environment', 'id', 'image', 'name', 'owner', - 'package', 'status', 'template', 'version', 'visibility') + COLUMNS = set(['blob', 'environment', 'id', 'image', + 'name', 'owner', 'package', 'status', + 'template', 'version', 'visibility']) parsed_args = self.check_parser(self.cmd, arglist, verify) columns, data = self.cmd.take_action(parsed_args) + name_fields = set([column[0] for column in data]) # Check that columns are correct - self.assertEqual(COLUMNS, columns) + self.assertEqual(COLUMNS, name_fields) def test_artifact_show_without_id(self): arglist = ['sample_artifact'] @@ -147,8 +149,6 @@ class TestCreateArtifacts(TestArtifacts): # Command to test self.cmd = osc_art.CreateArtifact(self.app, None) - self.COLUMNS = ('id', 'name', 'owner', - 'status', 'version', 'visibility') def test_create_artifact(self): arglist = ['sample_artifact', 'art', @@ -160,8 +160,9 @@ class TestCreateArtifacts(TestArtifacts): parsed_args = self.check_parser(self.cmd, arglist, verify) columns, data = self.cmd.take_action(parsed_args) + name_fields = set([column[0] for column in data]) # Check that columns are correct - self.assertEqual(self.COLUMNS, columns) + self.assertEqual(self.COLUMNS, name_fields) def test_create_artifact_multiproperty(self): arglist = ['sample_artifact', 'art', @@ -191,8 +192,6 @@ class TestUpdateArtifacts(TestArtifacts): # Command to test self.cmd = osc_art.UpdateArtifact(self.app, None) - self.COLUMNS = ('id', 'name', 'owner', - 'status', 'version', 'visibility') def test_artifact_update(self): arglist = ['sample_artifact', @@ -203,8 +202,10 @@ class TestUpdateArtifacts(TestArtifacts): ('property', ['blah=1', 'blag=2'])] parsed_args = self.check_parser(self.cmd, arglist, verify) columns, data = self.cmd.take_action(parsed_args) + + name_fields = set([column[0] for column in data]) # Check that columns are correct - self.assertEqual(self.COLUMNS, columns) + self.assertEqual(self.COLUMNS, name_fields) def test_artifact_update_bad(self): arglist = ['sample_artifact', @@ -226,8 +227,9 @@ class TestUpdateArtifacts(TestArtifacts): ('remove_property', ['prop1', 'prop2'])] parsed_args = self.check_parser(self.cmd, arglist, verify) columns, data = self.cmd.take_action(parsed_args) + name_fields = set([column[0] for column in data]) # Check that columns are correct - self.assertEqual(self.COLUMNS, columns) + self.assertEqual(self.COLUMNS, name_fields) class TestDeleteArtifacts(TestArtifacts): @@ -239,8 +241,6 @@ class TestDeleteArtifacts(TestArtifacts): # Command to test self.cmd = osc_art.DeleteArtifact(self.app, None) - self.COLUMNS = ('id', 'name', 'owner', - 'status', 'version', 'visibility') def test_artifact_delete(self): arglist = ['sample_artifact', @@ -248,9 +248,7 @@ class TestDeleteArtifacts(TestArtifacts): verify = [('type_name', 'sample_artifact'), ('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')] parsed_args = self.check_parser(self.cmd, arglist, verify) - columns, data = self.cmd.take_action(parsed_args) - # Check that columns are correct - self.assertEqual(self.COLUMNS, columns) + self.assertIsNone(self.cmd.take_action(parsed_args)) class TestActivateArtifacts(TestArtifacts): @@ -262,8 +260,6 @@ class TestActivateArtifacts(TestArtifacts): # Command to test self.cmd = osc_art.ActivateArtifact(self.app, None) - self.COLUMNS = ('id', 'name', 'owner', - 'status', 'version', 'visibility') def test_artifact_activate(self): arglist = ['sample_artifact', @@ -272,8 +268,10 @@ class TestActivateArtifacts(TestArtifacts): ('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')] parsed_args = self.check_parser(self.cmd, arglist, verify) columns, data = self.cmd.take_action(parsed_args) + + name_fields = set([column[0] for column in data]) # Check that columns are correct - self.assertEqual(self.COLUMNS, columns) + self.assertEqual(self.COLUMNS, name_fields) class TestDeactivateArtifacts(TestArtifacts): @@ -285,8 +283,6 @@ class TestDeactivateArtifacts(TestArtifacts): # Command to test self.cmd = osc_art.DeactivateArtifact(self.app, None) - self.COLUMNS = ('id', 'name', 'owner', - 'status', 'version', 'visibility') def test_artifact_deactivate(self): arglist = ['sample_artifact', @@ -295,8 +291,10 @@ class TestDeactivateArtifacts(TestArtifacts): ('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')] parsed_args = self.check_parser(self.cmd, arglist, verify) columns, data = self.cmd.take_action(parsed_args) + + name_fields = set([column[0] for column in data]) # Check that columns are correct - self.assertEqual(self.COLUMNS, columns) + self.assertEqual(self.COLUMNS, name_fields) class TestReactivateArtifacts(TestArtifacts): @@ -308,8 +306,6 @@ class TestReactivateArtifacts(TestArtifacts): # Command to test self.cmd = osc_art.ReactivateArtifact(self.app, None) - self.COLUMNS = ('id', 'name', 'owner', - 'status', 'version', 'visibility') def test_artifact_rectivate(self): arglist = ['sample_artifact', @@ -318,8 +314,10 @@ class TestReactivateArtifacts(TestArtifacts): ('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')] parsed_args = self.check_parser(self.cmd, arglist, verify) columns, data = self.cmd.take_action(parsed_args) + + name_fields = set([column[0] for column in data]) # Check that columns are correct - self.assertEqual(self.COLUMNS, columns) + self.assertEqual(self.COLUMNS, name_fields) class TestPublishArtifacts(TestArtifacts): @@ -331,8 +329,6 @@ class TestPublishArtifacts(TestArtifacts): # Command to test self.cmd = osc_art.PublishArtifact(self.app, None) - self.COLUMNS = ('id', 'name', 'owner', - 'status', 'version', 'visibility') def test_publish_delete(self): arglist = ['sample_artifact', @@ -341,5 +337,7 @@ class TestPublishArtifacts(TestArtifacts): ('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')] parsed_args = self.check_parser(self.cmd, arglist, verify) columns, data = self.cmd.take_action(parsed_args) + + name_fields = set([column[0] for column in data]) # Check that columns are correct - self.assertEqual(self.COLUMNS, columns) + self.assertEqual(self.COLUMNS, name_fields) diff --git a/glareclient/v1/artifacts.py b/glareclient/v1/artifacts.py index 446a4d8..2eaca54 100644 --- a/glareclient/v1/artifacts.py +++ b/glareclient/v1/artifacts.py @@ -239,3 +239,11 @@ class Controller(object): for type_name, type_schema in six.iteritems(body['schemas']): type_list.append((type_name, type_schema['version'])) return type_list + + def get_type_schema(self, type_name=None): + """Show schema of type name.""" + + type_name = self._check_type_name(type_name) + url = '/schemas/%s' % type_name + resp, body = self.http_client.get(url) + return body['schemas'][type_name]