Enable passing of integer value for pool-set action
Enable passing of an integer to the pool-set function. Due to how juju appears to parse things on the command line, setting type to string causes it to fail to accept '3', "3" or 3 as a string. Only "'3'" works. However, if we remove the type from actions.yaml and do the validation in the charm, any value can be passed. Depends-On: I6081c23af61fd5e872982ff477b0a5cb27141d11 Change-Id: Idf3468d9ae28dafc09c86f08b7f8c6470a665b7a Closes-Bug: #1838650
This commit is contained in:
parent
74ad5886a9
commit
b34d85ee81
|
@ -256,7 +256,10 @@ pool-set:
|
||||||
type: string
|
type: string
|
||||||
description: "Any valid Ceph key from http://docs.ceph.com/docs/master/rados/operations/pools/#set-pool-values"
|
description: "Any valid Ceph key from http://docs.ceph.com/docs/master/rados/operations/pools/#set-pool-values"
|
||||||
value:
|
value:
|
||||||
type: string
|
# LP: #1838650 - unfortunately, Juju appears to consider '3' on the
|
||||||
|
# command line as not being a string, and has to be quoted as "'3'". So,
|
||||||
|
# we actually let the charm do the verification, and let any value
|
||||||
|
# through here.
|
||||||
description: "The value to set"
|
description: "The value to set"
|
||||||
required:
|
required:
|
||||||
- key
|
- key
|
||||||
|
|
|
@ -32,7 +32,8 @@ if __name__ == '__main__':
|
||||||
'value': value}
|
'value': value}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
handle_set_pool_value(service='admin', request=request)
|
# Bug: #1838650 -- force coercion to an int for the value if required.
|
||||||
|
handle_set_pool_value(service='admin', request=request, coerce=True)
|
||||||
except CalledProcessError as e:
|
except CalledProcessError as e:
|
||||||
log(str(e))
|
log(str(e))
|
||||||
action_fail("Setting pool key: {} and value: {} failed with "
|
action_fail("Setting pool key: {} and value: {} failed with "
|
||||||
|
|
|
@ -540,11 +540,13 @@ def handle_remove_cache_tier(request, service):
|
||||||
pool.remove_cache_tier(cache_pool=cache_pool)
|
pool.remove_cache_tier(cache_pool=cache_pool)
|
||||||
|
|
||||||
|
|
||||||
def handle_set_pool_value(request, service):
|
def handle_set_pool_value(request, service, coerce=False):
|
||||||
"""Sets an arbitrary pool value.
|
"""Sets an arbitrary pool value.
|
||||||
|
|
||||||
:param request: dict of request operations and params
|
:param request: dict of request operations and params
|
||||||
:param service: The ceph client to run the command under.
|
:param service: The ceph client to run the command under.
|
||||||
|
:param coerce: Try to parse/coerce the value into the correct type.
|
||||||
|
Used by the action code that only gets Str from Juju
|
||||||
:returns: dict. exit-code and reason if not 0
|
:returns: dict. exit-code and reason if not 0
|
||||||
"""
|
"""
|
||||||
# Set arbitrary pool values
|
# Set arbitrary pool values
|
||||||
|
@ -558,6 +560,16 @@ def handle_set_pool_value(request, service):
|
||||||
|
|
||||||
# Get the validation method
|
# Get the validation method
|
||||||
validator_params = POOL_KEYS[params['key']]
|
validator_params = POOL_KEYS[params['key']]
|
||||||
|
# BUG: #1838650 - the function needs to try to coerce the value param to
|
||||||
|
# the type required for the validator to pass. Note, if this blows, then
|
||||||
|
# the param isn't parsable to the correct type.
|
||||||
|
if coerce:
|
||||||
|
try:
|
||||||
|
params['value'] = validator_params[0](params['value'])
|
||||||
|
except ValueError:
|
||||||
|
raise RuntimeError("Value {} isn't of type {}"
|
||||||
|
.format(params['value'], validator_params[0]))
|
||||||
|
# end of BUG: #1838650
|
||||||
if len(validator_params) == 1:
|
if len(validator_params) == 1:
|
||||||
# Validate that what the user passed is actually legal per Ceph's rules
|
# Validate that what the user passed is actually legal per Ceph's rules
|
||||||
validator(params['value'], validator_params[0])
|
validator(params['value'], validator_params[0])
|
||||||
|
|
Loading…
Reference in New Issue