test_cloud_factory.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import unittest
  2. from pyeventsystem.middleware import intercept
  3. from cloudbridge.cloud import factory
  4. from cloudbridge.cloud import interfaces
  5. from cloudbridge.cloud.base import helpers as cb_helpers
  6. from cloudbridge.cloud.factory import CloudProviderFactory
  7. from cloudbridge.cloud.interfaces import TestMockHelperMixin
  8. from cloudbridge.cloud.interfaces.provider import CloudProvider
  9. from cloudbridge.cloud.providers.aws import AWSCloudProvider
  10. class CloudFactoryTestCase(unittest.TestCase):
  11. _multiprocess_can_split_ = True
  12. def test_create_provider_valid(self):
  13. # Creating a provider with a known name should return
  14. # a valid implementation
  15. self.assertIsInstance(CloudProviderFactory().create_provider(
  16. factory.ProviderList.AWS, {}),
  17. interfaces.CloudProvider,
  18. "create_provider did not return a valid VM type")
  19. def test_create_provider_invalid(self):
  20. # Creating a provider with an invalid name should raise a
  21. # NotImplementedError
  22. with self.assertRaises(NotImplementedError):
  23. CloudProviderFactory().create_provider("ec23", {})
  24. def test_get_provider_class_valid(self):
  25. # Searching for a provider class with a known name should return a
  26. # valid class
  27. self.assertEqual(CloudProviderFactory().get_provider_class(
  28. factory.ProviderList.AWS), AWSCloudProvider)
  29. def test_get_provider_class_invalid(self):
  30. # Searching for a provider class with an invalid name should
  31. # return None
  32. self.assertIsNone(CloudProviderFactory().get_provider_class("aws1"))
  33. def test_find_provider_include_mocks(self):
  34. self.assertTrue(
  35. any(cls for cls
  36. in CloudProviderFactory().get_all_provider_classes()
  37. if issubclass(cls, TestMockHelperMixin)),
  38. "expected to find at least one mock provider")
  39. def test_find_provider_exclude_mocks(self):
  40. for cls in CloudProviderFactory().get_all_provider_classes(
  41. ignore_mocks=True):
  42. self.assertTrue(
  43. not issubclass(cls, TestMockHelperMixin),
  44. "Did not expect mock but %s implements mock provider" % cls)
  45. def test_register_provider_class_invalid(self):
  46. # Attempting to register an invalid test class should be ignored
  47. class DummyClass(object):
  48. PROVIDER_ID = 'aws'
  49. factory = CloudProviderFactory()
  50. factory.register_provider_class(DummyClass)
  51. self.assertTrue(DummyClass not in
  52. factory.get_all_provider_classes())
  53. def test_register_provider_class_double(self):
  54. # Attempting to register the same class twice should register second
  55. # instance
  56. class DummyClass(CloudProvider):
  57. PROVIDER_ID = 'aws'
  58. factory = CloudProviderFactory()
  59. factory.list_providers()
  60. factory.register_provider_class(DummyClass)
  61. self.assertTrue(DummyClass in
  62. factory.get_all_provider_classes())
  63. self.assertTrue(AWSCloudProvider not in
  64. factory.get_all_provider_classes())
  65. def test_register_provider_class_without_id(self):
  66. # Attempting to register a class without a PROVIDER_ID attribute
  67. # should be ignored.
  68. class DummyClass(CloudProvider):
  69. pass
  70. factory = CloudProviderFactory()
  71. factory.register_provider_class(DummyClass)
  72. self.assertTrue(DummyClass not in
  73. factory.get_all_provider_classes())
  74. def test_middleware_inherited(self):
  75. start_count = 10
  76. class SomeDummyClass(object):
  77. count = start_count
  78. @intercept(event_pattern="*", priority=2499)
  79. def return_incremented(self, event_args, *args, **kwargs):
  80. self.count += 1
  81. return self.count
  82. factory = CloudProviderFactory()
  83. some_obj = SomeDummyClass()
  84. factory.middleware.add(some_obj)
  85. provider_name = cb_helpers.get_env("CB_TEST_PROVIDER", "aws")
  86. first_prov = factory.create_provider(provider_name, {})
  87. # Any dispatched event should be intercepted and increment the count
  88. first_prov.storage.volumes.get("anything")
  89. self.assertEqual(first_prov.networking.networks.get("anything"),
  90. start_count + 2)
  91. second_prov = factory.create_provider(provider_name, {})
  92. # This count should be independent of the previous one
  93. self.assertEqual(second_prov.networking.networks.get("anything"),
  94. start_count + 3)
  95. def test_middleware_inherited_constructor(self):
  96. start_count = 10
  97. increment = 2
  98. class SomeDummyClass(object):
  99. count = start_count
  100. @intercept(event_pattern="*", priority=2499)
  101. def return_incremented(self, event_args, *args, **kwargs):
  102. self.count += 1
  103. return self.count
  104. factory = CloudProviderFactory()
  105. factory.middleware.add_middleware_class(SomeDummyClass)
  106. provider_name = cb_helpers.get_env("CB_TEST_PROVIDER", "aws")
  107. first_prov = factory.create_provider(provider_name, {})
  108. # Any dispatched event should be intercepted and increment the count
  109. first_prov.storage.volumes.get("anything")
  110. self.assertEqual(first_prov.networking.networks.get("anything"),
  111. start_count + 2)
  112. second_prov = factory.create_provider(provider_name, {})
  113. # This count should be independent of the previous one
  114. self.assertEqual(second_prov.networking.networks.get("anything"),
  115. start_count + 1)
  116. class SomeDummyClassWithArgs(object):
  117. def __init__(self, start, increment=1):
  118. self.count = start
  119. self.increment = increment
  120. @intercept(event_pattern="*", priority=2499)
  121. def return_incremented(self, event_args, *args, **kwargs):
  122. self.count += self.increment
  123. return self.count
  124. factory = CloudProviderFactory()
  125. factory.middleware.add_middleware_class(SomeDummyClassWithArgs,
  126. start_count,
  127. increment=increment)
  128. provider_name = cb_helpers.get_env("CB_TEST_PROVIDER", "aws")
  129. first_prov = factory.create_provider(provider_name, {})
  130. # Any dispatched event should be intercepted and increment the count
  131. first_prov.storage.volumes.get("anything")
  132. self.assertEqual(first_prov.networking.networks.get("anything"),
  133. start_count + 2*increment)
  134. second_prov = factory.create_provider(provider_name, {})
  135. # This count should be independent of the previous one
  136. self.assertEqual(second_prov.networking.networks.get("anything"),
  137. start_count + increment)
  138. def test_middleware_inherited_events(self):
  139. class SomeDummyClass(object):
  140. @intercept(event_pattern="*", priority=2499)
  141. def return_goodbye(self, event_args, *args, **kwargs):
  142. return "goodbye"
  143. def return_hello(event_args, *args, **kwargs):
  144. return "hello"
  145. factory = CloudProviderFactory()
  146. factory.middleware.add(SomeDummyClass())
  147. factory.middleware.events.intercept("*", 2490, return_hello)
  148. provider_name = cb_helpers.get_env("CB_TEST_PROVIDER", "aws")
  149. prov = factory.create_provider(provider_name, {})
  150. # Any dispatched event should be intercepted and return "hello" instead
  151. self.assertEqual(prov.networking.networks.get("anything"),
  152. "hello")