Add mesos_slave_executor_environment_variables validate in CLI
mesos_slave_executor_environment_variables is a file path to deliver the data for mesos executor environment variables, and validate the file if existing or matching the json form. Change-Id: Iaeb912184f8789321526887d25e281b5181089ef Partially-Implements:blueprint mesos-slave-flags
This commit is contained in:
parent
f1d97b652a
commit
bbdc05d227
@ -80,6 +80,16 @@ def args_array_to_patch(op, attributes):
|
|||||||
return patch
|
return patch
|
||||||
|
|
||||||
|
|
||||||
|
def handle_labels(labels):
|
||||||
|
labels = format_labels(labels)
|
||||||
|
if 'mesos_slave_executor_env_file' in labels:
|
||||||
|
environment_variables_data = handle_json_from_file(
|
||||||
|
labels['mesos_slave_executor_env_file'])
|
||||||
|
labels['mesos_slave_executor_env_variables'] = json.dumps(
|
||||||
|
environment_variables_data)
|
||||||
|
return labels
|
||||||
|
|
||||||
|
|
||||||
def format_labels(lbls, parse_comma=True):
|
def format_labels(lbls, parse_comma=True):
|
||||||
'''Reformat labels into dict of format expected by the API.'''
|
'''Reformat labels into dict of format expected by the API.'''
|
||||||
|
|
||||||
@ -111,3 +121,26 @@ def format_labels(lbls, parse_comma=True):
|
|||||||
|
|
||||||
def print_list_field(field):
|
def print_list_field(field):
|
||||||
return lambda obj: ', '.join(getattr(obj, field))
|
return lambda obj: ', '.join(getattr(obj, field))
|
||||||
|
|
||||||
|
|
||||||
|
def handle_json_from_file(json_arg):
|
||||||
|
"""Attempts to read JSON file by the file url.
|
||||||
|
|
||||||
|
:param json_arg: May be a file name containing the JSON.
|
||||||
|
:returns: A list or dictionary parsed from JSON.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(json_arg, 'r') as f:
|
||||||
|
json_arg = f.read().strip()
|
||||||
|
json_arg = json.loads(json_arg)
|
||||||
|
except IOError as e:
|
||||||
|
err = _("Cannot get JSON from file '%(file)s'. "
|
||||||
|
"Error: %(err)s") % {'err': e, 'file': json_arg}
|
||||||
|
raise exc.InvalidAttribute(err)
|
||||||
|
except ValueError as e:
|
||||||
|
err = (_("For JSON: '%(string)s', error: '%(err)s'") %
|
||||||
|
{'err': e, 'string': json_arg})
|
||||||
|
raise exc.InvalidAttribute(err)
|
||||||
|
|
||||||
|
return json_arg
|
||||||
|
@ -16,7 +16,11 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
|
import mock
|
||||||
|
from oslo_serialization import jsonutils as json
|
||||||
import six
|
import six
|
||||||
|
import six.moves.builtins as __builtin__
|
||||||
|
import tempfile
|
||||||
|
|
||||||
from magnumclient.common import cliutils
|
from magnumclient.common import cliutils
|
||||||
from magnumclient.common import utils
|
from magnumclient.common import utils
|
||||||
@ -230,3 +234,40 @@ class CliUtilsTest(test_utils.BaseTestCase):
|
|||||||
('c', dict_out['c'])])
|
('c', dict_out['c'])])
|
||||||
|
|
||||||
self.assertEqual(six.text_type(dict_exp), six.text_type(dict_act))
|
self.assertEqual(six.text_type(dict_exp), six.text_type(dict_act))
|
||||||
|
|
||||||
|
|
||||||
|
class HandleJsonFromFileTest(test_utils.BaseTestCase):
|
||||||
|
|
||||||
|
def test_handle_json_from_file_bad_json(self):
|
||||||
|
contents = 'foo'
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w') as f:
|
||||||
|
f.write(contents)
|
||||||
|
f.flush()
|
||||||
|
self.assertRaisesRegex(exc.InvalidAttribute,
|
||||||
|
'For JSON',
|
||||||
|
utils.handle_json_from_file, f.name)
|
||||||
|
|
||||||
|
def test_handle_json_from_file_valid_file(self):
|
||||||
|
contents = '{"step": "upgrade", "interface": "deploy"}'
|
||||||
|
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w') as f:
|
||||||
|
f.write(contents)
|
||||||
|
f.flush()
|
||||||
|
steps = utils.handle_json_from_file(f.name)
|
||||||
|
|
||||||
|
self.assertEqual(json.loads(contents), steps)
|
||||||
|
|
||||||
|
@mock.patch.object(__builtin__, 'open', autospec=True)
|
||||||
|
def test_handle_json_from_file_open_fail(self, mock_open):
|
||||||
|
mock_file_object = mock.MagicMock()
|
||||||
|
mock_file_handle = mock.MagicMock()
|
||||||
|
mock_file_handle.__enter__.return_value = mock_file_object
|
||||||
|
mock_open.return_value = mock_file_handle
|
||||||
|
mock_file_object.read.side_effect = IOError
|
||||||
|
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w') as f:
|
||||||
|
self.assertRaisesRegex(exc.InvalidAttribute,
|
||||||
|
"from file",
|
||||||
|
utils.handle_json_from_file, f.name)
|
||||||
|
mock_open.assert_called_once_with(f.name, 'r')
|
||||||
|
mock_file_object.read.assert_called_once_with()
|
||||||
|
@ -116,7 +116,7 @@ def do_baymodel_create(cs, args):
|
|||||||
opts['http_proxy'] = args.http_proxy
|
opts['http_proxy'] = args.http_proxy
|
||||||
opts['https_proxy'] = args.https_proxy
|
opts['https_proxy'] = args.https_proxy
|
||||||
opts['no_proxy'] = args.no_proxy
|
opts['no_proxy'] = args.no_proxy
|
||||||
opts['labels'] = magnum_utils.format_labels(args.labels)
|
opts['labels'] = magnum_utils.handle_labels(args.labels)
|
||||||
opts['tls_disabled'] = args.tls_disabled
|
opts['tls_disabled'] = args.tls_disabled
|
||||||
opts['public'] = args.public
|
opts['public'] = args.public
|
||||||
opts['registry_enabled'] = args.registry_enabled
|
opts['registry_enabled'] = args.registry_enabled
|
||||||
|
Loading…
Reference in New Issue
Block a user