2
0

services.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. """
  2. Base implementation for services available through a provider
  3. """
  4. import logging
  5. from cloudbridge.cloud.interfaces.resources import Router
  6. from cloudbridge.cloud.interfaces.services import BucketService
  7. from cloudbridge.cloud.interfaces.services import CloudService
  8. from cloudbridge.cloud.interfaces.services import ComputeService
  9. from cloudbridge.cloud.interfaces.services import FloatingIPService
  10. from cloudbridge.cloud.interfaces.services import GatewayService
  11. from cloudbridge.cloud.interfaces.services import ImageService
  12. from cloudbridge.cloud.interfaces.services import InstanceService
  13. from cloudbridge.cloud.interfaces.services import KeyPairService
  14. from cloudbridge.cloud.interfaces.services import NetworkService
  15. from cloudbridge.cloud.interfaces.services import NetworkingService
  16. from cloudbridge.cloud.interfaces.services import RegionService
  17. from cloudbridge.cloud.interfaces.services import RouterService
  18. from cloudbridge.cloud.interfaces.services import SecurityService
  19. from cloudbridge.cloud.interfaces.services import SnapshotService
  20. from cloudbridge.cloud.interfaces.services import StorageService
  21. from cloudbridge.cloud.interfaces.services import SubnetService
  22. from cloudbridge.cloud.interfaces.services import VMFirewallService
  23. from cloudbridge.cloud.interfaces.services import VMTypeService
  24. from cloudbridge.cloud.interfaces.services import VolumeService
  25. from .resources import BasePageableObjectMixin
  26. log = logging.getLogger(__name__)
  27. class BaseCloudService(CloudService):
  28. def __init__(self, provider):
  29. self._provider = provider
  30. @property
  31. def provider(self):
  32. return self._provider
  33. class BaseComputeService(ComputeService, BaseCloudService):
  34. def __init__(self, provider):
  35. super(BaseComputeService, self).__init__(provider)
  36. class BaseVolumeService(
  37. BasePageableObjectMixin, VolumeService, BaseCloudService):
  38. def __init__(self, provider):
  39. super(BaseVolumeService, self).__init__(provider)
  40. class BaseSnapshotService(
  41. BasePageableObjectMixin, SnapshotService, BaseCloudService):
  42. def __init__(self, provider):
  43. super(BaseSnapshotService, self).__init__(provider)
  44. class BaseStorageService(StorageService, BaseCloudService):
  45. def __init__(self, provider):
  46. super(BaseStorageService, self).__init__(provider)
  47. class BaseImageService(
  48. BasePageableObjectMixin, ImageService, BaseCloudService):
  49. def __init__(self, provider):
  50. super(BaseImageService, self).__init__(provider)
  51. class BaseBucketService(
  52. BasePageableObjectMixin, BucketService, BaseCloudService):
  53. def __init__(self, provider):
  54. super(BaseBucketService, self).__init__(provider)
  55. class BaseSecurityService(SecurityService, BaseCloudService):
  56. def __init__(self, provider):
  57. super(BaseSecurityService, self).__init__(provider)
  58. class BaseKeyPairService(
  59. BasePageableObjectMixin, KeyPairService, BaseCloudService):
  60. def __init__(self, provider):
  61. super(BaseKeyPairService, self).__init__(provider)
  62. def delete(self, key_pair_id):
  63. """
  64. Delete an existing key pair.
  65. :type key_pair_id: str
  66. :param key_pair_id: The id of the key pair to be deleted.
  67. :rtype: ``bool``
  68. :return: ``True`` if the key does not exist. Note that this implies
  69. that the key may not have been deleted by this method but
  70. instead has not existed in the first place.
  71. """
  72. log.info("Deleting the existing key pair %s", key_pair_id)
  73. kp = self.get(key_pair_id)
  74. if kp:
  75. kp.delete()
  76. return True
  77. class BaseVMFirewallService(
  78. BasePageableObjectMixin, VMFirewallService, BaseCloudService):
  79. def __init__(self, provider):
  80. super(BaseVMFirewallService, self).__init__(provider)
  81. class BaseVMTypeService(
  82. BasePageableObjectMixin, VMTypeService, BaseCloudService):
  83. def __init__(self, provider):
  84. super(BaseVMTypeService, self).__init__(provider)
  85. def get(self, vm_type_id):
  86. vm_type = (t for t in self if t.id == vm_type_id)
  87. return next(vm_type, None)
  88. def find(self, **kwargs):
  89. name = kwargs.get('name')
  90. log.info("Searching for VMTypeService with the: name %s ...", name)
  91. if name:
  92. return [itype for itype in self if itype.name == name]
  93. else:
  94. log.exception("TypeError exception raised. Invalid parameters "
  95. "used for search.")
  96. raise TypeError(
  97. "Invalid parameters for search. Supported attributes: {name}")
  98. class BaseInstanceService(
  99. BasePageableObjectMixin, InstanceService, BaseCloudService):
  100. def __init__(self, provider):
  101. super(BaseInstanceService, self).__init__(provider)
  102. class BaseRegionService(
  103. BasePageableObjectMixin, RegionService, BaseCloudService):
  104. def __init__(self, provider):
  105. super(BaseRegionService, self).__init__(provider)
  106. def find(self, name):
  107. return [region for region in self if region.name == name]
  108. class BaseNetworkingService(NetworkingService, BaseCloudService):
  109. def __init__(self, provider):
  110. super(BaseNetworkingService, self).__init__(provider)
  111. class BaseNetworkService(
  112. BasePageableObjectMixin, NetworkService, BaseCloudService):
  113. def __init__(self, provider):
  114. super(BaseNetworkService, self).__init__(provider)
  115. @property
  116. def subnets(self):
  117. return [subnet for subnet in self.provider.subnets
  118. if subnet.network_id == self.id]
  119. def delete(self, network_id):
  120. network = self.get(network_id)
  121. if network:
  122. log.info("Deleting network %s", network_id)
  123. network.delete()
  124. class BaseSubnetService(
  125. BasePageableObjectMixin, SubnetService, BaseCloudService):
  126. def __init__(self, provider):
  127. super(BaseSubnetService, self).__init__(provider)
  128. def find(self, **kwargs):
  129. name = kwargs.get('name')
  130. log.info("Searching for SubnetService with the name: %s ...", name)
  131. if name:
  132. return [subnet for subnet in self if subnet.name == name]
  133. else:
  134. log.exception("TypeError exception raised. Invalid parameters "
  135. "used for search.")
  136. raise TypeError(
  137. "Invalid parameters for search. Supported attributes: {name}")
  138. class BaseFloatingIPService(
  139. BasePageableObjectMixin, FloatingIPService, BaseCloudService):
  140. def __init__(self, provider):
  141. super(BaseFloatingIPService, self).__init__(provider)
  142. def find(self, **kwargs):
  143. if 'name' in kwargs:
  144. name = kwargs.get('name')
  145. log.info("Searching for FloatingIPService with the "
  146. "name: %s...", name)
  147. if name:
  148. return [fip for fip in self if fip.name == name]
  149. else:
  150. log.exception("TypeError exception raised. Invalid parameters "
  151. "used for search.")
  152. raise TypeError(
  153. "Invalid parameters for search. Supported attributes: {name}")
  154. def delete(self, fip_id):
  155. floating_ip = self.get(fip_id)
  156. if floating_ip:
  157. floating_ip.delete()
  158. class BaseRouterService(
  159. BasePageableObjectMixin, RouterService, BaseCloudService):
  160. def __init__(self, provider):
  161. super(BaseRouterService, self).__init__(provider)
  162. def delete(self, router):
  163. if isinstance(router, Router):
  164. log.info("Router %s successful deleted.", router)
  165. router.delete()
  166. else:
  167. log.info("Getting router %s", router)
  168. router = self.get(router)
  169. if router:
  170. log.info("Router %s successful deleted.", router)
  171. router.delete()
  172. class BaseGatewayService(
  173. GatewayService, BaseCloudService):
  174. def __init__(self, provider):
  175. super(BaseGatewayService, self).__init__(provider)