Example #1
0
def get_os_morphing_tools_helper(conn, os_morphing_tools_clss, hypervisor_type,
                                 os_type, os_root_dir, os_root_dev,
                                 event_manager):
    if os_type and os_type not in os_morphing_tools_clss:
        raise exception.OSMorphingToolsNotFound("Unsupported OS type: %s" %
                                                os_type)

    for cls in os_morphing_tools_clss.get(
            os_type, itertools.chain(*os_morphing_tools_clss.values())):
        LOG.debug("Loading osmorphing instance: %s", cls)
        tools = cls(conn, os_root_dir, os_root_dev, hypervisor_type,
                    event_manager)
        LOG.debug("Testing OS morphing tools: %s", cls.__name__)
        os_info = tools.check_os()
        if os_info:
            return (tools, os_info)
    raise exception.OSMorphingToolsNotFound()
Example #2
0
 def get_os_morphing_tools(self, os_type, osmorphing_info):
     """ Returns a list of possible OSMorphing classes for the given
     os type and osmorphing info.
     The OSMorphing classes will be asked to validate compatibility
     in order using their `check_os` method in order, so any classes whose
     `check_os` classmethods might both return a positive result should be
     placed in the correct order (from more specific to less specific).
     """
     raise exception.OSMorphingToolsNotFound(os_type=os_type)
Example #3
0
 def get_os_morphing_tools(self, conn, osmorphing_info):
     raise exception.OSMorphingToolsNotFound()
Example #4
0
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
Example #5
0
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)
Example #6
0
 def get_os_morphing_tools(self, conn, osmorphing_info):
     """ Returns a tuple containing the instantiated OSMorphing tools class
     to use as well as the OS info returned by the tools' `check_os` method.
     """
     raise exception.OSMorphingToolsNotFound()