240 lines
8.0 KiB
C
240 lines
8.0 KiB
C
/*
|
|
* ovirt-cluster.c: oVirt cluster 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
|
|
* <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Eduardo Lima (Etrunko) <etrunko@redhat.com>
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include "ovirt-enum-types.h"
|
|
#include "ovirt-cluster.h"
|
|
#include "govirt-private.h"
|
|
|
|
struct _OvirtClusterPrivate {
|
|
gchar *data_center_href;
|
|
gchar *data_center_id;
|
|
OvirtCollection *hosts;
|
|
};
|
|
|
|
G_DEFINE_TYPE_WITH_PRIVATE(OvirtCluster, ovirt_cluster, OVIRT_TYPE_RESOURCE);
|
|
|
|
enum {
|
|
PROP_0,
|
|
PROP_DATA_CENTER_HREF,
|
|
PROP_DATA_CENTER_ID,
|
|
};
|
|
|
|
static const char *get_data_center_href(OvirtCluster *cluster)
|
|
{
|
|
if (cluster->priv->data_center_href == NULL &&
|
|
cluster->priv->data_center_id != NULL) {
|
|
cluster->priv->data_center_href = g_strdup_printf("%s/%s",
|
|
"/ovirt-engine/api/data_centers",
|
|
cluster->priv->data_center_id);
|
|
}
|
|
|
|
return cluster->priv->data_center_href;
|
|
}
|
|
|
|
static void ovirt_cluster_get_property(GObject *object,
|
|
guint prop_id,
|
|
GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
OvirtCluster *cluster = OVIRT_CLUSTER(object);
|
|
|
|
switch (prop_id) {
|
|
case PROP_DATA_CENTER_HREF:
|
|
g_value_set_string(value, get_data_center_href(cluster));
|
|
break;
|
|
case PROP_DATA_CENTER_ID:
|
|
g_value_set_string(value, cluster->priv->data_center_id);
|
|
break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
}
|
|
}
|
|
|
|
static void ovirt_cluster_set_property(GObject *object,
|
|
guint prop_id,
|
|
const GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
OvirtCluster *cluster = OVIRT_CLUSTER(object);
|
|
|
|
switch (prop_id) {
|
|
case PROP_DATA_CENTER_HREF:
|
|
g_free(cluster->priv->data_center_href);
|
|
cluster->priv->data_center_href = g_value_dup_string(value);
|
|
break;
|
|
case PROP_DATA_CENTER_ID:
|
|
g_free(cluster->priv->data_center_id);
|
|
cluster->priv->data_center_id = g_value_dup_string(value);
|
|
break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
ovirt_cluster_dispose(GObject *obj)
|
|
{
|
|
OvirtCluster *cluster = OVIRT_CLUSTER(obj);
|
|
|
|
g_clear_pointer(&cluster->priv->data_center_href, g_free);
|
|
g_clear_pointer(&cluster->priv->data_center_id, g_free);
|
|
g_clear_object(&cluster->priv->hosts);
|
|
|
|
G_OBJECT_CLASS(ovirt_cluster_parent_class)->dispose(obj);
|
|
}
|
|
|
|
|
|
static gboolean ovirt_cluster_init_from_xml(OvirtResource *resource,
|
|
RestXmlNode *node,
|
|
GError **error)
|
|
{
|
|
OvirtResourceClass *parent_class;
|
|
OvirtXmlElement cluster_elements[] = {
|
|
{ .prop_name = "data-center-href",
|
|
.xml_path = "data_center",
|
|
.xml_attr = "href",
|
|
},
|
|
{ .prop_name = "data-center-id",
|
|
.xml_path = "data_center",
|
|
.xml_attr = "id",
|
|
},
|
|
{ NULL , },
|
|
};
|
|
|
|
if (!ovirt_rest_xml_node_parse(node, G_OBJECT(resource), cluster_elements))
|
|
return FALSE;
|
|
|
|
parent_class = OVIRT_RESOURCE_CLASS(ovirt_cluster_parent_class);
|
|
return parent_class->init_from_xml(resource, node, error);
|
|
}
|
|
|
|
|
|
static void ovirt_cluster_class_init(OvirtClusterClass *klass)
|
|
{
|
|
GObjectClass *object_class = G_OBJECT_CLASS(klass);
|
|
OvirtResourceClass *resource_class = OVIRT_RESOURCE_CLASS(klass);
|
|
GParamSpec *param_spec;
|
|
|
|
resource_class->init_from_xml = ovirt_cluster_init_from_xml;
|
|
object_class->dispose = ovirt_cluster_dispose;
|
|
object_class->get_property = ovirt_cluster_get_property;
|
|
object_class->set_property = ovirt_cluster_set_property;
|
|
|
|
param_spec = g_param_spec_string("data-center-href",
|
|
"Data Center href",
|
|
"Data Center href for the Cluster",
|
|
NULL,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_STATIC_STRINGS);
|
|
g_object_class_install_property(object_class,
|
|
PROP_DATA_CENTER_HREF,
|
|
param_spec);
|
|
|
|
param_spec = g_param_spec_string("data-center-id",
|
|
"Data Center Id",
|
|
"Data Center Id for the Cluster",
|
|
NULL,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_STATIC_STRINGS);
|
|
g_object_class_install_property(object_class,
|
|
PROP_DATA_CENTER_ID,
|
|
param_spec);
|
|
}
|
|
|
|
static void ovirt_cluster_init(OvirtCluster *cluster)
|
|
{
|
|
cluster->priv = ovirt_cluster_get_instance_private(cluster);
|
|
}
|
|
|
|
G_GNUC_INTERNAL
|
|
OvirtCluster *ovirt_cluster_new_from_id(const char *id,
|
|
const char *href)
|
|
{
|
|
OvirtResource *cluster = ovirt_resource_new_from_id(OVIRT_TYPE_CLUSTER, id, href);
|
|
return OVIRT_CLUSTER(cluster);
|
|
}
|
|
|
|
G_GNUC_INTERNAL
|
|
OvirtCluster *ovirt_cluster_new_from_xml(RestXmlNode *node,
|
|
GError **error)
|
|
{
|
|
OvirtResource *cluster = ovirt_resource_new_from_xml(OVIRT_TYPE_CLUSTER, node, error);
|
|
return OVIRT_CLUSTER(cluster);
|
|
}
|
|
|
|
OvirtCluster *ovirt_cluster_new(void)
|
|
{
|
|
OvirtResource *cluster = ovirt_resource_new(OVIRT_TYPE_CLUSTER);
|
|
return OVIRT_CLUSTER(cluster);
|
|
}
|
|
|
|
/**
|
|
* ovirt_cluster_get_hosts:
|
|
* @cluster: a #OvirtCluster
|
|
*
|
|
* Gets a #OvirtCollection representing the list of remote hosts from a
|
|
* cluster object. This method does not initiate any network
|
|
* activity, the remote host 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 hosts associated with @cluster.
|
|
*/
|
|
OvirtCollection *ovirt_cluster_get_hosts(OvirtCluster *cluster)
|
|
{
|
|
g_return_val_if_fail(OVIRT_IS_CLUSTER(cluster), NULL);
|
|
|
|
if (cluster->priv->hosts == NULL) {
|
|
OvirtCollection *collection;
|
|
collection = ovirt_sub_collection_new_from_resource(OVIRT_RESOURCE(cluster),
|
|
"hosts",
|
|
"hosts",
|
|
OVIRT_TYPE_HOST,
|
|
"host");
|
|
cluster->priv->hosts = collection;
|
|
}
|
|
|
|
return cluster->priv->hosts;
|
|
}
|
|
|
|
|
|
/**
|
|
* ovirt_cluster_get_data_center:
|
|
* @cluster: a #OvirtCluster
|
|
*
|
|
* Gets a #OvirtCluster representing the data center the cluster belongs
|
|
* to. This method does not initiate any network activity, the remote data center must
|
|
* be then be fetched using ovirt_resource_refresh() or
|
|
* ovirt_resource_refresh_async().
|
|
*
|
|
* Return value: (transfer full): a #OvirtDataCenter representing data center
|
|
* the @host belongs to.
|
|
*/
|
|
OvirtDataCenter *ovirt_cluster_get_data_center(OvirtCluster *cluster)
|
|
{
|
|
g_return_val_if_fail(OVIRT_IS_CLUSTER(cluster), NULL);
|
|
g_return_val_if_fail(cluster->priv->data_center_id != NULL, NULL);
|
|
return ovirt_data_center_new_from_id(cluster->priv->data_center_id, get_data_center_href(cluster));
|
|
}
|