diff --git a/glareclient/osc/v1/artifacts.py b/glareclient/osc/v1/artifacts.py index a39462d..128c973 100644 --- a/glareclient/osc/v1/artifacts.py +++ b/glareclient/osc/v1/artifacts.py @@ -15,13 +15,13 @@ import logging from osc_lib.command import command +from oslo_utils import strutils +from pprint import pformat +import six from glareclient.common import utils as glare_utils from glareclient.osc.v1 import TypeMapperAction -from pprint import pformat -import six - LOG = logging.getLogger(__name__) @@ -185,7 +185,21 @@ class CreateArtifact(command.Lister): metavar='', action='append', default=[], - help='Artifact property.' + help='Simple artifact property.' + ) + parser.add_argument( + '--list', '-l', + metavar='', + action='append', + default=[], + help='Artifact list property.' + ) + parser.add_argument( + '--dict', '-d', + metavar='', + action='append', + default=[], + help='Artifact dict property.' ) return parser @@ -197,6 +211,19 @@ class CreateArtifact(command.Lister): key, value = datum.split('=', 1) prop[key] = value + for datum in parsed_args.list: + key, value = datum.split('=', 1) + value = strutils.split_by_commas(value) + prop[key] = value + + for datum in parsed_args.dict: + key, value = datum.split('=', 1) + value = strutils.split_by_commas(value) + prop[key] = {} + for elem in value: + k, v = elem.split(':', 1) + prop[key][k] = v + client = self.app.client_manager.artifact data = client.artifacts.create(parsed_args.name, type_name=parsed_args.type_name, @@ -244,7 +271,21 @@ class UpdateArtifact(command.Lister): metavar='', action='append', default=[], - help='Update property values.' + help='Simple artifact property.' + ) + parser.add_argument( + '--list', '-l', + metavar='', + action='append', + default=[], + help='Artifact list property.' + ) + parser.add_argument( + '--dict', '-d', + metavar='', + action='append', + default=[], + help='Artifact dict property.' ) return parser @@ -256,6 +297,19 @@ class UpdateArtifact(command.Lister): key, value = datum.split('=', 1) prop[key] = value + for datum in parsed_args.list: + key, value = datum.split('=', 1) + value = strutils.split_by_commas(value) + prop[key] = value + + for datum in parsed_args.dict: + key, value = datum.split('=', 1) + value = strutils.split_by_commas(value) + prop[key] = {} + for elem in value: + k, v = elem.split(':', 1) + prop[key][k] = v + client = self.app.client_manager.artifact af_id = get_artifact_id(client, parsed_args) data = client.artifacts.update( diff --git a/glareclient/tests/unit/osc/v1/test_artifacts.py b/glareclient/tests/unit/osc/v1/test_artifacts.py index b9fd08a..89a154a 100644 --- a/glareclient/tests/unit/osc/v1/test_artifacts.py +++ b/glareclient/tests/unit/osc/v1/test_artifacts.py @@ -192,6 +192,42 @@ class TestCreateArtifacts(TestArtifacts): # Check that columns are correct self.assertEqual(self.COLUMNS, name_fields) + def test_create_artifact_list_prop(self): + arglist = ['images', 'art', + '--artifact-version', '0.2.4', + '--list', 'l=10,11,12'] + verify = [('type_name', 'images'), + ('list', ['l=10,11,12']), + ('artifact_version', '0.2.4')] + parsed_args = self.check_parser(self.cmd, arglist, verify) + with mock.patch.object( + self.app.client_manager.artifact.artifacts, + 'create') as patched_create: + self.cmd.take_action(parsed_args) + patched_create.assert_called_once_with( + 'art', + l=['10', '11', '12'], + type_name='images', + version='0.2.4') + + def test_create_artifact_dict_prop(self): + arglist = ['images', 'art', + '--artifact-version', '0.2.4', + '--dict', 'd=a:10,b:11,c:12'] + verify = [('type_name', 'images'), + ('dict', ['d=a:10,b:11,c:12']), + ('artifact_version', '0.2.4')] + parsed_args = self.check_parser(self.cmd, arglist, verify) + with mock.patch.object( + self.app.client_manager.artifact.artifacts, + 'create') as patched_create: + self.cmd.take_action(parsed_args) + patched_create.assert_called_once_with( + 'art', + d={'a': '10', 'c': '12', 'b': '11'}, + type_name='images', + version='0.2.4') + def test_create_artifact_multiproperty(self): arglist = ['images', 'art', '--artifact-version', '0.2.4', @@ -235,6 +271,40 @@ class TestUpdateArtifacts(TestArtifacts): # Check that columns are correct self.assertEqual(self.COLUMNS, name_fields) + def test_update_artifact_list_prop(self): + arglist = ['images', + 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', + '--list', 'l=10,11,12'] + verify = [('type_name', 'images'), + ('list', ['l=10,11,12'])] + parsed_args = self.check_parser(self.cmd, arglist, verify) + with mock.patch.object( + self.app.client_manager.artifact.artifacts, + 'update') as patched_update: + self.cmd.take_action(parsed_args) + patched_update.assert_called_once_with( + 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', + l=['10', '11', '12'], + remove_props=[], + type_name='images') + + def test_update_artifact_dict_prop(self): + arglist = ['images', + 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', + '--dict', 'd=a:10,b:11,c:12'] + verify = [('type_name', 'images'), + ('dict', ['d=a:10,b:11,c:12'])] + parsed_args = self.check_parser(self.cmd, arglist, verify) + with mock.patch.object( + self.app.client_manager.artifact.artifacts, + 'update') as patched_update: + self.cmd.take_action(parsed_args) + patched_update.assert_called_once_with( + 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', + d={'a': '10', 'c': '12', 'b': '11'}, + remove_props=[], + type_name='images') + def test_artifact_update_bad(self): arglist = ['images', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba',