impl.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. """
  2. Provider implementation based on openstack python client for OpenStack
  3. compatible clouds.
  4. """
  5. import os
  6. from cinderclient import client as cinder_client
  7. from keystoneclient import client as keystone_client
  8. from keystoneclient import session
  9. from keystoneclient.auth.identity import Password
  10. from novaclient import client as nova_client
  11. from swiftclient import client as swift_client
  12. from cloudbridge.cloud.base import BaseCloudProvider
  13. from .services import OpenStackBlockStoreService
  14. from .services import OpenStackComputeService
  15. from .services import OpenStackObjectStoreService
  16. from .services import OpenStackSecurityService
  17. class OpenStackCloudProvider(BaseCloudProvider):
  18. def __init__(self, config):
  19. super(OpenStackCloudProvider, self).__init__(config)
  20. self.username = self._get_config_value(
  21. 'username', os.environ.get('OS_USERNAME', None))
  22. self.password = self._get_config_value(
  23. 'password', os.environ.get('OS_PASSWORD', None))
  24. self.tenant_name = self._get_config_value(
  25. 'tenant_name', os.environ.get('OS_TENANT_NAME', None))
  26. self.auth_url = self._get_config_value(
  27. 'auth_url', os.environ.get('OS_AUTH_URL', None))
  28. self.region_name = self._get_config_value(
  29. 'region_name', os.environ.get('OS_REGION_NAME', None))
  30. self.nova = self._connect_nova()
  31. self.keystone = self._connect_keystone()
  32. self.cinder = self._connect_cinder()
  33. self.swift = self._connect_swift()
  34. self._compute = OpenStackComputeService(self)
  35. self._security = OpenStackSecurityService(self)
  36. self._block_store = OpenStackBlockStoreService(self)
  37. self._object_store = OpenStackObjectStoreService(self)
  38. @property
  39. def account(self):
  40. raise NotImplementedError(
  41. 'account not implemented by this provider')
  42. @property
  43. def compute(self):
  44. return self._compute
  45. @property
  46. def security(self):
  47. return self._security
  48. @property
  49. def block_store(self):
  50. return self._block_store
  51. @property
  52. def object_store(self):
  53. return self._object_store
  54. def _connect_nova(self):
  55. """
  56. Get an openstack nova client object for the given cloud.
  57. """
  58. api_version = self._get_config_value(
  59. 'os_compute_api_version',
  60. os.environ.get('OS_COMPUTE_API_VERSION', 2))
  61. service_name = self._get_config_value(
  62. 'nova_service_name',
  63. os.environ.get('NOVA_SERVICE_NAME', None))
  64. return nova_client.Client(
  65. api_version, username=self.username, api_key=self.password,
  66. project_id=self.tenant_name, auth_url=self.auth_url,
  67. region_name=self.region_name, service_name=service_name)
  68. def _connect_keystone(self):
  69. """
  70. Get an openstack keystone client object for the given cloud.
  71. """
  72. auth = Password(self.auth_url, username=self.username,
  73. password=self.password, tenant_name=self.tenant_name)
  74. # Wow, the internal keystoneV2 implementation is terribly buggy. It
  75. # needs both a separate Session object and the username, password again
  76. # for things to work correctly. Plus, a manual call to authenticate()
  77. # is also required if the service catalogue needs to be queried
  78. keystone = keystone_client.Client(
  79. session=session.Session(auth=auth),
  80. auth_url=self.auth_url,
  81. username=self.username,
  82. password=self.password,
  83. tenant_name=self.tenant_name,
  84. region_name=self.region_name)
  85. keystone.authenticate()
  86. return keystone
  87. def _connect_cinder(self):
  88. """
  89. Get an openstack cinder client object for the given cloud.
  90. """
  91. api_version = self._get_config_value(
  92. 'os_volume_api_version',
  93. os.environ.get('OS_VOLUME_API_VERSION', 2))
  94. return cinder_client.Client(
  95. api_version, username=self.username, api_key=self.password,
  96. project_id=self.tenant_name, auth_url=self.auth_url)
  97. def _connect_swift(self):
  98. """
  99. Get an openstack swift client object for the given cloud.
  100. """
  101. os_options = {'region_name': self.region_name}
  102. return swift_client.Connection(
  103. authurl=self.auth_url, auth_version='2', user=self.username,
  104. key=self.password, tenant_name=self.tenant_name,
  105. os_options=os_options)