test_interface.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import unittest
  2. import cloudbridge
  3. from cloudbridge import interfaces
  4. from cloudbridge.base import helpers as cb_helpers
  5. from cloudbridge.factory import CloudProviderFactory
  6. from cloudbridge.interfaces import TestMockHelperMixin
  7. from cloudbridge.interfaces.exceptions import ProviderConnectionException
  8. from tests import helpers
  9. from tests.helpers import ProviderTestBase
  10. class CloudInterfaceTestCase(ProviderTestBase):
  11. _multiprocess_can_split_ = True
  12. def test_name_property(self):
  13. # Name should always return a value and should not raise an exception
  14. assert self.provider.name
  15. def test_has_service_valid_service_type(self):
  16. # has_service with a valid service type should return
  17. # a boolean and raise no exceptions
  18. for key, value in interfaces.CloudServiceType.__dict__.items():
  19. if not key.startswith("__"):
  20. self.provider.has_service(value)
  21. def test_has_service_invalid_service_type(self):
  22. # has_service with an invalid service type should return False
  23. self.assertFalse(
  24. self.provider.has_service("NON_EXISTENT_SERVICE"),
  25. "has_service should not return True for a non-existent service")
  26. def test_library_version(self):
  27. # Check that the library version can be retrieved.
  28. self.assertIsNotNone(cloudbridge.get_version(),
  29. "Did not get library version.")
  30. def test_authenticate_success(self):
  31. self.assertTrue(self.provider.authenticate())
  32. def test_authenticate_failure(self):
  33. if isinstance(self.provider, TestMockHelperMixin):
  34. raise unittest.SkipTest(
  35. "Mock providers are not expected to"
  36. " authenticate correctly")
  37. # Mock up test by clearing credentials on a per provider basis
  38. cloned_config = self.provider.config.copy()
  39. if self.provider.PROVIDER_ID == 'aws':
  40. cloned_config['aws_access_key'] = "dummy_a_key"
  41. cloned_config['aws_secret_key'] = "dummy_s_key"
  42. elif self.provider.PROVIDER_ID == 'openstack':
  43. cloned_config['os_username'] = "cb_dummy"
  44. cloned_config['os_password'] = "cb_dummy"
  45. elif self.provider.PROVIDER_ID == 'azure':
  46. cloned_config['azure_subscription_id'] = "cb_dummy"
  47. elif self.provider.PROVIDER_ID == 'gcp':
  48. cloned_config['gcp_service_creds_dict'] = {'dummy': 'dict'}
  49. with self.assertRaises(ProviderConnectionException):
  50. cloned_provider = CloudProviderFactory().create_provider(
  51. self.provider.PROVIDER_ID, cloned_config)
  52. cloned_provider.authenticate()
  53. def test_provider_zone_in_region(self):
  54. cloned_config = self.provider.config.copy()
  55. # Just a simpler way set zone to null for any provider
  56. # instead of doing it individually for each provider
  57. cloned_config['aws_zone_name'] = None
  58. cloned_config['azure_zone_name'] = None
  59. cloned_config['gcp_zone_name'] = None
  60. cloned_config['openstack_zone_name'] = None
  61. cloned_provider = CloudProviderFactory().create_provider(
  62. self.provider.PROVIDER_ID, cloned_config)
  63. region = cloned_provider.compute.regions.get(
  64. cloned_provider.region_name)
  65. matches = [zone.name for zone in region.zones
  66. if zone.name == cloned_provider.zone_name]
  67. # FIXME: GCP always requires a zone, so skip for now
  68. if self.provider.PROVIDER_ID != 'gcp':
  69. self.assertListEqual([cloned_provider.zone_name], matches)
  70. def test_provider_always_has_zone(self):
  71. cloned_config = self.provider.config.copy()
  72. # Just a simpler way set zone to null for any provider
  73. # instead of doing it individually for each provider
  74. cloned_config['aws_zone_name'] = None
  75. cloned_config['azure_zone_name'] = None
  76. cloned_config['gcp_zone_name'] = None
  77. cloned_config['openstack_zone_name'] = None
  78. cloned_provider = CloudProviderFactory().create_provider(
  79. self.provider.PROVIDER_ID, cloned_config)
  80. # FIXME: GCP always requires a zone, so skip for now
  81. if self.provider.PROVIDER_ID != 'gcp':
  82. self.assertIsNotNone(cloned_provider.zone_name)
  83. def test_clone_provider_zone(self):
  84. for zone in list(self.provider.compute.regions.current.zones)[:2]:
  85. cloned_provider = self.provider.clone(zone=zone)
  86. test_vol = None
  87. # Currently, volumes are the cheapest object that's actually
  88. # cross-zonal for all providers
  89. with cb_helpers.cleanup_action(lambda: test_vol.delete()):
  90. label = "cb-attachvol-{0}".format(helpers.get_uuid())
  91. test_vol = cloned_provider.storage.volumes.create(label, 1)
  92. self.assertEqual(test_vol.zone_id, zone.id)