Sfoglia il codice sorgente

Added tests for iteration methods + fixed up some iteration issues.

nuwan_ag 10 anni fa
parent
commit
c3339faacc

+ 0 - 1
cloudbridge/cloud/base.py

@@ -261,7 +261,6 @@ class BaseInstance(BaseObjectLifeCycleMixin, Instance):
                 self.security_groups == other.security_groups and
                 self.security_groups == other.security_groups and
                 self.public_ips == other.public_ips and
                 self.public_ips == other.public_ips and
                 self.private_ips == other.private_ips and
                 self.private_ips == other.private_ips and
-                self.mac_address == other.mac_address and
                 self.image_id == other.image_id)
                 self.image_id == other.image_id)
 
 
     @property
     @property

+ 6 - 3
cloudbridge/cloud/providers/aws/resources.py

@@ -7,6 +7,7 @@ from boto.exception import EC2ResponseError
 from boto.s3.key import Key
 from boto.s3.key import Key
 from retrying import retry
 from retrying import retry
 
 
+from cloudbridge.cloud import helpers as cbhelpers
 from cloudbridge.cloud.base import BaseContainer
 from cloudbridge.cloud.base import BaseContainer
 from cloudbridge.cloud.base import BaseContainerObject
 from cloudbridge.cloud.base import BaseContainerObject
 from cloudbridge.cloud.base import BaseInstance
 from cloudbridge.cloud.base import BaseInstance
@@ -661,15 +662,17 @@ class AWSContainer(BaseContainer):
         raise NotImplementedError(
         raise NotImplementedError(
             'Container.list not implemented by this provider')
             'Container.list not implemented by this provider')
 
 
-    def list(self):
+    def list(self, limit=None, marker=None):
         """
         """
         List all objects within this container.
         List all objects within this container.
 
 
         :rtype: ContainerObject
         :rtype: ContainerObject
         :return: List of all available ContainerObjects within this container
         :return: List of all available ContainerObjects within this container
         """
         """
-        objects = self._bucket.list()
-        return [AWSContainerObject(self._provider, obj) for obj in objects]
+        objects = [AWSContainerObject(self._provider, obj)
+                   for obj in self._bucket.list()]
+        return cbhelpers.to_result_list(self._provider, objects, limit,
+                                        marker)
 
 
     def delete(self, delete_contents=False):
     def delete(self, delete_contents=False):
         """
         """

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

@@ -133,7 +133,8 @@ class OpenStackPlacementZone(BasePlacementZone):
 
 
 class OpenStackInstanceType(BaseInstanceType):
 class OpenStackInstanceType(BaseInstanceType):
 
 
-    def __init__(self, os_flavor):
+    def __init__(self, provider, os_flavor):
+        super(OpenStackInstanceType, self).__init__(provider)
         self._os_flavor = os_flavor
         self._os_flavor = os_flavor
 
 
     @property
     @property
@@ -261,7 +262,7 @@ class OpenStackInstance(BaseInstance):
         """
         """
         Get the instance type.
         Get the instance type.
         """
         """
-        return OpenStackInstanceType(self._os_instance.flavor)
+        return OpenStackInstanceType(self._provider, self._os_instance.flavor)
 
 
     def reboot(self):
     def reboot(self):
         """
         """

+ 1 - 1
cloudbridge/cloud/providers/openstack/services.py

@@ -266,7 +266,7 @@ class OpenStackInstanceTypesService(BaseInstanceTypesService):
             self.provider,
             self.provider,
             limit,
             limit,
             lambda nlimit:
             lambda nlimit:
-                [OpenStackInstanceType(obj)
+                [OpenStackInstanceType(self.provider, obj)
                  for obj in self.provider.nova.flavors.list(
                  for obj in self.provider.nova.flavors.list(
                     limit=nlimit,
                     limit=nlimit,
                     marker=marker)])
                     marker=marker)])

+ 2 - 0
test/__init__.py

@@ -27,6 +27,7 @@ as a base class to each combination).
 """
 """
 import cloudbridge
 import cloudbridge
 from test.helpers import ProviderTestCaseGenerator
 from test.helpers import ProviderTestCaseGenerator
+from test.test_cloud_helpers import CloudHelpersTestCase
 from test.test_instance_types_service import \
 from test.test_instance_types_service import \
     ProviderInstanceTypesServiceTestCase
     ProviderInstanceTypesServiceTestCase
 from test.test_provider_block_store_service import \
 from test.test_provider_block_store_service import \
@@ -40,6 +41,7 @@ from test.test_provider_region_service import ProviderRegionServiceTestCase
 from test.test_provider_security_service import ProviderSecurityServiceTestCase
 from test.test_provider_security_service import ProviderSecurityServiceTestCase
 
 
 PROVIDER_TESTS = [
 PROVIDER_TESTS = [
+    CloudHelpersTestCase,
     ProviderInterfaceTestCase,
     ProviderInterfaceTestCase,
     ProviderSecurityServiceTestCase,
     ProviderSecurityServiceTestCase,
     ProviderInstanceTypesServiceTestCase,
     ProviderInstanceTypesServiceTestCase,

+ 44 - 0
test/test_cloud_helpers.py

@@ -0,0 +1,44 @@
+import itertools
+
+from cloudbridge.cloud import helpers as cbhelpers
+from test.helpers import ProviderTestBase
+
+
+class CloudHelpersTestCase(ProviderTestBase):
+
+    def __init__(self, methodName, provider):
+        super(CloudHelpersTestCase, self).__init__(
+            methodName=methodName, provider=provider)
+
+    def test_result_list_conversion(self):
+
+        class DummyResult(object):
+
+            def __init__(self, objid, name):
+                self.id = objid
+                self.name = name
+
+            def __repr__(self):
+                return "%s (%s)" % (self.id, self.name)
+
+        objects = [DummyResult(1, "One"),
+                   DummyResult(2, "Two"),
+                   DummyResult(3, "Three"),
+                   DummyResult(4, "Four"),
+                   ]
+
+        results = cbhelpers.to_result_list(self.provider, objects, 2, None)
+        self.assertListEqual(results, list(itertools.islice(objects, 2)))
+        self.assertEqual(results.marker, objects[1].id)
+        self.assertTrue(results.supports_total)
+        self.assertEqual(results.total_results, 4)
+
+        results = cbhelpers.to_result_list(self.provider, objects, 2, 2)
+        self.assertListEqual(results, list(itertools.islice(objects, 2, 4)))
+        self.assertEqual(results.marker, None)
+        self.assertTrue(results.supports_total)
+        self.assertEqual(results.total_results, 4)
+
+        results = cbhelpers.to_result_list(self.provider, objects, 2, 3)
+        self.assertListEqual(results, list(itertools.islice(objects, 3, 4)))
+        self.assertEqual(results.marker, None)

+ 7 - 0
test/test_instance_types_service.py

@@ -1,3 +1,4 @@
+import itertools
 import six
 import six
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
 
 
@@ -10,6 +11,12 @@ class ProviderInstanceTypesServiceTestCase(ProviderTestBase):
 
 
     def test_instance_types(self):
     def test_instance_types(self):
         instance_types = self.provider.compute.instance_types.list()
         instance_types = self.provider.compute.instance_types.list()
+        # check iteration
+        iter_instance_types = list(itertools.islice(
+            self.provider.compute.instance_types,
+            len(instance_types)))
+        self.assertListEqual(iter_instance_types, instance_types)
+
         for inst_type in instance_types:
         for inst_type in instance_types:
             self.assertTrue(
             self.assertTrue(
                 inst_type.id in repr(inst_type),
                 inst_type.id in repr(inst_type),

+ 14 - 0
test/test_provider_block_store_service.py

@@ -1,3 +1,4 @@
+import itertools
 import uuid
 import uuid
 
 
 from cloudbridge.cloud.interfaces import SnapshotState
 from cloudbridge.cloud.interfaces import SnapshotState
@@ -37,6 +38,12 @@ class ProviderBlockStoreServiceTestCase(ProviderTestBase):
                 "repr(obj) should contain the object id so that the object"
                 "repr(obj) should contain the object id so that the object"
                 " can be reconstructed, but does not. eval(repr(obj)) == obj")
                 " can be reconstructed, but does not. eval(repr(obj)) == obj")
             volumes = self.provider.block_store.volumes.list()
             volumes = self.provider.block_store.volumes.list()
+            # check iteration
+            iter_volumes = list(itertools.islice(
+                self.provider.block_store.volumes,
+                len(volumes)))
+            self.assertListEqual(iter_volumes, volumes)
+
             found_volumes = [vol for vol in volumes if vol.name == name]
             found_volumes = [vol for vol in volumes if vol.name == name]
             self.assertTrue(
             self.assertTrue(
                 len(found_volumes) == 1,
                 len(found_volumes) == 1,
@@ -125,6 +132,13 @@ class ProviderBlockStoreServiceTestCase(ProviderTestBase):
                     " can be reconstructed, but does not.")
                     " can be reconstructed, but does not.")
 
 
                 snaps = self.provider.block_store.snapshots.list()
                 snaps = self.provider.block_store.snapshots.list()
+
+                # check iteration
+                iter_snaps = list(itertools.islice(
+                    self.provider.block_store.snapshots,
+                    len(snaps)))
+                self.assertListEqual(iter_snaps, snaps)
+
                 found_snaps = [snap for snap in snaps
                 found_snaps = [snap for snap in snaps
                                if snap.name == snap_name]
                                if snap.name == snap_name]
                 self.assertTrue(
                 self.assertTrue(

+ 8 - 0
test/test_provider_compute_service.py

@@ -1,3 +1,4 @@
+import itertools
 import uuid
 import uuid
 
 
 import ipaddress
 import ipaddress
@@ -33,6 +34,13 @@ class ProviderComputeServiceTestCase(ProviderTestBase):
             inst.wait_till_ready(interval=self.get_test_wait_interval())
             inst.wait_till_ready(interval=self.get_test_wait_interval())
 
 
             all_instances = self.provider.compute.instances.list()
             all_instances = self.provider.compute.instances.list()
+
+            # check iteration
+            iter_instances = list(itertools.islice(
+                self.provider.compute.instances,
+                len(all_instances)))
+            self.assertListEqual(iter_instances, all_instances)
+
             found_instances = [i for i in all_instances if i.name == name]
             found_instances = [i for i in all_instances if i.name == name]
             self.assertTrue(
             self.assertTrue(
                 len(found_instances) == 1,
                 len(found_instances) == 1,

+ 10 - 0
test/test_provider_image_service.py

@@ -1,5 +1,8 @@
+import itertools
 import uuid
 import uuid
+
 import six
 import six
+
 from cloudbridge.cloud.interfaces import MachineImageState
 from cloudbridge.cloud.interfaces import MachineImageState
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
 import test.helpers as helpers
 import test.helpers as helpers
@@ -47,6 +50,13 @@ class ProviderImageServiceTestCase(ProviderTestBase):
                     "Image description must be None or a string")
                     "Image description must be None or a string")
 
 
                 images = self.provider.compute.images.list()
                 images = self.provider.compute.images.list()
+
+                # check iteration
+                iter_images = list(itertools.islice(
+                    self.provider.compute.images,
+                    len(images)))
+                self.assertListEqual(iter_images, images)
+
                 found_images = [image for image in images
                 found_images = [image for image in images
                                 if image.name == name]
                                 if image.name == name]
                 self.assertTrue(
                 self.assertTrue(

+ 15 - 0
test/test_provider_object_store_service.py

@@ -1,4 +1,5 @@
 from io import BytesIO
 from io import BytesIO
+import itertools
 import uuid
 import uuid
 
 
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
@@ -20,6 +21,13 @@ class ProviderObjectStoreServiceTestCase(ProviderTestBase):
         test_container = self.provider.object_store.create(name)
         test_container = self.provider.object_store.create(name)
         with helpers.cleanup_action(lambda: test_container.delete()):
         with helpers.cleanup_action(lambda: test_container.delete()):
             containers = self.provider.object_store.list()
             containers = self.provider.object_store.list()
+
+            # check iteration
+            iter_containers = list(itertools.islice(
+                self.provider.object_store,
+                len(containers)))
+            self.assertListEqual(iter_containers, containers)
+
             found_containers = [c for c in containers if c.name == name]
             found_containers = [c for c in containers if c.name == name]
             self.assertTrue(
             self.assertTrue(
                 len(found_containers) == 1,
                 len(found_containers) == 1,
@@ -66,6 +74,13 @@ class ProviderObjectStoreServiceTestCase(ProviderTestBase):
                 # the file content as a parameter.
                 # the file content as a parameter.
                 obj.upload("dummy content")
                 obj.upload("dummy content")
                 objs = test_container.list()
                 objs = test_container.list()
+
+                # check iteration
+                iter_objs = list(itertools.islice(
+                    test_container,
+                    len(objs)))
+                self.assertListEqual(iter_objs, objs)
+
                 found_objs = [o for o in objs if o.name == obj_name]
                 found_objs = [o for o in objs if o.name == obj_name]
                 self.assertTrue(
                 self.assertTrue(
                     len(found_objs) == 1,
                     len(found_objs) == 1,

+ 9 - 0
test/test_provider_region_service.py

@@ -1,3 +1,5 @@
+import itertools
+
 from cloudbridge.cloud.interfaces import Region
 from cloudbridge.cloud.interfaces import Region
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
 
 
@@ -14,6 +16,13 @@ class ProviderRegionServiceTestCase(ProviderTestBase):
         and whether zones are returned appropriately.
         and whether zones are returned appropriately.
         """
         """
         regions = self.provider.compute.regions.list()
         regions = self.provider.compute.regions.list()
+
+        # check iteration
+        iter_regions = list(itertools.islice(
+            self.provider.compute.regions,
+            len(regions)))
+        self.assertListEqual(iter_regions, regions)
+
         for region in regions:
         for region in regions:
             self.assertIsInstance(
             self.assertIsInstance(
                 region,
                 region,

+ 16 - 0
test/test_provider_security_service.py

@@ -1,4 +1,6 @@
+import itertools
 import uuid
 import uuid
+
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
 import test.helpers as helpers
 import test.helpers as helpers
 
 
@@ -27,6 +29,13 @@ class ProviderSecurityServiceTestCase(ProviderTestBase):
                 "Recreating key pair did not return the expected key {0}."
                 "Recreating key pair did not return the expected key {0}."
                 .format(name))
                 .format(name))
         kpl = self.provider.security.key_pairs.list()
         kpl = self.provider.security.key_pairs.list()
+
+        # check iteration
+        iter_key_pairs = list(itertools.islice(
+            self.provider.security.key_pairs,
+            len(kpl)))
+        self.assertListEqual(iter_key_pairs, kpl)
+
         found_kp = [k for k in kpl if k.name == name]
         found_kp = [k for k in kpl if k.name == name]
         self.assertTrue(
         self.assertTrue(
             len(found_kp) == 0,
             len(found_kp) == 0,
@@ -81,6 +90,13 @@ class ProviderSecurityServiceTestCase(ProviderTestBase):
                 "List security groups did not return the expected group {0}."
                 "List security groups did not return the expected group {0}."
                 .format(name))
                 .format(name))
         sgl = self.provider.security.security_groups.list()
         sgl = self.provider.security.security_groups.list()
+
+        # check iteration
+        iter_security_groups = list(itertools.islice(
+            self.provider.security.security_groups,
+            len(sgl)))
+        self.assertListEqual(iter_security_groups, sgl)
+
         found_sg = [g for g in sgl if g.name == name]
         found_sg = [g for g in sgl if g.name == name]
         self.assertTrue(
         self.assertTrue(
             len(found_sg) == 0,
             len(found_sg) == 0,