def morph_image(connection_info, target_hypervisor, target_platform, volume_devs, nics_info, event_manager): (ip, port, username, pkey) = connection_info LOG.info("Waiting for connectivity on host: %(ip)s:%(port)s", {"ip": ip, "port": port}) utils.wait_for_port_connectivity(ip, port) event_manager.progress_update( "Connecting to host: %(ip)s:%(port)s" % {"ip": ip, "port": port}) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=ip, port=port, username=username, pkey=pkey) os_mount_tools = osmount_factory.get_os_mount_tools(ssh, event_manager) event_manager.progress_update("Discovering and mounting OS partitions") os_root_dir, other_mounted_dirs = os_mount_tools.mount_os(volume_devs) os_morphing_tools, os_info = osmorphing_factory.get_os_morphing_tools( ssh, os_root_dir, target_hypervisor, target_platform, event_manager) event_manager.progress_update('OS being migrated: %s' % str(os_info)) os_morphing_tools.set_net_config(nics_info, dhcp=True) LOG.info("Pre packages") os_morphing_tools.pre_packages_install() (packages_add, packages_remove) = os_morphing_tools.get_packages() if packages_add: event_manager.progress_update( "Adding packages: %s" % str(packages_add)) os_morphing_tools.install_packages(packages_add) if packages_remove: event_manager.progress_update( "Removing packages: %s" % str(packages_remove)) os_morphing_tools.uninstall_packages(packages_remove) LOG.info("Post packages") os_morphing_tools.post_packages_install() event_manager.progress_update("Dismounting OS partitions") os_mount_tools.dismount_os(other_mounted_dirs + [os_root_dir])
def morph_image(connection_info, os_type, target_hypervisor, target_platform, nics_info, event_manager, ignore_devices=[]): os_mount_tools = osmount_factory.get_os_mount_tools( os_type, connection_info, event_manager, ignore_devices) event_manager.progress_update("Discovering and mounting OS partitions") os_root_dir, other_mounted_dirs = os_mount_tools.mount_os() conn = os_mount_tools.get_connection() os_morphing_tools, os_info = osmorphing_factory.get_os_morphing_tools( conn, os_type, os_root_dir, target_hypervisor, target_platform, event_manager) event_manager.progress_update('OS being migrated: %s' % str(os_info)) os_morphing_tools.set_net_config(nics_info, dhcp=True) LOG.info("Pre packages") os_morphing_tools.pre_packages_install() (packages_add, packages_remove) = os_morphing_tools.get_packages() if packages_remove: event_manager.progress_update( "Removing packages: %s" % str(packages_remove)) os_morphing_tools.uninstall_packages(packages_remove) if packages_add: event_manager.progress_update( "Adding packages: %s" % str(packages_add)) os_morphing_tools.install_packages(packages_add) LOG.info("Post packages") os_morphing_tools.post_packages_install() event_manager.progress_update("Dismounting OS partitions") os_mount_tools.dismount_os(other_mounted_dirs + [os_root_dir])
def morph_image(origin_provider, destination_provider, connection_info, osmorphing_info, user_script, event_handler): event_manager = events.EventManager(event_handler) os_type = osmorphing_info.get('os_type') ignore_devices = osmorphing_info.get('ignore_devices', []) # instantiate and run OSMount tools: os_mount_tools = osmount_factory.get_os_mount_tools( os_type, connection_info, event_manager, ignore_devices, CONF.default_osmorphing_operation_timeout) proxy_settings = _get_proxy_settings() os_mount_tools.set_proxy(proxy_settings) LOG.info("Preparing for OS partitions discovery") try: os_mount_tools.setup() except Exception as err: raise exception.CoriolisException( "Failed to set up the minion machine for OSMorphing. This may be " "due to an incompatibility between the OS image used for the " "OSMorphing minion machine and the VM undergoing OSMorphing. " "Error was: %s" % str(err)) from err event_manager.progress_update("Discovering and mounting OS partitions") os_root_dir, os_root_dev = os_mount_tools.mount_os() osmorphing_info['os_root_dir'] = os_root_dir osmorphing_info['os_root_dev'] = os_root_dev conn = os_mount_tools.get_connection() environment = os_mount_tools.get_environment() detected_os_info = run_os_detect(origin_provider, destination_provider, conn, os_type, os_root_dir, osmorphing_info, tools_environment=environment) # TODO(aznashwan): # - export the source hypervisor type option in the VM's export info # - automatically detect the target hypervisor type from the worker VM hypervisor_type = osmorphing_info.get('hypervisor_type', None) osmorphing_parameters = osmorphing_info.get('osmorphing_parameters', {}) export_os_morphing_tools = None try: export_tools_cls = get_osmorphing_tools_class_for_provider( origin_provider, detected_os_info, os_type, osmorphing_info) if export_tools_cls: LOG.info( "Instantiating OSMorphing tools class '%s' for export provider" " '%s'", export_tools_cls.__name__, type(origin_provider)) export_os_morphing_tools = export_tools_cls( conn, os_root_dir, os_root_dev, hypervisor_type, event_manager, detected_os_info, osmorphing_parameters, CONF.default_osmorphing_operation_timeout) export_os_morphing_tools.set_environment(environment) else: LOG.debug( "No compatible OSMorphing tools class found for export provider " "'%s'", type(origin_provider).__name__) except exception.OSMorphingToolsNotFound: LOG.warn("No tools found for export provider of type: %s", type(origin_provider)) import_os_morphing_tools_cls = get_osmorphing_tools_class_for_provider( destination_provider, detected_os_info, os_type, osmorphing_info) if not import_os_morphing_tools_cls: LOG.error( "No compatible OSMorphing tools found from import provider '%s' " "for the given detected OS info %s", type(destination_provider), detected_os_info) raise exception.OSMorphingToolsNotFound(os_type=os_type) import_os_morphing_tools = import_os_morphing_tools_cls( conn, os_root_dir, os_root_dev, hypervisor_type, event_manager, detected_os_info, osmorphing_parameters, CONF.default_osmorphing_operation_timeout) import_os_morphing_tools.set_environment(environment) if user_script: event_manager.progress_update('Running OS morphing user script') import_os_morphing_tools.run_user_script(user_script) else: event_manager.progress_update('No OS morphing user script specified') event_manager.progress_update('OS being migrated: %s' % detected_os_info['friendly_release_name']) (packages_add, _) = import_os_morphing_tools.get_packages() if export_os_morphing_tools: (_, packages_remove) = export_os_morphing_tools.get_packages() # Don't remove packages that need to be installed packages_remove = list(set(packages_remove) - set(packages_add)) LOG.info("Pre packages uninstall") export_os_morphing_tools.pre_packages_uninstall(packages_remove) if packages_remove: event_manager.progress_update("Removing packages: %s" % str(packages_remove)) export_os_morphing_tools.uninstall_packages(packages_remove) LOG.info("Post packages uninstall") export_os_morphing_tools.post_packages_uninstall(packages_remove) LOG.info("Pre packages install") import_os_morphing_tools.pre_packages_install(packages_add) nics_info = osmorphing_info.get('nics_info') set_dhcp = osmorphing_info.get('nics_set_dhcp', True) import_os_morphing_tools.set_net_config(nics_info, dhcp=set_dhcp) LOG.info("Pre packages") if packages_add: event_manager.progress_update("Adding packages: %s" % str(packages_add)) import_os_morphing_tools.install_packages(packages_add) LOG.info("Post packages install") import_os_morphing_tools.post_packages_install(packages_add) event_manager.progress_update("Dismounting OS partitions") try: os_mount_tools.dismount_os(os_root_dir) except Exception as err: raise exception.CoriolisException( "Failed to dismount the OS undergoing OSMorphing. This could have " "been caused by minor FS corruption during the last disk sync. " "Please ensure that any source-side FS integrity mechanisms (e.g. " "filesystem quiescing, crash-consistent backups, etc.) are " "enabled and available for the source machine. If none are " "available, please try migrating/replicating the source machine " "while it is powered off. Error was: %s" % str(err)) from err
def morph_image(origin_provider, destination_provider, connection_info, osmorphing_info, event_handler): event_manager = events.EventManager(event_handler) event_manager.progress_update("Preparing instance for target platform") os_type = osmorphing_info.get('os_type') ignore_devices = osmorphing_info.get('ignore_devices', []) os_mount_tools = osmount_factory.get_os_mount_tools( os_type, connection_info, event_manager, ignore_devices) proxy_settings = _get_proxy_settings() os_mount_tools.set_proxy(proxy_settings) event_manager.progress_update("Preparing for OS partitions discovery") os_mount_tools.setup() event_manager.progress_update("Discovering and mounting OS partitions") os_root_dir, other_mounted_dirs, os_root_dev = os_mount_tools.mount_os() osmorphing_info['os_root_dir'] = os_root_dir osmorphing_info['os_root_dev'] = os_root_dev conn = os_mount_tools.get_connection() environment = os_mount_tools.get_environment() try: (export_os_morphing_tools, _) = origin_provider.get_os_morphing_tools( conn, osmorphing_info) export_os_morphing_tools.set_environment(environment) except exception.OSMorphingToolsNotFound: export_os_morphing_tools = None try: (import_os_morphing_tools, os_info) = destination_provider.get_os_morphing_tools( conn, osmorphing_info) import_os_morphing_tools.set_environment(environment) except exception.OSMorphingToolsNotFound: import_os_morphing_tools = None os_info = None if not import_os_morphing_tools: event_manager.progress_update( 'No OS morphing tools found for this instance') else: event_manager.progress_update('OS being migrated: %s' % str(os_info)) (packages_add, _) = import_os_morphing_tools.get_packages() if export_os_morphing_tools: (_, packages_remove) = export_os_morphing_tools.get_packages() # Don't remove packages that need to be installed packages_remove = list(set(packages_remove) - set(packages_add)) LOG.info("Pre packages uninstall") export_os_morphing_tools.pre_packages_uninstall(packages_remove) if packages_remove: event_manager.progress_update( "Removing packages: %s" % str(packages_remove)) export_os_morphing_tools.uninstall_packages(packages_remove) LOG.info("Post packages uninstall") export_os_morphing_tools.post_packages_uninstall(packages_remove) LOG.info("Pre packages install") import_os_morphing_tools.pre_packages_install(packages_add) nics_info = osmorphing_info.get('nics_info') set_dhcp = osmorphing_info.get('nics_set_dhcp', True) import_os_morphing_tools.set_net_config(nics_info, dhcp=set_dhcp) LOG.info("Pre packages") if packages_add: event_manager.progress_update( "Adding packages: %s" % str(packages_add)) import_os_morphing_tools.install_packages(packages_add) LOG.info("Post packages install") import_os_morphing_tools.post_packages_install(packages_add) event_manager.progress_update("Dismounting OS partitions") os_mount_tools.dismount_os(other_mounted_dirs + [os_root_dir])
def morph_image(origin_provider, destination_provider, connection_info, osmorphing_info, user_script, event_handler): event_manager = events.EventManager(event_handler) os_type = osmorphing_info.get('os_type') ignore_devices = osmorphing_info.get('ignore_devices', []) # instantiate and run OSMount tools: os_mount_tools = osmount_factory.get_os_mount_tools( os_type, connection_info, event_manager, ignore_devices) proxy_settings = _get_proxy_settings() os_mount_tools.set_proxy(proxy_settings) LOG.info("Preparing for OS partitions discovery") os_mount_tools.setup() event_manager.progress_update("Discovering and mounting OS partitions") os_root_dir, os_root_dev = os_mount_tools.mount_os() osmorphing_info['os_root_dir'] = os_root_dir osmorphing_info['os_root_dev'] = os_root_dev conn = os_mount_tools.get_connection() environment = os_mount_tools.get_environment() detected_os_info = run_os_detect(origin_provider, destination_provider, conn, os_type, os_root_dir, osmorphing_info, tools_environment=environment) # TODO(aznashwan): # - export the source hypervisor type option in the VM's export info # - automatically detect the target hypervisor type from the worker VM hypervisor_type = osmorphing_info.get('hypervisor_type', None) export_os_morphing_tools = None try: export_tools_cls = get_osmorphing_tools_class_for_provider( origin_provider, detected_os_info, os_type, osmorphing_info) if export_tools_cls: LOG.info( "Instantiating OSMorphing tools class '%s' for export provider" " '%s'", export_tools_cls.__name__, type(origin_provider)) export_os_morphing_tools = export_tools_cls( conn, os_root_dir, os_root_dev, hypervisor_type, event_manager, detected_os_info) export_os_morphing_tools.set_environment(environment) else: LOG.debug( "No compatible OSMorphing tools class found for export provider " "'%s'", type(origin_provider).__name__) except exception.OSMorphingToolsNotFound: LOG.warn("No tools found for export provider of type: %s", type(origin_provider)) import_os_morphing_tools_cls = get_osmorphing_tools_class_for_provider( destination_provider, detected_os_info, os_type, osmorphing_info) if not import_os_morphing_tools_cls: LOG.error( "No compatible OSMorphing tools found from import provider '%s' " "for the given detected OS info %s", type(destination_provider), detected_os_info) raise exception.OSMorphingToolsNotFound(os_type=os_type) import_os_morphing_tools = import_os_morphing_tools_cls( conn, os_root_dir, os_root_dev, hypervisor_type, event_manager, detected_os_info) import_os_morphing_tools.set_environment(environment) if user_script: event_manager.progress_update('Running OS morphing user script') import_os_morphing_tools.run_user_script(user_script) else: event_manager.progress_update('No OS morphing user script specified') event_manager.progress_update('OS being migrated: %s' % detected_os_info['friendly_release_name']) (packages_add, _) = import_os_morphing_tools.get_packages() if export_os_morphing_tools: (_, packages_remove) = export_os_morphing_tools.get_packages() # Don't remove packages that need to be installed packages_remove = list(set(packages_remove) - set(packages_add)) LOG.info("Pre packages uninstall") export_os_morphing_tools.pre_packages_uninstall(packages_remove) if packages_remove: event_manager.progress_update("Removing packages: %s" % str(packages_remove)) export_os_morphing_tools.uninstall_packages(packages_remove) LOG.info("Post packages uninstall") export_os_morphing_tools.post_packages_uninstall(packages_remove) LOG.info("Pre packages install") import_os_morphing_tools.pre_packages_install(packages_add) nics_info = osmorphing_info.get('nics_info') set_dhcp = osmorphing_info.get('nics_set_dhcp', True) import_os_morphing_tools.set_net_config(nics_info, dhcp=set_dhcp) LOG.info("Pre packages") if packages_add: event_manager.progress_update("Adding packages: %s" % str(packages_add)) try: import_os_morphing_tools.install_packages(packages_add) except Exception as err: raise exception.CoriolisException( "Failed to install packages: %s. Please review logs" " for more details." % ", ".join(packages_add)) from err LOG.info("Post packages install") import_os_morphing_tools.post_packages_install(packages_add) event_manager.progress_update("Dismounting OS partitions") os_mount_tools.dismount_os(os_root_dir)
def morph_image(origin_provider, destination_provider, connection_info, osmorphing_info, user_script, event_handler): event_manager = events.EventManager(event_handler) event_manager.progress_update("Preparing instance for target platform") os_type = osmorphing_info.get('os_type') ignore_devices = osmorphing_info.get('ignore_devices', []) os_mount_tools = osmount_factory.get_os_mount_tools( os_type, connection_info, event_manager, ignore_devices) proxy_settings = _get_proxy_settings() os_mount_tools.set_proxy(proxy_settings) event_manager.progress_update("Preparing for OS partitions discovery") os_mount_tools.setup() event_manager.progress_update("Discovering and mounting OS partitions") os_root_dir, os_root_dev = os_mount_tools.mount_os() osmorphing_info['os_root_dir'] = os_root_dir osmorphing_info['os_root_dev'] = os_root_dev conn = os_mount_tools.get_connection() environment = os_mount_tools.get_environment() try: (export_os_morphing_tools, _) = origin_provider.get_os_morphing_tools(conn, osmorphing_info) export_os_morphing_tools.set_environment(environment) except exception.OSMorphingToolsNotFound: LOG.warn("No tools found for export provider of type: %s", type(origin_provider)) export_os_morphing_tools = None (import_os_morphing_tools, os_info) = destination_provider.get_os_morphing_tools( conn, osmorphing_info) if user_script: event_manager.progress_update('Running OS morphing user script') import_os_morphing_tools.run_user_script(user_script) else: event_manager.progress_update('No OS morphing user script specified') if not import_os_morphing_tools: event_manager.progress_update( 'No OS morphing tools found for this instance') else: import_os_morphing_tools.set_environment(environment) event_manager.progress_update('OS being migrated: %s' % str(os_info)) (packages_add, _) = import_os_morphing_tools.get_packages() if export_os_morphing_tools: (_, packages_remove) = export_os_morphing_tools.get_packages() # Don't remove packages that need to be installed packages_remove = list(set(packages_remove) - set(packages_add)) LOG.info("Pre packages uninstall") export_os_morphing_tools.pre_packages_uninstall(packages_remove) if packages_remove: event_manager.progress_update("Removing packages: %s" % str(packages_remove)) export_os_morphing_tools.uninstall_packages(packages_remove) LOG.info("Post packages uninstall") export_os_morphing_tools.post_packages_uninstall(packages_remove) LOG.info("Pre packages install") import_os_morphing_tools.pre_packages_install(packages_add) nics_info = osmorphing_info.get('nics_info') set_dhcp = osmorphing_info.get('nics_set_dhcp', True) import_os_morphing_tools.set_net_config(nics_info, dhcp=set_dhcp) LOG.info("Pre packages") if packages_add: event_manager.progress_update("Adding packages: %s" % str(packages_add)) try: import_os_morphing_tools.install_packages(packages_add) except Exception as err: raise exception.CoriolisException( "Failed to install packages: %s. Please review logs" " for more details." % ", ".join(packages_add)) from err LOG.info("Post packages install") import_os_morphing_tools.post_packages_install(packages_add) event_manager.progress_update("Dismounting OS partitions") os_mount_tools.dismount_os(os_root_dir)