Google Summer of Code Ideas

From Libvirt Wiki
Revision as of 11:59, 1 February 2021 by Rjones@redhat.com (talk | contribs) (libnbd / nbdcopy io_uring)
(diff) ←Older revision | view current revision (diff) | Newer revision→ (diff)
Jump to: navigation, search

This page contains project ideas for upcoming Google Summer of Code.

FAQ

Google Summer of Code FAQ

Yearly programs

*  2020
*  2019
*  2018
*  2017
*  2016

Template

=== TITLE ===
 
 '''Summary:''' Short description of the project
 
 Detailed description of the project.
 
 '''Links:'''
 * Wiki links to relevant material
 * External links to mailing lists or web sites
 
 '''Details:'''
 * Skill level: beginner or intermediate or advanced
 * Language: C
 * Suggested by: Person who suggested the idea

Suggested ideas

Test driver API coverage

Summary: Expand API coverage in the test driver

The test driver (as accessed via the test:/// URI scheme) is a fake virt driver designed to let applications test against libvirt with fake data and not have any effect on the host. As can be seen from the API coverage report http://libvirt.org/hvsupport.html there are quite a few APIs not yet implemented in the test driver. Ideally the test driver would have 100% API coverage, and so the goal of the project is to address gaps in the API coverage. The work is incremental, so does not matter if not all APIs are implemented as part of the project - any amount of expanded coverage is sufficient and useful.

Links:

Details:

  • Skill level: beginner
  • Language: C
  • Mentor: Pavel Hrdina <phrdina@redhat.com>, phrdina on IRC (#virt OFTC)
  • Suggested by: Daniel Berrange


libvirt bindings for node.js

Summary: There are few libvirt bindings for node.js available via npm. However none of them expose all libvirt APIs. That is mainly because they are manually written and not automatically generated. The aim is to utilize same information that python bindings do and automatically generate node libvirt bindings based on that information so that they don't need to be modified for every new API. This is continuation of last years effort, not starting from scratch.

  • Component: libvirt
  • Skill level: advanced
  • Language: C, node.js
  • Suggested by: Martin Kletzander <mkletzan@redhat.com>

Links:

QEMU command line generator XML fuzzing

Summary: Using fuzzing techniques to generate unusual XML to feed to QEMU command line generator

There are a huge number of potential variants of XML documents that can be fed into libvirt. Only a subset of these are valid for generating QEMU command lines. It is likely that there are cases where omitting certain attributes or XML elements will cause the QEMU command line generator to crash. Using fuzzing techniques to generate unusual XML documents which could then be fed through the test suite may identify crashes.

Details:

  • Component: libvirt
  • Skill level: intermediate
  • Language: C
  • Mentor:
  • Suggested by: Daniel Berrange


Metadata support for all object schemas

Summary: Extend the domain XML <metadata> concept to all object schemas

The domain XML schema has support for storing arbitrary user/application specified information in a <metadata> element. Beneath this element, apps can add custom content isolated in a private XML namespace. Libvirt will treat this data as a black-box and store it with no modifications. e.g.

 <metadata>
   <lcp:consoles xmlns:lcp="http://libvirt.org/schemas/console-proxy/1.0">
     <lcp:console token="999f5742-2fb5-491c-832b-282b3afdfe0c" type="spice" port="0" insecure="yes"/>
     <lcp:console token="6a92ef00-6f54-4c18-820d-2a2eaf9ac309" type="serial" port="0" insecure="yes"/>
     <lcp:console token="2a7cbf19-079e-4599-923a-8496ceb7cf4b" type="serial" port="1" insecure="yes"/>
     <lcp:console token="3d7bbde9-b9eb-4548-a414-d17fa1968aae" type="console" port="0" insecure="yes"/>
     <lcp:console token="393c6fdd-dbf7-4da9-9ea7-472d2f5ad34c" type="console" port="1" insecure="yes"/>
     <lcp:console token="7b037f4e-10ab-4c1c-8a49-4e33146c693e" type="console" port="2" insecure="yes"/>
   </lcp:consoles>
 </metadata>

There is also a free form <title> and <description> element

There are also public APIs that let applications read/write this metadata on the fly, without having to redefine the entire XML config. Changes to this metadata triggered asynchronous event notifications.

The project idea is to extend this concept to all/most other object types, networks, nwfilters, interfaces, storage pools, storage volumes, node devices, secrets, etc. This involves

  • Extending the XML schema & corresponding parser/formatter to read/write the <title>, <description> and <metadata> elements
  • Add vir{OBJECT}SetMetadata & vir{OBJECT}GetMetadata public APIs for each object
  • Add async event callback for each object to notify of changes

For networks, nwfilters, storage pools and secrets this work is mostly a matter of copying the existing code pattern used for domains. This part of the project is suitable for total beginners / novices to libvirt.

Storage volumes, interfaces and node devices are more difficult, since libvirt never stores the master XML anywhere itself - the XML is just generated on the fly from another place. We could declare that metadata for those objects is not supported. If we want to get adventurous though, we could provide custom logic. For example, for storage volumes, with file based volumes at least, we can use extended attributes on the file to record metadata. This part of the project is more advanced and so requires higher skill level. It should be considered optional. It would be a successful project to simply complete the first part, covering networks, nwfilters, storage pools and secrets.

Links:

Details:

  • Skill level: beginner
  • Language: C
  • Suggested by: Daniel Berrange

libnbd bindings for Rust

Summary: Add Rust bindings for libnbd

libnbd is a client library for accessing NBD servers. It currently has bindings in C, OCaml, Python and Golang. We need someone to add bindings in Rust. To add extra excitement, the bindings must be generated by an OCaml script so they keep up to date with future changes to the API.

Links:

Details:

  • Skill level: intermediate or maybe advanced
  • Language: Rust and a bit of OCaml
  • Suggested by: Richard W.M. Jones <rjones@redhat.com>

libnbd / nbdcopy accleration using io_uring

Summary: Add io_uring support to libnbd and use it to accelerate nbdcopy

libnbd is a client library for accessing NBD servers. io_uring is a new set of kernel APIs for efficient asynchronous I/O. nbdcopy is a tool for copying between NBD servers which aims to be as fast and efficient as possible. This project would investigate extending libnbd to support io_uring (as an alternative to non-blocking send/recv), and then how to use that to make nbdcopy work as fast as possible under Linux.

Links:

Details:

  • Skill level: advanced
  • Language: C
  • Suggested by: Richard W.M. Jones <rjones@redhat.com>