Allow to specify dict and list properties in cli

Change-Id: I9da3c3b0f9f34429ec40d891f76acee863c4ec79
This commit is contained in:
Mike Fedosin 2016-12-22 11:49:15 +03:00
parent 50e117c20d
commit 8e8d788a84
2 changed files with 129 additions and 5 deletions
glareclient
osc/v1
tests/unit/osc/v1

@ -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='<key=value>',
action='append',
default=[],
help='Artifact property.'
help='Simple artifact property.'
)
parser.add_argument(
'--list', '-l',
metavar='<key=value>',
action='append',
default=[],
help='Artifact list property.'
)
parser.add_argument(
'--dict', '-d',
metavar='<key=value>',
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='<key=value>',
action='append',
default=[],
help='Update property values.'
help='Simple artifact property.'
)
parser.add_argument(
'--list', '-l',
metavar='<key=value>',
action='append',
default=[],
help='Artifact list property.'
)
parser.add_argument(
'--dict', '-d',
metavar='<key=value>',
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(

@ -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',