示例#1
0
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])
示例#2
0
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])
示例#3
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
示例#4
0
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])
示例#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)
示例#6
0
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)