services.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 ComputeService
  7. from cloudbridge.providers.interfaces import ImageService
  8. from cloudbridge.providers.interfaces import InstanceType
  9. from cloudbridge.providers.interfaces import InstanceTypesService
  10. from cloudbridge.providers.interfaces import KeyPair
  11. from cloudbridge.providers.interfaces import MachineImage
  12. from cloudbridge.providers.interfaces import PlacementZone
  13. from cloudbridge.providers.interfaces import SecurityGroup
  14. from cloudbridge.providers.interfaces import SecurityService
  15. from .resources import OpenStackInstance
  16. from .resources import OpenStackInstanceType
  17. from .resources import OpenStackMachineImage
  18. from .resources import OpenStackRegion
  19. class OpenStackSecurityService(SecurityService):
  20. def __init__(self, provider):
  21. self.provider = provider
  22. def list_key_pairs(self):
  23. """
  24. List all key pairs associated with this account.
  25. :rtype: ``list`` of :class:`.KeyPair`
  26. :return: list of KeyPair objects
  27. """
  28. key_pairs = self.provider.nova.keypairs.list()
  29. return [BaseKeyPair(kp.id) for kp in key_pairs]
  30. def list_security_groups(self):
  31. """
  32. Create a new security group
  33. :rtype: ``list`` of :class:`.KeyPair`
  34. :return: list of KeyPair objects
  35. """
  36. groups = self.provider.nova.security_groups.list()
  37. return [BaseSecurityGroup(group.name) for group in groups]
  38. class OpenStackImageService(ImageService):
  39. def __init__(self, provider):
  40. self.provider = provider
  41. def get_image(self, image_id):
  42. """
  43. Returns an Image given its id
  44. """
  45. image = self.provider.nova.images.get(image_id)
  46. if image:
  47. return OpenStackMachineImage(self.provider, image)
  48. else:
  49. return None
  50. def find_image(self, name):
  51. """
  52. Searches for an image by a given list of attributes
  53. """
  54. raise NotImplementedError(
  55. 'find_image not implemented by this provider')
  56. def list_images(self):
  57. """
  58. List all images.
  59. """
  60. images = self.provider.nova.images.list()
  61. return [OpenStackMachineImage(self.provider, image)
  62. for image in images]
  63. class OpenStackInstanceTypesService(InstanceTypesService):
  64. def __init__(self, provider):
  65. self.provider = provider
  66. def list(self):
  67. return [OpenStackInstanceType(f)
  68. for f in self.provider.nova.flavors.list()]
  69. def find_by_name(self, name):
  70. return next(
  71. (itype for itype in self.list() if itype.name == name), None)
  72. class OpenStackComputeService(ComputeService):
  73. def __init__(self, provider):
  74. self.provider = provider
  75. self.instance_types = OpenStackInstanceTypesService(self.provider)
  76. def create_instance(self, name, image, instance_type, zone=None,
  77. keypair=None, security_groups=None, user_data=None,
  78. block_device_mapping=None, network_interfaces=None,
  79. **kwargs):
  80. """
  81. Creates a new virtual machine instance.
  82. """
  83. image_id = image.image_id if isinstance(image, MachineImage) else image
  84. instance_size = instance_type.name if \
  85. isinstance(instance_type, InstanceType) else \
  86. self.instance_types.find_by_name(instance_type).id
  87. zone_name = zone.name if isinstance(zone, PlacementZone) else zone
  88. keypair_name = keypair.name if \
  89. isinstance(keypair, KeyPair) else keypair
  90. if security_groups:
  91. if isinstance(security_groups, list) and \
  92. isinstance(security_groups[0], SecurityGroup):
  93. security_groups_list = [sg.name for sg in security_groups]
  94. else:
  95. security_groups_list = security_groups
  96. else:
  97. security_groups_list = None
  98. os_instance = self.provider.nova.servers.create(
  99. name,
  100. image_id,
  101. instance_size,
  102. min_count=1,
  103. max_count=1,
  104. availability_zone=zone_name,
  105. key_name=keypair_name,
  106. security_groups=security_groups_list,
  107. userdata=user_data)
  108. return OpenStackInstance(self.provider, os_instance)
  109. def list_instances(self):
  110. """
  111. List all instances.
  112. """
  113. instances = self.provider.nova.servers.list()
  114. return [OpenStackInstance(self.provider, instance)
  115. for instance in instances]
  116. def list_regions(self):
  117. """
  118. List all data center regions.
  119. """
  120. # detailed must be set to ``False`` because the (default) ``True``
  121. # value requires Admin priviledges
  122. regions = self.provider.nova.availability_zones.list(detailed=False)
  123. return [OpenStackRegion(self.provider, region) for region in regions]
  124. def get_instance(self, instance_id):
  125. """
  126. Returns an instance given its id.
  127. """
  128. os_instance = self.provider.nova.servers.get(instance_id)
  129. return OpenStackInstance(self.provider, os_instance)