impl.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. """
  2. Provider implementation based on openstack python client for OpenStack
  3. compatible clouds.
  4. """
  5. import os
  6. from keystoneclient import client as keystone_client
  7. from keystoneclient import session
  8. from keystoneclient.auth.identity import Password
  9. from novaclient import client as nova_client
  10. from cloudbridge.providers.base import BaseCloudProvider
  11. from .services import OpenStackComputeService
  12. from .services import OpenStackImageService
  13. from .services import OpenStackSecurityService
  14. class OpenStackCloudProviderV1(BaseCloudProvider):
  15. def __init__(self, config):
  16. super(OpenStackCloudProviderV1, self).__init__(config)
  17. self.api_version = self._get_config_value(
  18. 'api_version', os.environ.get('OS_COMPUTE_API_VERSION', 2))
  19. self.username = self._get_config_value(
  20. 'username', os.environ.get('OS_USERNAME', None))
  21. self.password = self._get_config_value(
  22. 'password', os.environ.get('OS_PASSWORD', None))
  23. self.tenant_name = self._get_config_value(
  24. 'tenant_name', os.environ.get('OS_TENANT_NAME', None))
  25. self.auth_url = self._get_config_value(
  26. 'auth_url', os.environ.get('OS_AUTH_URL', None))
  27. self.nova = self._connect_nova()
  28. self.keystone = self._connect_keystone()
  29. self._compute = OpenStackComputeService(self)
  30. self._images = OpenStackImageService(self)
  31. self._security = OpenStackSecurityService(self)
  32. self._block_store = None # OpenStackBlockStore(self)
  33. self._object_store = None # OpenStackObjectStore(self)
  34. @property
  35. def compute(self):
  36. return self._compute
  37. @property
  38. def images(self):
  39. return self._images
  40. @property
  41. def security(self):
  42. return self._security
  43. @property
  44. def block_store(self):
  45. return self._block_store
  46. @property
  47. def object_store(self):
  48. return self._object_store
  49. def _connect_nova(self):
  50. """
  51. Get an openstack client object for the given cloud.
  52. """
  53. return nova_client.Client(
  54. self.api_version, self.username, self.password, self.tenant_name,
  55. self.auth_url)
  56. def _connect_keystone(self):
  57. """
  58. Get an openstack client object for the given cloud.
  59. """
  60. auth = Password(self.auth_url, username=self.username,
  61. password=self.password, tenant_name=self.tenant_name)
  62. # Wow, the internal keystoneV2 implementation is terribly buggy. It
  63. # needs both a separate Session object and the username, password again
  64. # for things to work correctly. Plus, a manual call to authenticate()
  65. # is also required if the service catalogue needs to be queried
  66. keystone = keystone_client.Client(
  67. session=session.Session(auth=auth),
  68. auth_url=self.auth_url,
  69. username=self.username,
  70. password=self.password,
  71. tenant_name=self.tenant_name)
  72. keystone.authenticate()
  73. return keystone