services.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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 KeyPair
  11. from cloudbridge.providers.interfaces import MachineImage
  12. from cloudbridge.providers.interfaces import ObjectStoreService
  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 AWSContainer
  19. from .resources import AWSInstance
  20. from .resources import AWSMachineImage
  21. from .resources import AWSSnapshot
  22. from .resources import AWSVolume
  23. class AWSSecurityService(SecurityService):
  24. def __init__(self, provider):
  25. self.provider = provider
  26. def list_key_pairs(self):
  27. """
  28. List all key pairs associated with this account.
  29. :rtype: ``list`` of :class:`.KeyPair`
  30. :return: list of KeyPair objects
  31. """
  32. key_pairs = self.provider.ec2_conn.get_all_key_pairs()
  33. return [BaseKeyPair(kp.name) for kp in key_pairs]
  34. def list_security_groups(self):
  35. """
  36. List all security groups associated with this account.
  37. :rtype: ``list`` of :class:`.SecurityGroup`
  38. :return: list of SecurityGroup objects
  39. """
  40. groups = self.provider.ec2_conn.get_all_security_groups()
  41. return [BaseSecurityGroup(group.id, group.name, group.description)
  42. for group in groups]
  43. class AWSBlockStoreService(BlockStoreService):
  44. def __init__(self, provider):
  45. self.provider = provider
  46. # Initialize provider services
  47. self._volumes = AWSVolumeService(self.provider)
  48. self._snapshots = AWSSnapshotService(self.provider)
  49. @property
  50. def volumes(self):
  51. return self._volumes
  52. @property
  53. def snapshots(self):
  54. return self._snapshots
  55. class AWSVolumeService(VolumeService):
  56. def __init__(self, provider):
  57. self.provider = provider
  58. def get_volume(self, volume_id):
  59. """
  60. Returns a volume given its id.
  61. """
  62. vols = self.provider.ec2_conn.get_all_volumes(volume_ids=[volume_id])
  63. return AWSVolume(self.provider, vols[0]) if vols else None
  64. def find_volume(self, name):
  65. """
  66. Searches for a volume by a given list of attributes.
  67. """
  68. raise NotImplementedError(
  69. 'find_volume not implemented by this provider')
  70. def list_volumes(self):
  71. """
  72. List all volumes.
  73. """
  74. return [AWSVolume(self.provider, vol)
  75. for vol in self.provider.ec2_conn.get_all_volumes()]
  76. def create_volume(self, name, size, zone, snapshot=None):
  77. """
  78. Creates a new volume.
  79. """
  80. zone_name = zone.name if isinstance(zone, PlacementZone) else zone
  81. snapshot_id = snapshot.snapshot_id if isinstance(
  82. zone, AWSSnapshot) and snapshot else snapshot
  83. ec2_vol = self.provider.ec2_conn.create_volume(
  84. size,
  85. zone_name,
  86. snapshot=snapshot_id)
  87. cb_vol = AWSVolume(self.provider, ec2_vol)
  88. cb_vol.name = name
  89. return cb_vol
  90. class AWSObjectStoreService(ObjectStoreService):
  91. def __init__(self, provider):
  92. self.provider = provider
  93. def get_container(self, container_id):
  94. """
  95. Returns a container given its id. Returns None if the container
  96. does not exist.
  97. """
  98. bucket = self.provider.s3_conn.lookup(container_id)
  99. if bucket:
  100. return AWSContainer(self.provider, bucket)
  101. else:
  102. return None
  103. def find_container(self, name):
  104. """
  105. Searches for a container by a given list of attributes
  106. """
  107. raise NotImplementedError(
  108. 'find_container not implemented by this provider')
  109. def list_containers(self):
  110. """
  111. List all containers.
  112. """
  113. buckets = self.provider.s3_conn.get_all_buckets()
  114. return [AWSContainer(self.provider, bucket) for bucket in buckets]
  115. def create_container(self, name, location=None):
  116. """
  117. Create a new container.
  118. """
  119. bucket = self.provider.s3_conn.create_bucket(
  120. name,
  121. location=location if location else '')
  122. return AWSContainer(self.provider, bucket)
  123. class AWSSnapshotService(SnapshotService):
  124. def __init__(self, provider):
  125. self.provider = provider
  126. def get_snapshot(self, snapshot_id):
  127. """
  128. Returns a snapshot given its id.
  129. """
  130. snaps = self.provider.ec2_conn.get_all_snapshots(
  131. snapshot_ids=[snapshot_id])
  132. return AWSSnapshot(self.provider, snaps[0]) if snaps else None
  133. def find_snapshot(self, name):
  134. """
  135. Searches for a volume by a given list of attributes.
  136. """
  137. raise NotImplementedError(
  138. 'find_volume not implemented by this provider')
  139. def list_snapshots(self):
  140. """
  141. List all snapshot.
  142. """
  143. # TODO: get_all_images returns too many images - some kind of filtering
  144. # abilities are needed. Forced to "self" for now
  145. return [AWSSnapshot(self.provider, snap)
  146. for snap in
  147. self.provider.ec2_conn.get_all_snapshots(owner="self")]
  148. def create_snapshot(self, name, volume, description=None):
  149. """
  150. Creates a new snapshot of a given volume.
  151. """
  152. volume_id = volume.volume_id if isinstance(
  153. volume,
  154. AWSVolume) else volume
  155. ec2_snap = self.provider.ec2_conn.create_snapshot(
  156. volume_id,
  157. description=description)
  158. cb_snap = AWSSnapshot(self.provider, ec2_snap)
  159. cb_snap.name = name
  160. return cb_snap
  161. class AWSImageService(ImageService):
  162. def __init__(self, provider):
  163. self.provider = provider
  164. def get_image(self, image_id):
  165. """
  166. Returns an Image given its id
  167. """
  168. image = self.provider.ec2_conn.get_image(image_id)
  169. if image:
  170. return AWSMachineImage(self.provider, image)
  171. else:
  172. return None
  173. def find_image(self, name):
  174. """
  175. Searches for an image by a given list of attributes
  176. """
  177. raise NotImplementedError(
  178. 'find_image not implemented by this provider')
  179. def list_images(self):
  180. """
  181. List all images.
  182. """
  183. # TODO: get_all_images returns too many images - some kind of filtering
  184. # abilities are needed. Forced to "self" for now
  185. images = self.provider.ec2_conn.get_all_images(owners="self")
  186. return [AWSMachineImage(self.provider, image) for image in images]
  187. class AWSComputeService(ComputeService):
  188. def __init__(self, provider):
  189. self.provider = provider
  190. def create_instance(self, name, image, instance_type, zone=None,
  191. keypair=None, security_groups=None, user_data=None,
  192. block_device_mapping=None, network_interfaces=None,
  193. **kwargs):
  194. """
  195. Creates a new virtual machine instance.
  196. """
  197. image_id = image.image_id if isinstance(image, MachineImage) else image
  198. instance_size = instance_type.name if \
  199. isinstance(instance_type, InstanceType) else instance_type
  200. zone_name = zone.name if isinstance(zone, PlacementZone) else zone
  201. keypair_name = keypair.name if isinstance(
  202. keypair,
  203. KeyPair) else keypair
  204. if security_groups:
  205. if isinstance(security_groups, list) and \
  206. isinstance(security_groups[0], SecurityGroup):
  207. security_groups_list = [sg.name for sg in security_groups]
  208. else:
  209. security_groups_list = security_groups
  210. else:
  211. security_groups_list = None
  212. reservation = self.provider.ec2_conn.run_instances(
  213. image_id=image_id, instance_type=instance_size,
  214. min_count=1, max_count=1, placement=zone_name,
  215. key_name=keypair_name, security_groups=security_groups_list,
  216. user_data=user_data
  217. )
  218. if reservation:
  219. instance = AWSInstance(self.provider, reservation.instances[0])
  220. instance.name = name
  221. return instance