services.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. """
  2. Services implemented by this provider
  3. """
  4. from cloudbridge.providers.base import BaseKeyPair
  5. from cloudbridge.providers.base import BaseSecurityGroup
  6. from cloudbridge.providers.interfaces import BlockStoreService
  7. from cloudbridge.providers.interfaces import ComputeService
  8. from cloudbridge.providers.interfaces import ImageService
  9. from cloudbridge.providers.interfaces import InstanceType
  10. from cloudbridge.providers.interfaces import InstanceTypesService
  11. from cloudbridge.providers.interfaces import KeyPair
  12. from cloudbridge.providers.interfaces import MachineImage
  13. from cloudbridge.providers.interfaces import PlacementZone
  14. from cloudbridge.providers.interfaces import SecurityGroup
  15. from cloudbridge.providers.interfaces import SecurityService
  16. from cloudbridge.providers.interfaces import SnapshotService
  17. from cloudbridge.providers.interfaces import VolumeService
  18. from .resources import OpenStackInstance
  19. from .resources import OpenStackInstanceType
  20. from .resources import OpenStackMachineImage
  21. from .resources import OpenStackRegion
  22. from .resources import OpenStackSnapshot
  23. from .resources import OpenStackVolume
  24. class OpenStackSecurityService(SecurityService):
  25. def __init__(self, provider):
  26. self.provider = provider
  27. def list_key_pairs(self):
  28. """
  29. List all key pairs associated with this account.
  30. :rtype: ``list`` of :class:`.KeyPair`
  31. :return: list of KeyPair objects
  32. """
  33. key_pairs = self.provider.nova.keypairs.list()
  34. return [BaseKeyPair(kp.id) for kp in key_pairs]
  35. def list_security_groups(self):
  36. """
  37. Create a new security group
  38. :rtype: ``list`` of :class:`.KeyPair`
  39. :return: list of KeyPair objects
  40. """
  41. groups = self.provider.nova.security_groups.list()
  42. return [BaseSecurityGroup(group.name) for group in groups]
  43. class OpenStackImageService(ImageService):
  44. def __init__(self, provider):
  45. self.provider = provider
  46. def get_image(self, image_id):
  47. """
  48. Returns an Image given its id
  49. """
  50. image = self.provider.nova.images.get(image_id)
  51. if image:
  52. return OpenStackMachineImage(self.provider, image)
  53. else:
  54. return None
  55. def find_image(self, name):
  56. """
  57. Searches for an image by a given list of attributes
  58. """
  59. raise NotImplementedError(
  60. 'find_image not implemented by this provider')
  61. def list_images(self):
  62. """
  63. List all images.
  64. """
  65. images = self.provider.nova.images.list()
  66. return [OpenStackMachineImage(self.provider, image)
  67. for image in images]
  68. class OpenStackInstanceTypesService(InstanceTypesService):
  69. def __init__(self, provider):
  70. self.provider = provider
  71. def list(self):
  72. return [OpenStackInstanceType(f)
  73. for f in self.provider.nova.flavors.list()]
  74. def find_by_name(self, name):
  75. return next(
  76. (itype for itype in self.list() if itype.name == name), None)
  77. class OpenStackBlockStoreService(BlockStoreService):
  78. def __init__(self, provider):
  79. self.provider = provider
  80. # Initialize provider services
  81. self._volumes = OpenStackVolumeService(self.provider)
  82. self._snapshots = OpenStackSnapshotService(self.provider)
  83. @property
  84. def volumes(self):
  85. return self._volumes
  86. @property
  87. def snapshots(self):
  88. return self._snapshots
  89. class OpenStackVolumeService(VolumeService):
  90. def __init__(self, provider):
  91. self.provider = provider
  92. def get_volume(self, volume_id):
  93. """
  94. Returns a volume given its id.
  95. """
  96. vol = self.provider.cinder.volumes.get(volume_id)
  97. return OpenStackVolume(self.provider, vol) if vol else None
  98. def find_volume(self, name):
  99. """
  100. Searches for a volume by a given list of attributes.
  101. """
  102. raise NotImplementedError(
  103. 'find_volume not implemented by this provider')
  104. def list_volumes(self):
  105. """
  106. List all volumes.
  107. """
  108. return [OpenStackVolume(self.provider, vol)
  109. for vol in self.provider.cinder.volumes.list()]
  110. def create_volume(self, name, size, zone, snapshot=None):
  111. """
  112. Creates a new volume.
  113. """
  114. zone_name = zone.name if isinstance(zone, PlacementZone) else zone
  115. snapshot_id = snapshot.snapshot_id if isinstance(
  116. zone, OpenStackSnapshot) and snapshot else snapshot
  117. os_vol = self.provider.cinder.volumes.create(
  118. size, name=name, availability_zone=zone_name,
  119. snapshot_id=snapshot_id)
  120. return OpenStackVolume(self.provider, os_vol)
  121. class OpenStackSnapshotService(SnapshotService):
  122. def __init__(self, provider):
  123. self.provider = provider
  124. def get_snapshot(self, snapshot_id):
  125. """
  126. Returns a snapshot given its id.
  127. """
  128. snap = self.provider.cinder.volume_snapshots.get(snapshot_id)
  129. return OpenStackSnapshot(self.provider, snap) if snap else None
  130. def find_snapshot(self, name):
  131. """
  132. Searches for a volume by a given list of attributes.
  133. """
  134. raise NotImplementedError(
  135. 'find_volume not implemented by this provider')
  136. def list_snapshots(self):
  137. """
  138. List all snapshot.
  139. """
  140. return [OpenStackSnapshot(self.provider, snap)
  141. for snap in self.provider.cinder.volume_snapshots.list()]
  142. def create_snapshot(self, name, volume, description=None):
  143. """
  144. Creates a new snapshot of a given volume.
  145. """
  146. volume_id = volume.volume_id if \
  147. isinstance(volume, OpenStackVolume) else volume
  148. os_snap = self.provider.cinder.volume_snapshots.create(
  149. volume_id, name=name,
  150. description=description)
  151. return OpenStackSnapshot(self.provider, os_snap)
  152. class OpenStackComputeService(ComputeService):
  153. def __init__(self, provider):
  154. self.provider = provider
  155. self.instance_types = OpenStackInstanceTypesService(self.provider)
  156. def create_instance(self, name, image, instance_type, zone=None,
  157. keypair=None, security_groups=None, user_data=None,
  158. block_device_mapping=None, network_interfaces=None,
  159. **kwargs):
  160. """
  161. Creates a new virtual machine instance.
  162. """
  163. image_id = image.image_id if isinstance(image, MachineImage) else image
  164. instance_size = instance_type.name if \
  165. isinstance(instance_type, InstanceType) else \
  166. self.instance_types.find_by_name(instance_type).id
  167. zone_name = zone.name if isinstance(zone, PlacementZone) else zone
  168. keypair_name = keypair.name if \
  169. isinstance(keypair, KeyPair) else keypair
  170. if security_groups:
  171. if isinstance(security_groups, list) and \
  172. isinstance(security_groups[0], SecurityGroup):
  173. security_groups_list = [sg.name for sg in security_groups]
  174. else:
  175. security_groups_list = security_groups
  176. else:
  177. security_groups_list = None
  178. os_instance = self.provider.nova.servers.create(
  179. name,
  180. image_id,
  181. instance_size,
  182. min_count=1,
  183. max_count=1,
  184. availability_zone=zone_name,
  185. key_name=keypair_name,
  186. security_groups=security_groups_list,
  187. userdata=user_data)
  188. return OpenStackInstance(self.provider, os_instance)
  189. def list_instances(self):
  190. """
  191. List all instances.
  192. """
  193. instances = self.provider.nova.servers.list()
  194. return [OpenStackInstance(self.provider, instance)
  195. for instance in instances]
  196. def list_regions(self):
  197. """
  198. List all data center regions.
  199. """
  200. # detailed must be set to ``False`` because the (default) ``True``
  201. # value requires Admin priviledges
  202. regions = self.provider.nova.availability_zones.list(detailed=False)
  203. return [OpenStackRegion(self.provider, region) for region in regions]
  204. def get_instance(self, instance_id):
  205. """
  206. Returns an instance given its id.
  207. """
  208. os_instance = self.provider.nova.servers.get(instance_id)
  209. return OpenStackInstance(self.provider, os_instance)