[PATCH v2] Add basic driver for the Cloud-Hypervisor
Daniel P. Berrangé
berrange at redhat.com
Fri Jun 4 10:03:06 UTC 2021
On Wed, May 12, 2021 at 10:01:31AM -0700, William Douglas wrote:
> Cloud-Hypervisor is a KVM virtualization using hypervisor. It
> functions similarly to qemu and the libvirt Cloud-Hypervisor driver
> uses a very similar structure to the libvirt driver.
>
> The biggest difference from the libvirt perspective is that the
> "monitor" socket is seperated into two sockets one that commands are
> issued to and one that events are notified from. The current
> implementation only uses the command socket (running over a REST API
> with json encoded data) with future changes to add support for the
> event socket (to better handle shutdowns from inside the VM).
>
> This patch adds support for the following initial VM actions using the
> Cloud-Hypervsior API:
> * vm.create
> * vm.delete
> * vm.boot
> * vm.shutdown
> * vm.reboot
> * vm.pause
> * vm.resume
>
> To use the Cloud-Hypervisor driver, the v15.0 release of
> Cloud-Hypervisor is required to be installed.
>
> Some additional notes:
> * The curl handle is persistent but not useful to detect ch process
> shutdown/crash (a future patch will address this shortcoming)
> * On a 64-bit host Cloud-Hypervisor needs to support PVH and so can
> emulate 32-bit mode but it isn't fully tested (a 64-bit kernel and
> 32-bit userspace is fine, a 32-bit kernel isn't validated)
>
> Signed-off-by: William Douglas <william.douglas at intel.com>
> ---
> The original RFC is
> https://listman.redhat.com/archives/libvir-list/2020-August/msg01040.html
>
> The v1 patch is
> https://listman.redhat.com/archives/libvir-list/2021-April/msg01271.html
>
> Changes since v1:
> * Removed specfile changes as cloud-hypervisor isn't included in
> distros yet
We still needed an arg in the spec:
-Ddriver_ch=disabled
because %meson force-enables all optional features by default.
> +static int
> +virCHDomainDefPostParseBasic(virDomainDef *def,
> + void *opaque G_GNUC_UNUSED)
> +{
> + /* check for emulator and create a default one if needed */
> + if (!def->emulator) {
> + if (!(def->emulator = g_find_program_in_path(CH_CMD))) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
Needed "%s", to pass 'ninja test'
> + _("No emulator found for cloud-hypervisor"));
> + return 1;
> + }
> + }
> +static int
> +virCHMonitorDetectUnsupportedDevices(virDomainDef *vmdef)
> +{
> + int ret = 0;
> +
> + if (vmdef->ngraphics > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support graphics"));
> + ret = 1;
> + }
> + if (vmdef->ncontrollers > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support controllers"));
> + ret = 1;
> + }
> + if (vmdef->nfss > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support fss"));
> + ret = 1;
> + }
> + if (vmdef->ninputs > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support inputs"));
> + ret = 1;
> + }
> + if (vmdef->nsounds > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support sounds"));
> + ret = 1;
> + }
> + if (vmdef->naudios > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support audios"));
> + ret = 1;
> + }
> + if (vmdef->nvideos > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support videos"));
> + ret = 1;
> + }
> + if (vmdef->nhostdevs > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support hostdevs"));
> + ret = 1;
> + }
> + if (vmdef->nredirdevs > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support redirdevs"));
> + ret = 1;
> + }
> + if (vmdef->nsmartcards > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support smartcards"));
> + ret = 1;
> + }
> + if (vmdef->nserials > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support serials"));
> + ret = 1;
> + }
> + if (vmdef->nparallels > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support parallels"));
> + ret = 1;
> + }
> + if (vmdef->nchannels > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support channels"));
> + ret = 1;
> + }
> + if (vmdef->nconsoles > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support consoles"));
> + ret = 1;
> + }
> + if (vmdef->nleases > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support leases"));
> + ret = 1;
> + }
> + if (vmdef->nhubs > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support hubs"));
> + ret = 1;
> + }
> + if (vmdef->nseclabels > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support seclabels"));
> + ret = 1;
> + }
> + if (vmdef->nrngs > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support rngs"));
> + ret = 1;
> + }
> + if (vmdef->nshmems > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support shmems"));
> + ret = 1;
> + }
> + if (vmdef->nmems > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support mems"));
> + ret = 1;
> + }
> + if (vmdef->npanics > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support panics"));
> + ret = 1;
> + }
> + if (vmdef->nsysinfo > 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Cloud-Hypervisor doesn't support sysinfo"));
> + ret = 1;
> + }
These all needed "%s" too
FWIW, as a future improvement, you can register an impl of
virDomainDeviceDefPostParseCallback
this callback will be invoked immediately after XML parsing,
once for each device. It is passed a 'virDomainDeviceDef'
which lets you do
switch ((virDomainDeviceType)dev->type)
case VIR_DOMAIN_DEVICE_DISK:
...
case VIR_DOMAIN_DEVICE_...:
...
}
which means that if we later add more types of device, this
will get a compile time error to force us add the new 'case'
for the new type of device
I fixed the format and spec file bug, and updated the version
number to 7.5.0 instead of 7.3.0, and have pushed this new
driver. I look forward to seeing future enhancements for it.
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list