|
Packit |
a07778 |
/*
|
|
Packit |
a07778 |
* libvirt-gconfig-domain-snapshot.c: libvirt domain snapshot configuration
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* Copyright (C) 2008 Daniel P. Berrange
|
|
Packit |
a07778 |
* Copyright (C) 2010-2013 Red Hat, Inc.
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
a07778 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a07778 |
* License as published by the Free Software Foundation; either
|
|
Packit |
a07778 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
a07778 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a07778 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a07778 |
* Lesser General Public License for more details.
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a07778 |
* License along with this library. If not, see
|
|
Packit |
a07778 |
* <http://www.gnu.org/licenses/>.
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
Packit |
a07778 |
* Christophe Fergeau <cfergeau@redhat.com>
|
|
Packit |
a07778 |
*/
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
#include <config.h>
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
#include "libvirt-gconfig/libvirt-gconfig.h"
|
|
Packit |
a07778 |
#include "libvirt-gconfig/libvirt-gconfig-private.h"
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
#define GVIR_CONFIG_DOMAIN_SNAPSHOT_GET_PRIVATE(obj) \
|
|
Packit |
a07778 |
(G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_CONFIG_TYPE_DOMAIN_SNAPSHOT, GVirConfigDomainSnapshotPrivate))
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
struct _GVirConfigDomainSnapshotPrivate
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
gboolean unused;
|
|
Packit |
a07778 |
};
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
G_DEFINE_TYPE_WITH_PRIVATE(GVirConfigDomainSnapshot, gvir_config_domain_snapshot, GVIR_CONFIG_TYPE_OBJECT);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
static void gvir_config_domain_snapshot_class_init(GVirConfigDomainSnapshotClass *klass G_GNUC_UNUSED)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
static void gvir_config_domain_snapshot_init(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
snapshot->priv = GVIR_CONFIG_DOMAIN_SNAPSHOT_GET_PRIVATE(snapshot);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(void)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
GVirConfigObject *object;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
object = gvir_config_object_new(GVIR_CONFIG_TYPE_DOMAIN_SNAPSHOT,
|
|
Packit |
a07778 |
"domainsnapshot",
|
|
Packit |
a07778 |
DATADIR "/libvirt/schemas/domainsnapshot.rng");
|
|
Packit |
a07778 |
return GVIR_CONFIG_DOMAIN_SNAPSHOT(object);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new_from_xml(const gchar *xml,
|
|
Packit |
a07778 |
GError **error)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
GVirConfigObject *object;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
object = gvir_config_object_new_from_xml(GVIR_CONFIG_TYPE_DOMAIN_SNAPSHOT,
|
|
Packit |
a07778 |
"domainsnapshot",
|
|
Packit |
a07778 |
DATADIR "/libvirt/schemas/domainsnapshot.rng",
|
|
Packit |
a07778 |
xml, error);
|
|
Packit |
a07778 |
return GVIR_CONFIG_DOMAIN_SNAPSHOT(object);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
const char *gvir_config_domain_snapshot_get_name(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot), NULL);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return gvir_config_object_get_node_content(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"name");
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
void gvir_config_domain_snapshot_set_name(GVirConfigDomainSnapshot *snapshot,
|
|
Packit |
a07778 |
const char *name)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"name", name);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
const char *gvir_config_domain_snapshot_get_description(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot), NULL);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return gvir_config_object_get_node_content(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"description");
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
void gvir_config_domain_snapshot_set_description(GVirConfigDomainSnapshot *snapshot,
|
|
Packit |
a07778 |
const char *description)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"description", description);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
GVirConfigDomainSnapshotMemoryState gvir_config_domain_snapshot_get_memory_state(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot),
|
|
Packit |
a07778 |
GVIR_CONFIG_DOMAIN_SNAPSHOT_MEMORY_STATE_NONE);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return gvir_config_object_get_attribute_genum(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"memory", "snapshot",
|
|
Packit |
a07778 |
GVIR_CONFIG_TYPE_DOMAIN_SNAPSHOT_MEMORY_STATE,
|
|
Packit |
a07778 |
GVIR_CONFIG_DOMAIN_SNAPSHOT_MEMORY_STATE_NONE);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
void gvir_config_domain_snapshot_set_memory_state(GVirConfigDomainSnapshot *snapshot,
|
|
Packit |
a07778 |
GVirConfigDomainSnapshotMemoryState state)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
gvir_config_object_add_child_with_attribute_enum(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"memory", "snapshot",
|
|
Packit |
a07778 |
GVIR_CONFIG_TYPE_DOMAIN_SNAPSHOT_MEMORY_STATE,
|
|
Packit |
a07778 |
state);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
const char *gvir_config_domain_snapshot_get_memory_file(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot), NULL);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"memory", "file");
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
void gvir_config_domain_snapshot_set_memory_file(GVirConfigDomainSnapshot *snapshot,
|
|
Packit |
a07778 |
const char *filename)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
gvir_config_object_add_child_with_attribute(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"memory", "file", filename);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
time_t gvir_config_domain_snapshot_get_creation_time(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot), 0);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"creationTime");
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
GVirConfigDomainSnapshotDomainState gvir_config_domain_snapshot_get_state(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot),
|
|
Packit |
a07778 |
GVIR_CONFIG_DOMAIN_SNAPSHOT_DOMAIN_STATE_NOSTATE);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return gvir_config_object_get_node_content_genum(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"state",
|
|
Packit |
a07778 |
GVIR_CONFIG_TYPE_DOMAIN_SNAPSHOT_DOMAIN_STATE,
|
|
Packit |
a07778 |
GVIR_CONFIG_DOMAIN_SNAPSHOT_DOMAIN_STATE_NOSTATE);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
const char *gvir_config_domain_snapshot_get_parent(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
GVirConfigObject *parent;
|
|
Packit |
a07778 |
const char *parent_name;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot), NULL);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
parent = gvir_config_object_get_child(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"parent");
|
|
Packit |
a07778 |
if (parent == NULL)
|
|
Packit |
a07778 |
return NULL;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
parent_name = gvir_config_object_get_node_content(parent, "name");
|
|
Packit |
a07778 |
g_object_unref(G_OBJECT(parent));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return parent_name;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
/**
|
|
Packit |
a07778 |
* gvir_config_domain_snapshot_get_domain:
|
|
Packit |
a07778 |
* @snapshot: a #GVirConfigDomainSnapshot
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* Gets the configuration of the domain @snapshot is a snapshot of.
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* Returns: (transfer full): A #GVirConfigDomain. The returned object
|
|
Packit |
a07778 |
* should be unreffed with g_object_unref() when no longer needed.
|
|
Packit |
a07778 |
*/
|
|
Packit |
a07778 |
GVirConfigDomain *gvir_config_domain_snapshot_get_domain(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
GVirConfigObject *domain;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot), NULL);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
domain = gvir_config_object_get_child_with_type(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"domain",
|
|
Packit |
a07778 |
GVIR_CONFIG_TYPE_DOMAIN);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return GVIR_CONFIG_DOMAIN(domain);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
/**
|
|
Packit |
a07778 |
* gvir_config_domain_snapshot_set_disks:
|
|
Packit |
a07778 |
* @snapshot: a #GVirConfigDomainSnapshot
|
|
Packit |
a07778 |
* @disks: (in) (element-type LibvirtGConfig.DomainSnapshotDisk):
|
|
Packit |
a07778 |
*/
|
|
Packit |
a07778 |
void gvir_config_domain_snapshot_set_disks(GVirConfigDomainSnapshot *snapshot,
|
|
Packit |
a07778 |
GList *disks)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
GVirConfigObject *disks_node;
|
|
Packit |
a07778 |
GList *it;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
if (disks == NULL) {
|
|
Packit |
a07778 |
gvir_config_object_delete_children(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"disks",
|
|
Packit |
a07778 |
NULL);
|
|
Packit |
a07778 |
return;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
disks_node = gvir_config_object_new(GVIR_CONFIG_TYPE_OBJECT,
|
|
Packit |
a07778 |
"disks", NULL);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
for (it = disks; it != NULL; it = it->next) {
|
|
Packit |
a07778 |
if (!GVIR_CONFIG_IS_DOMAIN_SNAPSHOT_DISK(it->data)) {
|
|
Packit |
a07778 |
g_warn_if_reached();
|
|
Packit |
a07778 |
continue;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
gvir_config_object_attach_add(disks_node,
|
|
Packit |
a07778 |
GVIR_CONFIG_OBJECT(it->data));
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"disks",
|
|
Packit |
a07778 |
disks_node);
|
|
Packit |
a07778 |
g_object_unref(G_OBJECT(disks_node));
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
void gvir_config_domain_snapshot_add_disk(GVirConfigDomainSnapshot *snapshot,
|
|
Packit |
a07778 |
GVirConfigDomainSnapshotDisk *disk)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
GVirConfigObject *disks_node;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot));
|
|
Packit |
a07778 |
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT_DISK(disk));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
disks_node = gvir_config_object_add_child(GVIR_CONFIG_OBJECT(snapshot),
|
|
Packit |
a07778 |
"disks");
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
gvir_config_object_attach_add(disks_node, GVIR_CONFIG_OBJECT(disk));
|
|
Packit |
a07778 |
g_object_unref(G_OBJECT(disks_node));
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
struct GetDiskData {
|
|
Packit |
a07778 |
GVirConfigXmlDoc *doc;
|
|
Packit |
a07778 |
GList *disks;
|
|
Packit |
a07778 |
};
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
static gboolean get_disk(xmlNodePtr node, gpointer opaque)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
struct GetDiskData* data = (struct GetDiskData*)opaque;
|
|
Packit |
a07778 |
GVirConfigDomainSnapshotDisk *disk;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
disk = gvir_config_domain_snapshot_disk_new_from_tree(data->doc, node);
|
|
Packit |
a07778 |
if (disk != NULL)
|
|
Packit |
a07778 |
data->disks = g_list_prepend(data->disks, disk);
|
|
Packit |
a07778 |
else
|
|
Packit |
a07778 |
g_debug("Failed to parse %s node", node->name);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return TRUE;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
/**
|
|
Packit |
a07778 |
* gvir_config_domain_snapshot_get_disks:
|
|
Packit |
a07778 |
* @snapshot: a #GVirConfigDomainSnapshot
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* Gets the list of disks attached to @snapshot. The returned list should
|
|
Packit |
a07778 |
* be freed with g_list_free(), after its elements have been unreffed with
|
|
Packit |
a07778 |
* g_object_unref().
|
|
Packit |
a07778 |
*
|
|
Packit |
a07778 |
* Returns: (element-type LibvirtGConfig.DomainSnapshotDisk) (transfer full):
|
|
Packit |
a07778 |
* a newly allocated #GList of #GVirConfigDomainSnapshotDisk.
|
|
Packit |
a07778 |
*/
|
|
Packit |
a07778 |
GList *gvir_config_domain_snapshot_get_disks(GVirConfigDomainSnapshot *snapshot)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
struct GetDiskData data;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(snapshot), NULL);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
g_object_get(G_OBJECT(snapshot), "doc", &data.doc, NULL);
|
|
Packit |
a07778 |
data.disks = NULL;
|
|
Packit |
a07778 |
gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(snapshot), "disks",
|
|
Packit |
a07778 |
get_disk, &data);
|
|
Packit |
a07778 |
if (data.doc != NULL) {
|
|
Packit |
a07778 |
g_object_unref(G_OBJECT(data.doc));
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return g_list_reverse(data.disks);
|
|
Packit |
a07778 |
}
|