diff --git a/glareclient/osc/v1/artifacts.py b/glareclient/osc/v1/artifacts.py index e8964c6..87c3fc4 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""" @@ -85,7 +104,7 @@ class ListArtifacts(command.Lister): table) -class ShowArtifact(command.ShowOne): +class ShowArtifact(command.Lister): """Show details artifact""" def get_parser(self, prog_name): @@ -106,12 +125,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): @@ -156,10 +176,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): @@ -209,10 +229,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): @@ -233,12 +253,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): @@ -261,10 +280,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): @@ -287,10 +306,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): @@ -313,10 +332,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): @@ -339,7 +358,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 bf2bb7b..6997505 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): @@ -122,20 +124,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'] @@ -161,8 +163,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', @@ -174,8 +174,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', @@ -205,8 +206,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', @@ -217,8 +216,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', @@ -240,8 +241,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): @@ -253,8 +255,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', @@ -262,9 +262,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): @@ -276,8 +274,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', @@ -286,8 +282,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): @@ -299,8 +297,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', @@ -309,8 +305,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): @@ -322,8 +320,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', @@ -332,8 +328,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): @@ -345,8 +343,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', @@ -355,5 +351,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]