base.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. # Copyright 2016 Cloudbase Solutions Srl
  2. # All Rights Reserved.
  3. import abc
  4. import itertools
  5. from oslo_log import log as logging
  6. from six import with_metaclass
  7. from coriolis import exception
  8. LOG = logging.getLogger(__name__)
  9. class BaseProvider(object, with_metaclass(abc.ABCMeta)):
  10. @property
  11. def platform(self):
  12. raise NotImplementedError("Missing provider platform attribute.")
  13. class BaseEndpointProvider(BaseProvider):
  14. @abc.abstractmethod
  15. def validate_connection(self, ctxt, connection_info):
  16. pass
  17. @abc.abstractmethod
  18. def get_connection_info_schema(self):
  19. pass
  20. class BaseEndpointInstancesProvider(BaseEndpointProvider):
  21. """ Defines operations for listing instances off of Endpoints """
  22. @abc.abstractmethod
  23. def get_instances(self, ctxt, connection_info, limit=None,
  24. last_seen_id=None, instance_name_pattern=None):
  25. """ Returns a list of instances """
  26. raise NotImplementedError()
  27. @abc.abstractmethod
  28. def get_instance(self, ctxt, connection_info, instance_name):
  29. """ Returns detailed info for a given instance """
  30. raise NotImplementedError()
  31. class BaseEndpointNetworksProvider(object, with_metaclass(abc.ABCMeta)):
  32. """ Defines operations for endpoints networks """
  33. @abc.abstractmethod
  34. def get_networks(self, ctxt, connection_info, env):
  35. """ Returns a list of networks """
  36. raise NotImplementedError()
  37. class BaseInstanceProvider(BaseProvider):
  38. def get_os_morphing_tools(self, conn, osmorphing_info):
  39. raise exception.OSMorphingToolsNotFound()
  40. class BaseImportInstanceProvider(BaseInstanceProvider):
  41. @abc.abstractmethod
  42. def get_target_environment_schema(self):
  43. pass
  44. def _get_destination_instance_name(self, export_info, instance_name):
  45. dest_instance_name = export_info.get("name", instance_name)
  46. LOG.debug('Destination instance name for "%(instance_name)s": '
  47. '"%(dest_instance_name)s"',
  48. {"instance_name": instance_name,
  49. "dest_instance_name": dest_instance_name})
  50. return dest_instance_name
  51. @abc.abstractmethod
  52. def deploy_os_morphing_resources(self, ctxt, connection_info,
  53. instance_deployment_info):
  54. pass
  55. @abc.abstractmethod
  56. def delete_os_morphing_resources(self, ctxt, connection_info,
  57. os_morphing_resources):
  58. pass
  59. class BaseImportProvider(BaseImportInstanceProvider):
  60. @abc.abstractmethod
  61. def import_instance(self, ctxt, connection_info, target_environment,
  62. instance_name, export_info):
  63. """ Imports the instance given by its name to the specified target
  64. environment within the destination cloud based on the provided
  65. connection and export info.
  66. """
  67. pass
  68. @abc.abstractmethod
  69. def deploy_disk_copy_resources(self, ctxt, connection_info,
  70. target_environment, volumes_info):
  71. pass
  72. @abc.abstractmethod
  73. def delete_disk_copy_resources(self, ctxt, connection_info,
  74. target_resources_dict):
  75. pass
  76. @abc.abstractmethod
  77. def finalize_import_instance(self, ctxt, connection_info,
  78. instance_deployment_info):
  79. pass
  80. @abc.abstractmethod
  81. def cleanup_failed_import_instance(self, ctxt, connection_info,
  82. instance_deployment_info):
  83. pass
  84. class BaseReplicaImportProvider(BaseImportInstanceProvider):
  85. @abc.abstractmethod
  86. def deploy_replica_instance(self, ctxt, connection_info,
  87. target_environment, instance_name, export_info,
  88. volumes_info, clone_disks):
  89. pass
  90. @abc.abstractmethod
  91. def finalize_replica_instance_deployment(self, ctxt, connection_info,
  92. instance_deployment_info):
  93. pass
  94. @abc.abstractmethod
  95. def cleanup_failed_replica_instance_deployment(self, ctxt, connection_info,
  96. instance_deployment_info):
  97. pass
  98. @abc.abstractmethod
  99. def deploy_replica_disks(self, ctxt, connection_info, target_environment,
  100. instance_name, export_info, volumes_info):
  101. pass
  102. @abc.abstractmethod
  103. def deploy_replica_target_resources(self, ctxt, connection_info,
  104. target_environment, volumes_info):
  105. pass
  106. @abc.abstractmethod
  107. def delete_replica_target_resources(self, ctxt, connection_info,
  108. migr_resources_dict):
  109. pass
  110. @abc.abstractmethod
  111. def delete_replica_disks(self, ctxt, connection_info, volumes_info):
  112. pass
  113. @abc.abstractmethod
  114. def create_replica_disk_snapshots(self, ctxt, connection_info,
  115. volumes_info):
  116. pass
  117. @abc.abstractmethod
  118. def delete_replica_disk_snapshots(self, ctxt, connection_info,
  119. volumes_info):
  120. pass
  121. @abc.abstractmethod
  122. def restore_replica_disk_snapshots(self, ctxt, connection_info,
  123. volumes_info):
  124. pass
  125. class BaseExportProvider(BaseInstanceProvider):
  126. @abc.abstractmethod
  127. def export_instance(self, ctxt, connection_info, instance_name,
  128. export_path):
  129. """ Exports the instance given by its name from the given source cloud
  130. to the provided export directory path using the given connection info.
  131. """
  132. pass
  133. class BaseReplicaExportProvider(BaseInstanceProvider):
  134. @abc.abstractmethod
  135. def get_replica_instance_info(self, ctxt, connection_info, instance_name):
  136. pass
  137. @abc.abstractmethod
  138. def deploy_replica_source_resources(self, ctxt, connection_info):
  139. pass
  140. @abc.abstractmethod
  141. def delete_replica_source_resources(self, ctxt, connection_info,
  142. migr_resources_dict):
  143. pass
  144. @abc.abstractmethod
  145. def replicate_disks(self, ctxt, connection_info, instance_name,
  146. source_conn_info, target_conn_info, volumes_info,
  147. incremental):
  148. pass
  149. @abc.abstractmethod
  150. def shutdown_instance(self, ctxt, connection_info, instance_name):
  151. pass
  152. def get_os_morphing_tools_helper(conn, os_morphing_tools_clss,
  153. hypervisor_type, os_type, os_root_dir,
  154. os_root_dev, event_manager):
  155. if os_type and os_type not in os_morphing_tools_clss:
  156. raise exception.OSMorphingToolsNotFound(
  157. "Unsupported OS type: %s" % os_type)
  158. for cls in os_morphing_tools_clss.get(
  159. os_type, itertools.chain(*os_morphing_tools_clss.values())):
  160. LOG.debug("Loading osmorphing instance: %s", cls)
  161. tools = cls(
  162. conn, os_root_dir, os_root_dev, hypervisor_type, event_manager)
  163. LOG.debug("Testing OS morphing tools: %s", cls.__name__)
  164. os_info = tools.check_os()
  165. if os_info:
  166. return (tools, os_info)
  167. raise exception.OSMorphingToolsNotFound()