# constraints keys are valid, and that we can successfully dump the
# constraints dict to json.
#
+# Once https://bugs.launchpad.net/juju/+bug/1645402 is addressed, this
+# module should be deprecated.
+#
import re
MEM = re.compile('^[1-9][0-9]*[MGTP]$')
# Multiplication factors to get Megabytes
+# https://github.com/juju/juju/blob/master/constraints/constraints.go#L666
FACTORS = {
"M": 1,
"G": 1024,
"P": 1024 * 1024 * 1024
}
+SNAKE1 = re.compile(r'(.)([A-Z][a-z]+)')
+SNAKE2 = re.compile('([a-z0-9])([A-Z])')
+
+
def parse(constraints):
"""
Constraints must be expressed as a string containing only spaces
and key value pairs joined by an '='.
"""
- if constraints is None:
+ if not constraints:
return None
+ if type(constraints) is dict:
+ # Fowards compatibilty: already parsed
+ return constraints
+
constraints = {
normalize_key(k): normalize_value(v) for k, v in [
s.split("=") for s in constraints.split(" ")]}
key = key.strip()
key = key.replace("-", "_") # Our _client lib wants "_" in place of "-"
+
+ # Convert camelCase to snake_case
+ key = SNAKE1.sub(r'\1_\2', key)
+ key = SNAKE2.sub(r'\1_\2', key).lower()
+
return key
values = [normalize_value(v) for v in values]
return values
+ if value.isdigit():
+ return int(value)
+
return value