/*
* ovirt-host.c: oVirt host handling
*
* Copyright (C) 2017 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* .
*
* Author: Eduardo Lima (Etrunko)
*/
#include
#include "ovirt-enum-types.h"
#include "ovirt-host.h"
#include "govirt-private.h"
struct _OvirtHostPrivate {
gchar *cluster_href;
gchar *cluster_id;
OvirtCollection *vms;
};
G_DEFINE_TYPE_WITH_PRIVATE(OvirtHost, ovirt_host, OVIRT_TYPE_RESOURCE);
enum {
PROP_0,
PROP_CLUSTER_HREF,
PROP_CLUSTER_ID,
};
static const char *get_cluster_href(OvirtHost *host)
{
if (host->priv->cluster_href == NULL &&
host->priv->cluster_id != NULL) {
host->priv->cluster_href = g_strdup_printf("%s/%s",
"/ovirt-engine/api/clusters",
host->priv->cluster_id);
}
return host->priv->cluster_href;
}
static void ovirt_host_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
OvirtHost *host = OVIRT_HOST(object);
switch (prop_id) {
case PROP_CLUSTER_HREF:
g_value_set_string(value, get_cluster_href(host));
break;
case PROP_CLUSTER_ID:
g_value_set_string(value, host->priv->cluster_id);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
}
static void ovirt_host_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
OvirtHost *host = OVIRT_HOST(object);
switch (prop_id) {
case PROP_CLUSTER_HREF:
g_free(host->priv->cluster_href);
host->priv->cluster_href = g_value_dup_string(value);
break;
case PROP_CLUSTER_ID:
g_free(host->priv->cluster_id);
host->priv->cluster_id = g_value_dup_string(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
}
static void
ovirt_host_dispose(GObject *obj)
{
OvirtHost *host = OVIRT_HOST(obj);
g_clear_pointer(&host->priv->cluster_href, g_free);
g_clear_pointer(&host->priv->cluster_id, g_free);
g_clear_object(&host->priv->vms);
G_OBJECT_CLASS(ovirt_host_parent_class)->dispose(obj);
}
static gboolean ovirt_host_init_from_xml(OvirtResource *resource,
RestXmlNode *node,
GError **error)
{
OvirtResourceClass *parent_class;
OvirtXmlElement host_elements[] = {
{ .prop_name = "cluster-href",
.xml_path = "cluster",
.xml_attr = "href",
},
{ .prop_name = "cluster-id",
.xml_path = "cluster",
.xml_attr = "id",
},
{ NULL , },
};
if (!ovirt_rest_xml_node_parse(node, G_OBJECT(resource), host_elements))
return FALSE;
parent_class = OVIRT_RESOURCE_CLASS(ovirt_host_parent_class);
return parent_class->init_from_xml(resource, node, error);
}
static void ovirt_host_class_init(OvirtHostClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
OvirtResourceClass *resource_class = OVIRT_RESOURCE_CLASS(klass);
GParamSpec *param_spec;
resource_class->init_from_xml = ovirt_host_init_from_xml;
object_class->dispose = ovirt_host_dispose;
object_class->get_property = ovirt_host_get_property;
object_class->set_property = ovirt_host_set_property;
param_spec = g_param_spec_string("cluster-href",
"Cluster href",
"Cluster href for the Host",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
g_object_class_install_property(object_class,
PROP_CLUSTER_HREF,
param_spec);
param_spec = g_param_spec_string("cluster-id",
"Cluster Id",
"Cluster Id for the Host",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
g_object_class_install_property(object_class,
PROP_CLUSTER_ID,
param_spec);
}
static void ovirt_host_init(OvirtHost *host)
{
host->priv = ovirt_host_get_instance_private(host);
}
G_GNUC_INTERNAL
OvirtHost *ovirt_host_new_from_id(const char *id,
const char *href)
{
OvirtResource *host = ovirt_resource_new_from_id(OVIRT_TYPE_HOST, id, href);
return OVIRT_HOST(host);
}
G_GNUC_INTERNAL
OvirtHost *ovirt_host_new_from_xml(RestXmlNode *node,
GError **error)
{
OvirtResource *host = ovirt_resource_new_from_xml(OVIRT_TYPE_HOST, node, error);
return OVIRT_HOST(host);
}
OvirtHost *ovirt_host_new(void)
{
OvirtResource *host = ovirt_resource_new(OVIRT_TYPE_HOST);
return OVIRT_HOST(host);
}
/**
* ovirt_host_get_vms:
* @host: a #OvirtHost
*
* Gets a #OvirtCollection representing the list of remote vms from a
* host object. This method does not initiate any network
* activity, the remote vm list must be then be fetched using
* ovirt_collection_fetch() or ovirt_collection_fetch_async().
*
* Return value: (transfer none): a #OvirtCollection representing the list
* of vms associated with @host.
*/
OvirtCollection *ovirt_host_get_vms(OvirtHost *host)
{
g_return_val_if_fail(OVIRT_IS_HOST(host), NULL);
if (host->priv->vms == NULL) {
OvirtCollection *collection;
collection = ovirt_sub_collection_new_from_resource(OVIRT_RESOURCE(host),
"vms",
"vms",
OVIRT_TYPE_VM,
"vm");
host->priv->vms = collection;
}
return host->priv->vms;
}
/**
* ovirt_host_get_cluster:
* @host: a #OvirtHost
*
* Gets a #OvirtCluster representing the cluster the host belongs
* to. This method does not initiate any network activity, the remote host must
* be then be fetched using ovirt_resource_refresh() or
* ovirt_resource_refresh_async().
*
* Return value: (transfer full): a #OvirtCluster representing cluster the @host
* belongs to.
*/
OvirtCluster *ovirt_host_get_cluster(OvirtHost *host)
{
g_return_val_if_fail(OVIRT_IS_HOST(host), NULL);
g_return_val_if_fail(host->priv->cluster_id != NULL, NULL);
return ovirt_cluster_new_from_id(host->priv->cluster_id, get_cluster_href(host));
}