Blame libvirt-gconfig/libvirt-gconfig-domain-os.c

Packit Service ea0369
/*
Packit Service ea0369
 * libvirt-gconfig-domain-os.c: libvirt domain OS configuration
Packit Service ea0369
 *
Packit Service ea0369
 * Copyright (C) 2011 Red Hat, Inc.
Packit Service ea0369
 *
Packit Service ea0369
 * This library is free software; you can redistribute it and/or
Packit Service ea0369
 * modify it under the terms of the GNU Lesser General Public
Packit Service ea0369
 * License as published by the Free Software Foundation; either
Packit Service ea0369
 * version 2.1 of the License, or (at your option) any later version.
Packit Service ea0369
 *
Packit Service ea0369
 * This library is distributed in the hope that it will be useful,
Packit Service ea0369
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service ea0369
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service ea0369
 * Lesser General Public License for more details.
Packit Service ea0369
 *
Packit Service ea0369
 * You should have received a copy of the GNU Lesser General Public
Packit Service ea0369
 * License along with this library. If not, see
Packit Service ea0369
 * <http://www.gnu.org/licenses/>.
Packit Service ea0369
 *
Packit Service ea0369
 * Author: Christophe Fergeau <cfergeau@gmail.com>
Packit Service ea0369
 */
Packit Service ea0369
Packit Service ea0369
#include <config.h>
Packit Service ea0369
Packit Service ea0369
#include "libvirt-gconfig/libvirt-gconfig.h"
Packit Service ea0369
#include "libvirt-gconfig/libvirt-gconfig-private.h"
Packit Service ea0369
Packit Service ea0369
#define GVIR_CONFIG_DOMAIN_OS_GET_PRIVATE(obj)                         \
Packit Service ea0369
        (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_CONFIG_TYPE_DOMAIN_OS, GVirConfigDomainOsPrivate))
Packit Service ea0369
Packit Service ea0369
struct _GVirConfigDomainOsPrivate
Packit Service ea0369
{
Packit Service ea0369
    gboolean unused;
Packit Service ea0369
};
Packit Service ea0369
Packit Service ea0369
G_DEFINE_TYPE_WITH_PRIVATE(GVirConfigDomainOs, gvir_config_domain_os, GVIR_CONFIG_TYPE_OBJECT);
Packit Service ea0369
Packit Service ea0369
Packit Service ea0369
static void gvir_config_domain_os_class_init(GVirConfigDomainOsClass *klass G_GNUC_UNUSED)
Packit Service ea0369
{
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
Packit Service ea0369
static void gvir_config_domain_os_init(GVirConfigDomainOs *os)
Packit Service ea0369
{
Packit Service ea0369
    os->priv = GVIR_CONFIG_DOMAIN_OS_GET_PRIVATE(os);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
Packit Service ea0369
GVirConfigDomainOs *gvir_config_domain_os_new(void)
Packit Service ea0369
{
Packit Service ea0369
    GVirConfigObject *object;
Packit Service ea0369
Packit Service ea0369
    object = gvir_config_object_new(GVIR_CONFIG_TYPE_DOMAIN_OS, "os", NULL);
Packit Service ea0369
    return GVIR_CONFIG_DOMAIN_OS(object);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
GVirConfigDomainOs *gvir_config_domain_os_new_from_xml(const gchar *xml, GError **error)
Packit Service ea0369
{
Packit Service ea0369
    GVirConfigObject *object;
Packit Service ea0369
Packit Service ea0369
    object = gvir_config_object_new_from_xml(GVIR_CONFIG_TYPE_DOMAIN_OS, "os",
Packit Service ea0369
                                             NULL, xml, error);
Packit Service ea0369
    return GVIR_CONFIG_DOMAIN_OS(object);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
void gvir_config_domain_os_set_os_type(GVirConfigDomainOs *os,
Packit Service ea0369
                                       GVirConfigDomainOsType type)
Packit Service ea0369
{
Packit Service ea0369
    const char *type_str;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit Service ea0369
Packit Service ea0369
    type_str = gvir_config_genum_get_nick(GVIR_CONFIG_TYPE_DOMAIN_OS_TYPE, type);
Packit Service ea0369
    g_return_if_fail(type_str != NULL);
Packit Service ea0369
Packit Service ea0369
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                        "type", type_str);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
GVirConfigDomainOsType gvir_config_domain_os_get_os_type(GVirConfigDomainOs *os)
Packit Service ea0369
{
Packit Service ea0369
    g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os),
Packit Service ea0369
                         GVIR_CONFIG_DOMAIN_OS_TYPE_HVM);
Packit Service ea0369
Packit Service ea0369
    return gvir_config_object_get_node_content_genum
Packit Service ea0369
            (GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
             "type",
Packit Service ea0369
             GVIR_CONFIG_TYPE_DOMAIN_OS_TYPE,
Packit Service ea0369
             GVIR_CONFIG_DOMAIN_OS_TYPE_HVM);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
/**
Packit Service ea0369
 * gvir_config_domain_os_set_kernel:
Packit Service ea0369
 * @os: a #GVirConfigDomainOs
Packit Service ea0369
 * @kernel: (allow-none): The kernel path
Packit Service ea0369
 */
Packit Service ea0369
void gvir_config_domain_os_set_kernel(GVirConfigDomainOs *os,
Packit Service ea0369
                                      const char * kernel)
Packit Service ea0369
{
Packit Service ea0369
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                        "kernel", kernel);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
/**
Packit Service ea0369
 * gvir_config_domain_os_set_ramdisk:
Packit Service ea0369
 * @os: a #GVirConfigDomainOs
Packit Service ea0369
 * @ramdisk: (allow-none): The ramdisk path
Packit Service ea0369
 */
Packit Service ea0369
void gvir_config_domain_os_set_ramdisk(GVirConfigDomainOs *os,
Packit Service ea0369
                                       const char * ramdisk)
Packit Service ea0369
{
Packit Service ea0369
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                        "initrd", ramdisk);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
/**
Packit Service ea0369
 * gvir_config_domain_os_set_cmdline:
Packit Service ea0369
 * @os: a #GVirConfigDomainOs
Packit Service ea0369
 * @cmdline: (allow-none): The direct boot commandline
Packit Service ea0369
 */
Packit Service ea0369
void gvir_config_domain_os_set_cmdline(GVirConfigDomainOs *os,
Packit Service ea0369
                                       const char * cmdline)
Packit Service ea0369
{
Packit Service ea0369
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                        "cmdline", cmdline);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
/**
Packit Service ea0369
 * gvir_config_domain_os_set_init:
Packit Service ea0369
 * @os: a #GVirConfigDomainOs
Packit Service ea0369
 * @init: (allow-none):
Packit Service ea0369
 */
Packit Service ea0369
void gvir_config_domain_os_set_init(GVirConfigDomainOs *os,
Packit Service ea0369
                                    const char * init)
Packit Service ea0369
{
Packit Service ea0369
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                        "init", init);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
/**
Packit Service ea0369
 * gvir_config_domain_os_set_loader:
Packit Service ea0369
 * @os: a #GVirConfigDomainOs
Packit Service ea0369
 * @loader: (allow-none):
Packit Service ea0369
 */
Packit Service ea0369
void gvir_config_domain_os_set_loader(GVirConfigDomainOs *os,
Packit Service ea0369
                                      const char * loader)
Packit Service ea0369
{
Packit Service ea0369
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                        "loader", loader);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
void gvir_config_domain_os_enable_boot_menu(GVirConfigDomainOs *os,
Packit Service ea0369
                                            gboolean enable)
Packit Service ea0369
{
Packit Service ea0369
    GVirConfigObject *node;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit Service ea0369
Packit Service ea0369
    node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "bootmenu");
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_OBJECT(node));
Packit Service ea0369
    gvir_config_object_set_attribute_with_type(node, "enable",
Packit Service ea0369
                                               G_TYPE_BOOLEAN, enable,
Packit Service ea0369
                                               NULL);
Packit Service ea0369
    g_object_unref(G_OBJECT(node));
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
void gvir_config_domain_os_bios_enable_serial(GVirConfigDomainOs *os,
Packit Service ea0369
                                              gboolean enable)
Packit Service ea0369
{
Packit Service ea0369
    GVirConfigObject *node;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit Service ea0369
Packit Service ea0369
    node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "bios");
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_OBJECT(node));
Packit Service ea0369
    gvir_config_object_set_attribute_with_type(node, "useserial",
Packit Service ea0369
                                               G_TYPE_BOOLEAN, enable,
Packit Service ea0369
                                               NULL);
Packit Service ea0369
    g_object_unref(G_OBJECT(node));
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
void gvir_config_domain_os_set_smbios_mode(GVirConfigDomainOs *os,
Packit Service ea0369
                                           GVirConfigDomainOsSmBiosMode mode)
Packit Service ea0369
{
Packit Service ea0369
    GVirConfigObject *node;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit Service ea0369
Packit Service ea0369
    node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "smbios");
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_OBJECT(node));
Packit Service ea0369
    gvir_config_object_set_attribute_with_type(node, "mode",
Packit Service ea0369
                                               GVIR_CONFIG_TYPE_DOMAIN_OS_SM_BIOS_MODE,
Packit Service ea0369
                                               mode, NULL);
Packit Service ea0369
    g_object_unref(G_OBJECT(node));
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
/**
Packit Service ea0369
 * gvir_config_domain_os_set_boot_devices:
Packit Service ea0369
 * @os: a #GVirConfigDomainOs
Packit Service ea0369
 * @boot_devices: (in) (element-type LibvirtGConfig.DomainOsBootDevice):
Packit Service ea0369
 */
Packit Service ea0369
void gvir_config_domain_os_set_boot_devices(GVirConfigDomainOs *os, GList *boot_devices)
Packit Service ea0369
{
Packit Service ea0369
    GList *it;
Packit Service ea0369
    xmlNodePtr os_node;
Packit Service ea0369
    xmlNodePtr node;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit Service ea0369
Packit Service ea0369
    os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
Packit Service ea0369
    g_return_if_fail(os_node != NULL);
Packit Service ea0369
Packit Service ea0369
    node = os_node->children;
Packit Service ea0369
    while (node != NULL) {
Packit Service ea0369
        xmlNodePtr next_node;
Packit Service ea0369
        next_node = node->next;
Packit Service ea0369
        if (g_strcmp0("boot", (char *)node->name) == 0) {
Packit Service ea0369
            xmlUnlinkNode(node);
Packit Service ea0369
            xmlFreeNode(node);
Packit Service ea0369
        }
Packit Service ea0369
        node = next_node;
Packit Service ea0369
    }
Packit Service ea0369
Packit Service ea0369
    for (it = boot_devices; it != NULL; it = it->next) {
Packit Service ea0369
        const char *dev;
Packit Service ea0369
Packit Service ea0369
        dev = gvir_config_genum_get_nick(GVIR_CONFIG_TYPE_DOMAIN_OS_BOOT_DEVICE,
Packit Service ea0369
                                         GPOINTER_TO_INT(it->data));
Packit Service ea0369
        g_warn_if_fail(dev != NULL);
Packit Service ea0369
        if (dev != NULL) {
Packit Service ea0369
            node = xmlNewDocNode(NULL, NULL, (xmlChar*)"boot", NULL);
Packit Service ea0369
            xmlNewProp(node, (xmlChar*)"dev", (xmlChar*)dev);
Packit Service ea0369
            xmlAddChild(os_node, node);
Packit Service ea0369
        }
Packit Service ea0369
    }
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
static gboolean add_boot_device(xmlNodePtr node, gpointer opaque)
Packit Service ea0369
{
Packit Service ea0369
    GList **devices = (GList **)opaque;
Packit Service ea0369
    const gchar *value;
Packit Service ea0369
Packit Service ea0369
    if (g_strcmp0((const gchar *)node->name, "boot") != 0)
Packit Service ea0369
        return TRUE;
Packit Service ea0369
Packit Service ea0369
    value = gvir_config_xml_get_attribute_content(node, "dev");
Packit Service ea0369
    if (value != NULL) {
Packit Service ea0369
        GVirConfigDomainOsBootDevice device;
Packit Service ea0369
Packit Service ea0369
        device = gvir_config_genum_get_value
Packit Service ea0369
                        (GVIR_CONFIG_TYPE_DOMAIN_OS_BOOT_DEVICE,
Packit Service ea0369
                         value,
Packit Service ea0369
                         GVIR_CONFIG_DOMAIN_OS_BOOT_DEVICE_HD);
Packit Service ea0369
        *devices = g_list_append(*devices, GINT_TO_POINTER(device));
Packit Service ea0369
    } else
Packit Service ea0369
        g_debug("Failed to parse attribute 'dev' of node 'boot'");
Packit Service ea0369
Packit Service ea0369
    return TRUE;
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
/**
Packit Service ea0369
 * gvir_config_domain_os_get_boot_devices:
Packit Service ea0369
 * @os: a #GVirConfigDomainOs
Packit Service ea0369
 *
Packit Service ea0369
 * Gets the list of devices attached to @os. The returned list should be
Packit Service ea0369
 * freed with g_list_free().
Packit Service ea0369
 *
Packit Service ea0369
 * Returns: (element-type LibvirtGConfig.DomainOsBootDevice) (transfer container):
Packit Service ea0369
 * a newly allocated #GList of #GVirConfigDomainOsBootDevice.
Packit Service ea0369
 */
Packit Service ea0369
GList *gvir_config_domain_os_get_boot_devices(GVirConfigDomainOs *os)
Packit Service ea0369
{
Packit Service ea0369
    GList *devices = NULL;
Packit Service ea0369
Packit Service ea0369
    g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os), NULL);
Packit Service ea0369
Packit Service ea0369
    gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                     NULL,
Packit Service ea0369
                                     add_boot_device,
Packit Service ea0369
                                     &devices);
Packit Service ea0369
Packit Service ea0369
    return devices;
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
const char *gvir_config_domain_os_get_arch(GVirConfigDomainOs *os)
Packit Service ea0369
{
Packit Service ea0369
    return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                            "type",
Packit Service ea0369
                                            "arch");
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
void gvir_config_domain_os_set_arch(GVirConfigDomainOs *os, const char *arch)
Packit Service ea0369
{
Packit Service ea0369
    xmlNodePtr os_node;
Packit Service ea0369
    xmlNodePtr os_type_node;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit Service ea0369
Packit Service ea0369
    os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
Packit Service ea0369
    g_return_if_fail(os_node != NULL);
Packit Service ea0369
Packit Service ea0369
    os_type_node = gvir_config_xml_get_element(os_node, "type", NULL);
Packit Service ea0369
    g_return_if_fail(os_type_node != NULL);
Packit Service ea0369
Packit Service ea0369
    xmlNewProp(os_type_node, (xmlChar*)"arch", (xmlChar*)arch);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
const char *gvir_config_domain_os_get_machine(GVirConfigDomainOs *os)
Packit Service ea0369
{
Packit Service ea0369
    return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
                                            "type",
Packit Service ea0369
                                            "machine");
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
void gvir_config_domain_os_set_machine(GVirConfigDomainOs *os, const char *machine)
Packit Service ea0369
{
Packit Service ea0369
    xmlNodePtr os_node;
Packit Service ea0369
    xmlNodePtr os_type_node;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit Service ea0369
Packit Service ea0369
    os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
Packit Service ea0369
    g_return_if_fail(os_node != NULL);
Packit Service ea0369
Packit Service ea0369
    os_type_node = gvir_config_xml_get_element(os_node, "type", NULL);
Packit Service ea0369
    g_return_if_fail(os_type_node != NULL);
Packit Service ea0369
Packit Service ea0369
    xmlNewProp(os_type_node, (xmlChar*)"machine", (xmlChar*)machine);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
void gvir_config_domain_os_set_firmware(GVirConfigDomainOs *os, GVirConfigDomainOsFirmware firmware)
Packit Service ea0369
{
Packit Service ea0369
    xmlNodePtr node;
Packit Service ea0369
    const gchar *firmware_str;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit Service ea0369
Packit Service ea0369
    node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
Packit Service ea0369
    g_return_if_fail(node != NULL);
Packit Service ea0369
Packit Service ea0369
    firmware_str = gvir_config_genum_get_nick(GVIR_CONFIG_TYPE_DOMAIN_OS_FIRMWARE,
Packit Service ea0369
                   firmware);
Packit Service ea0369
    g_return_if_fail(firmware_str != NULL);
Packit Service ea0369
Packit Service ea0369
    xmlNewProp(node, (xmlChar*)"firmware", (xmlChar*)firmware_str);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
GVirConfigDomainOsFirmware gvir_config_domain_os_get_firmware(GVirConfigDomainOs *os)
Packit Service ea0369
{
Packit Service ea0369
    g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os),
Packit Service ea0369
                         GVIR_CONFIG_DOMAIN_OS_FIRMWARE_BIOS);
Packit Service ea0369
Packit Service ea0369
    return gvir_config_object_get_attribute_genum
Packit Service ea0369
            (GVIR_CONFIG_OBJECT(os),
Packit Service ea0369
             NULL, "firmware",
Packit Service ea0369
             GVIR_CONFIG_TYPE_DOMAIN_OS_FIRMWARE,
Packit Service ea0369
             GVIR_CONFIG_DOMAIN_OS_FIRMWARE_BIOS);
Packit Service ea0369
}