heat API : make extract_user_params more generic
Make api.aws.utils.extract_user_params into a more generic aws-format-list-extraction function Change-Id: If6811ea1a138ddff96542f983397852dfbd483fd Signed-off-by: Steven Hardy <shardy@redhat.com>
This commit is contained in:
parent
00527198c8
commit
89df904c50
@ -27,41 +27,41 @@ def format_response(action, response):
|
||||
return {'%sResponse' % action: {'%sResult' % action: response}}
|
||||
|
||||
|
||||
def extract_user_params(params):
|
||||
def extract_param_pairs(params, prefix='', keyname='', valuename=''):
|
||||
"""
|
||||
Extract a dictionary of user input parameters for the stack
|
||||
Extract a dictionary of user input parameters, from AWS style
|
||||
parameter-pair encoded list
|
||||
|
||||
In the AWS API parameters, each user parameter appears as two key-value
|
||||
pairs with keys of the form below:
|
||||
In the AWS API list items appear as two key-value
|
||||
pairs (passed as query parameters) with keys of the form below:
|
||||
|
||||
Parameters.member.1.ParameterKey
|
||||
Parameters.member.1.ParameterValue
|
||||
Prefix.member.1.keyname=somekey
|
||||
Prefix.member.1.keyvalue=somevalue
|
||||
Prefix.member.2.keyname=anotherkey
|
||||
Prefix.member.2.keyvalue=somevalue
|
||||
|
||||
We reformat this into a normal dict here to match the heat
|
||||
We reformat this into a dict here to match the heat
|
||||
engine API expected format
|
||||
|
||||
Note this implemented outside of "create" as it will also be
|
||||
used by update (and EstimateTemplateCost if appropriate..)
|
||||
"""
|
||||
# Define the AWS key format to extract
|
||||
PARAM_KEYS = (
|
||||
PARAM_USER_KEY_re,
|
||||
PARAM_USER_VALUE_fmt,
|
||||
LIST_KEYS = (
|
||||
LIST_USER_KEY_re,
|
||||
LIST_USER_VALUE_fmt,
|
||||
) = (
|
||||
re.compile(r'Parameters\.member\.(.*?)\.ParameterKey$'),
|
||||
'Parameters.member.%s.ParameterValue',
|
||||
re.compile(r"%s\.member\.(.*?)\.%s$" % (prefix, keyname)),
|
||||
'.'.join([prefix, 'member', '%s', valuename])
|
||||
)
|
||||
|
||||
def get_param_pairs():
|
||||
for k in params:
|
||||
keymatch = PARAM_USER_KEY_re.match(k)
|
||||
keymatch = LIST_USER_KEY_re.match(k)
|
||||
if keymatch:
|
||||
key = params[k]
|
||||
v = PARAM_USER_VALUE_fmt % keymatch.group(1)
|
||||
v = LIST_USER_VALUE_fmt % keymatch.group(1)
|
||||
try:
|
||||
value = params[v]
|
||||
except KeyError:
|
||||
logger.error('Could not apply parameter %s' % key)
|
||||
logger.error('Could not extract parameter %s' % key)
|
||||
|
||||
yield (key, value)
|
||||
|
||||
|
@ -62,6 +62,22 @@ class StackController(object):
|
||||
str(resp['StackId'])])
|
||||
return resp
|
||||
|
||||
@staticmethod
|
||||
def _extract_user_params(params):
|
||||
"""
|
||||
Extract a dictionary of user input parameters for the stack
|
||||
|
||||
In the AWS API parameters, each user parameter appears as two key-value
|
||||
pairs with keys of the form below:
|
||||
|
||||
Parameters.member.1.ParameterKey
|
||||
Parameters.member.1.ParameterValue
|
||||
"""
|
||||
return api_utils.extract_param_pairs(params,
|
||||
prefix='Parameters',
|
||||
keyname='ParameterKey',
|
||||
valuename='ParameterValue')
|
||||
|
||||
def list(self, req):
|
||||
"""
|
||||
Implements ListStacks API action
|
||||
@ -253,7 +269,7 @@ class StackController(object):
|
||||
con = req.context
|
||||
|
||||
# Extract the stack input parameters
|
||||
stack_parms = api_utils.extract_user_params(req.params)
|
||||
stack_parms = self._extract_user_params(req.params)
|
||||
|
||||
# Extract any additional arguments ("Request Parameters")
|
||||
create_args = extract_args(req.params)
|
||||
|
@ -41,7 +41,9 @@ class AWSCommon(unittest.TestCase):
|
||||
'Parameters.member.Foo.ParameterValue': 'bar',
|
||||
'Parameters.member.Blarg.ParameterKey': 'blarg',
|
||||
'Parameters.member.Blarg.ParameterValue': 'wibble'}
|
||||
params = api_utils.extract_user_params(p)
|
||||
params = api_utils.extract_param_pairs(p, prefix='Parameters',
|
||||
keyname='ParameterKey',
|
||||
valuename='ParameterValue')
|
||||
self.assertEqual(len(params), 2)
|
||||
self.assertTrue('foo' in params)
|
||||
self.assertEqual(params['foo'], 'bar')
|
||||
@ -53,7 +55,9 @@ class AWSCommon(unittest.TestCase):
|
||||
'Parameters.member.Foo.Bar.ParameterValue': 'bar',
|
||||
'Parameters.member.Foo.Baz.ParameterKey': 'blarg',
|
||||
'Parameters.member.Foo.Baz.ParameterValue': 'wibble'}
|
||||
params = api_utils.extract_user_params(p)
|
||||
params = api_utils.extract_param_pairs(p, prefix='Parameters',
|
||||
keyname='ParameterKey',
|
||||
valuename='ParameterValue')
|
||||
self.assertEqual(len(params), 2)
|
||||
self.assertTrue('foo' in params)
|
||||
self.assertEqual(params['foo'], 'bar')
|
||||
@ -65,7 +69,9 @@ class AWSCommon(unittest.TestCase):
|
||||
'Parameters.member.Foo.Bar.ParameterValue': 'bar',
|
||||
'Foo.Baz.ParameterKey': 'blarg',
|
||||
'Foo.Baz.ParameterValue': 'wibble'}
|
||||
params = api_utils.extract_user_params(p)
|
||||
params = api_utils.extract_param_pairs(p, prefix='Parameters',
|
||||
keyname='ParameterKey',
|
||||
valuename='ParameterValue')
|
||||
self.assertEqual(len(params), 1)
|
||||
self.assertTrue('foo' in params)
|
||||
self.assertEqual(params['foo'], 'bar')
|
||||
@ -73,13 +79,17 @@ class AWSCommon(unittest.TestCase):
|
||||
def test_params_extract_garbage_prefix(self):
|
||||
p = {'prefixParameters.member.Foo.Bar.ParameterKey': 'foo',
|
||||
'Parameters.member.Foo.Bar.ParameterValue': 'bar'}
|
||||
params = api_utils.extract_user_params(p)
|
||||
params = api_utils.extract_param_pairs(p, prefix='Parameters',
|
||||
keyname='ParameterKey',
|
||||
valuename='ParameterValue')
|
||||
self.assertFalse(params)
|
||||
|
||||
def test_params_extract_garbage_suffix(self):
|
||||
p = {'Parameters.member.Foo.Bar.ParameterKeysuffix': 'foo',
|
||||
'Parameters.member.Foo.Bar.ParameterValue': 'bar'}
|
||||
params = api_utils.extract_user_params(p)
|
||||
params = api_utils.extract_param_pairs(p, prefix='Parameters',
|
||||
keyname='ParameterKey',
|
||||
valuename='ParameterValue')
|
||||
self.assertFalse(params)
|
||||
|
||||
def test_reformat_dict_keys(self):
|
||||
|
Loading…
Reference in New Issue
Block a user