Ver Fonte

Made json handling more consistent for resources

Nuwan Goonasekera há 8 anos atrás
pai
commit
44b8a6cba6

+ 12 - 9
cloudbridge/cloud/providers/aws/resources.py

@@ -3,7 +3,6 @@ DataTypes used by this provider
 """
 import hashlib
 import inspect
-import json
 
 from datetime import datetime
 
@@ -95,8 +94,9 @@ class AWSMachineImage(BaseMachineImage):
         :rtype: ``int``
         :return: The minimum disk size needed by this image
         """
-        bdm = self._ec2_image.block_device_mapping
-        return bdm[self._ec2_image.root_device_name].size
+        bdm = self._ec2_image.block_device_mapping.get(
+            self._ec2_image.root_device_name)
+        return bdm.size if bdm else None
 
     def delete(self):
         """
@@ -719,10 +719,10 @@ class AWSSecurityGroup(BaseSecurityGroup):
         attr = inspect.getmembers(self, lambda a: not (inspect.isroutine(a)))
         js = {k: v for (k, v) in attr if not k.startswith('_')}
         json_rules = [r.to_json() for r in self.rules]
-        js['rules'] = [json.loads(r) for r in json_rules]
+        js['rules'] = json_rules
         if js.get('network_id'):
             js.pop('network_id')  # Omit for consistency across cloud providers
-        return json.dumps(js, sort_keys=True)
+        return js
 
 
 class AWSSecurityGroupRule(BaseSecurityGroupRule):
@@ -777,7 +777,7 @@ class AWSSecurityGroupRule(BaseSecurityGroupRule):
         js = {k: v for (k, v) in attr if not k.startswith('_')}
         js['group'] = self.group.id if self.group else ''
         js['parent'] = self.parent.id if self.parent else ''
-        return json.dumps(js, sort_keys=True)
+        return js
 
     def delete(self):
         if self.group:
@@ -824,9 +824,12 @@ class AWSBucketObject(BaseBucketObject):
         """
         Get the date and time this object was last modified.
         """
-        lm = datetime.strptime(self._key.last_modified,
-                               "%Y-%m-%dT%H:%M:%S.%fZ")
-        return lm.strftime("%Y-%m-%dT%H:%M:%S.%f")
+        if self._key.last_modified:
+            lm = datetime.strptime(self._key.last_modified,
+                                   "%Y-%m-%dT%H:%M:%S.%fZ")
+            return lm.strftime("%Y-%m-%dT%H:%M:%S.%f")
+        else:
+            return None
 
     def iter_content(self):
         """

+ 3 - 4
cloudbridge/cloud/providers/openstack/resources.py

@@ -3,7 +3,6 @@ DataTypes used by this provider
 """
 import inspect
 import ipaddress
-import json
 
 import os
 
@@ -999,8 +998,8 @@ class OpenStackSecurityGroup(BaseSecurityGroup):
         attr = inspect.getmembers(self, lambda a: not(inspect.isroutine(a)))
         js = {k: v for(k, v) in attr if not k.startswith('_')}
         json_rules = [r.to_json() for r in self.rules]
-        js['rules'] = [json.loads(r) for r in json_rules]
-        return json.dumps(js, sort_keys=True)
+        js['rules'] = json_rules
+        return js
 
 
 class OpenStackSecurityGroupRule(BaseSecurityGroupRule):
@@ -1044,7 +1043,7 @@ class OpenStackSecurityGroupRule(BaseSecurityGroupRule):
         js = {k: v for(k, v) in attr if not k.startswith('_')}
         js['group'] = self.group.id if self.group else ''
         js['parent'] = self.parent.id if self.parent else ''
-        return json.dumps(js, sort_keys=True)
+        return js
 
     def delete(self):
         return self._provider.nova.security_group_rules.delete(self.id)

+ 3 - 1
test/helpers/standard_interface_tests.py

@@ -5,6 +5,8 @@ This includes:
    2. Checking for object equality and repr
    3. Checking standard behaviour for list, iter, find, get, delete
 """
+import uuid
+
 from cloudbridge.cloud.interfaces.resources import ResultList
 
 
@@ -84,7 +86,7 @@ def check_get(test, service, obj):
 
 def check_get_non_existent(test, service):
     # check get
-    get_objs = service.get("random_imagined_obj_id")
+    get_objs = service.get(str(uuid.uuid4()))
     test.assertIsNone(
         get_objs,
         "Get non-existent object for %s returned unexpected objects: %s"