Improve constraints parsing for empty values
[osm/N2VC.git] / juju / constraints.py
index 43a80a3..998862d 100644 (file)
@@ -11,6 +11,9 @@
 # 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
 
@@ -18,6 +21,7 @@ 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,
@@ -25,15 +29,23 @@ FACTORS = {
     "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(" ")]}
@@ -45,6 +57,11 @@ def normalize_key(key):
     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
 
 
@@ -61,4 +78,7 @@ def normalize_value(value):
         values = [normalize_value(v) for v in values]
         return values
 
+    if value.isdigit():
+        return int(value)
+
     return value